我已经在spark中处理了大量数据并将它们存储在HDFS中。
但是,我觉得saveAsTextFile方法有点慢。
所以我想知道是否有办法改善其表现。
我的原始代码(运行速度低于预期)
val data = sc.textFile("data", 200);
data.
flatMap(_.split(" ")).
map(word => (word, 1)).
reduceByKey(_ + _).
saveAsTextFile("output")
当我添加合并(1)时,速度会显着提高
val data = sc.textFile("data", 200);
data.
flatMap(_.split(" ")).
map(word => (word, 1)).
reduceByKey(_ + _).
coalesce(1).
saveAsTextFile("output")
答案 0 :(得分:2)
我猜你的工作运行缓慢b / c你要求输入200个分区。将输出写入HDFS时,它会将200个(可能很小的)文件写入HDFS。当你合并到1时,你会注意到加速。
我建议删除textFile中的200个分区,让Spark选择默认的并行性。
val data = sc.textFile(inputDir) // no partitions specified
您可能仍希望关注作业结束时写出的文件大小。当文件大小接近块大小时,HDFS表现最佳(我不记得默认值,但我认为大约256M)。
更多分区速度较慢的另一个原因是Spark每个分区都设置/拆除。设置这些数字是个好地方。看看你的Spark大师,如果有5ms的实际工作设置/拆卸100ms,你需要更少的分区。
我总是从Spark设置开始默认,然后根据需要从那里进行调整。