我正在使用 Flume 将日志收集到 HDFS。对于测试用例,我有小文件(~300kB),因为日志收集过程已针对实际使用进行了扩展。
有没有什么简单的方法可以将这些小文件组合成更接近 HDFS 块大小(64MB)的大文件?
GNU coreutils split可以完成这项工作。
如果源数据是行 - 在我的情况下是 - 并且一行是 around 84 bytes
,那么 HDFS 块64MB
可能包含 around800000
行:
hadoop dfs -cat /sourcedir/* | split --lines=800000 - joined_
hadoop dfs -copyFromLocal ./joined_* /destdir/
或--line-bytes
选项:
hadoop dfs -cat /sourcedir/* | split --line-bytes=67108864 - joined_
hadoop dfs -copyFromLocal ./joined_* /destdir/
我目前的解决方案是编写一个 MapReduce 作业,它实际上什么都不做,同时具有有限数量的 reducer。每个 reducer 都会输出一个文件,因此这会将它们组合在一起。您可以在每一行中添加原始文件的名称,以帮助显示它的来源。
我仍然有兴趣了解是否有我不知道的标准或经过验证的最佳方法。
你应该看看由 media6degrees 开源的 File Crusher。它可能有点过时,但您可以下载源代码并进行更改和/或贡献。JAR 和源代码位于:http ://www.jointhegrid.com/hadoop_filecrush/index.jsp
这本质上是一种用于合并小文件的 map-reduce 技术。