我正在用Flume收集日志到hdfs。对于这个测试用例,我有一些小文件(~300kb),因为日志收集过程是按实际用途进行缩放的。有没有简单的方法将这些小文件合并成更大的文件,这些文件的大小接近hdfs块大小(64mb)?
ccrfmcuu1#
gnu-coreutils-split可以完成这项工作。如果源数据是行—在我的例子中是—并且一行在周围 84 bytes ,然后是hdfs块 64MB 可能包含在 800000 线:
84 bytes
64MB
800000
hadoop dfs -cat /sourcedir/* | split --lines=800000 - joined_ hadoop dfs -copyFromLocal ./joined_* /destdir/
或与 --line-bytes 选项:
--line-bytes
hadoop dfs -cat /sourcedir/* | split --line-bytes=67108864 - joined_ hadoop dfs -copyFromLocal ./joined_* /destdir/
4bbkushb2#
你应该看看media6degrees开源的文件破碎机。它可能有点过时,但您可以下载源代码并进行更改和/或贡献。jar和源位于:http://www.jointhegrid.com/hadoop_filecrush/index.jsp这本质上是一种用于合并小文件的map-reduce技术。
bvn4nwqk3#
我目前的解决方案是编写一个mapreduce作业,它实际上什么也不做,同时拥有数量有限的reducer。每个reducer都输出一个文件,因此将它们合并在一起。您可以在每行中添加原始文件的名称,以帮助显示文件的来源。我仍然有兴趣听到,如果有一个标准或证明是最好的方式做这件事,我不知道。
3条答案
按热度按时间ccrfmcuu1#
gnu-coreutils-split可以完成这项工作。
如果源数据是行—在我的例子中是—并且一行在周围
84 bytes
,然后是hdfs块64MB
可能包含在800000
线:或与
--line-bytes
选项:4bbkushb2#
你应该看看media6degrees开源的文件破碎机。它可能有点过时,但您可以下载源代码并进行更改和/或贡献。jar和源位于:http://www.jointhegrid.com/hadoop_filecrush/index.jsp
这本质上是一种用于合并小文件的map-reduce技术。
bvn4nwqk3#
我目前的解决方案是编写一个mapreduce作业,它实际上什么也不做,同时拥有数量有限的reducer。每个reducer都输出一个文件,因此将它们合并在一起。您可以在每行中添加原始文件的名称,以帮助显示文件的来源。
我仍然有兴趣听到,如果有一个标准或证明是最好的方式做这件事,我不知道。