一、背景
近期准备对实时计算平台进行升级,调研阶段使用yarn client手动向yarn集群上提交flink任务时出现了jar包冲突问题,提交任务时,一直提示失败,来yarn的web控制台发现日志有报错信息,错误如下:
Caused by: org.apache.flink.runtime.resourcemanager.exceptions.ResourceManagerException: Cannot initialize resource provider. at org.apache.flink.runtime.resourcemanager.active.ActiveResourceManager.initialize(ActiveResourceManager.java:124) at org.apache.flink.runtime.resourcemanager.ResourceManager.startResourceManagerServices(ResourceManager.java:245) at org.apache.flink.runtime.resourcemanager.ResourceManager.onStart(ResourceManager.java:229) Caused by: org.apache.hadoop.yarn.exceptions.YarnRuntimeException: yarn.client.max-nodemanagers-proxies (0) can not be less than 1. at org.apache.hadoop.yarn.client.api.impl.ContainerManagementProtocolProxy.<init>(ContainerManagementProtocolProxy.java:74) at org.apache.hadoop.yarn.client.api.impl.NMClientImpl.serviceInit(NMClientImpl.java:136) at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163) at org.apache.hadoop.yarn.client.api.async.impl.NMClientAsyncImpl.serviceInit(NMClientAsyncImpl.java:109) at org.apache.hadoop.service.AbstractService.init(AbstractService.java:163) at org.apache.flink.yarn.YarnResourceManagerDriver.initializeInternal(YarnResourceManagerDriver.java:186) at org.apache.flink.runtime.resourcemanager.active.AbstractResourceManagerDriver.initialize(AbstractResourceManagerDriver.java:81) at org.apache.flink.runtime.resourcemanager.active.ActiveResourceManager.initialize(ActiveResourceManager.java:122) ...从报错信息中能清晰地看到,这是一个yarn参数的配置问题,要求yarn.client.max-nodemanagers-proxies的值不能小于1,而它的实际传入值为0,于是yarn Client在进行任务提交时初始化resource manager时抛出了异常,它的实际代码位置位于org.apache.hadoop.yarn.client.api.impl.ContainerManagementProtocolProxy中,查看了一下当前版本的ContainerManagementProtocolProxy中具体代码逻辑如下:
hadoop-yarn-client-2.4.1是flink-yarn的默认依赖,在这里会进行yarn.client.max-nodemanagers-proxies的配置检查,这个默值的值不能小于1,否则会抛出异常,如果没有手动配置过这个值,这里会使用500作为默认值,显然,我们没有对这个参数进行手动配置,那么为什么没有用500作为默认值呢?下面我们来分析一下。
二、原因分析
1、Hadoop版本依赖问题:首先想到的就是hadoop的版本依赖问题,从经验上来说这是最容易出问题的地方。
2、检查依赖版本:首先来查看实时计算平台上hadoop-yarn-client的依赖版本,查看后发现版本也是2.4.1,并无差异,由于两个地方都没有对yarn.client.max-nodemanagers-proxies进行手动配置,而上面从YarnConfiguration中获取yarn.client.max-nodemanagers-proxies的值时取到的不为空,导致默认填充值500没有生效,那么会不会是两个地方使用的YarnConfiguration中获取的值不同呢?于是添加日志打印输出(此处忽略这个过程),发现也并无差异。
3、不同版本的YarnConfiguration:转念一想,是不是使用了不同版本的YarnConfiguration,不同版本的有不同实现呢?查看一遍,果然如此,实时计算平台上使用的是2.4.1版本的YarnConfiguration,手动提交时使用的是2.7.4版本的YarnConfiguration。
三、处理步骤
1、统一版本:将用户pom文件中的的hadoop-hdfs设置为:
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>${hadoop.version}</version> <scope> provided </scope> </dependency>
或使用exclusions标签将其排除关联,若使用到hdfs的配置文件,则需要将core-site.xml、hdfs-site.xml、yarn-site.xml修改为mrs-core-site.xml、mrs-hdfs-site.xml、mrs-hbase-site.xml。
conf.addResource(HBaseUtil.class.getClassLoader().getResourceAsStream("mrs-core-site.xml"), false); conf.addResource(HBaseUtil.class.getClassLoader().getResourceAsStream("mrs-hdfs-site.xml"), false); conf.addResource(HBaseUtil.class.getClassLoader().getResourceAsStream("mrs-hbase-site.xml"), false);
通过以上步骤,可以解决MapReduce Hadoop jar包冲突导致的Flink提交失败问题,在实际应用过程中,遇到类似问题时,可以从以下几个方面入手:
1、确认Hadoop版本一致性;
2、检查并调整相关配置文件;
3、使用maven的exclusions标签排除不必要的依赖;
4、根据需要调整CLASSPATH顺序以解决类加载冲突问题。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1255167.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复