java—为mapreduce输入组合大量小文件

3j86kqsm  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(251)

我是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);

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

nhaq1z21

nhaq1z211#

检查apache kafka和apache flume。您可以聚合日志并将其移动到数据存储区。
我会亲自使用Flume。更容易使用imho。

kq0g1dla

kq0g1dla2#

如果您想使用mapreduce,我们可以使用不同的方法
hadoop归档(har files)是一种文件归档工具,它可以更有效地将文件打包到hdfs块中,从而减少namenode内存的使用,同时仍然允许对文件进行透明访问
这种情况通过combinefileinputformat得到了一定程度的缓解,combinefileinputformat设计用于处理小文件。在fileinputformat为每个文件创建一个分割的地方,combinefileinputformat将许多文件打包到每个分割中,以便每个Map器有更多的文件要处理。最关键的是,combinefileinputformat在决定将哪些块放置在同一个剥离中时会考虑节点和机架位置,因此它不会影响在典型mapreduce作业中处理输入的速度。
避免多个小文件情况的一种技术是通过使用sequencefile将小文件合并到较大的文件中:键可以作为文件名(或者一个常量,如nullwriteable,如果不需要的话),值可以作为文件内容。

相关问题