1. 程式人生 > >大數據學習之六——Hadoop I/O

大數據學習之六——Hadoop I/O

管理 完整 檢測 適合 img 復數 節點數據 設計 大文件

Hadoop IO的操作意義:基於海量數據集的完整性和壓縮性,Hadoop提供了用於分布式系統的API,包括序列化操作以及底層的數據結構。

1.HDFS數據完整性

目的:保證用戶在存儲和處理數據時,數據不會有任何的丟失和損壞。

(1)校驗和

檢測數據的常見措施:在數據第一次引入系統時計算校驗和(checksum),在數據通過不可靠的通道進行傳輸時再次計算校驗和,這樣就能發現數據是否損壞。

如果新校驗和和原來的校驗和不匹配,就認為數據有損壞。

A . HDFS的數據完整性:

HDFS對寫入的數據計算校驗和,並在讀取時驗證校驗和。

寫入數據節點驗證:數據節點負責在驗證收到的數據後,存儲數據及其校驗和,在收到客戶端數據或復制其他DataNode的數據時執行。正在寫數據的客戶端將數據及其校驗和發送到一系列數據節點組成的管線,管線的最後一個數據節點負責驗證校驗和。

讀取數據節點驗證:客戶端讀取數據節點數據也會驗證校驗和,將其和數據節點中存儲的校驗和進行比較。每個數據節點都會持久化一個用於驗證的校驗和日誌,所以它知道每個數據塊的最後一次驗證時間。當客戶端成功驗證一個數據塊之後,數據節點就會更新日誌。

B . 恢復數據

因為Hdfs中能夠存儲了每個數據塊的副本,因此可以通過復制完好的數據副本來修復損壞的數據塊。

C . LocalFileSystem類

該類執行客戶端的校驗和驗證。這就意味著,當你寫入一個名為filename的文件時,文件系統客戶端會明確的在包含每個文件塊校驗和的同一目錄內新建一個名為filename.crc的隱藏文件

D . ChecksumFileSystem類

ChecksumFileSystem類繼承自FileSystem類,一般用法為:

FileSystem rawFs = ...

FileSystem checksummedFs = new ChecksumFileSystem ( rawFs ) ;

其中的方法有:

getRawFileSystem ( ) :用於獲得任意一個文件的校驗和文件路徑。

reportChecksumFailure ( ) :在讀取文件時,若檢測到錯誤,就會調用此方法報告錯誤,然後LocaclFileSystem將出錯的文件和校驗和移到bad_files的文件夾內,管理員會定期檢查這個文件夾。

(2)運行後臺進程來檢測數據塊

數據節點後臺有一個進程DataBlockScanner,定期驗證存儲在這個數據節點上的所有數據項,該項措施解決物理存儲媒介上的損壞。工作流程如圖:

技術分享圖片

2.文件結構

HDFS主要是針對大數據文件來設計的,在小文件處理上效率低。解決方法就是選擇一個容器,將小文件包裝起來,將整個文件作為一條記錄。hdfs提供了兩種類型的容器:SequenceFile和MapFile。

SequenceFile:

sequence File由一系列的二進制key/value組成,如果key為小文件名,value為文件內容,則可以將大批小文件合並成一個大文件。Hadoop-0.21.0版本開始提供了SequenceFile,包括Writer,Reader和SequenceFileSorter類進行寫,讀和排序操作。該方案對於小文件存取都比較自由,不限制用戶和文件的多少,支持Append追加寫入,支持三級文檔壓縮(不壓縮、文件級、塊級別)、其存儲結構如圖:

技術分享圖片

SequenceFile存儲:

文件中每條記錄是可序列化、可持久化的鍵值對,提供相應的讀寫器和排序器,寫操作根據壓縮的類型分為3種:

—Write無壓縮寫數據

—RecordCompressWriter記錄級壓縮文件,只壓縮值

—BlockCompressWrite塊級壓縮文件,鍵值采用獨立壓縮方式

在存儲結構上,sequenceFile主要由一個header後跟多條record組成,如圖:

技術分享圖片

MapFile:

一個MapFile可以通過SequenceFile的地址,進行分類查找的格式。使用這個格式的優點在於,首先會將SequenceFile的地址都加載到內存中,並且進行key值排序,從而提供更快的數據查找。

與SequenceFile只生成一個文件不同,MapFile生成一個文件夾。

缺點:

1)文件不支持復寫操作,不能向已存在的SequenceFile追加存儲記錄

2)當write流不關閉時,沒有辦法構造read流。也就是在執行文件寫操作時,該文件是不可讀取的。

3.數據類型

(1)序列化

序列化serialization:是指將結構化對象轉化為字節流,以便寫到磁盤進行永久存儲或者在網絡上傳輸。

在hadoop中,系統中多個節點上進程間的通信是通過“遠程過程調用”(remote procedure call,RPC)實現的,而且要求系列化要快,且體積小,占用帶寬小。Hadoop定義了兩個序列化相關接口:writable和comparable。

Hadoop使用自己的序列化格式Writable,它格式緊湊,速度快,但很難用java以外的語言進行擴展或使用。

writable接口:基於datainput和dataoutput的簡單高效可序列化接口,就是org.apache.hadoop.io.writable接口,幾乎所有的hadoop可序列化對象都必須實現這個接口有來哥哥方法:Write,readFiles。

以IntWritable為例,它把java的int類型封裝成了Writable序列化格式:

可以通過set ( )設置它的值,new IntWritable().set(100);或者 new IntWritable(100)

實現序列化需要繼承接口,接口方法有重要的三個,例如:

A implements Writable,com..{

write ( DataInputStream ) DataInputStream

readFiles ( )

comparaTo ( B b )

}

當A繼承了該接口,就可以在hadoop上進行存儲操作。

4.hadoop壓縮

通過壓縮,減少存儲文件所需空間,還可以降低其在網絡上傳輸的時間。

本地庫:

因為hadoop使用java開發,但是有些需求和操作並不適合java,所以引入了本地庫native。

本地庫native是為了大量的數據讀寫快速,可以高效執行某些操作,如使用gzip壓縮解壓時,使用本地庫比使用java要時間短。

壓縮格式:

A. Gzip:優點:是壓縮率高,速度快

缺點:不支持split,當文件壓縮在128M內都可以用gzip

B. Izo:優點:壓縮速度快,支持split,支持native

缺點:hadoop本身不支持,需要安裝,比gzip壓縮率低

C. Snappy:優點:高速,壓縮率合理,支持native

缺點:hadoop不支持,Linux沒有對應的命令安裝

D. Bzip2:優點:支持split,壓縮率比gzip高,hadoop支持,Linux自帶命令

缺點:不支持native,壓縮解壓速度慢

大數據學習之六——Hadoop I/O