我正在使用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,将不胜感激!
非常感谢!
答案 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开始。