PySpark foreachPartition并行写入数据库

时间:2018-05-12 21:17:17

标签: apache-spark pyspark

我正在将数百个XML文件读入Spark Dataframe,其中每一行都包含特定事件的元数据和时间序列数据。将这些行中的每一行转换为rdd,以转换为具有特定键/值结构的批量文档,然后将其写入数据库。需要将XML数据分成批次<50Kb,因此帮助函数生成下面显示的批次。

def build_documents(data):

    # Make dataframe out of data tags
    data = pd.DataFrame([i.split(',') for i in list(chain(*(data)))])

    # Helper function to Get Batches
    for batch in get_batches(data): 
          x = batch.T.to_dict()
          yield x

def process_partition(partition):
   client = document_client.DocumentClient(HOST, {'masterKey': MASTER_KEY} )
   for element in partition:
        generator = build_documents(element)
        for batch in generator:
            client.CreateDocument(collection_link + 'data', batch)


# Write to Database
df.rdd.coalesce(20).foreachPartition(process_partition)

仍在调整分区数量,但是有关如何改进分区的任何想法?性能非常慢,正如目前为止实现的代码所预期的那样。该集群由32个内核组成,128.0 GB内存用于两个驱动程序,最多可扩展到8个执行程序。如下图所示,只有两名工人在运行,这在进一步扩展时显然不是最佳的。想法?

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

git clone将顺序条目写入数据库。而且,函数process_partition的逻辑也将是顺序的。

您需要对def df.rdd.coalesce(20).foreachPartition(process_partition)的逻辑进行多线程处理。这将加快该过程。也使用process_partition