最近我在Mac下作为开发环境压测一个兼容Hive的自研引擎,所以需要构建出TPCDS环境,关于TPCDS在Mac下的编译请参考我之前的文章:https://baifachuan.com/posts/34f97a60.html

我使用hive testbench来运行tpcd:https://github.com/hortonworks/hive-testbench

但是在执行./tpcds-setup.sh 10的时候出现如下问题:

2022-04-28 21:58:35,001 INFO mapreduce.Job: Job job_1650260671325_0017 running in uber mode : false
2022-04-28 21:58:35,002 INFO mapreduce.Job: map 0% reduce 0%
2022-04-28 21:58:39,041 INFO mapreduce.Job: Task Id : attempt_1650260671325_0017_m_000000_0, Status : FAILED
Error: java.lang.InterruptedException: Process failed with status code 139

at org.notmysock.tpcds.GenTable$DSDGen.map(GenTable.java:194)
at org.notmysock.tpcds.GenTable$DSDGen.map(GenTable.java:163)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:146)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:799)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:347)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:174)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:168)

通过查看hadoop的log,发现报错的内容与这个一致,并没有更详细的地方。

起初以为是文件权限有关的问题,于是尝试使用root进行测试,发现无论如何设置,都报同样的错误;而后又以为是版本的问题,然后就切换了hive-testbench的版本,然后错误仍然一样。

然后翻了一下源码,也没有发现什么大的问题,感觉逻辑是顺的,就是通过Java执行shell命令:

Process p = Runtime.getRuntime().exec(cmd, null, new File("dsdgen/tools/"));
int status = p.waitFor();
if(status != 0) {
String err = readToString(p.getErrorStream());
throw new InterruptedException("Process failed with status code " + status + "\n" + err);
}

而错误又恰好是从这里出来的,于是又回去研究 139 这个状态码。

139表示Too big row,按照理解应该是命令行太长了,于是我重新查看了之前为诊断问题添加的日志,注意到程序中使用的目录用的是相对路径”.”,对于一个MapReduce程序来说,这个路径就是Container的路径,长度很长。

于是我修改了这里从:

for(int i=0; i<cmd.length; i++) {
if(cmd[i].equals("$DIR")) {
cmd[i] = (new File(".")).getAbsolutePath();
}
if(cmd[i].equals("-parallel")) {
parallel = cmd[i+1];
}
if(cmd[i].equals("-child")) {
child = cmd[i+1];
}
}

cmd[i] = (new File(".")).getAbsolutePath();里面的 相对路径.换成绝对路径即可,这样就能正常的生成文件。


扫码手机观看或分享: