與任何I / O子系統(tǒng)不同,Hadoop還帶有一組原語。當(dāng)然,這些原始考慮因素雖然是通用的,但也與Hadoop IO系統(tǒng)一起使用,并具有一些特殊的內(nèi)涵。Hadoop處理數(shù)TB的數(shù)據(jù)集; 對這些原語的特殊考慮將讓我們了解Hadoop如何處理數(shù)據(jù)輸入和輸出。本文快速瀏覽這些原語,以便對Hadoop輸入輸出系統(tǒng)進(jìn)行透視。
數(shù)據(jù)的完整性
數(shù)據(jù)完整性意味著數(shù)據(jù)在其存儲,處理和檢索操作中應(yīng)保持準(zhǔn)確和一致。為了確保在持久性和處理期間沒有數(shù)據(jù)丟失或損壞,Hadoop保持嚴(yán)格的數(shù)據(jù)完整性約束。每次讀/寫操作都發(fā)生在磁盤中,因此通過網(wǎng)絡(luò)更容易出錯。而且,Hadoop處理的數(shù)據(jù)量只會加劇這種情況。檢測損壞數(shù)據(jù)的常用方法是通過校驗和。一個校驗當(dāng)數(shù)據(jù)首次進(jìn)入系統(tǒng)并在檢索過程中通過通道發(fā)送時計算。檢索端再次計算校驗和并與接收的校驗和匹配。如果它完全匹配,則認(rèn)為數(shù)據(jù)沒有錯誤,否則它包含錯誤。但問題是 - 如果校驗和發(fā)送本身是腐敗的呢?這是極不可能的,因為它是一個小數(shù)據(jù),但不是一個不可否認(rèn)的可能性。使用諸如ECC存儲器之類的正確硬件可以用于緩解這種情況。
這僅僅是檢測。因此,為了糾正錯誤,使用另一種稱為CRC(循環(huán)冗余校驗)的技術(shù)。
Hadoop更進(jìn)一步,為每512個(默認(rèn))字節(jié)數(shù)據(jù)創(chuàng)建一個獨(dú)特的校驗和。由于CRC-32僅為4字節(jié),因此存儲開銷不是問題。進(jìn)入系統(tǒng)的所有數(shù)據(jù)在轉(zhuǎn)發(fā)存儲或進(jìn)一步處理之前由數(shù)據(jù)節(jié)點驗證。發(fā)送到datanode管道的數(shù)據(jù)通過校驗和進(jìn)行驗證,發(fā)現(xiàn)的任何損壞都會立即通過ChecksumException通知客戶端。從datanode讀取的客戶端也經(jīng)歷了相同的鉆取。數(shù)據(jù)節(jié)點維護(hù)校驗和驗證日志以跟蹤已驗證的塊。在從客戶端接收到塊驗證成功信號時,由datanode更新日志。此類統(tǒng)計信息有助于防止壞磁盤出現(xiàn)問題。
除此之外,在DataBlockScanner的幫助下,在后臺運(yùn)行datanode線程,對塊存儲進(jìn)行定期驗證。這可以保護(hù)數(shù)據(jù)免受物理存儲介質(zhì)中的損壞。
Hadoop維護(hù)數(shù)據(jù)的副本或副本。這特別用于從大規(guī)模腐敗中恢復(fù)數(shù)據(jù)。一旦客戶端在讀取塊時檢測到錯誤,它會在拋出ChecksumException之前立即向datanode報告namenode中的壞塊。然后,namenode將其標(biāo)記為壞塊,并將對塊的任何進(jìn)一步引用安排到其副本。以這種方式,副本與其他副本一起維護(hù),并且標(biāo)記的壞塊從系統(tǒng)中移除。
對于在Hadoop LocalFileSystem中創(chuàng)建的每個文件,都會創(chuàng)建一個在同一目錄中具有相同名稱的隱藏文件,擴(kuò)展名為。<filename> .crc。此文件維護(hù)文件中每個數(shù)據(jù)塊(512字節(jié))的校驗和。元數(shù)據(jù)的維護(hù)有助于在扔之前檢測讀取錯誤ChecksumException由LocalFileSystem。
壓縮
記住Hadoop處理的數(shù)據(jù)量,壓縮不是奢侈品,而是要求。Hadoop正確使用的文件壓縮有許多明顯的好處。它節(jié)省了存儲要求,是加速網(wǎng)絡(luò)和磁盤上數(shù)據(jù)傳輸?shù)谋貍涔δ堋adoop常用的工具,技術(shù)和算法很多。它們中的許多都非常受歡迎,并且已經(jīng)在歷史上用于文件壓縮。例如,經(jīng)常使用gzip,bzip2,LZO,zip等。
序列化
將結(jié)構(gòu)化對象轉(zhuǎn)換為字節(jié)流的過程稱為序列化。這是通過網(wǎng)絡(luò)傳輸數(shù)據(jù)或在磁盤中保留原始數(shù)據(jù)時特別需要的。反序列化只是一個反向過程,其中一個字節(jié)流被轉(zhuǎn)換為結(jié)構(gòu)化對象。這對于原始字節(jié)的對象實現(xiàn)尤其需要。因此,分布式計算在幾個不同的領(lǐng)域中使用它并不奇怪:進(jìn)程間通信和數(shù)據(jù)持久性。
Hadoop使用RPC(遠(yuǎn)程過程調(diào)用)來實現(xiàn)節(jié)點之間的進(jìn)程間通信。因此,RPC協(xié)議使用序列化和反序列化的過程將消息呈現(xiàn)給字節(jié)流,反之亦然,并通過網(wǎng)絡(luò)發(fā)送消息。但是,該過程必須足夠緊湊,以便最好地利用網(wǎng)絡(luò)帶寬,以及快速,可互操作和靈活,以適應(yīng)隨時間推移的協(xié)議更新。
Hadoop有自己的緊湊和快速序列化格式,Writable,MapReduce程序用來生成鍵和值類型。
文件的數(shù)據(jù)結(jié)構(gòu)
有幾個高級容器在Hadoop中詳細(xì)說明了專用數(shù)據(jù)結(jié)構(gòu),以容納特殊類型的數(shù)據(jù)。例如,為了維護(hù)二進(jìn)制日志,SequenceFile容器提供了用于保持二進(jìn)制鍵值對的數(shù)據(jù)結(jié)構(gòu)。然后我們可以使用密鑰,例如LongWritable表示的時間戳和Writable的值,它指的是記錄的數(shù)量。
還有另一個容器,SequenceFile的排序派生,稱為MapFile。它提供了按鍵方便查找的索引。
這兩個容器是可互操作的,可以相互轉(zhuǎn)換。
結(jié)論
這只是Hadoop輸入/輸出系統(tǒng)的快速概述。我們將在后續(xù)文章中深入研究許多復(fù)雜的細(xì)節(jié)。如果人們對I / O系統(tǒng)有基本的了解,那么理解Hadoop輸入/輸出系統(tǒng)并不是很困難。Hadoop簡單地為它添加了一些額外的果汁以跟上其在大規(guī)模數(shù)據(jù)中工作的分布式特性。就這樣。