我最近在Hadoop中设置了LZO压缩。在HDFS中,最简单的压缩文件的方法是什么?我想要压缩一个文件,然后删除原始文件。我应该创建一个使用LZO压缩的IdentityMapper和IdentityReducer的MR作业吗?
我最近在Hadoop中设置了LZO压缩。在HDFS中,最简单的压缩文件的方法是什么?我想要压缩一个文件,然后删除原始文件。我应该创建一个使用LZO压缩的IdentityMapper和IdentityReducer的MR作业吗?
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.GzipCodec \
-Dmapred.reduce.tasks=0 \
-input <input-path> \
-output $OUTPUT \
-mapper "cut -f 2"
如果有需要,我通常会将输出存储在临时文件夹中以防出现问题:
OUTPUT=/tmp/hdfs-gzip-`basename $1`-$RANDOM
额外补充一点,我在流处理任务中没有指定一个reducer,但您可以自行指定。这将强制所有行进行排序,对于大文件可能需要很长时间。也许有一种方法可以通过覆盖分区器来避免这个问题,但我没有费心去解决它。不幸的是,您可能最终会得到许多小文件,这些文件不能有效地利用HDFS块。 这就是研究Hadoop Archives的原因之一。
我建议您编写一个MapReduce作业,正如您所说,只使用Identity映射器。在此过程中,您应考虑将数据写入序列文件以提高性能加载速度。您还可以将序列文件存储在块级和记录级压缩中。您应该测试一下哪种方式最适合您的需求,因为两者都针对不同类型的记录进行了优化。
Jeff Wu提供的流媒体命令和压缩文件的连接将生成一个单独的压缩文件。当非Java映射器传递给流媒体作业并且输入格式为文本流时,输出仅为值而不是键。
hadoop jar contrib/streaming/hadoop-streaming-1.0.3.jar \
-Dmapred.reduce.tasks=0 \
-Dmapred.output.compress=true \
-Dmapred.compress.map.output=true \
-Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
-input filename \
-output /filename \
-mapper /bin/cat \
-inputformat org.apache.hadoop.mapred.TextInputFormat \
-outputformat org.apache.hadoop.mapred.TextOutputFormat
hadoop fs -cat /path/part* | hadoop fs -put - /path/compressed.gz
/*
* Pig script to compress a directory
* input: hdfs input directory to compress
* hdfs output directory
*
*
*/
set output.compression.enabled true;
set output.compression.codec org.apache.hadoop.io.compress.BZip2Codec;
--comma seperated list of hdfs directories to compress
input0 = LOAD '$IN_DIR' USING PigStorage();
--single output directory
STORE input0 INTO '$OUT_DIR' USING PigStorage();
@Chitra 由于声誉问题,我无法发表评论
以下是一条完整的命令:不要使用第二条命令,可以直接将其压缩成一个文件
hadoop jar share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar \
-Dmapred.reduce.tasks=1 \
-Dmapred.output.compress=true \
-Dmapred.compress.map.output=true \
-Dmapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec \
-input /input/raw_file \
-output /archives/ \
-mapper /bin/cat \
-reducer /bin/cat \
-inputformat org.apache.hadoop.mapred.TextInputFormat \
-outputformat org.apache.hadoop.mapred.TextOutputFormat
我知道这是一个旧的帖子,但如果有人像我一样关注这个帖子,那么知道以下两种方法中的任何一种都可以在每行末尾给你一个tab
(\t)字符。
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.GzipCodec \
-Dmapred.reduce.tasks=0 \
-input <input-path> \
-output $OUTPUT \
-mapper "cut -f 2"
hadoop jar share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar \
-Dmapred.reduce.tasks=1 \
-Dmapred.output.compress=true \
-Dmapred.compress.map.output=true \
-Dmapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec \
-input /input/raw_file \
-output /archives/ \
-mapper /bin/cat \
-reducer /bin/cat \
-inputformat org.apache.hadoop.mapred.TextInputFormat \
-outputformat org.apache.hadoop.mapred.TextOutputFormat
-Dstream.map.output.field.separator=, \
-Dmapred.textoutputformat.separator=, \
完整执行命令
hadoop jar <HADOOP_HOME>/jars/hadoop-streaming-2.6.0-cdh5.4.11.jar \
-Dmapred.reduce.tasks=1 \
-Dmapred.output.compress=true \
-Dmapred.compress.map.output=true \
-Dstream.map.output.field.separator=, \
-Dmapred.textoutputformat.separator=, \
-Dmapred.output.compression.codec=org.apache.hadoop.io.compress.Lz4Codec \
-input file:////home/admin.kopparapu/accenture/File1_PII_Phone_part3.csv \
-output file:///home/admin.kopparapu/accenture/part3 \
-mapper /bin/cat \
-reducer /bin/cat \
-inputformat org.apache.hadoop.mapred.TextInputFormat \
-outputformat org.apache.hadoop.mapred.TextOutputFormat
如果你压缩单个文件,可能会节省一些空间,但你无法真正利用Hadoop的能力来处理该文件,因为解压缩必须由单个Map任务按顺序完成。如果你有很多文件,可以使用Hadoop Archive,但我不确定它是否包括任何类型的压缩。我能想到的主要压缩用例是压缩Maps的输出以发送到Reduces(节省网络I/O)。
哦,为了更完整地回答你的问题,你可能需要实现自己的RecordReader和/或InputFormat,以确保整个文件被单个Map任务读取,并且使用正确的解压缩过滤器。
cut -f 2
仅输出值。 - Jeff Wu