了解Spark中的treeReduce()
您可以在此处查看实现:https
:
//github.com/apache/spark/blob/ffa05c84fe75663fc33f3d954d1cb1e084ab3280/python/pyspark/rdd.py#L804
它与“正常”reduce
功能有何不同?
这是什么意思depth = 2
?
我不希望将reducer函数线性地传递到分区上,而是先减少每个可用对,然后像这样迭代直到我只有一对,并将其减小到1,如图所示:
是否treeReduce
做到这一点?
-
Standard
reduce
正在获取该函数的包装版本并将其用于mapPartitions
。之后,将结果收集并在驱动程序上本地减少。如果分区的数量很大和/或您使用的功能很昂贵,则这会在一台计算机上增加大量负载。的第一阶段
treeReduce
与上面的阶段几乎相同,但是在此之后,部分结果被并行合并,并且仅在驱动程序上执行最终聚合。depth
被
建议的树的深度
和自树的节点的深度定义为根和节点之间的边数它,你应该给你更多或更少的预期模式,虽然它看起来像一个分布式聚合能够尽早停止在一些案件。值得注意的是,您得到
treeReduce
的不是二叉树。分区的数量在每个级别上进行调整,并且很可能一次合并两个以上的分区。与标准的reduce相比,基于树的版本在
reduceByKey
每次迭代时都执行,这意味着大量的数据改组。如果分区的数量相对较小,使用普通分区会便宜得多reduce
。如果您怀疑的最后阶段reduce
是瓶颈tree*
版本,则值得尝试。