6

我正在使用 Flume 将日志收集到 HDFS。对于测试用例,我有小文件(~300kB),因为日志收集过程已针对实际使用进行了扩展。

有没有什么简单的方法可以将这些小文件组合成更接近 HDFS 块大小(64MB)的大文件?

4

3 回答 3

5

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/
于 2010-12-13T15:02:10.080 回答
3

我目前的解决方案是编写一个 MapReduce 作业,它实际上什么都不做,同时具有有限数量的 reducer。每个 reducer 都会输出一个文件,因此这会将它们组合在一起。您可以在每一行中添加原始文件的名称,以帮助显示它的来源。

我仍然有兴趣了解是否有我不知道的标准或经过验证的最佳方法。

于 2010-12-13T15:18:27.733 回答
3

你应该看看由 media6degrees 开源的 File Crusher。它可能有点过时,但您可以下载源代码并进行更改和/或贡献。JAR 和源代码位于:http ://www.jointhegrid.com/hadoop_filecrush/index.jsp

这本质上是一种用于合并小文件的 map-reduce 技术。

于 2012-04-22T14:35:42.197 回答