2017-07-26 72 views
0

我想知道执行一组操作而不是累积操作的性能成本是多少。 下面是一些代码来代表这两种情况:在火花上执行多个操作的性能RDD

方案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大小在几百万或更多。

+0

由它的外观情景1似乎是要走的路 –

回答

0

我认为最好的方法是执行代表性数据和基准结果。只有这样你才能得到准确反映真实生活表现的答案。

虽然第一个可以从数据中获益加载只有一次,还有许多其他因素在起作用,如:血统的

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

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