我是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);
这是一个好习惯吗?或者是否有其他机制用于此类要求?请帮忙......
答案 0 :(得分:2)
检查Apache Kafka和Apache Flume。您可以聚合日志并随之移动到数据存储区。
我个人使用Flume。更容易使用imho。
答案 1 :(得分:0)
如果您想使用mapreduce,我们可以采用不同的方式
Hadoop Archives或HAR文件是一个文件存档工具,可将文件打包到HDFS中 更高效地阻止,从而减少名字节点内存使用,同时仍然允许 透明访问文件
设计的CombineFileInputFormat在某种程度上缓解了这种情况 与小文件一起使用。 FileInputFormat创建每个文件的拆分, CombineFileInputFormat将许多文件打包到每个拆分中,以便每个映射器都有更多 处理。至关重要的是,CombineFileInputFormat会考虑节点和机架的位置 当决定将哪些块放在同一个分区中时,所以它不会妥协 它可以在典型的MapReduce作业中处理输入的速度。
避免许多小文件的一种技术是合并小文件 使用SequenceFile将更大的文件放入更大的文件中:密钥可以充当文件名(如果不需要,可以作为NullWritable等常量),将值作为文件内容。