壓縮在大數據中的優點:減小儲存文件所須要的磁盤空間,並加速數據在網絡和磁盤上的傳輸。java
壓縮格式:算法
Gzip和bzip2比較時,bzip2的壓縮率(壓縮以後的大小除以源文件的大小)要小,因此說bzip2的壓縮效果好。而這裏就會壓縮和解壓縮的時候浪費更多的時間。apache
codec實現了一種壓縮和解壓縮算法(意思就是codec使用相關的算法對數據進行編碼和解碼)。在Hadoop中,一個對CompressionCodec接口的實現表明一個codec。編程
對於不一樣的壓縮算法有不一樣的編解碼工具。獲取編解碼工具的方式有兩種,1是根據文件擴展名讓程序本身去選擇相應的編解碼工具,2是直接指定編解碼工具。網絡
CompressionCodec接口中工具
CompressionCodecFactory類oop
實例1:將本地文件上傳壓縮到HDFS集羣中測試
package com.jf.hdfs; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.LocalFileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.compress.CompressionCodec; import org.apache.hadoop.io.compress.CompressionCodecFactory; import org.apache.hadoop.io.compress.CompressionOutputStream; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; public class WriteComPressionFile extends Configured implements Tool { public int run(String[] args) throws Exception { Configuration conf = getConf(); String input = conf.get("input"); String output = conf.get("output"); // 本地文件系統 LocalFileSystem lfs = FileSystem.getLocal(conf); // 集羣文件系統 FileSystem fs = FileSystem.get(URI.create(output), conf); // 讀取本地文件的輸入流 FSDataInputStream is = lfs.open(new Path(input)); // 向集羣寫文件的輸出流 FSDataOutputStream os = fs.create(new Path(output)); CompressionCodecFactory ccf = new CompressionCodecFactory(conf); // 根據文件後綴名選擇編解碼工具 CompressionCodec codec = ccf.getCodec(new Path(output)); // 代編解碼工具的輸出流 CompressionOutputStream cos = codec.createOutputStream(os); IOUtils.copyBytes(is, cos, 1024, true); // 輸出選擇的編解碼工具名稱 System.out.println(codec.getClass().getName()); return 0; } public static void main(String[] args) throws Exception { System.exit(ToolRunner.run(new WriteComPressionFile(), args)); } }
執行測試:上傳server.log文件到集成環境中並命名爲server.log.bz2大數據
hadoop-2.7.1/bin/hadoop jar my_hadoop-0.0.1-SNAPSHOT.jar com.jf.hdfs.WriteComPressionFile -Doutput=/user/root/input/server.log.bz2 -Dinput=/home/softwares/server.log
執行結果:輸出使用的編解碼工具編碼
查看集羣內上傳路徑:
實例2:將實例1中上傳的文件解壓到本地環境
package com.jf.hdfs; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.LocalFileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.compress.CompressionCodec; import org.apache.hadoop.io.compress.CompressionCodecFactory; import org.apache.hadoop.io.compress.CompressionInputStream; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; public class ReadCompressionFile extends Configured implements Tool { public int run(String[] args) throws Exception { Configuration conf = getConf(); String input = conf.get("input"); String output = conf.get("output"); // 本地文件系統 LocalFileSystem lfs = FileSystem.getLocal(conf); // 集羣文件系統 FileSystem fs = FileSystem.get(URI.create(input), conf); // 本地文件輸出流 FSDataOutputStream os = lfs.create(new Path(output)); // 集羣文件輸入流 FSDataInputStream is = fs.open(new Path(input)); //獲取轉碼工具 CompressionCodecFactory ccf = new CompressionCodecFactory(conf); CompressionCodec codec = ccf.getCodec(new Path(input)); //代轉碼器的輸入流 CompressionInputStream cis = codec.createInputStream(is); IOUtils.copyBytes(cis, os, 1024, true); System.out.println(codec.getClass().getName()); return 0; } public static void main(String[] args) throws Exception { System.exit(ToolRunner.run(new ReadCompressionFile(), args)); } }
執行測試:下載實例1上傳的server.log.bz2文件到本地目錄爲server2.log
hadoop-2.7.1/bin/hadoop jar my_hadoop-0.0.1-SNAPSHOT.jar com.jf.hdfs.ReadCompressionFile -Doutput=/home/softwares/server2.log -Dinput=/user/root/input/server.log.bz2
查看本地文件夾下文件是否存在