【问题标题】:Concatenating multiple text files into one very large file in HDFS在 HDFS 中将多个文本文件连接成一个非常大的文件
【发布时间】:2016-12-29 23:31:30
【问题描述】:

我有多个文本文件。 它们的总大小超过了我可用的最大磁盘大小(~1.5TB)

Spark 程序从 HDFS 读取单个输入文本文件。所以我需要将这些文件合并为一个。 (我无法重新编写程序代码。我只获得了 *.jar 文件来执行)

HDFS 有这样的能力吗?我怎样才能做到这一点?

【问题讨论】:

    标签: hadoop


    【解决方案1】:

    我从您的问题中了解到,您想将多个文件合并为一个。这是一个解决方案,它可能不是最有效的方法,但它确实有效。假设您有两个文件:file1file2,并且您希望获得一个组合文件为 ConcatenatedFile .这是脚本。

    hadoop fs -cat /hadoop/path/to/file/file1.txt /hadoop/path/to/file/file2.txt | hadoop fs -put - /hadoop/path/to/file/Concatenate_file_Folder/ConcatenateFile.txt
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      HDFS 本​​身不提供此类功能。所有开箱即用的功能(例如带有管道的hdfs dfs -text *FileUtil 的复制方法)都使用您的客户端服务器来传输所有数据。

      根据我的经验,我们总是使用自己编写的 MapReduce 作业以分布式方式合并 HDFS 中的许多小文件。

      所以你有两个解决方案:

      1. 编写您自己的简单 MapReduce/Spark 作业以将文本文件与 你的格式。
      2. 查找已实施的此类解决方案 目的。

      关于解决方案#2:有一个简单的项目FileCrush 用于在HDFS 中组合文本或序列文件。它可能适合你,检查一下。

      使用示例:

      hadoop jar filecrush-2.0-SNAPSHOT.jar crush.Crush -Ddfs.block.size=134217728  \
        --input-format=text  \
        --output-format=text \
        --compress=none \
        /input/dir /output/dir 20161228161647 
      

      如果没有这些选项(尤其是 -Ddfs.block.size 和输出文件日期前缀 20161228161647),我在运行它时遇到了问题,因此请确保正确运行它。

      【讨论】:

        【解决方案3】:

        你可以做猪的工作:

        A = LOAD '/path/to/inputFiles' as (SCHEMA);
        STORE A into '/path/to/outputFile';
        

        执行 hdfs cat 然后将其放回到 hdfs 意味着,所有这些数据都在客户端节点中处理,并且会降低您的网络性能

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多