Pyspark的工作陷入了最后的任务

时间:2017-12-14 21:06:21

标签: apache-spark pyspark spark-dataframe yarn

我的程序流程是这样的:

1.从镶木地板文件中读取40亿行(~700GB)数据到数据框中。使用的分区大小为2296

2.清洁并过滤掉25亿行

3.使用管道模型转换剩余的15亿行,然后使用经过训练的模型。使用逻辑回归模型训练模型,其中预测0或1和30%的数据被从变换的数据帧中滤出。

4.上面的数据框是左外部与另一个~1 TB的数据集连接(也可以从镶木地板文件中读取。)分区大小为4000

5.将其加入另一个大约100 MB的数据集,例如

joined_data = data1.join(broadcast(small_dataset_100MB), data1.field == small_dataset_100MB.field, "left_outer")

6.然后将上述数据框分解为〜2000 {
1 {1}的因数 7.执行汇总
exploded_data = joined_data.withColumn('field', explode('field_list'))

aggregate = exploded_data.groupBy(*cols_to_select)\ .agg(F.countDistinct(exploded_data.field1).alias('distincts'), F.count("*").alias('count_all'))列表中共有10列。

8.最后执行一项行动cols_to_select

问题是,第三个最后计数阶段(200个任务)永远停留在任务199。尽管分配了4个核心和56个执行程序,但计数仅使用一个核心和一个执行程序来运行作业。我尝试将大小从40亿行分解为7亿行,这是1/6行,花了4个小时。我真的很感激如何加快这个过程的一些帮助谢谢

1 个答案:

答案 0 :(得分:1)

由于数据偏斜加入了庞大的数据集,因此操作陷入了最终任务。加入这两个数据框架的关键是严重偏差。现在通过从数据帧中删除偏斜数据来解决该问题。如果必须包含偏斜数据,则可以使用迭代广播连接(https://github.com/godatadriven/iterative-broadcast-join)。请查看此信息性视频,了解更多详情https://www.youtube.com/watch?v=6zg7NTw-kTQ