spark emr s3处理大量文件

vfhzx4xs  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(408)

我在s3中有大约15000个文件(orc),其中每个文件包含几分钟的数据,每个文件的大小在300-700mb之间变化。
由于在yyyy/mm/dd/hh24/min格式的目录中递归循环开销很大,我正在创建一个文件,其中包含给定日期的所有s3文件的列表(objects\u 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")

集群的大小是10台r3.4x1大型计算机(worker)(其中每个节点:120gbram和16个核),master的配置是m3.2xlarge(
我面临的问题是,spark read无休止地运行,我只看到驱动程序在工作,其余所有节点都没有做任何事情,也不知道为什么驱动程序要打开每个s3文件进行读取,因为afaik spark工作得很懒,所以直到一个动作被称为reading时才应该发生,我认为它列出了每个文件并收集了一些与之相关的元数据。
但为什么只有驱动程序在工作而其余的节点什么都不做,我如何使这个操作在所有工作节点上并行运行呢?
我偶然看到这些文章https://tech.kinja.com/how-not-to-pull-from-s3-using-apache-spark-1704509219 以及https://gist.github.com/snowindy/d438cb5256f9331f5eec,但在这里,整个文件内容都作为rdd读取,但我的用例取决于引用的列,只有那些数据块/列应该从s3中获取(orc提供的列访问是我的存储)。s3中的文件有大约130个列,但只有20个字段被引用并使用DataFrameAPI进行处理

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

您可以在下面看到,只有一个执行器在其中一个任务节点(集群模式)上运行to-driver程序,而其他节点(即worker)的cpu为0%,即使在处理了3-4个小时之后,由于需要处理大量文件,情况也是一样的

关于如何避免这个问题,即加快加载和进程,有什么建议吗?

ep6jt1vc

ep6jt1vc1#

有一个解决方案,可以帮助你在aws胶水的基础上。
在s3中有很多文件被分区。但是你有基于时间戳的分区。因此,使用胶水,您可以使用s3中的对象,如emr中的“Hive表”。
首先,您需要使用版本5.8+创建一个电子病历,您将能够看到:

您可以通过选中两个选项来设置此选项。这将允许访问aws胶水数据目录。
在此之后,您需要将您的根文件夹添加到aws glue目录中。快速的方法是使用胶水爬虫。此工具将对数据进行爬网,并根据需要创建目录。
我建议你看看这里。
在爬虫程序运行之后,您可以在aws athena看到目录中的表的元数据。
在雅典娜你可以检查你的数据是否被爬虫正确识别。
这个解决方案将使你的Spark工程接近一个真正的hdfs。由于元数据将正确地存在于数据目录中。应用程序查找“索引”所花的时间将使作业运行得更快。
在这里,我能够改进查询,而使用胶水处理分区则更好。所以,试一试这可能会对表演有所帮助。

相关问题