提高spark sql的并行性

时间:2015-08-26 02:50:41

标签: python concurrency apache-spark apache-spark-sql pyspark

我有以下代码。我正在使用pyspark 1.2.1和python 2.7(cpython)

for colname in shuffle_columns:
    colrdd = hive_context.sql('select %s from %s' % (colname, temp_table))
    # zip_with_random_index is expensive
    colwidx = zip_with_random_index(colrdd).map(merge_index_on_row)
    (hive_context.applySchema(colwidx, a_schema)
        .registerTempTable(a_name))

关于此代码的事情是它一次只能在一列上运行。我的群集中有足够的节点,我可以同时在多个列上运行。 有没有办法在spark中执行此操作?如果我使用了线程之类的东西怎么办?我可以以这种方式并行启动多个registerTempTable(以及相关的集合操作)吗? / p>

1 个答案:

答案 0 :(得分:1)

不幸的是,下面的效果不好。它的工作原理是所有单独的迭代都会执行。不幸的是,由于空指针异常,后续对hive_context对象的调用失败。

这可以通过concurrent.futures

实现
from concurrent import futures

def make_col_temptable(colname):
    colrdd = hive_context.sql('select %s from %s' % (colname, temp_table))
    # zip_with_random_index is expensive
    colwidx = zip_with_random_index(colrdd).map(merge_index_on_row)
    (hive_context.applySchema(colwidx, a_schema)
        .registerTempTable(a_name))

with futures.ThreadPoolExecutor(max_workers=20) as executor:
    futures.wait([executor.submit(make_col_temptable, colname) for colname in shuffle_columns])