Hadoop的TeraSort問題

iteye_19448發表於2011-09-29

第一步是執行TeraGen來產生資料,原始命令如下:

 

root@master:/opt/hadoop-0.20.2# hadoop jar hadoop-0.20.2-examples.jar teragen 10000000000 /user/terasort/input1TB

 由於Hadoop預設的配置檔案中,設定的map task個數為2,而teragen也沒給設定map task個數的命令列引數,因此teragen預設就啟2map1reduce,這對於有多個節點的叢集來說利用率太低。

 

修改命令如下:

 

root@master:/opt/hadoop-0.20.2# hadoop jar hadoop-0.20.2-examples.jar teragen -Dmapred.map.tasks=10 10000000000 /user/terasort/input1TB

 這樣就設定了map task的個數為10.

 

問題:

今天突然發現產生TeraGen產生的資料rowid部分有誤,如下:

 

<gr*,2G+!6-192184201CCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFFGGGGGGGGGGHHHHHHHHHHIIIIIIIIIIJJJJJJJJ

2rC#0Zuzo2-192184201KKKKKKKKKKLLLLLLLLLLMMMMMMMMMMNNNNNNNNNNOOOOOOOOOOPPPPPPPPPPQQQQQQQQQQRRRRRRRR

lR6'\mML<x-192184201SSSSSSSSSSTTTTTTTTTTUUUUUUUUUUVVVVVVVVVVWWWWWWWWWWXXXXXXXXXXYYYYYYYYYYZZZZZZZZ

 

紅色部分應該是正數(代表第幾行)才對,怎麼成了負數,原來TeraGen程式碼裡面有問題:

 

    private void addRowId(long rowId) {
      byte[] rowid = Integer.toString((int) rowId).getBytes();
      int padSpace = 10 - rowid.length;
      if (padSpace > 0) {
        value.append(spaces, 0, 10 - rowid.length);
      }
      value.append(rowid, 0, Math.min(rowid.length, 10));
    }

 第一行竟然對long型的rowId用了int強制型別轉化,這樣rowid怎麼可能超過4個bytes,而設計的是10個bytes,因此就造成了rowid出現負數的情況。

相關文章