您好,登錄后才能下訂單哦!
小編給大家分享一下Hadoop中TeraSort修改后輸出翻倍異常怎么辦,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
簡而言之,就是在修改了TeraInputFormat.java之后,運行TeraSort所得到的輸出數據不同程度的翻倍,剛開始并沒有什么頭緒,并且把采樣的線程和Map的讀入<key, value>搞混了,邏輯不清晰,導致很多時間都在無關緊要的地方反復調試.
其實應該可以想到一種辦法,就是在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修改后輸出翻倍異常怎么辦”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。