Spark作业的优化设计,并确保对预分区数据的狭隘依赖

时间:2017-03-30 14:54:55

标签: scala apache-spark dataframe shuffle partition

假设我有世界上所有国家/地区的活动数据(从关系上讲,每条记录都有一个国家/地区列),我希望通过每个国家/地区可用的一些参考数据来丰富该数据,然后将其用作某些ML算法的输入。此外,我知道每个连接集(按国家键入和加入)都适合单个执行器,在国家级处理这些数据的最有效方法是什么,并将结果合并以汇总总输出。

我目前的想法是:

  1. 按国家/地区对这两个数据集进行分区和键入,在国家/地区级别加入两个数据集,然后使用纯Scala代码(在地图函数中)处理数据,然后再将部分输出转换为最终联合的数据集。 / LI>
  2. 按国家/地区分区和键入两个数据集,在国家/地区级别加入两个数据集,始终坚持数据集并让Spark 2优化计算 - 例如受益于数据的高效序列化表示,整个阶段代码生成e.t.c。
  3. 其次,使用选项2),如何在初始键入和按国家/地区加入所有后续聚合操作(如groupBy()e.t.c.具有狭窄的依赖性(因为所有数据都将位于相同的“国家”分区中)。我是否只需要在我的聚合函数中使用的键中包含country列 - 例如groupBy(country,key1,key2 ...)?

1 个答案:

答案 0 :(得分:0)

我会做三件基本的事情:

  • 国家/地区密钥分区
  • 使用mapPartitions转换基于每个分区的Iterable数据
  • 使用reduceByKeyaggregateBykey进行汇总

所有这一切都应该让您尽可能高效地减少网络随机播放和磁盘I / O,同时在最后执行写操作之前完成所有实际工作。