烫伤'multiple map()'优化
Scalding 'multiple map()' optimization
下面两个代码块在性能上是否等价?
val input: TypedPipe[Person] = ....
input
.map(_.getName)
.map(_.split(" "))
和...
val input: TypedPipe[Person] = ....
input
.map(_.getName.split(" "))
具体来说,Scalding 是否会优化代码并始终以上两个片段执行单一地图作业?如果地图函数比 getName/split 复杂得多怎么办?
IMO(以及更复杂的地图函数)第一个示例更具可读性。但是,我担心它可能会导致运行时执行效率降低。
这两个函数不会在字节码/scalac 层被折叠,但更重要的是,scalding 总是会在 hadoop 中将它们折叠成一个 map 任务。事实上,所有类似地图的运算符(map、flatMap、filter 等)都将折叠到 1 个地图任务中,甚至折叠到 reduce 任务的末尾。
因此您的两个示例在 hadoop 中将具有相同的 DAG,唯一的区别是一些额外的函数调用开销。
与烫洗作业中进行的序列化/反序列化和 IO 相比,单独调用这些函数的开销不太可能成为性能瓶颈。热点虚拟机也有可能将其中的一些 JIT 转换为本机指令。
我绝对建议您考虑可读性,除非您进行了大量分析并发现这是一个瓶颈(我会感到非常惊讶)。
下面两个代码块在性能上是否等价?
val input: TypedPipe[Person] = ....
input
.map(_.getName)
.map(_.split(" "))
和...
val input: TypedPipe[Person] = ....
input
.map(_.getName.split(" "))
具体来说,Scalding 是否会优化代码并始终以上两个片段执行单一地图作业?如果地图函数比 getName/split 复杂得多怎么办?
IMO(以及更复杂的地图函数)第一个示例更具可读性。但是,我担心它可能会导致运行时执行效率降低。
这两个函数不会在字节码/scalac 层被折叠,但更重要的是,scalding 总是会在 hadoop 中将它们折叠成一个 map 任务。事实上,所有类似地图的运算符(map、flatMap、filter 等)都将折叠到 1 个地图任务中,甚至折叠到 reduce 任务的末尾。
因此您的两个示例在 hadoop 中将具有相同的 DAG,唯一的区别是一些额外的函数调用开销。
与烫洗作业中进行的序列化/反序列化和 IO 相比,单独调用这些函数的开销不太可能成为性能瓶颈。热点虚拟机也有可能将其中的一些 JIT 转换为本机指令。
我绝对建议您考虑可读性,除非您进行了大量分析并发现这是一个瓶颈(我会感到非常惊讶)。