您好,登錄后才能下訂單哦!
本篇內容介紹了“Hadoop SequenceFile BLOCK壓縮類型文件數據丟失怎么辦”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
先來了解SequenceFile BLOCK壓縮類型的數據寫入機制:
BLOCK壓縮類型的SequenceFile數據結構圖
BLOCK壓縮類型的SequenceFile.Writer實現類為SequenceFile.BlockCompressWriter,寫入流程如下:
1.寫入頭部信息:版本信息,壓縮類型信息,壓縮算法類信息,keyClass/valueClass類名,Metadata等;
2.寫入Sync標記;
3.將key和value序列化并寫入緩存,當緩存大小達到閾值(默認io.seqfile.compress.blocksize=1000000字節),觸發sync()操作,sync操作:先寫入sync標記,再將緩存中的key和value進行壓縮寫入FSDataOutputStream,格式如上圖中的Block compression。 這樣就成功寫入了一個block;
4. 后續的數據寫入流程和3一樣;
5. 當最后數據寫入完成后,會存在最后一個block的數據小于io.seqfile.compress.blocksize,這樣不會觸發sync()操作,所以必須調用BlockCompressWriter的close()方法,其中會去調用sync()操作將最后剩余的數據寫入FSDataOutputStream,并對FSDataOutputStream做close(),至此完成整個寫入流程。
?解決我的問題:?
我的問題是由于在寫入數據結束后只對FSDataOutputStream做了close()操作,而根據BLOCK壓縮類型的寫入必須調用Writer的close()操作,才能觸發sync()操作將剩余數據壓縮寫入FSDataOutputStream。而在我的實現中,當設置io.seqfile.compression.type為NONE和RECORD,不會出現數據丟失。 因為這兩種壓縮類型,是來一條數據就寫入outputStream,沒有BLOCK這樣的緩存后再寫入機制。
“Hadoop SequenceFile BLOCK壓縮類型文件數據丟失怎么辦”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。