Apache spark 使用Spark读取多个输入文件的最佳方法
我们有许多文本文件需要并行读取。这些是通过Spark流媒体作业创建的,但这是一个很长的故事。需要定期执行批处理计算,因此我们创建一个以逗号分隔的文件列表,以传递到sparkContext.textFile(文件列表)。这个列表可能会非常大(可能有10000个),并且都在hdfs上 问题是:阅读它们最有效的方式是什么 我们想到的可能性:Apache spark 使用Spark读取多个输入文件的最佳方法,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我们有许多文本文件需要并行读取。这些是通过Spark流媒体作业创建的,但这是一个很长的故事。需要定期执行批处理计算,因此我们创建一个以逗号分隔的文件列表,以传递到sparkContext.textFile(文件列表)。这个列表可能会非常大(可能有10000个),并且都在hdfs上 问题是:阅读它们最有效的方式是什么 我们想到的可能性: 我们是否应该像现在这样通过长长的名单?这似乎很慢,因为数据本身并没有那么大 是否应该将列表拆分并分组读取,并附加结果RDD 我们是否应该移动并附加文本以获得一个
- 我们是否应该像现在这样通过长长的名单?这似乎很慢,因为数据本身并没有那么大
- 是否应该将列表拆分并分组读取,并附加结果RDD李>
- 我们是否应该移动并附加文本以获得一个目录,其中包含较少的大型文本文件?这将是一个麻烦,因为数据被分离成带有时间戳的dir,我们需要保留这些dir用于其他用途
干杯 实际上有两种解决方案可以满足您的需要。在这两种方法中,变量
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创建了大量的小文件。