Hadoop的TeraSort问题

第一步是运行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出现负数的情况。

你可能感兴趣的:(hadoop,TeraSort)