1.集成原理说明

  • 思考:
    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方案。

2.配置操作

  • 大前提: 要保证之前hive的配置没有问题
建议:
	在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  杀死对应服务即可

3.如何在代码中集成HIVE

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()

4.Spark SQL分布式执行引擎

目前, 我们已经完成了spark集成hive的操作, 但是目前集成后, 如果需要连接hive, 此时需要启动一个spark的客户端(pyspark,spark-sql, 或者代码形式)才可以, 这个客户端底层, 相当于启动服务项, 用于连接hive服务, 进行处理操作, 一旦退出了这个客户端, 相当于这个服务也不存在了, 同样也就无法使用了
此操作非常类似于在hive部署的时候, 有一个本地模式部署(在启动hive客户端的时候, 内部自动启动了一个hive的hiveserver2服务项)

  • 如何启动spark的分布式执行引擎呢? 这个引擎可以理解为 spark的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[*]