我可以这样做:
hadoop fs -text /path/to/result/of/many/reudcers/part* | hadoop fs -put - /path/to/concatenated/file/target.csv
但它将使HDFS文件通过网络进行流式传输。有没有一种方法可以告诉HDFS合并集群本身上的一些文件?
我遇到了和你类似的问题。这篇文章提供了许多HDFS文件合并选项,但它们都有一些细节。这个名单上没有人符合我的要求。希望这能对你有所帮助。
- HDFSconcat(实际上是FileSystem.concat())。不是那么老的API。要求原始文件的最后一个块已满
- MapReduce作业:我可能会采用一些基于此技术的解决方案,但设置起来很慢
- 复制合并-据我所见,这将是再次复制。但我还没有核实细节
- 文件压缩-再次,看起来像MapReduce
所以主要的结果是,若MapReduce的设置速度适合你们,并没有问题。如果您有实时需求,事情就会变得越来越复杂。
我的一个"疯狂"想法是使用HBase协处理器机制(端点)和文件块位置信息,因为我在同一集群上有HBase。如果"疯狂"这个词不能阻止你,看看这个:http://blogs.apache.org/hbase/entry/coprocessor_introduction