为什么sc.wholeTextFile()。collect()变慢

时间:2018-09-17 10:55:48

标签: apache-spark

我正在使用Spark2.1本地模式(local [4])并尝试调用sc.wholeTextFiles以将news20数据集读取为RDD: val rdd = sc.wholeTextFiles("~/20news-18828/*", 4) val result = rdd.collect() 数据集从以下位置下载:http://qwone.com/%7Ejason/20Newsgroups/20news-18828.tar.gz,解压缩后,20news-18828下将有20个类别文件夹。对于每个子文件夹,将有大约900个小文本文件,因此总共有18828个文本文件。 当前数据在我的本地计算机上,将来可能会从HDFS中读取它们。

我的问题是上面的调用rdd.collect()确实很慢,大约需要90秒...或者,如果我使用本地Java文件API将它们全部读取为数组,然后sc.parallelize then collect,它几乎会立即完成。

想知道为什么使用sc.wholeTextFiles这么慢?还是我做错了什么?我只是不熟悉Spark,将不胜感激!

非常感谢!

1 个答案:

答案 0 :(得分:1)

这比读取本地文件要慢,因为这会增加开销,而没有增加任何值。

// read files into at least 4 partitions
// here you have the overhead of spinning up driver and executors and partitioning data
val rdd = sc.wholeTextFiles("~/20news-18828/*", 4)

// pull all of the data back from the executors and put it all on the driver
val result = rdd.collect()

要获得火花并行性的性能优势,您需要以某种方式并行处理数据。

由于您刚开始使用Spark,因此我建议从较新的DataFrame API开始,而不是从较旧的低级Spark上下文/ RDD开始。