1、
1.1、压缩格式总结
1.2、hadoop的压缩 codec
1.3、hadoop下各种压缩算法的压缩比
1.读lzo文件
需要添加以下代码,并导入lzo相关的jar包
job.setInputFormatClass(LzoTextInputFormat.class);
2.写lzo文件
lzo格式默认是不支持splitable的,需要为其添加索引文件,才能支持多个map并行对lzo文件进行处理
如果希望reduce输出的是lzo格式的文件,添加下面的语句
FileOutputFormat.setCompressOutput(job, true);
FileOutputFormat.setOutputCompressorClass(job, LzopCodec.class);
int result = job.waitForCompletion(true) ? 0 : 1;
//上面的语句执行完成后,会生成最后的输出文件,需要在此基础上添加lzo的索引
LzoIndexer lzoIndexer = new LzoIndexer(conf);
lzoIndexer.index(new Path(args[1]));
如果已经存在lzo文件,但没有添加索引,可以采用下面的方法,在输入路径的文件上上添加lzo索引
Hadoop jar $HADOOP_HOME/lib/hadoop-lzo-0.4.17.jar com.hadoop.compression.lzo.LzoIndexer hdfs://inputpath
或者
hadoop jar $HADOOP_HOME/lib/hadoop-lzo-0.4.17.jar
com.hadoop.compression.lzo.DistributedLzoIndexe hdfs://inputpath
1.1、压缩格式总结
压缩格式 | 工具 | 算法 | 文件扩展名 | 是否可切分 |
DEFLATE | 无 | DEFLATE | .deflate | 否 |
Gzip | gzip | DEFLATE | .gz | 否 |
bzip2 | bzip2 | bzip2 | .bz2 | 是 |
LZO | lzop | LZO | .lzo | 是(需要建立索引) |
LZ4 | 无 | LZ4 | .lz4 | 否 |
Snappy | 无 | Snappy | .snappy | 否 |
1.2、hadoop的压缩 codec
压缩格式 | HadoopCompressionCodec |
DEFLATE | org.apache.hadoop.io.compress.DefaultCodec |
gzip | org.apache.hadoop.io.compress.GzipCodec |
bzip2 | org.apache.hadoop.io.compress.Bzip2codec |
LZO | com.hadoop.compression.lzo.LzopCodec |
LZ4 | org.apache.hadoop.io.compress.Lz4Codec |
Snappy | org.apache.hadoop.io.compress.SnappyCodec |
1.3、hadoop下各种压缩算法的压缩比
压缩算法 | 原始文件大小 | 压缩后的文件大小 | 压缩速度 | 解压速度 |
gzip | 8.3GB | 1.8GB | 17.5MB/s | 58MB/s |
bzip2 | 8.3GB | 1.1GB | 2.4MB/s | 9.5MB/s |
LZO-best | 8.3GB | 2GB | 4MB/s | 60.6MB/s |
LZO | 8.3GB | 2.9GB | 49.3MB/S | 74.6MB/s |
1.读lzo文件
需要添加以下代码,并导入lzo相关的jar包
job.setInputFormatClass(LzoTextInputFormat.class);
2.写lzo文件
lzo格式默认是不支持splitable的,需要为其添加索引文件,才能支持多个map并行对lzo文件进行处理
如果希望reduce输出的是lzo格式的文件,添加下面的语句
FileOutputFormat.setCompressOutput(job, true);
FileOutputFormat.setOutputCompressorClass(job, LzopCodec.class);
int result = job.waitForCompletion(true) ? 0 : 1;
//上面的语句执行完成后,会生成最后的输出文件,需要在此基础上添加lzo的索引
LzoIndexer lzoIndexer = new LzoIndexer(conf);
lzoIndexer.index(new Path(args[1]));
如果已经存在lzo文件,但没有添加索引,可以采用下面的方法,在输入路径的文件上上添加lzo索引
Hadoop jar $HADOOP_HOME/lib/hadoop-lzo-0.4.17.jar com.hadoop.compression.lzo.LzoIndexer hdfs://inputpath
或者
hadoop jar $HADOOP_HOME/lib/hadoop-lzo-0.4.17.jar
com.hadoop.compression.lzo.DistributedLzoIndexe hdfs://inputpath