【问题标题】:Does Spark's reduceByKey use a constant amount of memory, or a linear one in the number of keys?Spark 的 reduceByKey 是使用恒定数量的内存,还是使用键数量的线性内存?
【发布时间】:2020-01-16 16:18:30
【问题描述】:
据我所知,有一些外部排序解决方案和/或 Hadoop MapReduce 中的解决方案允许在通过键对数据进行排序/分组时使用恒定数量的内存,而不是更多,以便通过聚合函数为每个钥匙。
假设 reduce 状态也是一个常数,比如加法。
这种常量内存分组/排序是否也可用于 Apache Spark 或 Flink,如果是,在 reduceByKey 或 aggregateByKey 的情况下,是否有任何特定的配置或编程方式要求这种常量内存处理方式?
【问题讨论】:
标签:
apache-spark
mapreduce
apache-flink
【解决方案1】:
两个系统都需要隐式执行操作,因为 Java 进程只获得固定数量的主内存。请注意,当要排序的数据变得更大时,需要将数据溢出到磁盘上。在排序的情况下,根据您的查询,这可能意味着需要在主内存和磁盘上实现完整的数据集。
如果您要问是否可以限制特定运算符的内存消耗,那么事情看起来要复杂得多。您可以将应用程序限制为一项特定操作并使用全局内存设置来限制消耗,但这会导致设置复杂。
您是否有一个特定的用例,需要限制特定操作的内存?
顺便说一句,您可以考虑使用 Spark 和 Flink 来取代 Hadoop MapReduce。只有几个边缘情况,MapReduce 可能能够击败下一代系统。