Apache spark ApacheSpark:如何从S3读取数百万(500万)个小文件(每个10kb)
我的目标概述:我需要找到包含特定ID的文件(它们是JSON格式的)。基本上需要返回ID和包含ID的文件名的DF(或列表)Apache spark ApacheSpark:如何从S3读取数百万(500万)个小文件(每个10kb),apache-spark,amazon-s3,amazon-emr,Apache Spark,Amazon S3,Amazon Emr,我的目标概述:我需要找到包含特定ID的文件(它们是JSON格式的)。基本上需要返回ID和包含ID的文件名的DF(或列表) // 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 fileSourc
// 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目录包含数百万(约500多万)个平均大小为10kb的文件。小文件问题!为此,我在EMR上构建了一个5节点集群(m4.xlarge),并使用齐柏林飞艇以交互方式运行上述代码
但是,在运行第一个spark语句(read)时,我不断遇到以下错误:
我很难找到更多关于上述错误的信息,但我怀疑这与我的spark工作向s3发出的请求有关
有人对如何处理这么多小文件有什么建议吗?我是否应该在EMR集群上从s3->HDFS执行s3 dist cp,然后运行上面的查询,但从HDFS读取?还是其他选择?这是一次性的活动…创建一个超大集群值得吗?这会提高性能还是解决我的错误?我曾考虑尝试将文件组合成更大的文件…但我需要包含ID的唯一文件
我很想改变这些文件在S3中聚合的方式……但对此我无能为力
注意:我在这里看到了一些帖子,但它们都是。另一个链接,但我认为这与我的无关,你是怎么做到的?在类似的情况下,你能解决吗?我也有同样的问题。目前在一些JSON上使用s3 dist cp,然后读取spark。但这确实是低效的。有更好的办法吗?@fletchr这个问题解决了吗?我也有同样的问题。不能更改s3上的文件(聚合)。您可以下载、合并(concat)文件并再次上载,这是唯一的解决方案(如果您想阅读s3)。最重要的一点是,无论如何,您都需要在特定时刻将这些文件上载到s3(无论是从本地主机还是从ec2实例)。因此,添加中间步骤以将这些文件合并到更大的文件不应该是一个问题。例如,使用12核的ec2实例,我能够在18分钟内合并35k文件(平均65GB)到350个更大的文件。这是最好的办法。
org.apache.thrift.transport.TTransportException at
org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:132)