使用 spark 保存和处理大量小文件

Save and Process huge amount of small files with spark

我是大数据新手!我有一些关于如何在 EMR 集群上的 spark 中处理和保存大量小文件(pdf 和 ppt/pptx)的问题。

我的目标是将数据(pdf 和 pptx)保存到 HDFS(或集群中的某种类型的数据存储中),然后从 spark 中提取此文件的内容并将其保存在 elasticsearch 或某些关系数据库中。

  1. 我看过HDFS保存数据时文件小的问题。保存大量 pdf 和 pptx 文件(最大大小 100-120 MB)的最佳方法是什么?我读过有关序列文件和 HAR(hadoop 存档)的内容,但其中 none 我不明白它到底是如何工作的,我也不知道什么是最好的。

  2. 处理这些文件的最佳方法是什么?我知道有些解决方案可能是 FileInputFormat 或 CombineFileInputFormat 但我还是不知道它是如何工作的。我知道不能 运行 每个小文件都在单独的任务上,因为集群将处于瓶颈情况。

谢谢!

如果您使用 Object 存储(如 S3)而不是 HDFS,则无需对您的文件应用任何更改或转换,您可以将它们作为一个单独的 object 或blob(这也意味着它们可以使用标准工具轻松读取,无需使用自定义 类 或代码解包或重新格式化)。 然后,您可以使用 python 工具(例如 boto(适用于 s3))读取文件,或者如果您正在使用 wholeTextFile 或 binaryFiles 命令使用 spark,然后制作 BytesIO (python) / ByteArrayInputStream (java) 使用标准库阅读它们。

2) 在处理文件时,你有项目和分区的区别。如果您有 10000 个文件,则可以创建 100 个分区,每个分区包含 100 个文件。由于 header 信息是相关的并且每个文件可能不同,因此每个文件都需要一次处理一个。

与此同时,我找到了一些解决 HDFS 中小文件问题的方法。我可以使用以下方法:

  1. HDFS Federation 帮助我们分配namenodes的负载:https://hortonworks.com/blog/an-introduction-to-hdfs-federation/

  2. 如果您的文件不是太大,HBase 也是一个不错的选择。

There are practical limits to the size of values (e.g., storing 10-50MB objects in HBase would probably be too much to ask); search the mailing list for conversations on this topic. All rows in HBase conform to the Data Model, and that includes versioning. Take that into consideration when making your design, as well as block size for the ColumnFamily. https://hbase.apache.org/book.html

  1. Apache Ozone 是类似于 S3 的对象存储,但在本地。在撰写本文时,据我所知,Ozone 尚未准备好投入生产。 https://hadoop.apache.org/ozone/