【问题标题】:How to put file to HDFS with Snappy compression如何使用 Snappy 压缩将文件放入 HDFS
【发布时间】:2016-08-03 11:33:44
【问题描述】:

我正在为一个客户工作,我应该使用 Snappy 压缩将一些文件放入 HDFS。我的问题是在 mapred-site.xmlhdfs-site.xml 中没有定义 snappy 编解码器

不知何故,我必须最好使用hdfs put 命令来放置文件,并且它们应该被压缩。没有机会更改配置文件,因为它是生产机器并且其他人正在积极使用它。

另一个建议的解决方案是将文件导入 HDFS 而不进行压缩,然后创建带压缩的配置单元外部表,并在删除未压缩文件的同时使用其源文件。但这还有很长的路要走,而且不能保证一定会奏效。

任何关于使用带有某种参数的hdfs put 来压缩文件的建议都将不胜感激。

【问题讨论】:

  • 这是不可能的,put 只是移动数据。

标签: hadoop compression hdfs snappy


【解决方案1】:

我建议您编写 map-reduce 作业来压缩 hdfs 中的数据。不知道有没有办法对hadoop put操作做自动压缩,但是假设不存在。一种选择是放置已经压缩的文件:

snzip file.tar
hdfs dfs -put file.tar.sz /user/hduser/test/

另一种方法是在 mapreduce 作业中压缩它。作为一个选项,您可以使用 hadoop 流 jar 来压缩 hdfs 中的文件:

hadoop jar $HADOOP_HOME/contrib/streaming/hadoop-streaming-0.20.2-cdh3u2.jar \
-Dmapred.output.compress=true \
-Dmapred.compress.map.output=true \
-Dmapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec \
-Dmapred.reduce.tasks=0 \
-input <input-path> \
-output $OUTPUT \

【讨论】:

    【解决方案2】:

    假设您在 hdfs 中有一个未压缩的 Spark 日志文件,但您想在 spark-defaults.conf 中打开 spark.eventLog.compress true 并继续压缩旧日志。 map-reduce 方法最有意义,但您也可以使用以下方法:

    snzip -t hadoop-snappy local_file_will_end_in_dot_snappy
    

    然后直接上传放上去。

    安装 snzip 可能如下所示:

    sudo yum install snappy snappy-devel
    curl -O https://dl.bintray.com/kubo/generic/snzip-1.0.4.tar.gz
    tar -zxvf snzip-1.0.4.tar.gz
    cd snzip-1.0.4
    ./configure
    make
    sudo make install
    

    单个文件的往返行程可能是:

    hdfs dfs -copyToLocal /var/log/spark/apps/application_1512353561403_50748_1 .
    snzip -t hadoop-snappy application_1512353561403_50748_1
    hdfs dfs -copyFromLocal application_1512353561403_50748_1.snappy /var/log/spark/apps/application_1512353561403_50748_1.snappy
    

    或者gohdfs:

    hdfs cat /var/log/spark/apps/application_1512353561403_50748_1 \
    | snzip -t hadoop-snappy > zzz
    hdfs put zzz /var/log/spark/apps/application_1512353561403_50748_1.snappy
    rm zzz
    

    【讨论】:

      【解决方案3】:

      我们通过一些场景来解决这个问题

      1. 如果是 rdd,则将其转换为数据帧,例如。 RDD.toDF 不需要参数,以防您想指定列名 你可以通过rdd.toDF("c1","c2","c3")
      2. 转换为 DF 后,假设您想将其设置为具有快速压缩的 parquet 文件格式,您需要使用 sqlContext

        sqlContext.setConf("spark.parquet.commpression.codec","snappy")
        sqlContext.setConf("spark.parquet.commpression.codec","gzip") 
        

        用于gzip压缩

      3. 在此之后使用以下命令 XXDF.write.parquet("your_path") 它将被快速压缩保存

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-27
        • 1970-01-01
        相关资源
        最近更新 更多