1. 环境介绍
集群:CDH5.12.0
Spark版本:2.4.0(未编译)
执行 spark-sql 的 shell 脚本时,会报如下错误
[root@master bin]# sh spark-sql
Warning: Failed to load org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver: org/apache/hadoop/hive/cli/CliDriver
Failed to load hive class.
You need to build Spark with -Phive and -Phive-thriftserver.
根据提示,不能加载 org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver 这个类,这个类在 spark-hive-thriftserver_2.11-2.4.4.jar 中,从Spark官网直接下载的版本是没有这个jar包的,因此我们需要编译。
2. 编译
编译的版本选择的是Spark2.4.4,基于生产集群CDH5.12.0进行编译。
官网编译链接
2.1 下载源码
下载链接
官网编译说明:
The Maven-based build is the build of reference for Apache Spark. Building Spark using Maven requires Maven 3.5.4 and Java 8.
Maven版本:3.5.4(最好是这个,不然编译的时候容易出错)
组件 | 下载链接 |
---|---|
spark-2.4.4.tgz | 链接:https://pan.baidu.com/s/1_GSuIHbOGCAVmxic5WsdSw 提取码:ftnk |
jdk-8u191-linux-x64.tar.gz | 链接:https://pan.baidu.com/s/1g49I3cM2zPfGaf4nr20Tmg 提取码:8wxv |
apache-maven-3.5.4-bin.tar.gz | 链接:https://pan.baidu.com/s/1J9nzepbE83GP5tkCf_Sm3w 提取码:38ic |
scala-2.11.12.tgz | 链接:https://pan.baidu.com/s/1-fL6Fm24i74ZTOQBJlBBiA 提取码:kxai |
2.2 解压
需要将jdk、maven、scala解压到指定目录,并且配置环境变量,由于环境中已配置,在这里就不多操作了。
说明:因为公司测试环境连接外网非常的慢,所以我是在自己的虚拟机上编译的。
由于没注意,这点后面给我带来很大的坑。
[hadoop@spark001 source]$ tar -zxvf spark-2.4.4.tgz
[hadoop@spark001 source]$ cd spark-2.4.4
-
注释掉文件中以下内容,在后面添加版本,以使编译快速通过
[hadoop@spark001 spark-2.4.4]$ vim dev/make-distribution.sh #VERSION=$("$MVN" help:evaluate -Dexpression=project.version $@ 2>/dev/null\ # | grep -v "INFO"\ # | grep -v "WARNING"\ # | tail -n 1) #SCALA_VERSION=$("$MVN" help:evaluate -Dexpression=scala.binary.version $@ 2>/dev/null\ # | grep -v "INFO"\ # | grep -v "WARNING"\ # | tail -n 1) #SPARK_HADOOP_VERSION=$("$MVN" help:evaluate -Dexpression=hadoop.version $@ 2>/dev/null\ # | grep -v "INFO"\ # | grep -v "WARNING"\ # | tail -n 1) #SPARK_HIVE=$("$MVN" help:evaluate -Dexpression=project.activeProfiles -pl sql/hive $@ 2>/dev/null\ # | grep -v "INFO"\ # | grep -v "WARNING"\ # | fgrep --count "<id>hive</id>";\ # # Reset exit status to 0, otherwise the script stops here if the last grep finds nothing\ # # because we use "set -o pipefail" # echo -n) VERSION=2.4.4 # spark 版本 SCALA_VERSION=2.11 # scala 版本 SPARK_HADOOP_VERSION=2.6.0-cdh5.12.0 #对应的hadoop 版本 SPARK_HIVE=1 # 支持的hive
-
修改 pom.xml 文件,添加阿里云和 cloudera 仓库地址
[hadoop@spark001 spark-2.4.4]$ vim pom.xml <repositories> <!--<repository> <id>central</id> <name>Maven Repository</name> <url>https://repo.maven.apache.org/maven2</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository>--> <repository> <id>maven-ali</id> <url>http://maven.aliyun.com/nexus/content/groups/public//</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> <updatePolicy>always</updatePolicy> <checksumPolicy>fail</checksumPolicy> </snapshots> </repository> <repository> <id>cloudera</id> <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url> </repository> </repositories>
-
编译命令
./dev/make-distribution.sh \ --name 2.6.0-cdh5.12.0 \ --tgz \ -Pyarn \ -Phive \ -Phive-thriftserver \ -Phadoop-2.6 \ -Dhadoop.version=2.6.0-cdh5.12.0
接下来就是漫长的等待,直到出现这个页面说明编译成功!
接下来测试编译的spark支不支持 sparksql 连接hive?1.解压 [hadoop@spark001 spark-2.4.4]$ tar -zxvf spark-2.4.4-bin-2.6.0-cdh5.12.0.tgz -C ~/app 2.将spark的环境变量修改成此目录 [hadoop@spark001 app]$ ln -s spark-2.4.4-bin-2.6.0-cdh5.12.0/ spark [hadoop@spark001 app]$ vim ~/.bash_profile #spark export SPARK_HOME=/home/hadoop/app/spark export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH 3.执行spark-sql脚本 [hadoop@spark001 bin]$ ./spark-sql --jars ~/lib/mysql-connector-java-5.1.48.jar --driver-class-path ~/lib/mysql-connector-java-5.1.48.jar WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Spark master: local[2], Application Id: local-1585894518067 spark-sql (default)>
测试成功!
3. 集群测试
测试成功后,我便将 spark-2.4.4-bin-2.6.0-cdh5.12.0.tgz 上传到测试集群,测试能否连接 hive?
和上面步骤几乎一致,将集群中原有的Spark环境变量换成spark2.4.4的目录,运行spark-sql脚本
./spark-sql --jars ~/lib/mysql-connector-java-5.1.48.jar --driver-class-path ~/lib/mysql-connector-java-5.1.48.jar
Warning: Failed to load org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver: org/apache/hadoop/hive/conf/HiveVariableSource
Failed to load hive class.
You need to build Spark with -Phive and -Phive-thriftserver.
谁知又报了这个错误,又不能加载这个类,need to build Spark with -Phive and -Phive-thriftserver,可我明明已经编译成功了,并且在自己的机器上测试也OK的啊,怎么还会出现这个错误呢?查看 spark-hive-thriftserver_2.11-2.4.4.jar 是否存在$SPARK_HOME/jars 中,也是存在的。在百度上查找问题,看了很多博客,不得不吐槽都是抄来抄去,都不能解决我的问题。
心想不能连接就不能连接吧,大不了不在控制台使用spark-sql。
可这时我在本地idea写的sparksql连接hive操作的代码,打包放到集群上运行,竟然报找不到代码中所写的数据库,在hive的黑窗口 show databases 一下,数据库是存在的,本地也是能跑通的,这就奇怪了。思考了一会,我意识到在集群上运行,用的是集群环境,可集群上spark本身就连接不上hive元数据,看来上面那个问题必须要解决,不解决的话,我们所有操作hive表的代码将都不能在集群上执行。
可我明明编译成功了,为什么还报找不到类呢?
也已经将所需的配置文件拷贝到 $SPARK_HOME/conf 下了。
这时我仔细看了一下spark目录里面的文件,发现spark目录下的文件夹、文件、jar包的用户和用户组都是hadoop,因为我编译spark用的虚拟机上的用户是hadoop,而测试环境是 root 用户,拷贝过去的配置文件也是 root 用户,它报找不到这个类,会不会是因为用户组权限不一样,导致找不到的呢?带着这个疑问,我将spark里面所有的文件用户和用户组都改成 root,然后再次测试。
[root@master bin]# ./spark-sql
WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Spark master: local[2], Application Id: local-1585899821529
spark-sql (default)> show databases;
databaseName
default
monitor
ods
temp
Time taken: 3.781 seconds, Fetched 4 row(s)
测试成功!真是不容易啊,这个坑隐藏的真是深啊!
踩坑日记:以后一定要注意用户和用户组的问题。