如何使用Snappy压缩将文件放入HDFS

时间:2016-08-03 11:33:44

标签: hadoop compression hdfs snappy

我正在为一个客户端工作,我应该使用Snappy压缩将一些文件放到HDFS中。我的问题是在mapred-site.xmlhdfs-site.xml

中未定义snappy编解码器

不知何故,我必须使用hdfs put命令放置文件,并且应该压缩它们。没有机会更改配置文件,因为它是生产机器和其他人主动使用它。

另一个建议的解决方案是在不压缩的情况下将文件导入HDFS,然后使用压缩创建hive外部表,并在删除未压缩文件时使用其源文件。但这还有很长的路要走,并不能保证有效。

对于使用hdfs put使用某种参数来压缩文件,我们将不胜感激。

3 个答案:

答案 0 :(得分:2)

我建议您编写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 \

答案 1 :(得分:1)

假设您在hdfs中有一个未压缩的Spark日志文件,但您想打开spark.eventLog.compress true中的spark-defaults.conf并继续压缩旧日志。 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

答案 2 :(得分:-1)

我们在某些情况下解决了此问题

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

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

    用于gzip压缩

  3. 此后,使用以下命令 XXDF.write.parquet("your_path")将通过快速压缩保存