【问题标题】:What is the difference between forEachAsync vs forEachPartitionAsync in Apache Spark?Apache Spark 中的 forEachAsync 与 forEachPartitionAsync 有什么区别?
【发布时间】:2017-08-27 19:53:50
【问题描述】:

forEachAsync 与 forEachPartitionAsync 有什么区别?

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

forEachPartitionAsync:扇出每个分区,并在不同的工作人员之间并行运行每个分区的 lambda。此处的 lambda 将以异步方式逐个迭代该分区中的值

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

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    相信你已经知道Async这个事实,求问forEach和forEachPartition的区别,

    不同之处在于,ForEachPartition 将允许您运行每个分区的自定义代码,而 ForEach 无法做到这一点。

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

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

    您不能在 ForEach 中执行此操作,在 foreach 中它将为每条记录迭代。

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

    【讨论】:

    • 非常感谢!我现在明白了。从数据库中检索记录(例如表扫描)时,您会使用什么?你得到一个Iterable,当你做iterable.iterator.next()我不确定它是打开一个新连接还是使用现有连接?但我能说的是,没有给用户连接启动或关闭过程,因为它由 spark--connector 处理。
    • 在从 DB 中检索数据时,如果您使用的是 Spark JDBC,Spark 将在内部为您管理连接。但是,假设您在 DB 中有一些小参考数据,您想提取这些数据以在 forEach 中进行一些处理,您可以使用 forEachPartition,创建您的“par partition”连接,提取数据并最终在您关闭时关闭它完毕。如果回答您的问题,请接受答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-06-23
    • 2016-06-05
    • 1970-01-01
    • 2014-06-24
    • 2018-08-14
    • 2017-10-13
    • 2021-11-19
    • 2015-12-05
    相关资源
    最近更新 更多