小文件和hadoop / spark - 每个原始文件是一个单独的计算单位

时间:2014-10-25 23:39:01

标签: hadoop hdfs apache-spark

方案

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

然而,在我的情况下,我需要保留原始输入文件与其内容之间的关系 - 因为每个输入文件应该作为一个单元单独处理,在我的情况下,map-reduce作业由于自然而产生我的数据。

问题是:

  1. 如何在汇总文件中标记每个输入文件的边界?理想情况下,我将它们组织为键值对,关键是例如原始文件名,值为其内容。希望映射操作能够相应地无缝地使用它 - 每个键值对代表一个原始文件。如何最好地完成?

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

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

  4. 关于Apache Spark的注意事项

    我可能会使用Apache Spark个工作,而不是hadoop地图减少工作。我仍然可以在他们之间混合,例如如果初始文件聚合与hadoop更好地工作。

    最后

    许多答案讨论了相关方面,但其中很多/大部分是陈旧的,并不一定代表当今版本中的最佳方式,更不用说使用Spark执行此操作的方法,或将每个原始输入文件保存为离散单位。

    感谢您清除此消息!

1 个答案:

答案 0 :(得分:0)

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