结合大量小文件进行mapreduce输入

时间:2013-11-30 05:56:44

标签: java hadoop mapreduce

我是Hadoop&的新手MapReduce。我们正在开发一个网络监控工具(在java中)。我们定期收集被监控设备的各种信息,比如每5秒收集一次。并通过java客户端将这些信息作为新文件写入HDFS(因为我们没有使用hdfs附加功能)。在HDFS中,我们的数据组织将是这样的:

/monitored_info
      /f1.txt
      /f2.txt
      .......
      /f1020010.txt

因此每个文件的大小通常小于2KB。 我知道每个地图任务最多可以占用1个文件,并且它会像地图任务一样产生,并且作业效率低下。为了摆脱这种情况,我们在提交工作之前使用了FileUtil的合并工具:

FileUtil.copyMerge(fileSystem, new Path("monitored_info"), fileSystem,
                new Path("mapInputfile"), false, conf, null);

这是一个好习惯吗?或者是否有其他机制用于此类要求?请帮忙......

2 个答案:

答案 0 :(得分:2)

检查Apache KafkaApache Flume。您可以聚合日志并随之移动到数据存储区。

我个人使用Flume。更容易使用imho。

答案 1 :(得分:0)

如果您想使用mapreduce,我们可以采用不同的方式

  1. Hadoop Archives或HAR文件是一个文件存档工具,可将文件打包到HDFS中 更高效地阻止,从而减少名字节点内存使用,同时仍然允许 透明访问文件

  2. 设计的CombineFileInputFormat在某种程度上缓解了这种情况 与小文件一起使用。 FileInputFormat创建每个文件的拆分, CombineFileInputFormat将许多文件打包到每个拆分中,以便每个映射器都有更多 处理。至关重要的是,CombineFileInputFormat会考虑节点和机架的位置 当决定将哪些块放在同一个分区中时,所以它不会妥协 它可以在典型的MapReduce作业中处理输入的速度。

  3. 避免许多小文件的一种技术是合并小文件 使用SequenceFile将更大的文件放入更大的文件中:密钥可以充当文件名(如果不需要,可以作为NullWritable等常量),将值作为文件内容。