[Compression] Hadoop 压缩
0. 说明
Hadoop 压缩介绍 && 压缩格式总结 && 压缩编解码器测试
1. 介绍
【文件压缩的好处】
文件压缩的好处如下:
- 减少存储文件所需要的磁盘空间
- 加速数据在网络和磁盘上的传输
2. 压缩编解码器
【2.1 压缩格式总结】
压缩比高 | 压缩速度快 |
DEFLATE | LZ4 |
gzip | LZO |
bzip2 | Snappy |
3. 测试压缩编解码器
【3.1 使用 LZO 编解码器】
使用 LZO 编解码器需要在 pom.xml 中添加依赖
<!-- LZO 依赖 --> <dependency> <groupId>org.anarres.lzo</groupId> <artifactId>lzo-hadoop</artifactId> <version>1.0.0</version> </dependency>
【3.2 编写测试代码】
package hadoop.compression; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.compress.*; import org.apache.hadoop.util.ReflectionUtils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; /** * 测试压缩 && 解压缩 */ public class TestCodec { public static void main(String[] args) { // SnappyCodec.class 需要配置 Hadoop,然后进行相关操作 Class[] clazzes = { DeflateCodec.class, GzipCodec.class, BZip2Codec.class, Lz4Codec.class, LzopCodec.class, SnappyCodec.class }; for (Class clazz : clazzes) { // 调用压缩方法 testCompress(clazz); // 调用解压缩方法 testDecompress(clazz); } } /** * 测试压缩 */ public static void testCompress(Class clazz) { try { // 获得当前时间 long start = System.currentTimeMillis(); Configuration conf = new Configuration(); // 通过反射获取 CompressionCodec 对象 CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(clazz, conf); // 获得文件扩展名 String ext = codec.getDefaultExtension(); // 通过 codec 获取输出流,将文件进行压缩 CompressionOutputStream cos = codec.createOutputStream(new FileOutputStream("E:/test/codec/sdata.txt" + ext)); // 获取输入流 FileInputStream fis = new FileInputStream("E:/test/codec/sdata.txt"); IOUtils.copyBytes(fis, cos, 1024); fis.close(); cos.close(); // 计算总时长 System.out.print("压缩编解码器: " + ext + "压缩时间" + (System.currentTimeMillis() - start)); File f = new File("E:/test/codec/sdata.txt" + ext); System.out.println(" 文件大小: " + f.length()); } catch (Exception e) { e.printStackTrace(); } } /** * 测试解压缩 * * @param clazz */ public static void testDecompress(Class clazz) { try { // 获得当前时间 long start = System.currentTimeMillis(); Configuration conf = new Configuration(); // 通过反射获取 CompressionCodec 对象 CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(clazz, conf); // 获得文件扩展名 String ext = codec.getDefaultExtension(); // 通过 codec 获取输入流,将文件进行解压缩 CompressionInputStream cis = codec.createInputStream(new FileInputStream("E:/test/codec/sdata.txt" + ext)); // 获取输出流 FileOutputStream fos = new FileOutputStream("E:/test/codec/sdata2.txt"); IOUtils.copyBytes(cis, fos, 1024); IOUtils.closeStream(fos); cis.close(); // 计算总时长 System.out.print("解压缩时间" + (System.currentTimeMillis() - start)); } catch (Exception e) { e.printStackTrace(); } } }
【3.3 测试结果】
压缩编解码器 压缩时间 文件大小 解压缩时间 .deflate 1592 1454907 433 .gz 1218 1454919 438 .bz2 8603 1391326 57118 .lz4 79 2700204 95 .lzo 136 2445355 110 压缩时长 lz4 < lzo < gz < deflate < bz2 压缩比 lz4 < lzo < gz < deflate < bz2
解压时长 lz4 < lzo < deflate < gz < bz2
【3.4 解决 LZO 和 Snappy 的压缩编解码器】
1. LZO: 通过添加 Maven 依赖导入相关 Jar 包
2. Snappy:替换 Hadoop 安装包(在 CentOS 中)
3. 将 lzo-hadoop.jar 和 lzo-core.jar 放在 /soft/hadoop/share/hadoop/common/lib 目录中
4. 运行打包好的 Jar 包
hadoop jar myhadoop-1.0-SNAPSHOT.jar com.hadoop.Compression.TestCodec
并未进行 Snappy 操作,所以测试结果不包含 Snappy
且将新火试新茶,诗酒趁年华。