2017-01-26 90 views
-1

我在spark中处理大数据并将它们存储在HDFS中。有没有一种方法来提高saveAsTextFile方法在火花上的性能

但是,我觉得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

我会推荐检查你的工作的火花主页面,它有很多关于工作不同部分时间的细节。您可能还想检查您正在写入hdfs的文件和大小。例如,你可能会写很多小文件。 – jeff

+0

谢谢你的回复! 你能回答多一个问题吗?如果你不介意。 当我使用'sc.textFile()'加载文本文件时,我将此方法的分区参数设置为200.这是您所说的“您可能正在写很多小文件”? –

+0

请添加您尝试过的代码。 – mrsrinivas

回答

1

我猜你的工作运行速度慢b/c你要求输入200个分区。将输出写入HDFS时,它将向HDFS写入200个(可能很小的)文件。当你合并到1时,你会注意到加速。

我建议删除textFile中的200个分区并让Spark选择默认并行性。

val data = sc.textFile(inputDir) // no partitions specified 

尽管如此,您可能还是要留意在作业结束时写出的文件大小。当文件大小接近块大小时,HDFS表现最佳(我不记得默认值,但我认为大约为256M)。

更多分区可能会更慢的另一个原因是,Spark会为每个分区设置/拆卸。设置这些数字是个好地方。看看你的Spark大师,如果有5ms的实际工作需要100ms的设置/拆卸,你需要更少的分区。

我总是以Spark设置为默认值,然后根据需要进行调整。

+0

感谢您的回复! –

相关问题