BigPig 2013-09-04
hadoop版本:hadoop-2.0.0-cdh4.3.0
oozie版本:oozie-3.3.2-cdh4.3.0
在使用上述版本的hadoop和oozie进行开发时,启动hadoop后,NN节点上的进程有NameNode,ResourceManager,DN节点的进程有DataNode,NodeManager,hadoop启动正常,在上面执行自己写的M/R程序也没问题,但是当使用oozie提交M/R任务时候,报了以下一个异常:
Caused by: com.google.protobuf.ServiceException: java.net.ConnectException: Call From slave4/10.95.3.65 to 0.0.0.0:10020 failed on connection exception: java.net.ConnectException: 拒绝连接; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:212) at com.sun.proxy.$Proxy28.registerApplicationMaster(Unknown Source) at org.apache.hadoop.yarn.api.impl.pb.client.AMRMProtocolPBClientImpl.registerApplicationMaster(AMRMProtocolPBClientImpl.java:100) ... 12 more
10020这个端口是hadoop的jobhistory的端口,对于oozie在提交job的时候为什么要去连接jobhistory不是很理解,在map-site.xml也配置了这个选项:
<property> <name>mapreduce.jobhistory.address</name> <value>master:10020</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.shstarthistoryserver把这个服务启动,这样在NN上会启动JobHistoryServer进程,这个进程的监听端口就是10020,本以为这样这个问题就能解决了,没想到在oozie的log日志里还是报上面的错,唯一可能的原因是oozie没有读取到jobhistory的配置,因此我把这个配置:
<property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property>
又在oozie/conf/hadoop-conf/core-site.xml文件中又添加了一遍,上述错误就消失了,job也能正常跑起来了。
ps:我用的MR2,MR1在集成时不存在上述问题。