Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark ApacheSpark:如何从S3读取数百万(500万)个小文件(每个10kb)_Apache Spark_Amazon S3_Amazon Emr - Fatal编程技术网

Apache spark ApacheSpark:如何从S3读取数百万(500万)个小文件(每个10kb)

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

我的目标概述:我需要找到包含特定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 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)