为何MapReduce Hadoop jar包冲突会导致Flink任务提交失败?

Hadoop jar包冲突导致Flink任务提交失败,需检查并解决jar包依赖问题。

一、背景

近期准备对实时计算平台进行升级,调研阶段使用yarn client手动向yarn集群上提交flink任务时出现了jar包冲突问题,提交任务时,一直提示失败,来yarn的web控制台发现日志有报错信息,错误如下:

为何MapReduce Hadoop jar包冲突会导致Flink任务提交失败?

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。

为何MapReduce Hadoop jar包冲突会导致Flink任务提交失败?

三、处理步骤

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版本一致性;

为何MapReduce Hadoop jar包冲突会导致Flink任务提交失败?

2、检查并调整相关配置文件;

3、使用maven的exclusions标签排除不必要的依赖;

4、根据需要调整CLASSPATH顺序以解决类加载冲突问题。

原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1255167.html

本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。

(0)
未希的头像未希新媒体运营
上一篇 2024-10-31 00:29
下一篇 2024-10-31 00:36

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

产品购买 QQ咨询 微信咨询
分享本页
返回顶部
云产品限时秒杀。精选云产品高防服务器,20M大带宽限量抢购 >>点击进入