hadoop - 合并 hdfs 文件

标签 hadoop hdfs

我在 HDFS 中有 1000 多个文件可用,命名约定为 1_fileName.txtN_fileName.txt。每个文件的大小为 1024 MB。 我需要将这些文件合并到一个(HDFS)中并保持文件的顺序。说 5_FileName.txt 应该只追加在 4_fileName.txt

之后

执行此操作的最佳和最快方法是什么。

有没有什么方法可以在不复制数据节点之间的实际数据的情况下执行这种合并?例如:获取此文件的 block 位置并使用这些 block 位置在名称节点中创建一个新条目(文件名)?

最佳答案

没有有效的方法可以做到这一点,您需要将所有数据移动到一个节点,然后再返回到 HDFS。

执行此操作的命令行脚本如下所示:

hadoop fs -text *_fileName.txt | hadoop fs -put - targetFilename.txt

这会将与 glob 匹配的所有文件抓取到标准输出,然后您将该流通过管道传输到 put 命令并将流输出到名为 targetFilename.txt 的 HDFS 文件

你遇到的唯一问题是你所追求的文件名结构——如果你有固定的宽度,用零填充数字部分会更容易,但在它的当前状态下你会得到一个意想不到的字典顺序 (1, 10, 100、1000、11、110 等)而不是数字顺序(1、2、3、4 等)。您可以通过将 scriptlet 修改为:

hadoop fs -text [0-9]_fileName.txt [0-9][0-9]_fileName.txt \
    [0-9][0-9[0-9]_fileName.txt | hadoop fs -put - targetFilename.txt

关于hadoop - 合并 hdfs 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14831117/

相关文章:

sorting - setOutputKeyComparator - Mapreduce 二次排序(ValueGrouping 之后)

apache-spark - 来自边缘节点 Jupyter 笔记本的 spark jdbc 连接

java - 在CountingBloomFilter Hadoop中添加 key

hadoop - hdfs列表并选择最新的更新文件

hadoop - 如何在不将整个文件下载到本地磁盘的情况下下载 tar.gz 并将其打包到 hdfs?

java - 运行start-dfs.sh后无法启动namenode(hadoop 2.7.1)

hadoop - 如何从映射器向驱动程序报告一个值?

performance - 如何调整配置单元以查询元数据?

hadoop - 为Kafka主题创建Hive Table Producer

hadoop - HDInsight hadoop-mapreduce-examples.jar 输出在哪里?