共計 1004 個字符,預計需要花費 3 分鐘才能閱讀完成。
丸趣 TV 小編給大家分享一下 Hadoop 中 TeraSort 修改后輸出翻倍異常怎么辦,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
簡而言之,就是在修改了TeraInputFormat.java 之后,運行 TeraSort 所得到的輸出數據不同程度的翻倍,剛開始并沒有什么頭緒,并且把采樣的線程和Map 的讀入
其實應該可以想到一種辦法,就是在 MapTask 里設斷點觀察,但不知道是自己懶還是因為對隱藏在深處的MapTask 有一種畏懼心里,起初我并沒有仔細進去看,后來在MapTask 里RecordReader 部分的 nextKeyValue() 方法里設置變量計數并輸出,來觀察每次 split 所獲取的記錄條數,結果發現,我的每個 split 都完整的獲取了整個(注意是整個輸入文件)而不是一個 split 大小的記錄,所以輸出也隨著翻倍了.
那么關鍵點找出來了,問題出在哪里呢?MapTask 部分是Hadoop 默認綁定的,TeraSort 并沒有重寫,所以這部分不可能出錯;TeraInputFormat 的前半部分是取樣部分,問題不可能出在這里;后半部分的 RecordReader 的 initialize 部分和修改前基本無變化,那錯誤的部分一定是在 nextKeyValue() 部分了,于是一行一行分析,最終鎖定了這一句:
newSize = in.readLine(record);
很普通的讀取一行記錄,那有沒有可能是 readLine() 這個方法對長度沒有限定呢?雖然 nextKeyValue() 方法是 split 對象調用的,但會不會 readLine() 并不理會你每個 split 塊的大小而是一股氣往下讀取直到讀到文件末尾呢?
為了驗證這個可能,我添加了全局變量:
long recordLen;
// 將下面這句加在 nextKeyValue() 中
recordLen += newSize;
來記錄讀取記錄的總長度,,并設定當
if(recordLen >= split.getLength){
return false;
}
修改后打 jar 包放到節點上運行,結果正確?。?!
看完了這篇文章,相信你對“Hadoop 中 TeraSort 修改后輸出翻倍異常怎么辦”有了一定的了解,如果想了解更多相關知識,歡迎關注丸趣 TV 行業資訊頻道,感謝各位的閱讀!