思考:
Spark On Hive的目的: 将客户端提交的SQL语句从原来翻译MR 变更为 翻译为Spark的RDD程序(Spark程序), 然后交给Yarn执行
那么也就意味着, 一旦Spark 和 HIVE集成在一起, 这个HIVE的原有的HiveServer2这个服务就没有任何的价值了, 所以说Spark On HIVE 本质:
让Spark去集成hive的metastore的元数据服务即可, 集成后, 可以让spark的执行引擎, 结合元数据信息, 将SQL翻译为Spark的应用程序, 基于Spark执行运行, 从而提升效率
核心目的:
集合HIVE的元数据服务, 由Spark进行执行, 避免每一次都需要自己来构建元数据信息, 导致信息数据不一致, 不统一的问题, 一旦有了元数据服务后, 表的元数据信息就可以固定, 不管是谁在使用spark SQL, 不需要定义schema信息, 直接读取数据, 进行分析即可
最终目标: 让原有使用HIVE的从业者, 不需要改变任何的方案, 即可在内部无痕转换为spark方案。
建议:
在on hive配置前, 尝试先单独启动hive 看看能不能启动成功, 并连接
启动hive的命令:
cd /export/server/hive/bin
启动metastore:
nohup ./hive --service metastore &
启动hiveserver2:
nohup ./hive --service hiveserver2 &
基于beeline连接:
./beeline 进入客户端
输入: !connect jdbc:hive2://node1:10000
输入用户名: root
输入密码: 密码可以不用输入
注意:
启动hive的时候, 要保证 hadoop肯定是启动良好了
测试完成后, 将HIVE通过 kill 方式将其杀掉即可
1) 确保 hive的conf目录下的hive-site.xml中配置了metastore服务地址
<property>
<name>hive.metastore.uris</name>
<value>thrift://node1:9083</value>
</property>
2) 需要将hive的conf目录下的hive-site.xml 拷贝到 spark的 conf 目录下
如果spark没有配置集群版本, 只需要拷贝node1即可
如果配置spark集群, 需要将文件拷贝每一个spark节点上
3) 启动 hive的metastore服务:
cd /export/server/hive/bin
nohup ./hive --service metastore &
启动后, 一定要看到有runjar的出现
4) 启动 hadoop集群, 以及spark集群(如果采用local模式, 此集群不需要启动)
5) 使用spark的bin目录下: spark-sql 脚本 或者 pyspark 脚本打开一个客户端, 进行测试即可
测试小技巧:
同时也可以将hive的hiveserver2服务启动后, 然后通过hive的beeline连接hive, 然后通过hive创建一个库, 在 spark-sql 脚本 或者 pyspark 脚本 通过 show databases 查看, 如果能看到, 说明集成成功了...
测试完成后, 可以将hive的hiveserver2 直接杀掉即可, 因为后续不需要这个服务:
首先查看hiveserver2服务的进程id是多少:
ps -ef | grep hiveserver2 或者 jps -m
查看后,直接通过 kill -9 杀死对应服务即可
import pandas as pd
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
from pyspark.sql import Window as win
import pyspark.sql.functions as F
from pyspark.sql.types import *
import os
# 锁定远端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'
if __name__ == '__main__':
print("Pandas的DF与Spark SQL DF的互转操作: ")
# 1- 创建SparkSession对象
# enableHiveSupport: 启动Spark和HIVE的集成 (支持)
# 默认 spark在创建库和表的时候, 默认加载数据的目录在本地磁盘上, 而不是HDFS
spark = SparkSession\
.builder\
.appName('write_01')\
.master('local[*]')\
.config('spark.sql.shuffle.partitions','4')\
.config('hive.metastore.uris','thrift://node1:9083') \
.config('spark.sql.warehouse.dir', 'hdfs://node1:8020/user/hive/warehouse') \
.enableHiveSupport()\
.getOrCreate()
# 测试一下
spark.sql("show databases").show()
目前, 我们已经完成了spark集成hive的操作, 但是目前集成后, 如果需要连接hive, 此时需要启动一个spark的客户端(pyspark,spark-sql, 或者代码形式)才可以, 这个客户端底层, 相当于启动服务项, 用于连接hive服务, 进行处理操作, 一旦退出了这个客户端, 相当于这个服务也不存在了, 同样也就无法使用了
此操作非常类似于在hive部署的时候, 有一个本地模式部署(在启动hive客户端的时候, 内部自动启动了一个hive的hiveserver2服务项)
cd /export/server/spark
./sbin/start-thriftserver.sh \
--hiveconf hive.server2.thrift.port=10000 \
--hiveconf hive.server2.thrift.bind.host=node1 \
--hiveconf spark.sql.warehouse.dir=hdfs://node1:8020/user/hive/warehouse \
--master local[*]