Hadoop--使用JavaAPI對檔案解壓、壓縮
阿新 • • 發佈:2018-11-16
GitHub:https://github.com/GYT0313/Hadoop-JavaAPI-Code/tree/master/chapter5/src/org/gyt/hadoopCompression
前言
本次示例做了如下工作:
- 將 bzip2 格式解壓
- 將檔案壓縮為 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); } } }
執行:
右鍵執行:
解壓的內容: