2017-04-03 51 views
1

forEachAsync vs forEachPartitionAsync有什么区别?Apache Spark中的forEachAsync vs forEachPartitionAsync有什么区别?

如果我在这里猜测是我下面会说,但请纠正我,如果我wrong.forEachAsync刚刚经历值由一个在一个异步精气神遍历所有分区的一个

forEachPartitionAsync:扇出每个分区并在不同的工作人员中并行运行每个分区的lambda。这里的lambda将以异步的方式逐个遍历该分区中的值。

但是等待,rdd操作应该事实上并行执行吗?所以如果我调用应该并行执行的rdd.forEachAsync不是吗?我想我有点困惑,现在forEachAsync和forEachPartitionAsync之间究竟有什么不同?除了分别将Tuple与Tuple的迭代器传递给lambda。

回答

1

我相信你已经知道的异步的事实,并请求的forEach和forEachPartition之间的区别,

不同的是,ForEachPartition将让你每个分区的自定义代码运行,你不能用ForEach做。

例如,您想要将结果保存到数据库。现在,您知道打开关闭DB连接的代价很高,因此每个执行器的连接(或池)最好。所以你的代码将是

rdd.forEachPartition(part => { 
    db= mysql..blablabla 
    part.forEach(record=> { 
    db.save(record) 
    }) 
    db.close() 
}) 

你不能在ForEach中做到这一点,在foreach它会迭代每个记录。

记住,一个分区将总是在一个执行器上运行。因此,如果您在开始处理数据使用forEachPition之前有任何昂贵的前期工作要做。如果不只是使用forEach。两者都是平行的。一个给你灵活性,另一个给予简单。

+0

非常感谢!我现在明白了。当从数据库中检索记录时(例如表扫描),你会用什么?你得到一个Iterable,当你做'iterable.iterator.next()'我不确定它是打开一个新的连接还是使用现有的连接?但我可以说的是,没有给用户的连接启动或关闭过程,因为它是由spark- - 连接器保管的。 – user1870400

+0

从数据库中检索数据时,如果您使用Spark JDBC,则Spark将在内部为您管理连接。但让我们说,在DB中有一些小的参考数据的情况下,您可以使用forEachPartition来创建“par分区”连接,然后将数据拉出并最终关闭它完成。如果接受答案,如果它回答你的问题。谢谢 ! – RBanerjee

相关问题