ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Idea开发Spark直接以yarn-cluster模式提交到Ambari集群的解决方案

2021-07-26 16:33:07  阅读:229  来源: 互联网

标签:Ambari Idea yarn 集群 derby spark 2.0


一.背景介绍
许多中小型企业使用Ambari去管理自己的大数据集群,以Spark作为主要的计算框架去实现数据的分析。通用的Spark的开发调试流程是往往需要以下流程:

Idea上进行开发,并使用spark local模式进行调试。
打包程序放到测试分布式环境上进行spark on yarn client模式进行调试。
使用spark on yarn cluster模式进行调试,成功后在正式环境中进行分布式的测试和部署。
有时候由于分布式和本地模式的差异,许多错误在分布式环境中才得以体现。但是在分布式的环境中进行测试,需要反复的打包、部署、提交、测试bug和修改源码。这个过程可能迭代很多次,浪费了大量时间。如果能够在Idea开发的时候就能够提交到分布式环境,将大大减少测试的工作量。本文讲述如何在Idea开发环境中直接以spark on yarn client的模式将代码提交到Ambari集群中。

二.集群环境
Ambari版本2.2.2.18
HDP-2.4.2.0-258(Hadoop2.7.1 Spark1.6.3)
因资源限制,版本相对较老,后续会增加新版本Ambari和HDP的测试,但是原理应该是相通的。

三.部署步骤:
1.修改本地的Hadoop环境
windows本地环境需要注意设置HADOOP_HOME并且保持与Ambari集群的Hadoop版本一致。比如我们使用的是Hadoop2.7.1,在windows本地设置HADOOP_HOME路径,文件夹里面包含bin子文件夹,里面需要包含hadoop.dll、winutil.exe等部分必备依赖。如下图所示:

 

 

 

版本不一致,则可能触发org.apache.hadoop.io.nativeio.nativeio$windows.createdirectorywithmode0类的错误。具体操作可以总结为以下步骤:

将HADOOP_HOME文件夹在系统环境变量中设置好
将PATH指向${HADOOP_HOME}/bin目录,目录中需包含上图的依赖
将hadoop.dll拷贝到windows\system32系统目录下。
2.修改Idea开发实例
1.IDEA里修改开发源码和参数

val conf = new SparkConf().setMaster("yarn-client").setAppName("YarnTest")
conf.set("spark.driver.extraJavaOptions","-Dhdp.version=2.4.2.0-258")
conf.set("spark.yarn.am.extraJavaOptions","-Dhdp.version=2.4.2.0-258")
val sc = new SparkContext(conf)
val hiveContext = new HiveContext(sc)
在setMaster的参数里面直接指定“yarn-client”模式,在conf里面设置

"spark.driver.extraJavaOptions","-Dhdp.version=2.4.2.0-258"
"spark.yarn.am.extraJavaOptions","-Dhdp.version=2.4.2.0-258"
这两个参数,指向Ambari集群的HDP具体版本。

2.idea的环境变量中增加Ambari集群的配置文件,按照需要添加如下

 

 


3.pom的依赖中需要增加spark-yarn_2.10

<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-yarn -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-yarn_2.10</artifactId>
<version>1.6.3</version>
</dependency>
4.需要修改mapreduce-site文件中的${hdp.version}为实际的版本号

2.4.2.0-258
5.修改mapreduce-site.xml文件里的topology_script.py项,直接去掉

四.其他问题
1.derby的版本不兼容的问题
测试中遇到如下问题:

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.derby.jdbc.EmbeddedDriver
Caused by: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
解决方法为更换derby的依赖包,直接从HDP集群拷贝的依赖包版本高于测试环境,使用如下脚本检查derby依赖:

find /usr/hdp/ -name "*.jar" -exec sh -c 'jar -tf {}|grep -H --label {} 'org.apache.derby.jdbc.EmbeddedDriver'' \;
发现依赖低版本的derby,于是删除HDP的derby-10.10.2.0.jar包,从pom内增加低版本的derby依赖

<!-- https://mvnrepository.com/artifact/org.apache.derby/derby -->
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.10.1.1</version>
<scope>test</scope>
</dependency>
2.spark assembly依赖问题
Could not find or load main class org.apache.spark.deploy.yarn.ExecutorLauncher
这个问题通过查找源码发现此类位于spark-assembly-1.6.1.2.4.2.0-258-hadoop2.7.1.2.4.2.0-258.jar

从集群中(一般在/usr/hdp/${HDP.VERSION}/spark/lib)目录下拷贝,并且添加到idea的依赖中去即可

 

 

 

五.结束语
通过以上的配置改造,已经可以实现spark Idea开发直接基于分布式集群进行代码测试和运行,极大地减少了spark分布式开发的工作量。如果读者有任何问题,也欢迎留言与我沟通。


————————————————
版权声明:本文为CSDN博主「吸欧大王」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_36714575/article/details/92796571

标签:Ambari,Idea,yarn,集群,derby,spark,2.0
来源: https://www.cnblogs.com/javalinux/p/15062074.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有