hadoop筆記四:hadoop io的壓縮和編解碼工具

1.壓縮

壓縮在大數據中的優點:減小儲存文件所須要的磁盤空間,並加速數據在網絡和磁盤上的傳輸。java

壓縮格式:算法

Gzip和bzip2比較時,bzip2的壓縮率(壓縮以後的大小除以源文件的大小)要小,因此說bzip2的壓縮效果好。而這裏就會壓縮和解壓縮的時候浪費更多的時間。apache

2.編解碼工具

codec實現了一種壓縮和解壓縮算法(意思就是codec使用相關的算法對數據進行編碼和解碼)。在Hadoop中,一個對CompressionCodec接口的實現表明一個codec。編程

對於不一樣的壓縮算法有不一樣的編解碼工具。獲取編解碼工具的方式有兩種,1是根據文件擴展名讓程序本身去選擇相應的編解碼工具,2是直接指定編解碼工具。網絡

3.java編程操做文件壓縮和解壓縮

1.實現編解碼的流程,是在對文件讀寫時在流中對文件進行編碼和解碼。

2. 編解碼相關的類或方法

CompressionCodec接口中工具

CompressionCodecFactory類oop

3.代碼實例

實例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

查看本地文件夾下文件是否存在

相關文章
相關標籤/搜索