java程式設計師的大資料之路(5):HDFS壓縮與解壓縮
背景
好久沒有更新了,原因是公司專案上線,差點被祭天。在這種驚心動魄的時候還是要抽時間做一點自己喜歡做的事情的,然而進度比預期慢了許多。
正式開始
接下來就開始記錄最近的學習成果啦!
在Hadoop叢集中,網路資源是非常珍貴的。因此對檔案進行壓縮是非常必要的,除此之外。壓縮檔案的另一個好處就是可以節省磁碟空間。
壓縮方法介紹
我們在對檔案進行壓縮時,要仔細考慮使用哪種壓縮方法最合適。常見的壓縮格式有
表5-1
壓縮格式 | 工具 | 演算法 | 副檔名 | 是否包含多個檔案 | 是否可切分 |
---|---|---|---|---|---|
DEFLATE | N/A | DEFLATE | .deflate | 否 | 否 |
Gzip | gzip | DEFLATE | .gz | 否 | 否 |
bzip2 | bzip2 | bzip2 | .bz2 | 否 | 是 |
LZO | Lzop | LZO | .lzo | 否 | 否 |
相比較之下,bzip2比gzip更高效,但壓縮速度要慢一些。LZO壓縮速度比gzip更快,但效率不高。
在Hadoop中,一個對CompressionCodec介面的實現代表一個codec。例如,GzipCodec包裝了gzip的壓縮和解壓縮方法。(實際上每個Codec都包含了這兩個方法)
我們可以利用CompressionCodec中的方法對資料進行壓縮和解壓。
上表中“是否可切分”一列,表示壓縮演算法是否支援切分。可切分的壓縮格式更加適合MapReduce。gzip格式使用DEFLATE來儲存壓縮過的資料,DEFLATE將資料作為一系列壓縮過的塊進行儲存。問題是,每塊的開始沒有指定使用者在資料流中任意點定位到下一個塊的起始位置,而是其自身與資料流同步。因此,gzip並不支援檔案切分。但是,bzip2檔案提供不同資料塊之間的同步標識,因而它是支援切分的。
在MapReduce中使用壓縮
主要程式碼
這裡舉一個查詢每年最高氣溫的例子,對輸出資料進行壓縮。
Map
public class MaxTemperatureMapper extends MapReduceBase
implements Mapper<LongWritable, Text, Text, IntWritable>{
private static final int MISSING = 9999;
public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
String data = value.toString();
String year = "" ;
int airTemperature = 0;
if(data != null && data.length() > 0) {
String[] temp = data.split(",");
year = temp[0];
airTemperature = Integer.parseInt(temp[1]);
}
output.collect(new Text(year),new IntWritable(airTemperature));
}
}
Reduce
public class MaxTemperatureReducer extends MapReduceBase
implements Reducer<Text, IntWritable, Text, IntWritable>{
public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
int maxValue = Integer.MIN_VALUE;
while (values.hasNext()) {
maxValue = Math.max(maxValue, values.next().get());
}
output.collect(key, new IntWritable((maxValue)));
}
}
Compression
public class MaxTemperatureWithCompression {
public static void main(String[] args) throws IOException {
if (args.length != 2) {
System.err.println("Usage: MaxTemperatureWithCompression <input path> " +
"<output path>");
System.exit(-1);
}
JobConf conf = new JobConf(MaxTemperatureWithCompression.class);
conf.setJobName("Max temperature with output compression");
FileInputFormat.addInputPath(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
conf.setBoolean("mapred.output.compress", true);
conf.setClass("mapred.output.compression.codec", GzipCodec.class, CompressionCodec.class);
conf.setMapperClass(MaxTemperatureMapper.class);
conf.setCombinerClass(MaxTemperatureReducer.class);
conf.setReducerClass(MaxTemperatureReducer.class);
JobClient.runJob(conf);
}
}
執行結果
上圖中,output目錄下的結果為未設定要使用的壓縮類,即Hadoop預設使用的是DEFLATE壓縮,副檔名為.deflate。output1目錄下的結果是設定使用Gzip壓縮。
需要注意
驗證過程中,需要注意的是,一定根據map和reduce方法的引數設定setOutputKeyClass和setOutputValueClass,否則會丟擲型別轉換異常,因為Hadoop預設的輸出Key和Value型別分別是LongWritable和Text。
本例中map和reduce輸出型別相同,如果不同,也可以單獨設定中間結果的輸出型別:
conf.setMapOutputKeyClass(Text.class);
conf.setMapOutputValueClass(IntWritable.class);
總結
要對MapReduce進行壓縮,需要把mapred.output.compress屬性設定為true,另外需要設定mapred.output.compression.codec屬性。如果要對map的輸出結果進行壓縮,則需要設定mapred.compress.map.output和mapred.map.output.compression.codec。
相關推薦
java程式設計師的大資料之路(5):HDFS壓縮與解壓縮
背景 好久沒有更新了,原因是公司專案上線,差點被祭天。在這種驚心動魄的時候還是要抽時間做一點自己喜歡做的事情的,然而進度比預期慢了許多。 正式開始 接下來就開始記錄最近的學習成果啦! 在Hadoop叢集中,網路資源是非常珍貴的。因此對檔案進行壓縮是非
java程式設計師的大資料之路(7):基於檔案的資料結構
SequenceFile 介紹 由於日誌檔案中每一條日誌記錄是一行文字。如果想記錄二進位制型別,純文字是不合適的。這種情況下,Hadoop的SequenceFile類非常合適。SequenceFile可以作為小檔案容器。而HDFS和MapReduce是針
ApolloStudio高手之路(5):嵌入海康威視VisionMaster機器視覺演算法平臺提供一站式工控設計
VisionMaster是海康威視近兩年來一直主推的機器視覺演算法平臺,也許在效能和演算法豐富程度上跟市面上的美國康耐視公司的VisionPro以及德國MvTec公司的Halcon還有不小差距,但整體使用體驗也算是國產視覺軟體佼佼者之一。 在ApolloStudio當中,基於VisionMa
es6學習之路(5):數值的擴充套件
1.Number.isFinite(), Number.isNaN() ES6 在 Number 物件上,新提供了Number.isFinite()和Number.isNaN()兩個方法。Number.isFinite()用來檢查一個數值是否為有限的( finite )。
SSM入門之路(5):使用Mybatis操縱MySQL資料庫
先使用,後原理。 一、工具準備 本文執行環境: JDK 1.8.0 Eclipse Oxygen.3a Release (4.7.3a) MySQL 8.0.12-standard 二、Mybatis簡介 官網定義: M
Choerodon 的微服務之路(三):服務註冊與發現
本文是 Choerodon 的微服務之路系列推文第三篇。在上一篇《Choerodon的微服務之路(二):微服務閘道器》中,介紹了Choerodon 在搭建微服務閘道器時考慮的一些問題以及兩種常見的微服務閘道器模式,並且通過程式碼介紹了Choerodon 的閘道器是如何實現的。本篇文章將介紹Choer
大資料晉級之路(5)Hadoop,Spark,Storm綜合比較
大資料框架:Spark vs Hadoop vs Storm 目錄 Hadoop Spark Storm 大資料時代,TB級甚至PB級資料已經超過單機尺度的資料處理,分散式處理系統應運而生。 知識預熱 「專治不明覺厲」之“大資料
USB小白學習之路(5) HID鼠標程序
不可 核心部分 兩個 變化 rip pre 端口 enter style HID鼠標程序 1. 特別註意 需要特別註意,各個例程中的設備描述符,配置描述符等各種描述符都是已經配置好了的,我們需要做的只是在例程中將代碼修改為自己需要的部分即可,一般情況下是不可以串搭配的。 2
Python之路(三):基本資料型別(下)
元祖tuple 是對列表的二次加工,書寫格式為括號(),裡面放元素 元組的一級元素不可被修改,且不能被增加和刪除 一般寫元組的時候,推薦在最後加入逗號, 能加則加 建立元組
Tensorflow學習之路(一):從MNIST資料集開始
MNIST資料集簡單介紹: MNIST 資料集可在 http://yann.lecun.com/exdb/mnist/ 獲取, 它包含了四個部分: Training set images: train-images-idx3-ubyte.gz (9.9 MB,
ApolloStudio高手之路(6):用Python以極簡方式讀寫OPC DA、OPC UA資料並實現UI控制元件自動繫結重新整理顯示
OPC(OLE for Process Control, 用於過程控制的OLE)是一個工業標準,OPC是為了連線資料來源(OPC伺服器)和資料的使用者(OPC應用程式)之間的軟體介面標準。資料來源可以是PLC,DCS,條形碼讀取器等控制裝置。隨控制系統構成的不同,作為資料來源的OPC伺服器既可以
ApolloStudio高手之路(3):用Python以最優雅簡潔的方式讀寫支援Modbus RTU/TCP協議的裝置資料
縱觀整個工業界生態鏈,可能Modbus協議(包括了通過串列埠方式連線的Modbus RTU協議和通過網路傳輸的Modbus TCP協議,這裡統稱為Modbus)作為一種工業領域通訊協議的業界標準在所有裝置互聯的協議群中獨佔鰲頭,也許正是因為其相較與其他協議的優越性(1.公開發表並且無版權要求;2
Pandas使用DataFrame進行資料分析比賽進階之路(二):日期資料處理:按日期篩選、顯示及統計資料
首先,表格的資料格式如下: 1、獲取某年某月資料 data_train = pd.read_csv('data/train.csv') # 將資料型別轉換為日期型別 data_train[
Struts2 學習之路(二):2.4 Struts2(2.5.14.1版本)中的萬用字元匹配問題
struts.xml 配置檔案中萬用字元的匹配 可以匹配action節點中的class屬性,method屬性,result子節點的name屬性,甚至是result子節點的路徑內容 因為2.5.x版本
胖子哥的大資料之路(6)- NoSQL生態圈全景介紹
引言: NoSQL高階培訓課程的基礎理論篇的部分課件,是從一本英文原著中做的摘選,中文部分參考自網際網路。給大家分享。 正文: The NoSQL Ecosystem 目錄 The NoSQL Ecosystem... 1 13.1. What's in a Name?.
Java程序員修煉之路(一)我們為什麽選擇Java
均衡 and ext 修行 穩定性 類庫 多人 官方 edi 我們為什麽選擇Java大多數人選擇Java可能只是因為聽說Java前景好、Java比較好找工作、Java語言在TIOBE排行榜上一直位於前三等等之類的原因,但是Java具體好在哪裏,心裏卻是沒有什麽概念的。其實我
一個鹹魚的Python爬蟲之路(三):爬取網頁圖片
you os.path odin 路徑 生成 存在 parent lose exist 學完Requests庫與Beautifulsoup庫我們今天來實戰一波,爬取網頁圖片。依照現在所學只能爬取圖片在html頁面的而不能爬取由JavaScript生成的圖。所以我找了這個網站
OpenCV探索之路(十三):詳解掩膜mask
ret 如果 拷貝 ace 設置 之路 動作 與運算 區域 在OpenCV中我們經常會遇到一個名字:Mask(掩膜)。很多函數都使用到它,那麽這個Mask到底什麽呢? 一開始我接觸到Mask這個東西時,我還真是一頭霧水啊,也對無法理解Mask到底有什麽用。經過查閱大量資料後
C++學習之路(六):關於C++提供的強制類型轉換
code 記錄 是不是 通過 行修改 單元 c語言 enum 表達式 C語言中提供了舊式的強制類型轉換方法。比如: int a =1; char *p = (char *)&a; 上述將a的地址單元強制轉換為char類型的指針。這裏暫且不說上述轉換結果是否合理,但
C++學習之路(十):虛繼承引入的執行效率
存取 ++ 移位 繼承 模型 虛函數 必須 執行 amp 這篇文章不知道取啥名字了,暫且這樣叫,直接看場景就明白了。節選自《深度探索C++對象模型》 Point3d origin, *pt = &origin; (1)origin.x = 0; (2)pt->