我的目标的简要概述:我需要找到包含特定ID的文件(它们为JSON格式)。基本上需要返回一个DF(或列表)的ID和包含它的文件名。
// Read in the data from s3
val dfLogs = spark.read.json("s3://some/path/to/data")
.withColumn("fileSourceName", input_file_name())
// Filter for the ID and select then id and fileSourceName
val results = dfLogs.filter($"id" === "some-unique-id")
.select($"id", $"fileSourceName")
// Return the results
results.show(false)
听起来很简单,对吧?但是,我面临的挑战是我正在读取的S3目录包含数百万个(大约5+百万个)文件,这些文件的平均大小为10kb。小文件问题!为此,我一直在EMR上建立一个5节点群集(m4.xlarge),并使用Zeppelin交互地运行上述代码。
但是,在运行第一个spark语句(读取)时,我不断抛出以下错误:
org.apache.thrift.transport.TTransportException at
org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:132)
我很难找到更多有关上述错误的信息,但我怀疑这与从我的Spark作业到s3的请求有关。
有人对如何处理这么多小文件有任何建议吗?我应该在EMR群集上从S3-> HDFS做s3-dist-cp,然后运行上面的查询但从HDFS读取吗?还是其他选择?这是一次活动……是否值得创建一个超大型集群?这会提高性能还是解决我的错误?我曾考虑过尝试将文件分成更大的文件...但是我需要包含ID的唯一文件。
我想更改这些文件在S3中的聚合方式...但是我无能为力。
不相关