Hadoop基礎-Idea打包詳解之手動添加依賴(SequenceFile的壓縮編解碼器案例)
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
一.編輯配置文件(pml.xml)(我們這里配置的是對“cn.org.yinzhengjie.compress.TestCompressCodec”該包進行打包操作)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>groupId</groupId> 8 <artifactId>yinzhengjieCode</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 11 <dependencies> 12 <dependency> 13 <groupId>org.apache.hadoop</groupId> 14 <artifactId>hadoop-client</artifactId> 15 <version>2.7.3</version> 16 </dependency> 17 18 <dependency> 19 <groupId>org.anarres.lzo</groupId> 20 <artifactId>lzo-hadoop</artifactId> 21 <version>1.0.0</version> 22 </dependency> 23 24 </dependencies> 25 26 <!--將指定類的所有依賴打入到一個包中--> 27 <build> 28 <plugins> 29 <plugin> 30 <artifactId>maven-assembly-plugin</artifactId> 31 <configuration> 32 <descriptorRefs> 33 <descriptorRef>jar-with-dependencies</descriptorRef> 34 </descriptorRefs> 35 <archive> 36 <manifest> 37 <!-- main函數所在的類 --> 38 <mainClass>cn.org.yinzhengjie.compress.TestCompressCodec</mainClass> 39 </manifest> 40 </archive> 41 </configuration> 42 <executions> 43 <execution> 44 <id>make-assembly</id> <!-- this is used for inheritance merges --> 45 <phase>package</phase> <!-- bind to the packaging phase --> 46 <goals> 47 <goal>single</goal> 48 </goals> 49 </execution> 50 </executions> 51 </plugin> 52 </plugins> 53 </build> 54 55 </project>
注意事項如下:
我們通過pom.xml配置文件不難看出我們需要打的包是“cn.org.yinzhengjie.compress.TestCompressCodec”,上述的配置主要是對該包打入相應的依賴包關系,且上述配置僅對該包有效喲。當然我所述的只是“<build></build>”標簽里面里面的參數,它是對手動添加依賴的關鍵!
二.開始打包
1>.需要打包(cn.org.yinzhengjie.compress.TestCompressCodec)的代碼如下:
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.compress; 7 8 import org.apache.hadoop.conf.Configuration; 9 import org.apache.hadoop.io.IOUtils; 10 import org.apache.hadoop.io.compress.*; 11 import org.apache.hadoop.util.ReflectionUtils; 12 import java.io.File; 13 import java.io.FileInputStream; 14 import java.io.FileOutputStream; 15 16 17 public class TestCompressCodec { 18 /** 19 * 設置路徑動態傳參 20 * @param args 21 */ 22 public static void main(String[] args) { 23 if(args == null || args.length == 0){ 24 System.out.println("需要輸入路徑"); 25 System.exit(-1); 26 } 27 Class[] classes = { 28 DefaultCodec.class, 29 GzipCodec.class, 30 BZip2Codec.class, 31 Lz4Codec.class, 32 LzopCodec.class, 33 SnappyCodec.class 34 }; 35 for(Class clazz : classes){ 36 testCompress(clazz, args[0]); 37 testDecompress(clazz,args[0]); 38 } 39 } 40 /** 41 * Gzip壓縮 42 * @throws Exception 43 */ 44 public static void testCompress(Class clazz, String path) { 45 try { 46 long start = System.currentTimeMillis(); 47 Configuration conf = new Configuration(); 48 conf.set("fs.defaultFS", "file:///"); 49 CompressionCodec codec = (CompressionCodec)ReflectionUtils.newInstance(clazz, conf); 50 FileInputStream fis = new FileInputStream(path); 51 //獲取擴展名 52 String ext = codec.getDefaultExtension(); 53 //創建壓縮輸出流 54 CompressionOutputStream cos = codec.createOutputStream(new FileOutputStream(path+ext)); 55 IOUtils.copyBytes(fis,cos,1024); 56 fis.close(); 57 cos.close(); 58 System.out.print("壓縮類型:"+ ext+"\t"+ "壓縮時間:" + (System.currentTimeMillis() - start)+ "\t"); 59 File f = new File(path+ext); 60 System.out.print("文件大小:"+ f.length() + "\t"); 61 } catch (Exception e) { 62 e.printStackTrace(); 63 } 64 } 65 66 /** 67 * Gzip解壓 68 * @throws Exception 69 */ 70 public static void testDecompress(Class clazz,String path) { 71 try { 72 long start = System.currentTimeMillis(); 73 Configuration conf = new Configuration(); 74 conf.set("fs.defaultFS", "file:///"); 75 CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(clazz, conf); 76 //擴展名 77 String ext = codec.getDefaultExtension(); 78 //壓縮輸入流 79 CompressionInputStream cis = codec.createInputStream(new FileInputStream(path+ext)); 80 FileOutputStream fos = new FileOutputStream(path+ext+".txt"); 81 IOUtils.copyBytes(cis,fos,1024); 82 cis.close(); 83 fos.close(); 84 System.out.println("解壓時間:" + (System.currentTimeMillis() - start)); 85 } catch (Exception e) { 86 e.printStackTrace(); 87 } 88 } 89 }
2>.點擊“package進行打包操作”
3>.打包后的產物
在打包的過程需要一定的時間,我們需要耐心等待
打包過程中如果沒有遇到錯誤,就會出現以下的界面
打包完成之后,會有兩個文件生成,如下圖:
三.Hadoop壓縮格式綜合測試
由於我在Windows測試說當前Hadoop版本不支持snappy壓縮格式,官網上也沒有相應的下載版本(鏈接:https://pan.baidu.com/s/1Clhsvv-gzvVX7lQOQ27vng 密碼:d367),不過有大神編譯了Hadoop支持snappy格式的,如果有時間了我也得去研究研究,到時候會把筆記共享給大家。好了,下圖就是我使用支持snappy壓縮格式的版本進行測試的。
我們將上面的核心信息抽取如下:
壓縮類型:.deflate 壓縮時間:14247 文件大小:3455087 解壓時間:11734 壓縮類型:.gz 壓縮時間:9657 文件大小:3455099 解壓時間:12088 壓縮類型:.bz2 壓縮時間:653629 文件大小:4208570 解壓時間:61072 壓縮類型:.lz4 壓縮時間:7965 文件大小:4070753 解壓時間:11660 壓縮類型:.lzo 壓縮時間:8632 文件大小:7186193 解壓時間:10454 壓縮類型:.snappy 壓縮時間:10035 文件大小:44166230 解壓時間:12421
根據結果反推理論:(以上實驗是對一個890M的文件進行處理,生成環境最好以實際生成環境為准,這個數據僅供參考!)
壓縮時間從小到大:
lz4 < lzo < gz < snappy < deflate < bz2;
壓縮大小從小到大:
defalte < gz < lz4 < bz2 < lzo < snappy;
解壓時間從小到大:
zo < lz4 < deflate < gz < snappy < bz2;