Failed to load org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver: org/apache/hadoop/hive/cli/

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)

测试成功!真是不容易啊,这个坑隐藏的真是深啊!
踩坑日记:以后一定要注意用户和用户组的问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值