1. 程式人生 > >Hadoop--使用JavaAPI對檔案解壓、壓縮

Hadoop--使用JavaAPI對檔案解壓、壓縮


GitHub:https://github.com/GYT0313/Hadoop-JavaAPI-Code/tree/master/chapter5/src/org/gyt/hadoopCompression

前言

本次示例做了如下工作:

  1. 將 bzip2 格式解壓
  2. 將檔案壓縮為 gzip 格式

1. 上傳 bzip2

準備壓縮檔案:
在這裡插入圖片描述

上傳檔案到 HDFS(注:/data 目錄已存在):
在這裡插入圖片描述

2. 程式碼編寫

FileCompress.java:該類完成了前言中的功能,IP根據自己叢集IP配置,註釋部分有不正確的地方請見諒。

package org.gyt.hadoopCompression;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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.io.compress.GzipCodec;

/**
 * @FileName: FileCompress.java
 * @Package: org.gyt.hadoopCompression
 * @Author: Gu Yongtao
 * @Description: [檔案描述]
 *
 * @Date: 2018年11月9日 上午11:09:16
 */

public class FileCompress {
	public static void main(String[] args) throws IOException {
		// 解壓 1.bz2 為 1 -- createInputStream
		String uri = "hdfs://master:9000/data/1.bz2";
		Configuration conf = new Configuration();
		FileSystem fileSystem = FileSystem.get(URI.create(uri.toString()), conf);
		Path inputPath = new Path(uri);
		CompressionCodecFactory factory = new CompressionCodecFactory(conf);
		CompressionCodec codec = factory.getCodec(inputPath); // 根據檔案字尾判斷生成何種型別的CompressionCodec
		if (codec == null) {
			System.out.println("No codec found for " + uri);
			System.exit(1); // 異常退出
		}
		// 解壓的路徑名
		String outputUri = CompressionCodecFactory.removeSuffix(uri, codec.getDefaultExtension());
		InputStream inputStream = null;
		OutputStream outputStream = null;
		try {
			inputStream = codec.createInputStream(fileSystem.open(inputPath)); // 對輸入流進行解壓
			outputStream = fileSystem.create(new Path(outputUri)); // 建立輸出檔案,獲得輸出流
			IOUtils.copyBytes(inputStream, outputStream, conf); // 從輸入流到輸出流複製, 實現解壓
		} finally {
			// TODO: handle finally clause
			IOUtils.closeStream(inputStream);
			IOUtils.closeStream(outputStream);
		}
		
		// 壓縮 1 為 1.gz  -- createOutputStream
		CompressionOutputStream compressionOutputStream = null;
		// 壓縮
		Path gzPath = new Path("hdfs://master:9000/data/2.gz");
		try {
			inputStream = fileSystem.open(new Path(outputUri)); // 獲得原始檔輸入流
			GzipCodec gzipCodec = new GzipCodec(); // 獲得gz格式例項
			gzipCodec.setConf(conf); // 設定Configuration
			compressionOutputStream = gzipCodec.createOutputStream(fileSystem.create(gzPath)); // 建立輸出檔案獲得輸出流
			IOUtils.copyBytes(inputStream, compressionOutputStream, 4096, false); // 從輸入流複製到輸出流 buffsize 4096
			compressionOutputStream.close();			
		} finally {
			// TODO: handle finally clause
			IOUtils.closeStream(inputStream);
			IOUtils.closeStream(outputStream);
		}
	}
}

執行:

右鍵執行:
在這裡插入圖片描述
解壓的內容:
在這裡插入圖片描述