Hadoop基礎-Idea打包詳解之手動添加依賴(SequenceFile的壓縮編解碼器案例)


            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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM