hadoop實戰隨筆_0715

可以通過調整hadoop的參數配置來優化shuffle的性能,例如:在一個任務中,完成單位任務使用時間最多的一般都是I/O操作,可以通過合理的配置ip.sort.*屬性(具體來說是增加io.sort.mb的值)來減少shuffle過程中緩衝區內容超過閥值後的寫出操作。在reduce端,直接在複製map輸出的時候將複製的結果放在內存中同樣能夠提升性能,這樣可以讓部分數據少做兩次I/O操作(前提是留下的內存足夠reduce任務執行),所以在reduce函數的內存需求很小的情況下,將mapred.inmem.merge.threshold設置爲0,將mapred.job.reduce.input.buffer.percent設置爲1.0(或者一個更低的值)能夠讓I/O操作更少,提升shuffle的性能。


推測式執行:當作業的所有任務都開始執行時,jobtracker會統計所有任務的平均進度,由於某個任務所在的tasktracker節點配置低或者cpu負載過高,導致該節點任務慢於總任務的平均速度,這時jobtracker就會啓動一個新的備份任務,當兩個任務中快的任務執行完成後,jobtrcker就會kill掉慢的任務。

hadoop默認開啓推測式執行。

又優點有缺點。


任務JVM重用:在一個任務結束以後,讓後續任務重用此Java虛擬機,這樣可以省下新任務啓用新JVM的時間。

控制JVM重用的屬性是mapred.job.reuse.jvm.num.tasks,這個屬性定義了單個JVM上運行任務的數目,-1爲運行任務數目不受限制。


跳過壞記錄:由於沒有考慮到對有些擁有個別格式或字段的數據(壞記錄)的特殊處理(代碼問題)導致的崩潰,任務的重啓是不起作用的,因爲重啓多少次都會崩潰。這時最好的辦法就是遇到壞記錄就跳過去(對於龐大數據集,跳過個別數據,對結果影響不大),然後繼續處理後面的數據,這就是hadoop中的忽略模式(skipping模式)。當忽略模式開啓時,當任務失敗兩次後,它會將正在處理的記錄告訴TaskTracker,然後TaskTracker會重新運行該任務並在運行到先前任務報告的記錄地方時直接跳過。忽略模式只能檢測並忽略一個錯誤記錄,因此這種機制僅適用於檢測個別錯誤記錄。如果增加任務嘗試次數最大值(由mapred.map.max.attemps mapred.reduce.max.attemps兩個屬性決定),可以增加忽略模式能夠檢測並忽略的錯誤記錄數目。默認情況下忽略模式是關閉的,可以使用SkipBadRedcord類單獨爲mapreduce任務啓用它。



I/O

org.apache.hadoop.io

org.apache.hadoop.io.compress

org.apache.hadoop.io.file.tfile

org.apache.hadoop.io.serializer

org.apache.hadoop.io.serializer.avro


對本地文件I/O的檢查

hadoop中,本地文件系統的數據完整性由客戶端負責。重點是在存儲和讀取問價時進行檢驗和的處理。

具體做法是,每當Hadoop創建文件a時,Hadoop就會同時在同一文件夾下創建隱藏文件.a.crc,這個文件記錄了文件a的校驗和。針對數據文件的大小,每512個字節Hadoop就會生成一個32位的校驗和(4字節),你可以在src/core/core-default.xml中通過修改io.bytes.per.checksum的大小來修改每個校驗和所針對的文件大小。


數據壓縮:


數據的I/O中序列化操作:序列化是將對象轉化爲字節流的方法,或者說用字節流描述對象的方法。與序列化相對的是反序列化,反序列化是將字節流轉化爲對象的方法。

序列化有兩個目的:進程間通信,數據持久性存儲。


WritableHadoop的核心,Hadoop通過它定義了Hadoop中基本的數據類型及其操作。一般來說,無論是上傳下載數據還是運行MapReduce程序,你無時無刻不需要使用Writable類,因此Hadoop中具有龐大的一類Writable類,不過Writable類本身卻很簡單。


















































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章