Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark ApacheSpark中的forEachAsync与forEachPartitionAsync有什么区别?_Apache Spark - Fatal编程技术网

Apache spark ApacheSpark中的forEachAsync与forEachPartitionAsync有什么区别?

Apache spark ApacheSpark中的forEachAsync与forEachPartitionAsync有什么区别?,apache-spark,Apache Spark,forEachAsync和forEachPartitionAsync之间有什么区别 如果我猜这里是,我会说下面的话,但如果我错了,请纠正我。forEachAsync只是以异步方式逐个迭代所有分区中的值 forEachPartitionAsync:扇出每个分区,并跨不同的工作线程并行运行每个分区的lambda。这里的lambda将以异步方式逐个遍历该分区中的值 但是等等,rdd操作实际上应该并行执行,对吗?所以,如果我调用rdd.forEachAsync,它也应该并行执行,不是吗?我想我有点困惑,

forEachAsync和forEachPartitionAsync之间有什么区别

如果我猜这里是,我会说下面的话,但如果我错了,请纠正我。forEachAsync只是以异步方式逐个迭代所有分区中的值

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


但是等等,rdd操作实际上应该并行执行,对吗?所以,如果我调用rdd.forEachAsync,它也应该并行执行,不是吗?我想我有点困惑,forEachAsync和forEachPartitionAsync之间到底有什么区别?除了将元组与元组迭代器分别传递给lambda之外。

我相信您已经知道异步的事实,并询问forEach和forEachPartition之间的区别

不同的是,ForEachPartition允许您按分区运行自定义代码,而这是ForEach所不能做到的

例如,您希望将结果保存到数据库中。现在,正如您所知道的,打开和关闭数据库连接是昂贵的,每个执行器一个连接(或池)将是最好的。所以你的代码是

rdd.forEachPartition(part => {
    db= mysql..blablabla
    part.forEach(record=> {
    db.save(record)
   })
   db.close()
})
在ForEach中不能这样做,在ForEach中它将对每条记录进行迭代


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

非常感谢!我现在明白了。从数据库中检索记录(例如表扫描)时,您将使用什么?您得到一个Iterable,当您执行
Iterable.iterator.next()
时,我不确定它是否打开了一个新连接或使用了现有连接?但我可以说的是,没有为用户提供连接启动或关闭过程,因为它由spark连接器负责。在从DB检索数据时,如果您使用spark JDBC,spark将在内部为您管理连接。但是,假设在DB中有一些小的参考数据,您想在forEach中拉这些数据来进行一些处理,您可以使用forEachPartition,创建“par分区”连接,拉取数据,最后在完成后关闭它。如果答案回答了你的问题,就接受它。谢谢