[SequenceFile_4] SequenceFile 配置压缩
0. 说明
SequenceFile 配置压缩编解码器 && 压缩类型的选型
1. SequenceFile 配置压缩编解码器
package hadoop.compression; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.SequenceFile; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.compress.BZip2Codec; import org.apache.hadoop.io.compress.CompressionCodec; import org.apache.hadoop.io.compress.Lz4Codec; import org.apache.hadoop.util.ReflectionUtils; import org.junit.Test; /** * SequenceFile 配置压缩编解码器 */ public class TestSeqFileCompression { /** * 测试 SequenceFile 配置压缩编解码器进行压缩 */ @Test public void testWriteSeq() throws Exception { Configuration conf = new Configuration(); // 设置文件系统为本地模式 conf.set("fs.defaultFS", "file:///"); FileSystem fs = FileSystem.get(conf); // 通过反射获取 CompressionCodec 对象 // BZip2Codec.class / Lz4Codec.class // BZip2Codec codec = ReflectionUtils.newInstance(BZip2Codec.class, conf); Lz4Codec codec = ReflectionUtils.newInstance(Lz4Codec.class, conf); // Path path = new Path("E:/test/bz2.seq"); Path path = new Path("E:/test/lz4.seq"); // 块压缩 SequenceFile.Writer writer = SequenceFile.createWriter(fs, conf, path, IntWritable.class, Text.class, SequenceFile.CompressionType.BLOCK, codec); for (int i = 1; i <= 1000000; i++) { IntWritable key = new IntWritable(i); Text value = new Text("helloworld" + i); writer.append(key, value); } writer.close(); } }
2. 压缩类型的选型
1. 使用 SequenceFile 等容器文件格式(SequenceFile | Avro 数据文件 | ORCFiles | Parquet 文件) + 快速压缩工具(LZO | LZ4 | Snappy)
效率最高
2. 使用支持切分的压缩格式(bzip2 | LZO),即支持逻辑切割的压缩格式
LZO只有在添加索引的时候才支持切割,即 LZO 文件的预处理
package hadoop.compression; import com.hadoop.compression.lzo.LzoIndexer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; /** * LZO 文件的预处理,即在使用 LZO 文件之前添加索引 */ public class TestLzoIndex { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); // 压缩编解码器必须是此类或其子类 conf.set("io.compression.codecs","com.hadoop.compression.lzo.LzopCodec"); LzoIndexer indexer = new LzoIndexer(conf); indexer.index(new Path("file:///E:/test/codec/sdata.txt.lzo")); } }
3. 将文本文件(待处理的文件)进行预切割,在每个文件段下进行压缩
4. 存储未压缩的文件,效率最低
且将新火试新茶,诗酒趁年华。