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
# 下载安装包wget https://mirrors.bfsu.edu.cn/apache/spark/spark-3.1.2/spark-3.1.2-bin-hadoop3.2.tgz# 解压安装包tar -zxvf spark-3.1.2-bin-hadoop3.2.tgz# 修改目录名称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)
