我是hadoop&mapreduce的新手,我们正在开发一个网络监控工具(java),我们定期收集被监控设备的各种信息,比如说每5秒钟收集一次。并通过java客户端将这些信息作为新文件写入hdfs(因为我们不使用hdfs append工具)
/monitored_info
/f1.txt
/f2.txt
.......
/f1020010.txt
因此,每个文件的大小通常小于2kb。我知道每个Map任务可以采取多达1个文件,它将产生尽可能多的Map任务和工作效率将是低效的。为了解决这个问题,我们在提交作业之前使用了fileutil的合并功能:
FileUtil.copyMerge(fileSystem, new Path("monitored_info"), fileSystem,
new Path("mapInputfile"), false, conf, null);
这是个好习惯吗?或者是否有其他机制用于此类要求?请帮忙。。。
2条答案
按热度按时间nhaq1z211#
检查apache kafka和apache flume。您可以聚合日志并将其移动到数据存储区。
我会亲自使用Flume。更容易使用imho。
kq0g1dla2#
如果您想使用mapreduce,我们可以使用不同的方法
hadoop归档(har files)是一种文件归档工具,它可以更有效地将文件打包到hdfs块中,从而减少namenode内存的使用,同时仍然允许对文件进行透明访问
这种情况通过combinefileinputformat得到了一定程度的缓解,combinefileinputformat设计用于处理小文件。在fileinputformat为每个文件创建一个分割的地方,combinefileinputformat将许多文件打包到每个分割中,以便每个Map器有更多的文件要处理。最关键的是,combinefileinputformat在决定将哪些块放置在同一个剥离中时会考虑节点和机架位置,因此它不会影响在典型mapreduce作业中处理输入的速度。
避免多个小文件情况的一种技术是通过使用sequencefile将小文件合并到较大的文件中:键可以作为文件名(或者一个常量,如nullwriteable,如果不需要的话),值可以作为文件内容。