【CDH CM版本5.13以下】解决「通过Parcel对spark2版本升级无法发现服务」问题

【CDH CM版本5.13以下】解决「通过Parcel对spark2版本升级无法发现服务」问题

    • 前言
    • 现象
    • 报错
    • 报错原因
    • 新升级方案
    • 操作留档
        • 准备
        • 版本升级
        • 升级验证
        • 版本回退
        • 回退验证
    • 后记

前言

公司对于CDH5.10(注意这个版本)有三个物理集群(非云服务,自有机房),其中两个作为生产,一个作为测试,。生产集群目前都处于满负荷运载的状态,随着业务数据增生,计算方面的瓶颈已较为明显。
对于生产集群的性能提升团队已经想了很多办法,从jar、脚本、底层文件这些都进行了调整,虽然有效果,但还是存在不少问题。
而对于分布式计算框架+引擎的spark来说,目前我们使用的版本还停留在2.1,经过商讨,决定对这块进行升级,打算从spark2.1升级到spark2.4。
那由于生产集群每天有数千作业要跑,直接在生产集群上测试方案是不可行的,于是我先在测试集群上进行了升级测试,结果是整个升级过程十分顺利,于是我信心满满地在一个普通的周六和同事配合停掉了一切计算任务,开始进行生产集群上spark的升级,结果坑出现了!

现象

尽管spark相关包裹都放在了应在的位置上,相应的权限也都做了更改,甚至Pacel都进行了正常地激活、分配,但是在添加服务至集群的时候,我惊愕地发现spark2服务不见了,没错就是这么突然!

报错

有个有趣的现象是:
当我把SPARK2_ON_YARN-2.1.0.cloudera1.jar重新放入csd文件夹下,重启CM服务后spark2服务又奇迹般出现。
也就是说问题是在于SPARK2_ON_YARN-2.4.0.cloudera2.jar不能被识别,查看/var/log/cloudera-scm-server下的cloudera-scm-server.log后,果然发现了异常:

2020-08-22 15:06:13,355 WARN mian:com.cloudera.csd.components.CsdLocalRepository: 
Skipping[/opt/cloudera/csdSPARK2_ON_YARN-2.4.0.cloudera2.jar]:
{
     
 Could not read service descriptor for csd [SPARK2_ON_YARN-2.4.0.cloudera2.jar]: Could not resolve type id 'provided' into a subtype of [simple type,class com.cloudera.csd.descreptors.parameters.Parameter<java.lang.Object>] at [Source: [B@#1f408ab6; line: 124,column: 45](through reference chain: ServiceDescriptor["parameters"])]
}

这段异常的大致意思是不能识别SPARK2_ON_YARN-2.4.0.cloudera2.jar里面的一些子类型而导致跳过了这个包,从而在我们的CM页面上添加服务时就不出现spark2服务了。

报错原因

为什么对于CDH5.10升级spark2会有这个异常?
又为什么测试集群上一样是CDH5.10环境,却不会报这样的异常?
对这个异常和现象我进行了很长很长时间的搜索,中文回答大多集中在文件权限和csd文件位置这两块,对于这两方面内容我很确定自己的操作在这上面没有失误。当我搜遍全网(墙内)也没能发现什么有效的信息的时候,我近乎放弃。
但天无绝人之路,冷静了一会儿,我也察觉到可能是环境出了问题,这时我搜到了一篇外网的提问帖子Installing Nifi with cloudera ,这个老兄是想在cloudera安装Nifi,但也是在激活并分配包裹又重启CM之后,怎么也发现不了Nifi服务,与我的情况十份类似。
还有另一篇Problem for adding cdsw service ,这两个帖子的回答都很有价值,
其中有个大佬的回答帮助了我:
【CDH CM版本5.13以下】解决「通过Parcel对spark2版本升级无法发现服务」问题_第1张图片
他大致讲到(我也是靠翻译才读懂),因为CM版本的问题,导致组件识别的不兼容,这一下真的是醍醐灌顶,我立马意识到问题的关键,于是我去查看了测试集群的版本信息:
【CDH CM版本5.13以下】解决「通过Parcel对spark2版本升级无法发现服务」问题_第2张图片
生产集群的版本信息:
【CDH CM版本5.13以下】解决「通过Parcel对spark2版本升级无法发现服务」问题_第3张图片
看到这一幕,我如同遭受雷击,当时虎躯一震,嘴里大骂“王德发”,既有苦心找到问题的关键的喜悦,又有因为这种低级问题白费精力的懊恼!
测试集群的CM不知道被哪个升级到5.15(在2018年10月份的时候),但是用的CDH版本仍然是5.1,所以从外部看来生产集群的环境与测试集群如出一辙,难以发现有什么差异,但二者对于服务组件的支持程度是不一致的,这也是为什么测试环境能够识别spark2.4服务而生产环境不能的原因。

新升级方案

在这种情况下,如果仍需要对spark2进行升级,则先要对CM进行升级(CM调整到5.13以上,CDH版本保持5.10不变),然后在对spark2进行升级。

操作留档

这里对我在测试集群所做的spark2版本升级和版本回退操作做个记录.

准备

进入spark2.4Parcel下载地址下载文件:

SPARK2-2.4.0.cloudera2-1.cdh5.13.3.p0.1041012-el7.parcel
SPARK2-2.4.0.cloudera2-1.cdh5.13.3.p0.1041012-el7.parcel.sha1
manifest.json

进入csd jar下载地址下载文件:

SPARK2_ON_YARN-2.4.0.cloudera2.jar

注意
manifest.json页面可能不能下载,考虑复制下载链接,然后在linux命令行下使用wget手动下载。

文件均成功下载后,将四个文件打包命名为:spark2.4.0-129-data-test.zip
上传spark2.4.0-129-data-test.zip至生产CM Server节点上的cd /data/spark-update目录下,依次执行:

cd /data/spark-update
unzip spark2.4.0-129-data-test.zip
mv /opt/cloudera/parcel-repo/mainifest.json 	/opt/cloudera/parcel-repo/mainifest_CDH5.json
mv SPARK2-2.4.0.cloudera2-1.cdh5.13.3.p0.1041012-el7.parcel.sha1 	SPARK2-2.4.0.cloudera2-1.cdh5.13.3.p0.1041012-el7.parcel.sha
mv SPARK2-2.4.0.cloudera2-1.cdh5.13.3.p0.1041012-el7.parcel     	/opt/cloudera/parcel-repo
mv SPARK2-2.4.0.cloudera2-1.cdh5.13.3.p0.1041012-el7.parcel.sha    	/opt/cloudera/parcel-repo
mv manifest.json    /opt/cloudera/parcel-repo
mv SPARK2_ON_YARN-2.4.0.cloudera2.jar    /opt/cloudera/csd

版本升级

进入cloudera主页面,先确保spark2服务停止:
【CDH CM版本5.13以下】解决「通过Parcel对spark2版本升级无法发现服务」问题_第4张图片
然后删除spark2服务:
【CDH CM版本5.13以下】解决「通过Parcel对spark2版本升级无法发现服务」问题_第5张图片
接着执行命令重启CM:

service cloudera-scm-agent restart
service cloudera-scm-server restart

重启完成后,重新登录,依次点击 主机 - Parcel-spark2-分配-激活spark2.4.0,等待激活完成:
【CDH CM版本5.13以下】解决「通过Parcel对spark2版本升级无法发现服务」问题_第6张图片
【CDH CM版本5.13以下】解决「通过Parcel对spark2版本升级无法发现服务」问题_第7张图片
点击集群添加服务:
【CDH CM版本5.13以下】解决「通过Parcel对spark2版本升级无法发现服务」问题_第8张图片
勾选spark2点击继续:
【CDH CM版本5.13以下】解决「通过Parcel对spark2版本升级无法发现服务」问题_第9张图片
选择依赖关系:
【CDH CM版本5.13以下】解决「通过Parcel对spark2版本升级无法发现服务」问题_第10张图片
接下来依次选择主机、继续、审核项目、继续后等待添加完成就可以了:
【CDH CM版本5.13以下】解决「通过Parcel对spark2版本升级无法发现服务」问题_第11张图片
最后,返回页面,cloudera提示过期配置,重启所有服务:

【CDH CM版本5.13以下】解决「通过Parcel对spark2版本升级无法发现服务」问题_第12张图片

升级验证

执行 spark2-shell,查看spark版本:
在这里插入图片描述
命令执行正常:
【CDH CM版本5.13以下】解决「通过Parcel对spark2版本升级无法发现服务」问题_第13张图片

版本回退

这里的回退是指从spark2.4回退到spark2.1,是在升级过程出现问题,需要回到以前的版本时的操作,先执行:

mv /opt/cloudera/parcel-repo/mainifest_CDH5.json 	/opt/cloudera/parcel-repo/mainifest_CDH5_SPARK2.4.json
mv /opt/cloudera/parcel-repo/mainifest_CDH5.json 	/opt/cloudera/parcel-repo/mainifest.json

然后进行【升级】的各项操作,包含删除spark2.4、激活spark2.1.0,添加spark2服务,都完成后,shell base环境执行 spark2-shell,查看spark版本并执行命令,恢复spark2.1.0并使用正常(可能spark2.1.0重启history会报错,那是因为Parcel中的spark2.4服务没有移除,导致csd版本出问题,彻底移除后重启即可)。

回退验证

执行 spark2-shell,查看spark版本:
在这里插入图片描述
命令执行正常:
【CDH CM版本5.13以下】解决「通过Parcel对spark2版本升级无法发现服务」问题_第14张图片

后记

希望这篇博客能够帮助到你,有问题留言交流。

你可能感兴趣的:(Spark,CDH,大数据,spark)