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

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

因此,每个文件的大小通常小于2KB。
我知道每个 map task 最多可以占用1个文件,它将生成与 map task 一样多的文件,并且该工作效率很低。为了解决这个问题,我们在提交作业之前使用了FileUtil的合并工具:
FileUtil.copyMerge(fileSystem, new Path("monitored_info"), fileSystem,
                new Path("mapInputfile"), false, conf, null);

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

最佳答案

检查Apache KafkaApache Flume。您可以汇总日志并与它们一起移动到数据存储中。

我会亲自使用Flume。更容易使用恕我直言。

关于java - 合并大量小文件以进行mapreduce输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20297108/

10-11 22:30
查看更多