使用Spark读取许多输入文件的最佳方法

时间:2015-03-14 17:59:19

标签: apache-spark spark-streaming

我们需要并行读取许多文本文件。这些是使用Spark流媒体工作创建的,但这是一个很长的故事。定期需要进行批量计算,因此我们创建一个以逗号分隔的文件列表,以传递给sparkContext.textFile(fileList)。列表可以变得非常大(可能是10000)并且全部都在hdfs上。

问题是:阅读它们的最佳方式是什么?

我们想到的可能性:

  • 我们应该像现在一样通过长长的清单吗?这个似乎慢,因为数据本身并不是那么大。
  • 是否应该将列表分解并在附加组中读取RDD?
  • 我们是否应该移动并附加文本以获得一个包含较少大文本文件的目录?这将是一个麻烦,因为数据被分成带有时间戳的dirs,我们需要保留这些时间戳用于其他用途。

2 个答案:

答案 0 :(得分:1)

确保所有文件都在同一目录中,并使用sparkContext.wholeTextFiles(directoryPath)方法将目录中的所有文件读取为JavaPairRDD,其中文件名为key,文件内容为value。

干杯!!

答案 1 :(得分:0)

实际上有两种解决方案可能适合您的需求。在这两种方法中,变量dir必须指向群集上所有节点可用的目录:

wholeTextFiles(dir)创建一个带有key/value结构的 PairRDD 对象,其中key是文件的完整路径,value是包含 all 该文件内容的字符串。它为每个文件创建一个条目,并根据可用的执行程序核心数量进行分区。

PairRDD (key,value):
hdfs://TextFile1.txt,this is the content of the file textfile4
hdfs://TextFile2.txt,this is the content of the file textfile4
hdfs://TextFile3.txt,this is the content of the file textfile4
hdfs://TextFile4.txt,this is the content of the file textfile4
相反,

textFile(dir)保留原始结构并为每个文件创建一个分区,例如,这对于因依赖性而无法拆分到不同分区的文件非常有用。这意味着拥有1000个文件将导致1000个分区。

哪种方法最好取决于您的应用程序的需求。如果数据完全独立且文件内容不依赖于自身,wholeTextFiles可能是更好的方法,而textFile可能适合您,如果维护文件结构很重要。