pyspark分布负荷不均匀,零件尺寸增加

时间:2016-07-25 12:46:29

标签: python-2.7 pyspark rdd

我的pyspark过程的输出部分大小不均匀,但可以预测n ** 2模式(0,1,2,4,8,16等)。这是我的过程:

我从Google BigQuery加载数据如下:

dConf = {
    "mapred.bq.project.id": project_id,
    "mapred.bq.gcs.bucket": bucket,
    "mapred.bq.input.project.id": project_id,
    "mapred.bq.input.dataset.id":dataset_id,
    "mapred.bq.input.table.id": table_id
}

rdd_dataset_raw = sc.newAPIHadoopRDD(
    "com.google.cloud.hadoop.io.bigquery.JsonTextBigQueryInputFormat",
    "org.apache.hadoop.io.LongWritable",
    "com.google.gson.JsonObject",
    conf=dConf
)

其输出如下(rdd_dataset_raw.take(2)):

[(0, u'{"group_id":"1","pertubations":"Current Affairs,Sport,Technology"}'), 
(67, u'{"group_id":"2","pertubations":"Current Affairs,Sport,Celeb Gossip"}')]

一些简单的处理,重新分区:

rdd_dataset = (
    rdd_dataset_raw
    .repartition(nr_partitions)
    .map(lambda t, json=json: json.loads(t[1]))
)

看起来像这样:

[{u'group_id': u'1', u'pertubations': u'Current Affairs,Sport,Technology'}, 
{u'group_id': u'2', u'pertubations': u'Current Affairs,Sport,Celeb Gossip'}]

当我使用以下命令将RDD保存到Google存储空间时

rdd_dataset_raw.saveAsTextFile("gs://bucket/directory")

这会创建nr_partitions部分文件。

但是,这些部件文件的大小不均匀。它们在n**2中增加,其中n是部件文件编号。换句话说,

part-00000包含0行
part-00001包含1行
part-00002包含2行 part-00003包含4行 part-00004包含8行 等

其中大多数也几乎立即完成,后面的部分耗尽内存。

发生什么事了!?如何使分区均匀加载?

1 个答案:

答案 0 :(得分:0)

只需将repartition替换为partitionBy

即可
rdd_dataset = (
    rdd_dataset_raw
    .partitionBy(nr_partitions)
    .map(lambda t, json=json: json.loads(t[1]))
)

请注意,这需要尽早完成。通过一个未分区的rdd然后分区后来破了。

Docs