有没有办法在spark上提高saveAsTextFile方法的性能

时间:2017-01-26 02:00:44

标签: performance apache-spark

我已经在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")

1 个答案:

答案 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设置开始默认,然后根据需要从那里进行调整。