我是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);
这是一个好的做法吗?或者是否有其他机制用于此类要求?请帮忙。。。
检查Apache Kafka和Apache Flume。您可以聚合日志并将其移动到数据存储中。
我会亲自使用Flume。更易于使用imho。
如果你想使用mapreduce,我们有不同的方法可以实现
-
Hadoop档案,或称HAR文件,是一种将文件打包到HDFS中的文件归档工具块的效率更高,从而减少namenode内存的使用,同时仍然允许透明访问文件
-
CombineFileInputFormat在一定程度上缓解了这种情况能够很好地处理小文件。在FileInputFormat为每个文件创建拆分的情况下,CombineFileInputFormat将许多文件打包到每个拆分中,以便每个映射器都有更多要处理。至关重要的是,CombineFileInputFormat考虑了节点和机架的位置在决定将哪些块放置在同一拆分中时,这样就不会影响在典型的MapReduce作业中处理输入的速度。
-
避免多个小文件情况的一种技术是合并小文件通过使用SequenceFile将其转换为更大的文件:键可以用作文件名(如果不需要,也可以用作NullWritable等常量),值可以用作文件内容。