第一步是运行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默认就启2个map,1个reduce,这对于有多个节点的集群来说利用率太低。
修改命令如下:
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出现负数的情况。