1. 程式人生 > >Hadoop實戰-中高階部分 之 Hadoop IO

Hadoop實戰-中高階部分 之 Hadoop IO

          HDFS以透明方式校驗所有寫入它的資料,並在預設設定下,會在讀取資料時驗證校驗和。針對資料的每個io.bytes.per.checksum(預設512位元組)位元組,都會建立一個單獨的校驗和。              資料節點負責在儲存資料及其校驗和之前驗證它們收到的資料。 從客戶端和其它資料節點複製過來的資料。客戶端寫入資料並且將它傳送到一個數據節點管線中,在管線的最後一個數據節點驗證校驗和。               客戶端讀取資料節點上的資料時,會驗證校驗和,將其與資料節點上儲存的校驗和進行對比。每個資料節點維護一個連續的校驗和驗證日誌,因此它知道每個資料塊最後驗證的時間。每個資料節點還會在後臺執行緒執行一個DataBlockScanner(資料塊檢測程式),定期驗證儲存在資料節點上的所有塊,為了防止物理儲存介質中位衰減鎖造成的資料損壞。           HDFS通過複製完整的副本來產生一個新的,無錯的副本來“治癒”哪些出錯的資料塊。工作方式:如果客戶端讀取資料塊時檢測到錯誤,丟擲Checksum Exception前報告該壞塊以及它試圖從名稱節點中藥讀取的資料節點。名稱節點將這個塊標記為損壞的,不會直接複製給客戶端或複製該副本到另一個數據 節點。它會從其他副本複製一個新的副本。 本地檔案系統             Hadoop的本地檔案系統執行客戶端校驗。意味著,在寫一個名filename的檔案時,檔案系統的客戶端以透明的方式建立一個隱藏.filename.crc。在同一個資料夾下,包含每個檔案塊的校驗和。                 資料塊大小由io.bytes.per.checksum屬性控制,塊的大小作為元資料儲存在.crc檔案中。也可能禁用校驗和:底層檔案系統原生支援校驗和。這裡通過 RawLocalFileSystem來替代LocalFileSystem完成。要在一個應用中全域性使用,只需要設定fs.file.impl值為 org.apache.hadoop.fs.RawLocalFileSystem來重新map執行檔案的URL。或者只想對某些讀取禁用校驗和校驗。例子: Configuration conf = ... FileSystem fs = new RawLocalFileSystem(); fs.initialize(null, conf); ChecksumFileSystem
LocalFileSystem使用ChecksumFileSystem(校驗和檔案系統)為自己工作,這個類可以很容易新增校驗和功能到其他檔案系統中。因為ChecksumFileSystem也包含於檔案系統中。 第二部分:壓縮 編碼/解碼 編碼/解碼器:用以執行壓縮解壓演算法。 •DEFLATE   org.apache.hadoop.io.compress.DefaultCodec •gzip   org.apache.hadoop.io.compress.GzipCodec •bzip2  org.apache.hadoop.io.compress.Bzip2Codec •LZO  com.hadoop.compression.lzo.LzopCodec •CompressionCodec 對流進行進行壓縮與解壓縮 •CompressionCodecFactory 方法來推斷CompressionCodec   Hadoop支援的壓縮形式
壓縮格式 工具 演算法   副檔名   多檔案 可分割性
 DEFLATE  無  DEFLATE  .deflate  不  不
 gzip  gzip  DEFLATE  .gz  不  不
 bzip2  bzip2  bzip2  .bz2  不  是
 LZO  lzop  LZO  .lzo  不  不
•屬性名:       io.compression.codecs       預設值: org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.ompress.Bzip2Codec •本地庫
壓縮格式
Java 實現 本地實現
DEFLATE
Gzip
Bzip2
LZO
壓縮與輸入分割 •前提:           在考慮如何壓縮那些將由MapReduce處理的資料時,考慮壓縮格式是否支援分割是很重要的。 • 案例 •假設,一個檔案時一個gzip格式的壓縮檔案,壓縮後的大小為1GB。HDFS將其分為16塊。然而針對每一塊在進行分塊是不可以的,因為gzip合適的檔案不支援分割(分塊)機制,所以讀取他的MapReduce不分割檔案,造成了只有Map讀取16塊檔案的情況。導致執行時間變長。 •應該選擇哪種壓縮形式 •總體原則,還要經過測試,才可以決定。 •經驗:大檔案選擇支援分割的壓縮形式   MR 中使用壓縮 •前提:          如果檔案是壓縮過的,那麼在被MapReduce讀取時,它們會被解壓,根據檔案的副檔名來選擇應該使用拿一種壓縮解碼器。 •使用: •壓縮MapReduce的作業輸出,在作業配置中將 mapred.output.compress屬性設定為true,將mapred.output.compression.codec屬性設定為自己需要使用的壓縮解碼/編碼器的類名。 •通過gunzip –c file來檢視結果。   Ø程式碼示例 conf.setBoolean(“mapred.output.compress’,true) Conf.setClass(“mapred.output.compression.codec”,GizpCodec.class, CompressionCodec.class); •Map作業輸出結果的壓縮 •使用原因           因為Map作業的中間結果會輸出到本地,並在網路上傳遞。所以壓縮能獲得更好效能,因為傳播的資料減少了。 •Map輸出壓縮屬性 •mapred.compress.map.output •mapred.map.output •compression.codec •程式碼示例 •conf.setCompressMapOutput •conf.setMapOutputCompressorClass(GzipCodec.classs)
第三部分:序列化 什麼是Hadoop的序列化 •序列化(serialization)           序列化指的是將結構化物件轉為位元組流以便於通過網路進行傳輸或寫入持久儲存的過程。反序列化指的是將位元組流轉為一系列結構化物件的過程。           序列化用於:程序間通訊與持久儲存。     RPC序列化建議的特性 1.緊湊(Compact)即方便網路傳輸,充分利用儲存空間 2.快速(Fast)即序列化及反序列化效能要好 3.擴充套件性(Extensible)即協議有變化,可以支援新的需求 4.互操作性(Interoperable)即客戶端及伺服器端不依賴語言的實現   Hadoop使用Writables,滿足緊湊、快速,不滿足擴充套件能及互操作性 •Hadoop的序列化不是java的序列化,Hadoop自己實現了自己的序列化機制。格式Writables。 •Hadoop中定義了兩個序列化相關的介面:Writable介面和Comparable介面,這兩個介面可以合成一個介面WritableComparable. Writable介面 Writable 介面 Writable 介面定義了兩個方法: (1)一個用於將其狀態寫入二進位制格式的 DataOutput 流; (2)另一個用於從二進位制格式的 DataInput 流讀取其狀態;
我們可以使用 set() 函式來建立和設定 Writable 的值: IntWritable wirtable = new IntWritable(); writable.set(163); 同樣我們也可以使用建構函式: IntWritable writable = new IntWritable(163); package org.apache.hadoop.io; import java.io.DataOutput; import java.io.DataInput; import java.io.IOException; public interface Writable {    void write(DataOutput out) throws IOException;    void readFields(DataInput in) throws IOException;} Writable 介面 Writable 介面定義了兩個方法: (1)一個用於將其狀態寫入二進位制格式的 DataOutput 流; (2)另一個用於從二進位制格式的 DataInput 流讀取其狀態;
我們可以使用 set() 函式來建立和設定 Writable 的值: IntWritable wirtable = new IntWritable(); writable.set(163); 同樣我們也可以使用建構函式: IntWritable writable = new IntWritable(163); WritableComparable  comparator          IntWritable 實現了 WritableComparable 介面 ,後者是 Writable 與java.lang.Comprable 介面的子介面 package org.apache.hadoop.io;      public interface       WritableComparable<T> extends Writable,Comparable<T> {} Hadoop 優化比對,不需要反序列化即可比較。 package  org.apache.hadoop.io;  import  java.util.Comparator;  public  interface  RawComparator<T>  extends  Comparator<T>  {      public  int  compare( byte [] b1,  int  s1,  int  l1,  byte [] b2,  int s2,  int  l2);  }           WritableComparator 是一個 RawComparator 通用的實現 ,為WritableComparable classes.    它做了兩件事  1.實現了 compare() 方法(返序列化)  2.它充當的是 RawComparator 的工廠類 Hadoop自帶的序列化介面(Writable類) Hadoop 自帶的序列化介面 實現了 WritableComparable 介面的類: 基礎: BooleanWritable | ByteWritable 數字: IntWritable | VIntWritable | FloatWritable | LongWritable |VLongWritable | DoubleWritable 高階: NullWritable | Text | BytesWritable | MDSHash | ObjectWritable |GenericWritable 僅實現了 Writable 介面的類: 陣列: ArrayWritable | TwoDArrayWritable 對映: AbstractMapWritable | MapWritable | SortedMapWritable •Text         Text是UTF-8的Writable。可以將它理解為一種與java.lang.String 相類似的Writable。Text類代替了UTF-8類。          Text是可變的,其值可以通過呼叫set()方法來改變。最大儲存是2GB。 •NullWritable NullWritable是一種特殊的Writable型別,因為它的序列化的長度是零。可以做佔位符。 •BytesWritable 
 BytesWritable 是一個二進位制的資料陣列封裝。它的序列化格式是一個int欄位. BytesWritable是可變的,其值可以通過呼叫set()方法來改變。   •ObjectWriable ObjectWriable 適用於欄位可以使用多種型別時。 •Writable集合      一共 四種:             ArrayWritable和TwoDArrayWritable是針對陣列與二維陣列             MapWritable和SortededMapWritable 針對是Map與SortMap 自定義Writable •實現WritableComparable •實現      /** * 將物件轉換為位元組流並寫入到輸出流out中 */       write()       /** * 從輸入流in 中讀取位元組流並反序列化為物件 */        readFields(),       /** * 將this對像與物件O比較*/       compareTo()方法。 第四部分:基於檔案的資料結構 SequenceFile           SequeceFile是Hadoop API提供的一種二進位制檔案支援。這種二進位制檔案直接將<key, value>對序列化到檔案中。          Key是任意的Writable,Value是任意的Writable          這種檔案格式 有以下好處: A.支援壓縮,且可定製為基於Record或Block壓縮(Block級壓縮效能較優) B.本地化任務支援:因為檔案可以被切分,因此MapReduce任務時資料的本地化情況應該是非常好的。 C.難度低:因為是Hadoop框架提供的API,業務邏輯側的修改比較簡單。   SequenceFile 步驟: 1. 設定 Configuration       2. 獲取 File System       3. 設定檔案輸出路徑       4. SequenceFile.createWriter 建立 SequenceFile.Writer 然後寫入       5. 呼叫 SequenceFile.Writer .append 追加寫入       6. 關閉流 SequenceFile 步驟: 1. 設定 Configuration       2. 獲取 File System       3. 設定檔案輸出路徑       4. SequenceFile.Reader 建立讀取類 SequenceFile.Reader       5. 拿到 Key 與 Value 的 class       6. 讀取   SequenceFile使用壓縮 寫:壓縮分為Record和Block兩種。 讀時自動解壓。 步驟:       增加如下程式碼      SequenceFile.createWriter(fs, conf, path, key.getClass(), value.getClass(), SequenceFile.CompressionType.RECORD, new Bzip2Codec())     MapFile            MapFile 是經過排序的帶索引的 SequenceFile ,可以根據鍵值進行查詢 .       由兩部分組成,分別是 data 和 index 。 index 作為檔案的資料索引,主要記錄了每個 Record 的 key 值,以及該 Record 在檔案中的偏移位置。在 MapFile 被訪問的時候 , 索引 檔案會被載入到記憶體,通過索引對映關係可迅速定位到指定Record 所在檔案位置, 因此,相對 SequenceFile 而言, MapFile 的檢索效率是高效的,缺點是會消耗一部分 記憶體來儲存 index 資料 .   MapFile 步驟: 1. 設定 Configuration       2. 獲取 File System       3. 設定檔案輸出路徑       4. MapFile Reader 建立讀取類 . MapFile Reader       5. 拿到 Key 與 Value 的 class       6. 讀取 MapFile 步驟: 1. 設定 Configuration       2. 獲取 File System       3. 設定檔案輸出路徑       4. MapFile .createWriter 建立 MapFile .createWriter 然後寫入       5. 呼叫 MapFile .Writer .append 追加寫入       6. 關閉流   轉載請註明出處【  http://sishuok.com/forum/blogPost/list/5963.html

相關推薦

Hadoop實戰-中高階部分 Hadoop IO

          HDFS以透明方式校驗所有寫入它的資料,並在預設設定下,會在讀取資料時驗證校驗和。針對資料的每個io.bytes.per.checksum(預設512位元組)位元組,都會建立一個單獨的校驗和。              資料節點負責在儲存資料及其校驗和之前驗證它們收到的資料。 從客戶端和

Hadoop實戰-中高階部分 Hadoop HA

•hadoop.security.authorization •預設值 false • 是不是要開啟 賬號驗證機制,開啟之後 Hadoop 在執行任何動作之前都會先確認是否有許可權。詳細的許可權設定會放在 hadoop-policy.xml 裡。例如要讓 fenriswolf 這個 account 及

Hadoop實戰-初級部分 Hadoop IO

          HDFS以透明方式校驗所有寫入它的資料,並在預設設定下,會在讀取資料時驗證校驗和。針對資料的每個io.bytes.per.checksum(預設512位元組)位元組,都會建立一個單獨的校驗和。              資料節點負責在儲存資料及其校驗和之前驗證它們收到的資料。 從客戶端和

Hadoop實戰-初級部分 Hadoop MapReduce JAVA API

•MapReduce程式可以以以下三種模式執行 – –Local(Standalone) Mode:只有一個 Java 虛擬機器在跑,完全沒有分散式的成分。且不使用HDFS檔案系統,而是使用本機的Linux檔案系統。 –Pseudo-distributed Mode:在同一臺機器上啟動獨立數個 JVM 程序

Hadoop實戰-初級部分 MapReduce

              Hadoop Map/Reduce是一個使用簡易的軟體框架,基於它寫出來的應用程式能夠執行在由上千個商用機器組成的大型叢集上,並以一種可靠容錯的方式並行處理上T級別的資料集。               MapReduce基礎出發點是很易懂。它由稱為map和reduce的兩部分使

Hadoop實戰-中高階部分 PPT 和 原始碼 下載

內容概述:Hadoop中高階精品課程,深入學習HDFS的原理;MapReduce的原理;MapReduce高階程式設計;Hadoop的IO機制, 如序列化、壓縮;Hadoop的RPC;RESTFul API;叢集等高階特性。    本課程包括很多原始碼級深入剖析的內容,還有很

安裝Hadoop——Hadoop實戰初級部分學習筆記

3、安裝Hadoop 1、window上裝    (建議xp 玩玩就行了,實際要在linux) 1.1、裝JDK(不要裝到帶空格等目錄中。。) 1.2、安裝cygwin 需要安裝oenSSL、VIM、Base 1.3、在cygwin安裝SSHD   ssh-h

hadoop家族學習路線圖hadoop產品介紹

工作效率 快速 性能 pan 數據處理 sha lin pig win 大數據這個詞也許幾年前你聽著還會覺得陌生,但我相信你現在聽到hadoop這個詞的時候你應該都會覺得“熟悉”!越來越發現身邊從事hadoop開發或者是正在學習hadoop的人變多了。作為一個hadoop入

Hadoop概念學習系列Hadoop、Spark學習路線(很值得推薦)

不多說,直接上乾貨! 說在前面的話   此筆,對於僅對於Hadoop和Spark初中學者。高手請忽略! 1 Java基礎:     視訊方面:           推薦《畢向東JAVA基礎視訊教程》。學習hadoop不需要過度的深入,java學習到

hadoop家族學習路線圖hadoop產品詳解

大資料這個詞也許幾年前你聽著還會覺得陌生,但我相信你現在聽到hadoop這個詞的時候你應該都會覺得“熟悉”!越來越發現身邊從事hadoop開發或者是正在學習hadoop的人變多了。作為一個hadoop入門級的新手,你會覺得哪些地方很難呢?執行環境的搭建恐怕就已經足夠讓新手頭疼

Hadoop概念學習系列Hadoop、Spark學習路線(很值得推薦)(十八)

   不多說,直接上乾貨! 說在前面的話   此筆,對於僅對於Hadoop和Spark初中學者。高手請忽略! 1 Java基礎:     視訊方面:          推薦《畢向東JAVA基礎視訊教程》。學習hadoop不需要過度的深入,java學習到javase,在Java虛

Hadoop實戰-MapReducemax、min、avg統計(六)

next combine output fileinput private pub eof pri use 1、數據準備: Mike,35 Steven,40 Ken,28 Cindy,32 2、預期結果 Max  40 Min   28 Avg 33 3、M

Hadoop實戰-Flume自定義Sink(十九)

current ioe back urn oop print out java try import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream;

Hadoop實戰-FlumeHdfs Sink(十)

pac esc path ref times buffers ogg events nts a1.sources = r1 a1.sinks = k1 a1.channels = c1 # Describe/configure the source a1.sources

Hadoop實戰-FlumeSource regex_extractor(十二)

local netcat nts configure style cto and event time a1.sources = r1 a1.sinks = k1 a1.channels = c1 # Describe/configure the source a1.s

大資料Hadoop學習——動手實戰學習MapReduce程式設計例項

文章目錄 一、MapReduce程式設計例項 1.自定義物件序列化 需求分析 報錯:Exception in thread "main" java.lang.IllegalArgumentExcept

大資料hadoop 環境搭建從零開始——實戰訓練

        這裡的前提是要先安裝一個乾淨的CentOS系統,我這裡用的是CentOS6.6,安裝教程參考另一篇部落格:https://blog.csdn.net/gaofengyan/article/details/85054337 目錄 ha

Hadoop源碼學習HDFS(一)

-a node bsp ima 數據 layout 版本號 name 技術   Hadoop的HDFS可以分為NameNode與DataNode,NameNode存儲所有DataNode中數據的元數據信息。而DataNode負責存儲真正的數據(數據塊)信息以及數據塊的ID。

hadoop入門學習系列hadoop學習sqoop安裝

1.7 sqoop安裝 opc 2.6 clas jdb -m -- error 1.下載安裝包及解壓 tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 2.配置環境變量和配置文件 cd 到 sqoop

大數據系列Hadoop框架

apr png 關系型 big sqoop ted 服務器 定制 操作 Hadoop框架中,有很多優秀的工具,幫助我們解決工作中的問題。 Hadoop的位置 從上圖可以看出,越往右,實時性越高,越往上,涉及到算法等越多。 越往上,越往右就越火…… Hadoop框架中一