Apache spark 在spark RDD上执行多个操作的性能
我想知道一个接一个地执行一组操作而不是累积操作的性能成本是多少。 以下是表示这两种场景的一些代码: 场景1:Apache spark 在spark RDD上执行多个操作的性能,apache-spark,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: RD
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大小以百万或更多为单位。我认为最好的方法是在代表性数据上执行,并对结果进行基准测试。只有这样,你才能得到准确反映现实生活表现的答案 虽然第一种方法可能受益于只加载一次数据,但还有许多其他因素在起作用,例如:
- 沿袭的长度(数据缓存、洗牌)
- 输入格式,如果从源重新执行沿袭
- 为每个操作和GC配置分配的内存量
- 单次传递操作产生的总数据量
- 集群配置
- 下游转换
第一种情况可能导致较长的GC暂停或GC相关OOM、磁盘溢出增加或资源利用率低下。第二种方法可以实现更高的粒度,尤其是动态分配。从外观上看,场景1似乎是可行的