【问题标题】:Python/Hive interface slow with fetchone(), hangs with fetchall()Python/Hive 接口使用 fetchone() 很慢,使用 fetchall() 挂起
【发布时间】:2014-08-11 16:55:06
【问题描述】:

我有一个使用 pyhs2 查询 HiveServer2 的 python 脚本,如下所示:

import pyhs2;
conn = pyhs2.connect(host=localhost,
               port=10000,
               user='user',
               password='password',
               database='default');

cur = conn.cursor();
cur.execute("SELECT name,data,number,time FROM table WHERE date = '2014-01-01' AND number in (1,5,6,22) ORDER BY name,time ASC");

line = cur.fetchone();
while line is not None:
   <do some processing, including writing to stdout>
   .
   .
   .
   line = cur.fetchone();

我也尝试过使用 fetchall() 而不是 fetchone(),但这似乎永远挂起。

我的查询运行良好并返回约 2.7 亿行。为了进行测试,我将 Hive 的输出转储到一个以制表符分隔的平面文件中,并针对该文件编写了我的 python 脚本的内容,因此我不必在每次运行时都等待查询完成。我读取平面文件的脚本将在大约 20 分钟内完成。让我感到困惑的是,当我直接查询 Hive 时,我看不到相同的性能。实际上,完成处理需要大约 5 倍的时间。我对 Hive 和 python 还很陌生,所以也许我犯了一些愚蠢的错误,但是我在网上看到的示例显示了这样的设置。我只想遍历我的 Hive 返回,尽可能快地一次获取一行,就像我使用我的平面文件一样。有什么建议吗?

附:我发现这个问题听起来很相似:

Python slow on fetchone, hangs on fetchall

但这最终是一个 SQLite 问题,我无法控制我的 Hive 设置。

【问题讨论】:

  • 你试过 hive -e 'select name, data .....' > file.out 吗?这是否提供相同的性能
  • 是的,自从我发布这个问题以来,我已经尝试过。我应该用我尝试过的更新它。这是一个很好的建议,因为我收到了最好的表现,比如hive -e 'select name,data...' | python script.py
  • 为了讲述我的经历并尽可能提供帮助,我会说我选择不使用这个 pyhs2 库,因为我获得了最好的性能,只是管道符合我的程序标准。我避免将数据转储到我随后处理的文件中,因为这将在 HDD 上运行 I/O。另外,我听说hive无论如何都会在返回数据的过程中写入一个文件。我现在正在研究 HBase,但我想让 Hive 按我想要的方式工作。

标签: python hive


【解决方案1】:

您是否考虑过使用 fetchmany()。

这将是分块提取数据的 DBAPI 解决方案(更大的一个,开销是一个问题,小于所有行,内存是一个问题)。

【讨论】:

  • 看源码,fetchmany只是循环调用了fetchone。所以它会遇到同样的性能问题,可能会更糟,因为它将所有数据附加到一个数组中。
  • 我不是 python 专家,但查看 pyhs2 模块的源代码对我来说并不高效。它在 fetchmany 中锁定游标对象,然后每次在 fetchone 中锁定并释放它。对我来说,这似乎是一个相当基本的错误,应该在循环外完成的功能在循环内完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 2018-03-09
  • 2018-12-14
  • 1970-01-01
相关资源
最近更新 更多