1、集成原理
HiveServer2的主要作用: 接收SQL语句,进行语法检查;解析SQL语句;优化;将SQL转变成MapReduce程序,提交到Yarn集群上运行
SparkSQL与Hive集成,实际上是替换掉HiveServer2。是SparkSQL中的HiveServer2替换掉了Hive中的HiveServer2。
集成以后优点如下:
1- 对于SparkSQL来说,可以避免在代码中编写schema信息。直接向MetaStore请求元数据信息
2- 对于SparkSQL来说,多个人可以共用同一套元数据信息,避免每个人对数据理解不同造成代码功能兼容性问题
3- 对于Hive来说,底层执行引擎由之前的MapReduce变成了Spark Core,能够提升运行效率
4- 对于使用者/程序员来说,SparkSQL与Hive集成,对于上层使用者来说,是完全透明的。
2、集成环境配置
SparkSQL整合Hive步骤
(1)检查hive中 hive-site.xml中,是否有关于metastore的地址配置。如果没有,需要新增操作
cd /export/server/hive/conf
vim hive-site.xml
<property><name>hive.metastore.uris</name>
<value>thrift://node1.itcast.cn:9083</value>
</property>
(2)node1上 将hive-site.xml拷贝到spark安装路径conf目录
cd /export/server/hive/conf
cp hive-site.xml /export/server/spark/conf/
(3)将mysql的连接驱动包拷贝到spark的jars目录下
node1执行以下命令将连接驱动包拷贝到spark的jars目录下,三台机器都要进行拷贝
cd /export/server/hive/lib
cp mysql-connector-java-5.1.32.jar /export/server/spark/jars/
3、启动metastore服务
# 注意:
# 启动 hadoop集群
start-all.sh
# 启动hive的metastore
nohup /export/server/hive/bin/hive --service metastore &
# 测试spark-sql
/export/server/spark/bin/spark-sql
4、SparkOnHive操作
4.1 黑窗口测试spark-sql
[root@node1 bin]# /export/server/spark/bin/spark-sql
...
spark-sql>show databases;
...
spark-sql>create database if not exists spark_demo;
...
spark-sql>create table if not exists spark_demo.stu(id int,name string);
...
spark-sql>insert into spark_demo.stu values(1,'张三'),(2,'李四');
...
4.2 python代码测试spark-sql
SparkOnHive配置:
spark.sql.warehouse.dir: 告知Spark数据表存放的地方。推荐使用HDFS。如果不配置,默认使用本地磁盘存储。
hive.metastore.uris: 告知Spark,MetaStore元数据管理服务的连接信息
enableHiveSupport() : 开启Spark和Hive的集成
使用格式如下:
spark = SparkSession.builder\
.config('spark.sql.warehouse.dir','hdfs://node1:8020/user/hive/warehouse')\
.config('hive.metastore.uris','thrift://node1.itcast.cn:9083')\
.appName('pyspark_demo')\
.master('local[1]')\
.enableHiveSupport()\
.getOrCreate()
示例:
导包
import os
import time
from pyspark.sql import SparkSession
绑定指定的python解释器
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3'
os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'
创建main函数
if name == 'main':
# 1.创建SparkContext对象
spark = SparkSession.builder
.config('spark.sql.warehouse.dir','hdfs://node1:8020/user/hive/warehouse')
.config('hive.metastore.uris','thrift://node1.itcast.cn:9083')
.appName('pyspark_demo')
.master('local[1]')
.enableHiveSupport()
.getOrCreate()
# 2.执行sql
# 查看所有库
spark.sql( "show databases").show()
# 查看demo1的student表内容
spark.sql("select * from demo1.student").show()
# 测试是否能建库: 可以
spark.sql( "create database if not exists spark_demo" )
# 测试是否能在spark_demo建表: 可以
spark.sql("""create table if not exists spark_demo.stu(id int,name string)""")
# 测试是否可以往spark_demo.stu表插入数据: 可以
spark.sql("""insert into spark_demo.stu values(1,'张三'),(2,'李四')""")
# 为了方便查看web页面
time.sleep(500)
# 3.关闭资源
spark.stop()
版权归原作者 困了就倒头睡 所有, 如有侵权,请联系我们删除。