我正在将数百个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个执行程序。如下图所示,只有两名工人在运行,这在进一步扩展时显然不是最佳的。想法?
答案 0 :(得分:1)
git clone
将顺序条目写入数据库。而且,函数process_partition的逻辑也将是顺序的。
您需要对def df.rdd.coalesce(20).foreachPartition(process_partition)
的逻辑进行多线程处理。这将加快该过程。也使用process_partition