我正在为一个客户端工作,我应该使用Snappy压缩将一些文件放到HDFS中。我的问题是在mapred-site.xml
或hdfs-site.xml
不知何故,我必须使用hdfs put
命令放置文件,并且应该压缩它们。没有机会更改配置文件,因为它是生产机器和其他人主动使用它。
另一个建议的解决方案是在不压缩的情况下将文件导入HDFS,然后使用压缩创建hive外部表,并在删除未压缩文件时使用其源文件。但这还有很长的路要走,并不能保证有效。
对于使用hdfs put
使用某种参数来压缩文件,我们将不胜感激。
答案 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)
我们在某些情况下解决了此问题
RDD.toDF
不需要参数
您可以通过rdd.toDF("c1","c2","c3")
转换为DF后,假设您想将其设置为具有活泼压缩的镶木地板文件格式,则需要使用sqlContext
sqlContext.setConf("spark.parquet.commpression.codec","snappy")
sqlContext.setConf("spark.parquet.commpression.codec","gzip")
用于gzip压缩
此后,使用以下命令
XXDF.write.parquet("your_path")
将通过快速压缩保存