使用本地spark-submit命令行的方式远程提交sparkJar到yarn集群

joemw 2017-09-30 11:39:10
由于通过yarnclient代码提交spark到yarn集群不支持并发(同一个jvm只能初始化一个sparkcontext对象),且程序报错后极有可能导致jvm关闭,故排除了此方法。同时,经过两天的学习,将使用本地spark-submit命令行的方式远程提交sparkJar到yarn集群的配置方法贴出:
分如下步骤:
一:
首先需要拷贝集群中的hadoop根目录机器根目录下的bin/ conf/目录到本地。
bin/目录是为了防止windows下本地程序始终报winutils缺乏的错误
conf/目录在很多地方,例如spark探索集群信息(hdfs,yarn)的时候有用到
并且配置好环境变量:HADOOP_HOME HADOOP_CONF_DIR 分别指向hadoop根目录和hadoop conf/目录

二:
拷贝集群上的spark根目录及其子目录bin/ conf/ lib/目录和子文件RELEASE到本地。
bin/ 该目录下有启动spark的脚本
conf/ 该目录下是存放的spark的很多初始化参数配置和初始化环境配置,spark脚本在启动时会将其中的配置文件添加到classpath中传给调用程序使用
lib/ 该目录下只需要有一个类似于spark-assembly-**-hadoop***-cdh***.jar的jar包,一般情况下直接从集群对应目录拷贝过来即可。但是某些CDH的这个包(例:5.9.3)并不包含其所依赖hadoop相关jar包,这样就会导致在本地调用时报classnotfound错误。解决办法是自行在ide中使用maven导入这个包以及其依赖的hadoop(core,hdfs)包,自行打包后命名成为spark-assembly-**-hadoop***-cdh***.jar的形式,放入相应目录即可(注意自行打包中META-INF下面的冲突问题,自行修改冲突的META-INF下的配置文件即可)。此包是调用脚本提交spark任务时直接执行的jar包,相当重要。
最后别忘了配置好环境变量,SPARK_HOME 指向 spark的根目录。
另外某些cdh 的spark执行脚本中只有linux,而没有windows的cmd脚本,从其他cdh版本的包中拷贝过来即可。

三:配置好远程大数据集权主机名到本地host文件,windows 修改 c://windows/system32/drivers/etc/host. linux修改/etc/hosts文件。配置好以后,试试能不能ping通,同时应该保证远程的相关端口能从本地访问的到。

四:某些spark脚本文件和配置文件在windows下不能很好的执行。
例如: load-spark-env.cmd当中,应当加上如下两句:
set LD_LIBRARY_PATH=/opt/cloudera/parcels/CDH-5.9.3-1.cdh5.9.3.p0.4/lib/hadoop/lib/native

set SPARK_DIST_CLASSPATH=/opt/cloudera/parcels/CDH-5.9.3-1.cdh5.9.3.p0.4/jars/hbase-protocol-1.2.0-cdh5.9.3.jar(此处为项目可能需要依赖的jar包,按理说应该将classpath.txt文件中的包全部拼接在一起,用 : 分隔,但是windows下似乎对变量长度有限制,所以此处在windows下只能优先导入自己需要的包),才能执行成功远程提交的saprk程序。这个地方是在和linux执行脚本的对比中发现的问题。

spark-defaults.conf,当中。某些参数在linux下执行正常,但是在windows下执行就不正常。
例如:5.9.3cdh版本中,其中的spark.driver.extraLibraryPath=****就应该注释掉,不然程序始终不能提交到yarn集群(似乎是bug),但在linux下就没问题。另外注意:这个配置文件当中配置的所有环境都是集群而不是本地的环境,所以从集群拷贝过来之后,一般不需要修改本文件。

五:最后说本地spark-submit 命令行的使用。
基本命令如下(linux下请自行替换命令行脚本为相应目录下的spark-submit,例:/home/spark/spark_home/bin/spark-submit):
E:\bigdata\spark\bin\spark-submit.cmd --master yarn --deploy-mode cluster --driver-cores 1 --executor-cores 1 --driver-memory 1g --executor-memory 1g --num-executors 2 --spark.yarn.jar=hdfs://nameservice1/tools/spark/spark-assembly-1.6.0-cdh5.9.3-hadoop2.6.0-cdh5.9.3.jar --jars dependency1.jar,dependency2.jar --class com.ph.bdsys.spk.main.SparkMain hdfs://nameserbices/tools/spark/execute.jar param1 param2

其中有如下几个参数需要特别注意:
spark.yarn.jar:此参数应该在spark-defaults.conf中直接配置成hdfs下的先关assembly jar包。如果配置到本地,会导致从本地向集群直接上传该jar包,由于这个jar包又比较大,会导致上传的十分耗时。

jars:尽量不要使用该参数传递依赖jar包,因为这会导致从本地上传jar包到集群hdfs,增加执行耗时。本人解决办法是将依赖的jar包和自己的执行jar包打成一个包,之后上传到hdfs指定目录下,spark-submit命令直接指定 hdfs上的jar包即可,例如本命令的:hdfs://nameserbices/tools/spark/execute.jar就是一个包含了其他依赖包的jar包。(将执行的jar包放在hdfs上也是为了避免从本地上传到集群徒增耗时)

参数param:在windows下,经过测试,在很大可能下如果参数包含了,"" '' 时,会导致参数传送异常。所以只能传递简单参数,可采用中间介质(数据库)辅助解决该问题。

经过以上几个步骤,就相当于是在本地pc给远程的集群多加了一个本地的spark提交节点,可以随意使用spark-submit 命令在本地提交任意spark程序到远程集群执行了,方便各种web等三方应用直接在本地和spark集群交互。

不同CDH版本,配置方式可能稍微不同,请自行阅读spark调用脚本解决相关问题。


...全文
2979 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你好,请问这样提交,本地服务器会不会参与运算?

1,258

社区成员

发帖
与我相关
我的任务
社区描述
Spark由Scala写成,是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于MapReduce算法实现的分布式计算。
社区管理员
  • Spark
  • shiter
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧