【发布时间】:2014-10-25 23:39:01
【问题描述】:
场景
我有一个场景,我想以可扩展的方式处理包含许多小文件(平均输入文件大小约为 0.7MB)的数据。由于这不应该与hdfs 和许多小文件due to the "small files problem" 一起使用,我想我会将一种类型的所有输入文件(我们称之为 A 型)合并到一个 hdfs 文件中,以及另一种类型的文件(让我们调用它将 B) 键入另一个 hdfs 文件,依此类推。
但是,在我的情况下,我需要保留原始输入文件与其内容之间的关系 - 因为每个输入文件应作为一个单元单独处理,在我的情况下,在 map-reduce 作业中,由性质引起我的数据。
问题是:
-
我应该如何标记每个输入文件的 边界 在它进入的聚合文件中?理想情况下,我会将它们组织为键值对,键是例如原始文件名,值是它的内容。希望 map 操作能够相应地无缝使用它——每个键值对代表一个原始文件。怎么做到最好?
-
如果需要特殊处理,我将如何处理 二进制 输入文件的情况?
-
假设 B 类型的文件如上所述聚合到一个文件中,并且映射操作的目标只是从每个原始输入文件创建一个大小相似的输出,那么创建聚合输出文件 C 的最佳方法是什么包括所有这些输出?我大约一半的工作只会做映射,不会减少......
关于 Apache Spark 的注意事项
我可能会使用Apache Spark 作业而不是hadoop map reduce 作业。我仍然可以在它们之间混合,例如如果初始文件聚合使用 hadoop 效果更好。
终于
许多答案讨论了相关方面,但其中许多/大多数都是旧的,不一定代表当今版本中的最佳方法,更不用说使用Spark 执行此操作的方法,或者将每个原始输入文件保留为离散单元.
感谢您解决这个问题!
【问题讨论】:
-
我很想知道您是否已经得出关于将二进制文件作为离散工作单元处理的任何结论。唯一合适的方法是编写一个从
FileInputFormat扩展的自定义类,它返回一个代表文件全部内容的InputSplit。 -
我也有同样的想法,但目前还没有尝试过这部分!
标签: hadoop hdfs apache-spark