Hadoop重點(diǎn)難點(diǎn):Hadoop IO/壓縮/序列化
輸入文件從HDFS進(jìn)行讀取. 輸出文件會(huì)存入本地磁盤(pán). Reducer和Mapper間的網(wǎng)絡(luò)I/O,從Mapper節(jié)點(diǎn)得到Reducer的檢索文件. 使用Reducer實(shí)例從本地磁盤(pán)回讀數(shù)據(jù). Reducer輸出- 回傳到HDFS.
序列化
Writable 接口
BytesWritable
NullWritable
ObjectWritable和GenericWritable
Wriable集合類
ArrayWritable ArrayPrimitiveWritable TwoDArrayWritable MapWritable SortedMapWritable EnumMapWritable
序列化框架
序列化IDL
基于文件的數(shù)據(jù)結(jié)構(gòu)
SequnceFile的寫(xiě)操作
SequenceFile的讀操作
通過(guò)命令行接口顯示 SequenceFile。
SequenceFile 的排序和合并。
關(guān)于MapFile
壓縮
使用容器文件格式,例如順序文件, Avro 數(shù)據(jù)文件。ORCF 了說(shuō) Parquet 文件
使用支持切分的壓縮格式,例如 bzip2 或者通過(guò)索引實(shí)現(xiàn)切分的壓縮格式,例子如LZO。
在應(yīng)用中將文件中切分成塊,并使用任意一種他所格式為每個(gè)數(shù)據(jù)塊建立壓縮文件(不論它是否支持切分)。在這種情況下,需要合理選擇數(shù)據(jù)大小,以確保壓縮后的數(shù)據(jù)塊的大小近似于HDFS塊的大小。
存儲(chǔ)未經(jīng)壓縮的文件。
在 Mapreduce 中使用壓縮
FileOutputFormat.setCompressOutput(job,true);
FileOutputFormat.setOutputCompressorClass(job,GzipCodec.class);
完整性
檢測(cè)數(shù)據(jù)是否損壞的常見(jiàn)措施是,在數(shù)據(jù)第一次引入系統(tǒng)時(shí)計(jì)算校驗(yàn)和并在數(shù)據(jù)通過(guò)一個(gè)不可靠的通道進(jìn)行傳輸時(shí)再次計(jì)算校驗(yàn)和,這樣就能發(fā)現(xiàn)數(shù)據(jù)是否損壞,如果計(jì)算所得的新校驗(yàn)和和原來(lái)的校驗(yàn)和不匹配,我們就認(rèn)為數(shù)據(jù)已損壞。但該技術(shù)并不能修復(fù)數(shù)據(jù)。常見(jiàn)的錯(cuò)誤檢測(cè)碼是 CRC-32(32位循環(huán)冗余檢驗(yàn)),任何大小的數(shù)據(jù)輸入均計(jì)算得到一個(gè)32位的整數(shù)校驗(yàn)和。
datanode 負(fù)責(zé)在收到數(shù)據(jù)后存儲(chǔ)該數(shù)據(jù)及其校驗(yàn)和之前對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證。它在收到客戶端的數(shù)據(jù)或復(fù)制其他 datanode 的數(shù)據(jù)時(shí)執(zhí)行這個(gè)操作。正在寫(xiě)數(shù)據(jù)的客戶端將數(shù)據(jù)及其校驗(yàn)和發(fā)送到由一系列 datanode 組成的管線,管線中最后一個(gè) datanode 負(fù)責(zé)驗(yàn)證校驗(yàn)和。如果 datanode 檢測(cè)到錯(cuò)誤,客戶端就會(huì)收到一個(gè) IOException 異常的子類。
客戶端從 datanode 讀取數(shù)據(jù)時(shí),也會(huì)驗(yàn)證校驗(yàn)和,將它們與 datanode 中存儲(chǔ)的校驗(yàn)和進(jìn)行比較。每個(gè)datanode均持久保存有一個(gè)驗(yàn)證的校驗(yàn)和日志,所以它知道每個(gè)數(shù)據(jù)塊的最后一次驗(yàn)證時(shí)間??蛻舳顺晒︱?yàn)證一個(gè)數(shù)據(jù)塊后,會(huì)告訴這個(gè) datanode , datanode 由此更新日志。保存這些統(tǒng)計(jì)信息對(duì)于檢測(cè)損壞的磁盤(pán)很有價(jià)值。
不只是客戶端在讀取數(shù)據(jù)塊時(shí)會(huì)驗(yàn)證校驗(yàn)和,每個(gè) datanode 也會(huì)在一個(gè)后臺(tái)線程中運(yùn)行一個(gè) DataBlockScanner ,從而定期驗(yàn)證存儲(chǔ)在這個(gè) datanode 上的所有數(shù)據(jù)塊。該項(xiàng)措施是解決物理存儲(chǔ)媒體上位損壞的有力措施。
由于 HDFS 存儲(chǔ)著每個(gè)數(shù)據(jù)塊的復(fù)本,因此它可以通過(guò)數(shù)據(jù)復(fù)本來(lái)修復(fù)損壞的數(shù)據(jù)塊,進(jìn)而得到一個(gè)新的,完好無(wú)損的復(fù)本?;舅悸肥?,客戶端在讀取數(shù)據(jù)塊時(shí),如果檢測(cè)到錯(cuò)誤,首先向 namenode 報(bào)告已損壞的數(shù)據(jù)塊及其正在嘗試讀取操作的這個(gè) datanode ,再拋出 ChecksumException 異常。namenode 將這個(gè)數(shù)據(jù)塊復(fù)本標(biāo)記為已損壞,這樣它不再將客戶端處理請(qǐng)求直接發(fā)送到這個(gè)節(jié)點(diǎn),或嘗試將這個(gè)復(fù)本復(fù)制到另一個(gè) datanode 。之后,它安排這個(gè)數(shù)據(jù)塊的一個(gè)復(fù)本復(fù)制到另一個(gè) datanode ,這樣一來(lái),數(shù)據(jù)塊的復(fù)本因子又回到期望水平。此后,已損壞的數(shù)據(jù)塊復(fù)本便被刪除。
Hadoop的LocalFileSystem 執(zhí)行客戶端的校驗(yàn)和驗(yàn)證。這意味著在你寫(xiě)入一個(gè)名為 filename 的文件時(shí),文件系統(tǒng)客戶端會(huì)明確在包含每個(gè)文件快校驗(yàn)和的同一個(gè)目錄內(nèi)新建一個(gè) filename.crc 隱藏文件。文件塊的大小作為元數(shù)據(jù)存儲(chǔ)在.crc文件中,所以即使文件塊大小的設(shè)置已經(jīng)發(fā)生變化,仍然可以正確讀回文件。在讀取文件時(shí)需要驗(yàn)證校驗(yàn)和,并且如果檢測(cè)到錯(cuò)誤,LocalFileSystem 還會(huì)拋出一個(gè) ChecksumException 異常。
