TPCDS-Hive-testbench运行报错status-139的解决方法

背景

前阵子在用Tpcds对hive做性能测试的时候,遇到过报错 Process failed with status code 139

问题剖析

通过源码查看,找到了最终异常抛出的地方: hive-testbench-hdp3/tpcds-gen/src/main/java/org/notmysock/tpcds/GenTable.java

源码github地址

    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的解决方法

文章首发于: http://nebofeng.com/2022/12/08/tpcds-hive-testbench%e8%bf%90%e8%a1%8c%e6%8a%a5%e9%94%99status-139%e7%9a%84%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值