我有超过150,000个.csv.gz文件,这些文件组织在几个具有相同前缀的文件夹中(在s3上)。每个文件的大小约为550KB。我的目标是将所有这些文件读入一个DataFrame,总大小约为80GB。
我正在使用EMR 5.0.0和一个不错的集群:c4.8xlarge的3个实例 (36个vCPU,60个GiB内存,EBS存储:100个GiB)。
我正在路径中使用通配符读取文件:
sc.textFile("s3://bucket/directory/prefix*/*.csv.gz")
然后我做了一些地图操作,并通过调用toDF("col1_name", "col2_name", "col3_name")
将RDD转换为DataFrame。然后,我几乎没有调用UDF来创建新列。
当我致电df.show()
时,操作需要很长时间才能完成。
我想知道为什么这个过程需要很长时间?
是否读取了大量的.csv.gz文件?
答案 0 :(得分:3)
.gz
个文件不可拆分,将导致150K分区。 Spark会像那样:它甚至会破坏几个10k的分区。
您可能希望首先查看aws distcp
或S3DistCp
以复制到hdfs - 然后使用适当的Hadoop InputFormat
捆绑文件,例如CombineFileInputFormat
以及许多文件合而为一。这是一个较旧的博客,有更多的想法:http://inquidia.com/news-and-info/working-small-files-hadoop-part-3