我的程序流程是这样的:
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个小时。我真的很感激如何加快这个过程的一些帮助谢谢
答案 0 :(得分:1)
由于数据偏斜加入了庞大的数据集,因此操作陷入了最终任务。加入这两个数据框架的关键是严重偏差。现在通过从数据帧中删除偏斜数据来解决该问题。如果必须包含偏斜数据,则可以使用迭代广播连接(https://github.com/godatadriven/iterative-broadcast-join)。请查看此信息性视频,了解更多详情https://www.youtube.com/watch?v=6zg7NTw-kTQ