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

时间:2016-12-09 10:20:37

标签: hadoop apache-spark hdfs amazon-emr

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

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

  1. 我在HDFS中保存数据时已经读过小文件的问题。保存大量PDF格式的最佳方法是什么? pptx文件(格式大小为100-120 MB)?我读过关于序列文件和HAR(hadoop档案)但没有一个我不明白它是如何工作的,我不知道什么是最好的。

  2. 处理此文件的最佳方法是什么?我知道有些解决方案可能是FileInputFormat或CombineFileInputFormat但我又不知道它究竟是如何工作的。我知道无法在分离的任务上运行每个小文件,因为集群将被置于瓶颈状态。

  3. 谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

  1. HDFS联合会帮助我们分配名称节点的负载:https://hortonworks.com/blog/an-introduction-to-hdfs-federation/

  2. 如果您的文件大小不太大,
  3. HBase可能也是不错的选择。

  

值的大小有实际限制(例如,在HBase中存储10-50MB对象可能会要求太多);在邮件列表中搜索有关此主题的对话。 HBase中的所有行均符合数据模型,其中包括版本控制。设计时要考虑到这一点,以及ColumnFamily的块大小。   https://hbase.apache.org/book.html

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