【问题标题】:Small files and hadoop/spark - each original file being a single unit of computation小文件和 hadoop/spark - 每个原始文件都是一个计算单元
【发布时间】:2014-10-25 23:39:01
【问题描述】:

场景

我有一个场景,我想以可扩展的方式处理包含许多小文件(平均输入文件大小约为 0.7MB)的数据。由于这不应该与hdfs 和许多小文件due to the "small files problem" 一起使用,我想我会将一种类型的所有输入文件(我们称之为 A 型)合并到一个 hdfs 文件中,以及另一种类型的文件(让我们调用它将 B) 键入另一个 hdfs 文件,依此类推。

但是,在我的情况下,我需要保留原始输入文件与其内容之间的关系 - 因为每个输入文件应作为一个单元单独处理,在我的情况下,在 map-reduce 作业中,由性质引起我的数据。

问题是:

  1. 我应该如何标记每个输入文件的 边界 在它进入的聚合文件中?理想情况下,我会将它们组织为键值对,键是例如原始文件名,值是它的内容。希望 map 操作能够相应地无缝使用它——每个键值对代表一个原始文件。怎么做到最好?

  2. 如果需要特殊处理,我将如何处理 二进制 输入文件的情况?

  3. 假设 B 类型的文件如上所述聚合到一个文件中,并且映射操作的目标只是从每个原始输入文件创建一个大小相似的输出,那么创建聚合输出文件 C 的最佳方法是什么包括所有这些输出?我大约一半的工作只会做映射,不会减少......

关于 Apache Spark 的注意事项

我可能会使用Apache Spark 作业而不是hadoop map reduce 作业。我仍然可以在它们之间混合,例如如果初始文件聚合使用 hadoop 效果更好。

终于

许多答案讨论了相关方面,但其中许多/大多数都是旧的,不一定代表当今版本中的最佳方法,更不用说使用Spark 执行此操作的方法,或者将每个原始输入文件保留为离散单元.

感谢您解决这个问题!

【问题讨论】:

  • 我很想知道您是否已经得出关于将二进制文件作为离散工作单元处理的任何结论。唯一合适的方法是编写一个从 FileInputFormat 扩展的自定义类,它返回一个代表文件全部内容的 InputSplit
  • 我也有同样的想法,但目前还没有尝试过这部分!

标签: hadoop hdfs apache-spark


【解决方案1】:

您的文件是否需要存储在 HDFS 上?你能从 S3 中读取它们吗? Spark 支持从 S3 读取文件,这可以让您绕过这个问题。

【讨论】:

  • 好吧,您似乎还没有解决大部分问题...当然可以导入文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 2017-06-14
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
相关资源
最近更新 更多