使用oozie时运行job异常

异常信息Call From cloudera/192.168.253.128 to 0.0.0.0:10020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused

通过异常信息,可以猜测应该是在执行任务时,配置没有读到,所以使用了默认的0.0.0.0:10020地址。为了验证是否是这个原因造成的,我们可以修改oozie/conf目录下的log4j的日志级别为调试。
然后通过查看和跟踪hadoop的源代码,验证了猜想的正确性,由于oozie在提交job的时候,会读取oozie/conf/hadop-conf/core-site.xml中的配置,我们只需要在这个配置文件中添加配置:
(注意!!!!主机名要更换为你的,不要照抄cloudera)

<property>
<name>mapreduce.jobhistory.address</name>
<value>cloudera:10020</value>
</property>

在使用上述版本的hadoop和oozie进行开发时,启动hadoop后,NN节点上的进程有NameNode,ResourceManager,DN节点的进程有DataNode,NodeManager,hadoop启动正常,在上面执行自己写的M/R程序也没问题,但是当使用oozie提交M/R任务时候,报了以下一个异常:
Call From cloudera/192.168.253.128 to 0.0.0.0:10020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused

10020这个端口是hadoop的 jobhistory的端口,对于oozie在提交job的时候为什么要去连接jobhistory不是很理解,在mapred-site.xml也配置了这个选项:

<property>
<name>mapreduce.jobhistory.address</name>
<value>cloudera:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>cloudera:19888</value>
</property>

后来通过调试和跟踪hadoop源代码,发现oozie在提交任务后确实会去连接jobhistory,
开到debug模式后,在org.apache.hadoop.mapred.ClientCache,这个类的:

  protected MRClientProtocol instantiateHistoryProxy()
      throws IOException {
    final String serviceAddr = conf.get(JHAdminConfig.MR_HISTORY_ADDRESS);
    if (StringUtils.isEmpty(serviceAddr)) {
      return null;
    }
    LOG.debug("Connecting to HistoryServer at: " + serviceAddr);
    final YarnRPC rpc = YarnRPC.create(conf);
    LOG.debug("Connected to HistoryServer at: " + serviceAddr);
    UserGroupInformation currentUser = UserGroupInformation.getCurrentUser();
    return currentUser.doAs(new PrivilegedAction<MRClientProtocol>() {
      @Override
      public MRClientProtocol run() {
        return (MRClientProtocol) rpc.getProxy(HSClientProtocol.class,
            NetUtils.createSocketAddr(serviceAddr), conf);
      }
    });
  }

通过上面的代码可以知道确实连接了HistoryServer,因此我通过命令
mr-jobhistory-daemon.sh start historyserver 把这个服务启动,这样在NN上会启动JobHistoryServer进程,这个进程的监听端口就是10020,本以为这样这个问题就能解决了,没想到在oozie的log日志里还是报上面的错,唯一可能的原因是oozie没有读取到 jobhistory的配置, 因此我把这个配置:

<property>
<name>mapreduce.jobhistory.address</name>
<value>cloudera:10020</value>
</property>

又在oozie/conf/hadoop-conf/core-site.xml文件中又添加了一遍,上述错误就消失了,job也能正常跑起来了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值