CDH安装SPARK2.3

在我的CDH5.14集群中,默认安装的spark是1.6版本,这里需要将其升级为spark2.x版本。
经查阅官方文档,发现spark1.6和2.x是可以并行安装的,也就是说可以不用删除默认的1.6版本,
可以直接安装2.x版本,它们各自用的端口也是不一样的。这里做一下安装spark2.3版本的步骤记录。

一. 安装准备

1.csd包:http://archive.cloudera.com/spark2/csd/

2.parcel包:http://archive.cloudera.com/spark2/parcels/2.3.0.cloudera2/

注意,下载对应版本的包,我的CentOS7,所以下载el7的包,若是CentOS6,就要下el6的包。
特别注意,如果你安装spark2.3,按照上面下载就是了,注意一下操作系统的版本;如果你不打算安装spark2.3,
想安装其他版本,比如2.0,那么一定要注意下面的事项:
如果你仔细浏览过这些路径,会发现下图中,csd和parcel包会有.clouderal1和.clouderal2之分,和2.0与2.1版本之分,
那么在下载parcel时也要注意,下载对应的包。即如果下载到的是.clouderal1的csd包,下载parcel包也要下载文件名中
是.clouderal1的包,不能下载.clouderal2的包,同时csd2.0的包也不能用于parcel2.1的包,不然很可能安不上

二. 开始安装
1.安装前可以停掉集群和Cloudera Management Service

2.下面的操作在每个CDH节点都要进行。(我们将下载下来的csd的jar包放到主节点的/opt/cloudera/csd目录下)

3.上传CSD包到机器的/opt/cloudera/csd目录,并且修改文件的用户和组。注意如果本目录下有其他的jar包,把删掉或者移到其他目录

chown cloudera-scm:cloudera-scm SPARK2_ON_YARN-2.3.0.cloudera2.jar

4.上传parcel包到机器的/opt/cloudera/parcel-repo目录下。
注意。如果有其他的安装包,不用删除 。但是如果本目录下有其他的重名文件比如manifest.json文件,
把它重命名备份掉。然后把那3个parcel包的文件放在这里。

5.如果刚刚没有停掉CM和集群,现在将他们停掉。然后运行命令。

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

6.把CM和集群启动起来。然后点击主机->Parcel页面,
看是否多了个spark2的选项。如下图,你这里此时应该是分配按钮,点击,等待操作完成后,点击激活按钮

7.激活后,点击你的群集-》添加服务,添加spark2服务。注意,如果你这里看不到spark2服务,就请检查你
的CSD包和parcel包是否对应,上面的步骤是否有漏掉。正常情况下,应该是能用了。

三.遇到的问题

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/Logger
	at java.lang.Class.getDeclaredMethods0(Native Method)
	at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
	at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
	at java.lang.Class.getMethod0(Class.java:3018)
	at java.lang.Class.getMethod(Class.java:1784)
	at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
	at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)

解决:缺少jar包,丢入slf4j-api-1.6.1.jar和slf4j-log4j12-1.6.1.jar和log4j-1.2.17.jar

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream
	at org.apache.spark.internal.Logging$.<init>(Logging.scala:174)
	at org.apache.spark.internal.Logging$.<clinit>(Logging.scala)
	at org.apache.spark.internal.Logging$class.initializeLogIfNecessary(Logging.scala:105)
	at org.apache.spark.deploy.SparkSubmit$.initializeLogIfNecessary(SparkSubmit.scala:70)
	at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:127)
	at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.fs.FSDataInputStream
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 6 more

解决:
从spark1.4以后,所有spark的编译都是没有将hadoop的classpath编译进去的,所以必须在spark-env.sh中指定hadoop中的所有jar包。
在spark-evn.sh中添加:
#这里实际上就是执行一条hadoop的命令,将hadoop的classpath引一下
export SPARK_DIST_CLASSPATH= ( ( {HADOOP_HOME}/bin/hadoop classpath)

官网上的说明:
https://spark.apache.org/docs/latest/hadoop-provided.html

PS: .sh文件修改以后,需要使用./xxx.sh 或者 sh xxx.sh进行申明,shell脚本才能生效,不然修改了也会报错。

猜你喜欢

转载自blog.csdn.net/weixin_43840194/article/details/89307836
今日推荐