Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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
Hadoop Spark EMR S3处理大量文件_Hadoop_Apache Spark_Amazon S3_Emr_Amazon Emr - Fatal编程技术网

Hadoop Spark EMR S3处理大量文件

Hadoop Spark EMR S3处理大量文件,hadoop,apache-spark,amazon-s3,emr,amazon-emr,Hadoop,Apache Spark,Amazon S3,Emr,Amazon Emr,我在S3中有大约15000个文件(ORC),其中每个文件包含几分钟的数据,每个文件的大小在300-700MB之间变化 由于递归循环遍历YYYY/MM/DD/HH24/MIN格式的目录非常昂贵,因此我正在创建一个文件,其中包含给定日期的所有S3文件列表(objects_list.txt),并将此文件作为输入传递给spark read API val file_list = scala.io.Source.fromInputStream(getClass.getResourceAsStream("/

我在S3中有大约15000个文件(ORC),其中每个文件包含几分钟的数据,每个文件的大小在300-700MB之间变化

由于递归循环遍历YYYY/MM/DD/HH24/MIN格式的目录非常昂贵,因此我正在创建一个文件,其中包含给定日期的所有S3文件列表(objects_list.txt),并将此文件作为输入传递给spark read API

val file_list = scala.io.Source.fromInputStream(getClass.getResourceAsStream("/objects_list.txt"))
val paths: mutable.Set[String] = mutable.Set[String]()
    for (line <- file_list.getLines()) {
      if(line.length > 0 && line.contains("part"))
        paths.add(line.trim)
    }

val eventsDF = spark.read.format("orc").option("spark.sql.orc.filterPushdown","true").load(paths.toSeq: _*)
eventsDF.createOrReplaceTempView("events")
您可以在下面看到,只有一个执行器正在其中一个任务节点(集群模式)上运行to驱动程序,而其他节点(即工作节点)上的CPU为0%,即使在处理3-4小时后,由于需要处理大量文件,情况也是一样的


关于如何避免这个问题,即加快加载和处理速度,有什么建议吗?

有一个解决方案可以帮助您基于AWS Glue

在S3中有很多文件被分区。但是您有基于时间戳的分区。因此,使用glue,您可以使用S3中的对象,如EMR中的“配置单元表”

首先,您需要使用5.8+版本创建一个EMR,您将能够看到:

您可以通过选中这两个选项来设置此选项。这将允许访问AWS Glue数据目录

在此之后,您需要将根文件夹添加到AWS Glue目录中。快速的方法是使用胶水爬行器。此工具将对数据进行爬网,并根据需要创建目录

我建议你去看看

爬虫程序运行后,您可以在目录中看到表的元数据

在雅典娜,你可以检查你的数据是否被爬虫正确识别

此解决方案将使您的spark接近真正的HDFS。由于元数据将正确地保存在数据目录中。应用程序查找“索引”所用的时间将使作业运行得更快


在这里使用它,我能够改进查询,而使用胶水处理分区要好得多。因此,请尝试一下,这可能有助于提高性能。

感谢您提供详细的答案。但是除了AWS Glue还有其他通用解决方案吗?如果有人在GCE或Azure上运行他们的应用程序呢,我认为这是一个非常常见的问题,人们可能正在做一些事情来摆脱这个瓶颈,有兴趣了解这个解决方案。在另一个注释中,是否有关于如何从EMR中引用/连接到Glue catalog表的参考资料,他们的文档中没有任何示例/示例,但这并不多。如果您创建了一个EMR集群,请检查以上两项。使用spark可以在指向配置单元表时指向该表。就像这样使用:
val myDf=spark.table(“database.table”)
您就有了您的数据框架。刚才检查了,我的输入数据所在的新加坡还没有胶水,还有其他方法吗?将尝试创建配置单元元数据,但还有其他方法吗?这很难说:(您可以尝试通过指向S3存储桶的配置单元创建外部表。这也可以帮助您。
Sample Log Messages:
17/10/08 18:31:15 INFO S3NativeFileSystem: Opening 's3://xxxx/flattenedDataOrc/data=eventsTable/y=2017/m=09/d=20/h=09/min=00/part-r-00199-e4ba7eee-fb98-4d4f-aecc-3f5685ff64a8.zlib.orc' for reading
17/10/08 18:31:15 INFO S3NativeFileSystem: Opening 's3://xxxx/flattenedDataOrc/data=eventsTable/y=2017/m=09/d=20/h=19/min=00/part-r-00023-5e53e661-82ec-4ff1-8f4c-8e9419b2aadc.zlib.orc' for reading