1. 程式人生 > >Hadoop壓縮與解壓

Hadoop壓縮與解壓

1 壓縮

一般來說,計算機處理的資料都存在一些冗餘度,同時資料中間,尤其是相鄰資料間存在著相關性,所以可以通過一些有別於原始編碼的特殊編碼方式來儲存資料, 使資料佔用的儲存空間比較小,這個過程一般叫壓縮。和壓縮對應的概念是解壓縮,就是將被壓縮的資料從特殊編碼方式還原為原始資料的過程。

壓縮廣泛應用於海量資料處理中,對資料檔案進行壓縮,可以有效減少儲存檔案所需的空間,並加快資料在網路上或者到磁碟上的傳輸速度。在Hadoop中,壓縮應用於檔案儲存、Map階段到Reduce階段的資料交換(需要開啟相關的選項)等情景。

資料壓縮的方式非常多,不同特點的資料有不同的資料壓縮方式:如對聲音和影象等特殊資料的壓縮,就可以採用有損的壓縮方法,允許壓縮過程中損失一定的信 息,換取比較大的壓縮比;而對音樂資料的壓縮,由於資料有自己比較特殊的編碼方式,因此也可以採用一些針對這些特殊編碼的專用資料壓縮演算法。

2 Hadoop壓縮簡介

Hadoop作為一個較通用的海量資料處理平臺,在使用壓縮方式方面,主要考慮壓縮速度和壓縮檔案的可分割性。

所有的壓縮演算法都會考慮時間和空間的權衡,更快的壓縮和解壓縮速度通常會耗費更多的空間(壓縮比較低)。例如,通過gzip命令壓縮資料時,使用者可以設定 不同的選項來選擇速度優先或空間優先,選項–1表示優先考慮速度,選項–9表示空間最優,可以獲得最大的壓縮比。需要注意的是,有些壓縮演算法的壓縮和解壓 縮速度會有比較大的差別:gzip和zip是通用的壓縮工具,在時間/空間處理上相對平衡,gzip2壓縮比gzip和zip更有效,但速度較慢,而且 bzip2的解壓縮速度快於它的壓縮速度。

當使用MapReduce處理壓縮檔案時,需要考慮壓縮檔案的可分割性。考慮我們需要對保持在HDFS上的一個大小為1GB的文字檔案進行處理,當前 HDFS的資料塊大小為64MB的情況下,該檔案被儲存為16塊,對應的MapReduce作業將會將該檔案分為16個輸入分片,提供給16個獨立的 Map任務進行處理。但如果該檔案是一個gzip格式的壓縮檔案(大小不變),這時,MapReduce作業不能夠將該檔案分為16個分片,因為不可能從 gzip資料流中的某個點開始,進行資料解壓。但是,如果該檔案是一個bzip2格式的壓縮檔案,那麼,MapReduce作業可以通過bzip2格式壓 縮檔案中的塊,將輸入劃分為若干輸入分片,並從塊開始處開始解壓縮資料。bzip2格式壓縮檔案中,塊與塊間提供了一個48位的同步標記,因 此,bzip2支援資料分割。

表3-2列出了一些可以用於Hadoop的常見壓縮格式以及特性。

表3-2 Hadoop支援的壓縮格式

為了支援多種壓縮解壓縮演算法,Hadoop引入了編碼/解碼器。與Hadoop序列化框架類似,編碼/解碼器也是使用抽象工廠的設計模式。目前,Hadoop支援的編碼/解碼器如表3-3所示。

表3-3 壓縮演算法及其編碼/解碼器

同一個壓縮方法對應的壓縮、解壓縮相關工具,都可以通過相應的編碼/解碼器獲得。

3 Hadoop壓縮API應用例項

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.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; 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.CompressionInputStream; import org.apache.hadoop.io.compress.CompressionOutputStream; import org.apache.hadoop.util.ReflectionUtils; public class CodecTest { public static void main(String[] args) throws Exception { compress("org.apache.hadoop.io.compress.BZip2Codec"); //        compress("org.apache.hadoop.io.compress.GzipCodec"); //        compress("org.apache.hadoop.io.compress.Lz4Codec"); //        compress("org.apache.hadoop.io.compress.SnappyCodec"); // uncompress("text"); // uncompress1("hdfs://master:9000/user/hadoop/text.gz"); } // 壓縮檔案 public static void compress(String codecClassName) throws Exception { Class<?> codecClass = Class.forName(codecClassName); Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(conf); CompressionCodec codec = (CompressionCodec) ReflectionUtils.newInstance(codecClass, conf);

相關推薦

Hadoop壓縮

1 壓縮 一般來說,計算機處理的資料都存在一些冗餘度,同時資料中間,尤其是相鄰資料間存在著相關性,所以可以通過一些有別於原始編碼的特殊編碼方式來儲存資料, 使資料佔用的儲存空間比較小,這個過程一般叫壓縮。和壓縮對應的概念是解壓縮,就是將被壓縮的資料從特殊編碼方式

指令篇:文件文件系統的壓縮打包(歸檔)___gzip、zcat;bzip2、bzcat;zip; tar

roo 壓縮命令 過時 bsp 演示 組合 localhost 打包 mov 一、文件與文件系統的壓縮:   1、單文件的四種壓縮命令:     ①、Compress  (過時了,不做過多說明)     ②、gzip,zcat   (gzip:壓縮。zcat:查看)    

常用壓縮工具使用

tar zip gzip 1、tar打包tar -cvf a.tar a.txt or a/-v 查看詳情打包後gzip壓縮tar -zcvf a.tar.gz a.txt or a/打包後bzip2壓縮tar -jcvf a.tar.bz2 a.txt or a/解壓打的包tar -xf a.t

PHP GZ壓縮

code fwrite name bsp time style write fclose log 1 /*將字符串添加至GZ文件*/ 2 function gz_str($str,$gz_name){ 3 $fp = gzopen ($gz_name, ‘w

續寫vim,shell腳本基礎編輯,read命令,ifcase判斷語句,文件查找方式,壓縮

退出 hist match 時間戳 語法錯誤 margin 基本概念 相同 reg 一、 Vim續寫 ?1、命令擴展模式的位置定界 ??起始位置 cmd 終止位置???Cmd:????y復制????d刪除????Gu變大寫????gu變小寫??例如:0y$命令意味著:

Linux學習之文件的壓縮

zip2 壓縮命令 unzip 文件夾 擴展 格式 應該 host bz2 下面來學習四個常用的壓縮命令。 gzip 特點: 1.只能壓縮文件,不能壓縮目錄 2.不保留源文件 [root@localhost test]# gzip aaa 將a

Linux 之 tar打包壓縮使用

tartar打包壓縮與解壓使用 1.tar 壓縮打包/root/Desktop整個目錄,並把打包的文件放到/root/backup目錄下 [root@localhost ~]# tar -czvf /root/backup/desktop.tar.gz Desktop/ Desktop/ Desktop/ab

打包壓縮功能

unrar nbsp span 打包 spa .gz bz2 filename unzip 一解壓。 tar包:# tar -xvf filename.tar rar包:# unrar e filename.rar zip包:# unzip filename.zip tar

1078 字符串壓縮

names size ostream 位數 i++ col target cout amp 題目鏈接:https://pintia.cn/problem-sets/994805260223102976/problems/994805262018265088 題解: 1

Linux下壓縮

zip壓縮解壓 壓縮: zip -r dist.zip dist/* 解壓: unzip dist.zip unzip -o dist.zip // 在不提示的情況下覆蓋檔案 unzip -o -d ~/Desktop/temp // -d指定解壓目錄 tar壓縮解壓

liunx系統中的檔案壓縮

zip格式 壓縮: zip -r [目標檔名].zip [原檔案/目錄名] 解壓: unzip [原檔名].zip 注:-r引數代表遞迴 tar格式(該格式僅僅打包,不壓縮) 打包:tar -cvf [目標檔名].tar [原檔名/目錄名] 解包:tar -xvf [原檔名]

PAT-1078 字串壓縮

1078 字串壓縮與解壓 (20 分) 文字壓縮有很多種方法,這裡我們只考慮最簡單的一種:把由相同字元組成的一個連續的片段用這個字元和片段中含有這個字元的個數來表示。例如 ccccc 就用 5c 來表示。如果字元沒有重複,就原樣輸出。例如 aba 壓縮後仍然是 aba。 解壓方法就是反過

linux 操作之壓縮

壓縮與解壓   壓縮格式:zip , rar , 7z , iso , exe     gzip     (以下是命令操作)     gzip [檔名]  #壓縮成gz格式 , 原來的檔案消失 , 不支援目錄.     bzip2 -d [壓縮檔名] #解壓     bzip

1078 字串壓縮 ——C++實現

題目 1078 字串壓縮與解壓 (20 分) 文字壓縮有很多種方法,這裡我們只考慮最簡單的一種:把由相同字元組成的一個連續的片段用這個字元和片段中含有這個字元的個數來表示。例如 ccccc 就用 5c 來表示。如果字元沒有重複,就原樣輸出。例如 aba 壓縮後仍然是 aba。

C# 處理文件的壓縮

targe new 文件夾的名稱 pri 自己 zipfile each empty ESS 最近做了一個關於winform 程序更新下載的功能,大概思路是,程序檢測到服務端系統版本號發生改變,系統需要更新;這時請求服務端更新地址,下載更新包到程序的根目錄,更新包是一個壓縮

jar包壓縮

1、解壓jar包: 命令:C:\jar>jar xf lm.jar 沒有任何錯誤提示,表示解壓成功。 2、壓縮jar包: 命令:C:\jar>jar cvf lm.jar 檔案1 檔案2 檔案3 檔案4 回車,壓縮後的jar包就在本目錄下,也可以這樣 命令:jar cvf lm.

Ubuntu下各種壓縮的方式小結

這篇文章主要給大家介紹了在Ubuntu系統下各種壓縮與解壓的方式,其中包括.tar、.gz、.bz2、.bz、.Z、.tgz、.zip、.rar以及.lha等各個的解壓與壓縮方法,每一種都給出了示例程式碼,需要的朋友可以參考學習,一起來看看吧。

PAT乙級 1078 字串壓縮 (20 分)

文字壓縮有很多種方法,這裡我們只考慮最簡單的一種:把由相同字元組成的一個連續的片段用這個字元和片段中含有這個字元的個數來表示。例如 ccccc 就用 5c 來表示。如果字元沒有重複,就原樣輸出。例如 aba 壓縮後仍然是 aba。 解壓方法就是反過來,把形如 5c 這樣的表示恢復為 cc

字串的壓縮

import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.util.zip.GZIPInputStream;import java.util.z

PAT1078 字串壓縮 (20 分)

思路:分成兩類,解壓和被解壓。解壓的時候字串中只有字母和空格,只要設定一個加法器數一數相鄰相同的就好了。被解壓時字串中有字母、空格、數字。特殊點在於數字,設定一個加法器,將該數字從string轉化成int就好了,如果該加法器數字不變依然為零的話就設定為一。再來一重迴圈輸出