如何使用Impala和Python代码同时运行查询?

时间:2019-10-02 15:08:48

标签: python hadoop python-multiprocessing impala ibis

上下文

我使用Python(3.7)在Hadoop服务器上运行多个查询。

经过几次测试,我认为Impala是查询数据库的最有效引擎。因此,我使用Ibis框架设置了连接,以强制使用Impala(默认情况下使用Hive)。

考虑到查询的数量,我试图同时运行这些查询。

我想我已经接近了,但是在尝试使用Ibis和我启动的多个进程共享与服务器的连接时,我遇到了问题。

我对Python还是很陌生,但是我将尽力清楚地解释我的问题,并使用正确的词汇表。如有任何错误,请提前原谅我!!

如何提交查询

要提交我的查询,代码如下:

  • 与数据库的连接:

hdfs = ibis.hdfs_connect(host ='X.X.X.X',port = Y) 客户端= ibis.impala.connect(host ='X.X.X.X',port = Y,hdfs_client = hdfs)

  • 创建查询(完成几次):

query =“选择...从...哪里...”

  • 发送查询并检索结果(针对每个查询完成):

query = self.client.sql(查询) 数据= query.execute(限制=无)

如何同时运行这些查询

现在,我已经使用多重处理创建了一个Process类,并且向我传递了将启用连接的client参数(至少,我认为),以及一个包含配置查询所需信息的列表。在服务器上运行:

import multiprocessing

class ParallelDataRetrieving(multiprocessing.Process):

    """Process in charge of retrieving the data."""

    def __init__(self,client,someInformations):

    multiprocessing.Process.__init__(self)

    self.client = client
    self.someInformations = someInformations

def run(self):

    """Code to run during the execution of the process."""

    cpt1 = 0

    while cpt1 < len(someInformations):

        query = Use someInformations[cpt1] to create the query.

    query = self.client.sql(query)
    data = query.execute(limit = None)

    Some work on the data...

    return 0

然后,从主脚本中,我(尝试)建立连接,并使用该连接启动多个进程:

hdfs = ibis.hdfs_connect(host='X.X.X.X', port=Y)
client = ibis.impala.connect(host='X.X.X.X',port=Y,hdfs_client=hdfs)

process_1 = ParallelDataRetrieving(client,someInformations)
process_1.start()
process_2 = ...

但是此代码不起作用。我收到错误消息“ TypeError:无法腌制_thread.lock对象”。

据我了解,这是由于多处理使用Pickle来“封装”参数并将其传输到进程(其内存在Windows上独立运行)的事实。而且似乎无法腌制“ client”参数。

然后,我在互联网上找到了一些试图解决此问题的想法,但似乎都不适用于我的特定情况(Ibis,Impala ...):

  • 我试图直接在Process对象的run方法中创建连接(这意味着每个Process一个连接):这导致“ BrokenPipeError:[Errno 32]管道损坏”

  • 我尝试使用 multiprocessing.sharedctypes.RawValue ,但是如果这是正确的解决方案,我不太确定我是否可以在自己的代码中正确实现它...

此刻我的处境差不多。我将继续尝试解决这个问题,但是作为Python的一种“新来者”,以及数据库查询的多处理,我认为更高级的用户可能会帮助我!

提前感谢您用于此请求的时间!

0 个答案:

没有答案