Spark使用外部Hive

如果想连接外部已经部署好的 Hive,需要通过以下几个步骤:

  • Spark 要接管 Hive 需要把 hive-site.xml 拷贝到 conf/目录下
  • 把 Mysql 的驱动 copy 到 jars/目录下
  • 如果访问不到 hdfs,则需要把 core-site.xml 和 hdfs-site.xml 拷贝到 conf/目录下
  • 重启 spark-shell

一、安装

spark官网:http://spark.apache.org

spark3.1.2下载地址:https://mirrors.bfsu.edu.cn/apache/spark/spark-3.1.2/spark-3.1.2-bin-hadoop3.2.tgz

  1. # 下载安装包
  2. wget https://mirrors.bfsu.edu.cn/apache/spark/spark-3.1.2/spark-3.1.2-bin-hadoop3.2.tgz
  3. # 解压安装包
  4. tar -zxvf spark-3.1.2-bin-hadoop3.2.tgz
  5. # 修改目录名称
  6. mv spark-3.1.2-bin-hadoop3.2 spark-hive

二、配置外部Hive

需要保证hive的MetaStore处于启动状态才可以使用,spark在使用过程中会依赖此服务

拷贝mysql驱动

cp mysql-connector-java-5.1.48.jar spark-hive/jars

拷贝hive-site.xml到spark-hive/conf目录下。hive-site.xml文件内容如下

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <!-- jdbc 连接的 URL -->
  <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://hadoop102:3306/metastore?useSSL=false</value>
  </property>
  <!-- jdbc 连接的 Driver-->
  <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <!-- jdbc 连接的 username-->
  <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
  </property>
  <!-- jdbc 连接的 password -->
  <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>root123</value>
  </property>
  <!-- Hive 元数据存储版本的验证 -->
  <property>
    <name>hive.metastore.schema.verification</name>
    <value>false</value>
  </property>
  <!--元数据存储授权-->
  <property>
    <name>hive.metastore.event.db.notification.api.auth</name>
    <value>false</value>
  </property>
  <!-- Hive 默认在 HDFS 的工作目录 -->
  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
  </property>
  <!-- 指定hive的工作引擎 -->
  <property>
    <name>hive.execution.engine</name>
    <value>mr</value>
  </property>

  <!-- 指定存储元数据要连接的地址 -->
  <property>
    <name>hive.metastore.uris</name>
    <value>thrift://hadoop102:9083</value>
  </property>
  <!-- 指定 hiveserver2 连接的 host -->
  <property>
    <name>hive.server2.thrift.bind.host</name>
    <value>hadoop102</value>
  </property>
  <!-- 指定 hiveserver2 连接的端口号 -->
  <property>
    <name>hive.server2.thrift.port</name>
    <value>10000</value>
  </property>
  <!-- 加快hiveserver2的启动速度 -->
  <property>
    <name>hive.server2.active.passive.ha.enable</name>
    <value>true</value>
  </property>
</configuration>

三、使用

使用spark-shell进行访问

# 启动spark-shell
bin/spark-shell

# 进入scala命令行后使用
scala> spark.sql("show tables").show
+--------+---------+-----------+
|database|tableName|isTemporary|
+--------+---------+-----------+
| default|     test|      false|
+--------+---------+-----------+


scala> spark.sql("select * from test").show
+------+                                                                        
|    id|
+------+
|     1|
|嘿嘿嘿|
|哈哈哈|
|   345|
|   678|
|   890|
|你好啊|
|呵呵哒|
| hello|
| world|
+------+

使用spark-sql进行访问

# 启动spark-sql
bin/spark-sql

# 查看所有库
spark-sql> show databases;
db_hive
default

# 使用指定的库
spark-sql> use db_hive;
Time taken: 0.042 seconds

# 查看所有表
spark-sql> show tables;
db_hive hive_test       false

# 查询表数据
spark-sql> select * from hive_test;
1       张三    18
1       张三    18
2       张三    18
3       张三3   18
4       张三4   18

四、使用start-thriftserver替代hiveserver2

启动start-thriftserver

在此之前需要停止hiveserver2,hiveserver2的端口也是10000

sbin/start-thriftserver.sh

使用beeline连接ThriftServer

bin/beeline -u jdbc:hive2://hadoop102:10000 -n root

# 显示数据库
0: jdbc:hive2://hadoop102:10000> show databases;
+------------+
| namespace  |
+------------+
| db_hive    |
| default    |
+------------+
2 rows selected (0.147 seconds)

# 显示所有表
0: jdbc:hive2://hadoop102:10000> show tables;
+-----------+------------+--------------+
| database  | tableName  | isTemporary  |
+-----------+------------+--------------+
| default   | test       | false        |
+-----------+------------+--------------+
1 row selected (0.09 seconds)

# 查询表数据
0: jdbc:hive2://hadoop102:10000> select * from test;
+--------+
|   id   |
+--------+
| 1      |
| 嘿嘿嘿    |
| 哈哈哈    |
| 345    |
| 678    |
| 890    |
| 你好啊    |
| 呵呵哒    |
| hello  |
| world  |
+--------+
10 rows selected (0.183 seconds)