背景
前阵子在用Tpcds对hive做性能测试的时候,遇到过报错 Process failed with status code 139
问题剖析
通过源码查看,找到了最终异常抛出的地方: hive-testbench-hdp3/tpcds-gen/src/main/java/org/notmysock/tpcds/GenTable.java
for(int i=0; i<cmd.length; i++) {
if(cmd[i].equals("$DIR")) {
//这里的相对路径 . 即container运行的目录
cmd[i] = (new File(".")).getAbsolutePath();
}
if(cmd[i].equals("-parallel")) {
parallel = cmd[i+1];
}
if(cmd[i].equals("-child")) {
child = cmd[i+1];
}
}
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查询 p.waitFor() 相关博客。博客地址
-
同时结合最近的改动(之前tpcds可以正常执行,近期改动了相关的目录)
最终定位到报错原因是yarn container的目录过长。
解决方法:最终选择方法2
1. 修改源码,更改目录相关逻辑
这个方法也是有些博客的解决方法。这里我并不推荐,从源码上来看,topcds生成元数据的逻辑是
- 根据参数划分并行度,任务启动后每个container都会通过分部署缓存拉取dbgen相关jar包
- 每个并行度的container都会调用dbgen 数据生成脚本生成数据。
- 所有并行度生成数据之后。上传到hdfs。(container执行之后也会自动清理目录)
如果更改执行目录,需要考虑目录的创建清理逻辑,可能还需要dbgen jar包拷贝逻辑,为了避免有改动遗漏的地方,浪费时间,个人感觉非必要情况下,方法1了解原理即可,最终用方法2规避问题。
其中方法1可以参考参考链接(本人未验证过),修改源码之后注意进行多次测试。
2. 直接更改 Yarn container的目录参数:yarn.nodemanager.log-dirs 为层次较浅的目录
因为使用该框架的本质目的是测试基准性能,而更改Yarn的container 日志目录并不影响基准性能。所以直接更改目录参数是最便捷的方法。最终这个也是我采用的方法。改为2-3层是可以正常运行的。
参考链接
TPCDS-Hive-testbench运行报错status-139
【TPCDS】记一个Hive testbench运行报错statu 139的问题
备注
IT 内容具有时效性,未避免更新后未同步,请点击查看最新内容: TPCDS-Hive-testbench运行报错status-139的解决方法
标签:status,container,TPCDS,源码,报错,testbench,139,目录 From: https://www.cnblogs.com/nebofeng/p/16967302.html