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

Posted nebofeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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/

以上是关于TPCDS-Hive-testbench运行报错status-139的解决方法的主要内容,如果未能解决你的问题,请参考以下文章

python3.x 运行脚本报错

遇到的问题---airflow on k8s---运行时scheduler报错ImportError: libpq.so.5: cannot open shared object file: No s

遇到的问题---airflow on k8s---运行时scheduler报错ImportError: libpq.so.5: cannot open shared object file: No s

解决iex -S mix报错

运行C++程序报错:Segmentation fault(coredump) 请问为啥?

switch(String) JAVA运行通过, jsp运行报错。