Apache Spark:如何从S3中读取数百万(5+百万)个小文件(每个10kb)

时间:2019-02-24 17:07:22

标签: apache-spark amazon-s3 amazon-emr

我的目标的简要概述:我需要找到包含特定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中的聚合方式...但是我无能为力。

注意:我在这里看到了一些帖子,但它们是quite old。另一个链接,但这与我的situation

不相关

0 个答案:

没有答案