0

我正在使用 hive-jdbc-0.7.1-cdh3u5.jar。我在 EMR 上运行了一些内存密集型查询,这些查询偶尔会失败。当我查看作业跟踪器时,我看到查询已被终止,并且我看到以下错误:

java.io.IOException:任务进程退出,非零状态为 137

但是,Hive JDBC 驱动程序 execute() 调用没有检测到这一点,而是挂起。没有发现异常。有任何想法吗?谢谢:

    ST stQuery = MY_QUERY;
    尝试 {
        语句 stmt = conn.createStatement();
        stmt.execute(stQuery.render()); // 在不知道作业已被终止的情况下挂在这里。不会引发异常。
    }
    捕获(SQLException sql){
        sqle.printStackTrace();
        log.error("查询失败");
        返回;
    }

4

1 回答 1

1

这可能是由于hadoop会在10分钟(600秒)后如果没有得到响应就会杀死任务,通过设置参数mapred.task.timeout=0我们可以避免杀死运行超过10分钟的任务。

同样在这些情况下,人们可以编写 mapper/reducer 以定期报告进度(比每 10 分钟更频繁)。这可以通过多种方式实现:

  • 调用setStatus()Reporter 设置任务进度的人类可读描述
  • 调用incrCounter()Reporter 以增加用户计数器
  • 调用progress()Reporter 告诉 Hadoop 你的任务仍然存在(并且正在取得进展)
于 2012-12-21T10:05:09.393 回答