Apache spark 使用Spark读取多个输入文件的最佳方法

Apache spark 使用Spark读取多个输入文件的最佳方法,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我们有许多文本文件需要并行读取。这些是通过Spark流媒体作业创建的,但这是一个很长的故事。需要定期执行批处理计算,因此我们创建一个以逗号分隔的文件列表,以传递到sparkContext.textFile(文件列表)。这个列表可能会非常大(可能有10000个),并且都在hdfs上 问题是:阅读它们最有效的方式是什么 我们想到的可能性: 我们是否应该像现在这样通过长长的名单?这似乎很慢,因为数据本身并没有那么大 是否应该将列表拆分并分组读取,并附加结果RDD 我们是否应该移动并附加文本以获得一个

我们有许多文本文件需要并行读取。这些是通过Spark流媒体作业创建的,但这是一个很长的故事。需要定期执行批处理计算,因此我们创建一个以逗号分隔的文件列表,以传递到sparkContext.textFile(文件列表)。这个列表可能会非常大(可能有10000个),并且都在hdfs上

问题是:阅读它们最有效的方式是什么

我们想到的可能性:

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

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


干杯

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

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

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
可能适合您。

您对此问题有什么解决方案吗?我知道这些方法,但wholeTextFiles方法不适合,而且textFile速度非常慢。实际上,在决定分区之前,它必须扫描所有文件的统计信息。用这种方法无法读取大量小文件。如果将所有文件复制到一个大文件中,速度将提高10-100倍!不幸的是,Spark Streaming创建了大量的小文件。