Apache Spark中forEachAsync与forEachPartitionAsync有什么区别?

时间:2017-04-03 04:03:12

标签: apache-spark

forEachAsync与forEachPartitionAsync有什么区别?

如果我在这里猜测我会说以下但如果我错了请纠正我.forEachAsync只是在异步方式中逐个遍历所有分区的值

forEachPartitionAsync:扇出每个分区,并在不同的worker之间并行运行每个分区的lambda。这里的lambda将以异步方式逐个迭代来自该分区的值

但等等,rdd操作应该实际并行执行吗?所以如果我调用应该并行执行的rdd.forEachAsync也不是吗?我想我有点困惑,现在forEachAsync和forEachPartitionAsync之间的区别是什么?除了将Tuple vs Tuples的Iterator分别传递给lambda之外。

1 个答案:

答案 0 :(得分:3)

我相信你已经意识到Async的事实,并且要求forEach和forEachPartition之间的区别,

不同的是,ForEachPartition将允许您运行每个分区自定义代码,而您可以使用ForEach。

例如,您希望将结果保存到数据库。现在您知道打开关闭数据库连接的成本很高,每个执行程序的一个连接(或池)将是最好的。所以你的代码将是

    Bundle args = new Bundle();
    args.putString("key",value);

    mapView.onCreate(args);

您无法在ForEach中执行此操作,在foreach中它会针对每条记录进行迭代。

请记住,一个分区将始终在一个执行程序上运行。因此,如果您在开始处理数据之前要做任何昂贵的前期工作,请使用forAachParition。如果不只是使用forEach。两者都是平行的。一个为您提供灵活性,简化了其他方式。