我正在使用Flume将日志收集到HDFS。对于测试用例,我有小文件(~300kB),因为日志收集过程是按实际用途缩放的。
有没有简单的方法将这些小文件组合成更接近HDFS块大小(64MB)的较大文件?
答案 0 :(得分:5)
GNU coreutils split 可以完成这项工作。
如果源数据是行 - 在我的情况下它们是 - 并且一行在84 bytes
附近,则HDFS块64MB
可以包含大约800000
行:
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/
答案 1 :(得分:3)
我目前的解决方案是编写一个MapReduce作业,它可以有效地执行任何操作,同时使用有限数量的reducer。每个reducer都会输出一个文件,因此将它们拼凑在一起。您可以在每行中添加原始文件的名称,以帮助显示它来自何处。
我仍然有兴趣听听是否有一种我不了解的标准或经过验证的最佳方法。
答案 2 :(得分:3)
你应该看一下media6degrees开源的File Crusher。它可能有点过时,但您可以下载源并进行更改和/或贡献。 JAR和Source位于:http://www.jointhegrid.com/hadoop_filecrush/index.jsp
这实际上是一种用于合并小文件的map-reduce技术。