【问题标题】:Merging compressed files on HDFS合并 HDFS 上的压缩文件
【发布时间】:2015-05-06 13:56:50
【问题描述】:

我如何将 HDFS 上一个目录中的所有文件(我知道全部压缩)合并到一个压缩文件中,不通过本地计算机复制数据?例如,但不一定,使用 Pig?

例如,我有一个文件夹 /data/input,其中包含文件 part-m-00000.gz 和 part-m-00001.gz。现在我想将它们合并到一个文件/data/output/foo.gz

【问题讨论】:

    标签: hadoop compression apache-pig hdfs


    【解决方案1】:

    我建议查看 FileCrush (https://github.com/edwardcapriolo/filecrush),这是一个使用 MapReduce 在 HDFS 上合并文件的工具。它完全符合您的描述,并提供了几个选项来处理压缩和控制输出文件的数量。

      Crush --max-file-blocks XXX /data/input /data/output
    

    max-file-blocks 表示每个输出文件的最大 dfs 块数。例如,根据文档:

    默认值8,80个小文件,每个是dfs的1/10 由于 8 * 1/10 = 8,块将被分组到单个输出文件中 dfs 块。如果有 81 个小文件,每个是 dfs 的 1/10 块,将创建两个输出文件。一个输出文件包含 41个文件的组合内容,第二个将包含组合的 其他 40 个的内容。一个包含许多小文件的目录将是 转换为更少数量的较大文件,其中每个输出文件 大小差不多。

    【讨论】:

      【解决方案2】:

      如果您将 Parallel 设置为 1 - 那么您将拥有单个输出文件。 这可以通过两种方式完成:

      1. 在你的猪中添加 set default_parallel 20; 但请注意,这会影响你猪中的一切
      2. 为单个操作更改并行 - 如DISTINCT ID PARALLEL 1;

      可以阅读更多关于Parallel Features的信息

      【讨论】:

        【解决方案3】:

        我知道有一个选项可以使用“hdfs dfs -getMerge”命令合并到本地文件系统。也许您可以使用它来合并到本地文件系统,然后使用“hdfs dfs -copyFromLocal”命令将其复制回 hdfs。

        【讨论】:

        • 但我想避免将数据来回传输到本地文件系统。
        猜你喜欢
        • 1970-01-01
        • 2017-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-02
        • 1970-01-01
        • 2017-06-17
        相关资源
        最近更新 更多