在spark RDD上执行多项操作的性能

时间:2017-07-26 11:47:50

标签: apache-spark

我想知道逐个执行一组操作而不是累积的性能成本是多少。 以下是一些代表这两种情况的代码:

情景1:

val operations: List[Row => Boolean]
val rdd: RDD[Row]
val result: RDD[Boolean] = rdd.flatMap(row => operations.map(f => f(row)))

场景2

val operations: List[Row => Boolean]
val rdd: RDD[Row]
val result: RDD[Boolean] = sc.union(operations.map(f => rdd.map(f)))

我知道第二个更贵,但我有一些理由喜欢它,我想知道它有多贵。

我的操作数量介于10到100之间,RDD大小为数百万或更多。

1 个答案:

答案 0 :(得分:0)

我认为最好的方法是在代表性数据上执行并对结果进行基准测试。只有这样,您才能得到准确反映现实生活表现的答案。

虽然第一个可能只受益于仅加载一次的数据,但还有许多其他因素在起作用,例如:

  • 沿袭的长度(数据被缓存,洗牌)。
  • 输入格式,如果从源重新执行沿袭。
  • 为每个操作和GC配置分配的内存量。
  • 单次通过操作产生的总数据量。
  • 群集配置。
  • 下游转型。

第一种情况可能会导致更长的GC暂停或GC相关的OOM,磁盘溢出增加或资源利用率下降。第二种方法可以实现更高的粒度,尤其是动态分配。