Spark实战(十一)Spark2.x集成Hive

一、Hive配置

(一)、简介

   一般的公司都会有自己的数据仓库,而大多数都选择的Hive数据仓库,总所周知hive默认使用MapReduce来进行数据操作,MapReduce在计算过程中会涉及数量巨大的网络传输,这需要耗费大量的时间,在计算过程中会反复读写磁盘,极其耗时,因此使用spark来计算可以提高效率,但是之前有很多数据都是通过hive来操作,好在spark可以无缝集成hive,使用hive中的数据。

(二)、Hive存储Metastore的三种方式

   hive中通过使用Metastore来存储所创建的数据库表等信息,而元数据是保存在数据库中,如Mysql、derBy等
   Metastore可以作为客户端读取hive数据的桥梁,也就是客户端连接上Metastore服务,然后Metastore服务再去连接Mysql、DerBy等数据库来存取元数据,通过Metastore服务可以多个客户端同时进行连接,而且客户端可以不用知道数据库的用户名和密码,比直接获取数据库更加安全。
   Metastore有三种方式:内嵌DerBy方式、Local方式、remote方式。

1.内嵌DerBy方式

   这种方式是hive的默认方式,配置简单,但是一次只能连接一个客户端,也就是当你你启动一个hive服务会内嵌一个metastore服务,如果再去启动一个便又会内嵌一个metastore服务,并不是说你的客户端只能启动一个hive,是能启动多个,但是每个都有metastore,浪费资源。这种方式多用于测试数据,生产环境上不建议使用。

执行初始化命令:schematool -dbType derby -initSchema

查看初始化后的信息: schematool -dbType derby -info	

2.Local方式

   这种方式与内嵌的区别就是不再使用DerBy来存储介质,而是使用如Mysql数据库来保存,在这种模式下hive与Metastore服务运行在同一个进程中,mysql可以与hive在同一机器上也可以在其他机器上,这种方式可以多个用户连接到同一个数据库上,也就是用户通过Mysql用户密码来进行访问,hive-site.xml配置如下:

<property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://mini2:3306/hive?createDatabaseIfNotExist=true</value>
        <description>JDBC connect string for a JDBC metastore</description>
</property>

<property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
        <description>Driver class name for a JDBC metastore</description>
</property>

<property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
        <description>username to use against metastore database</description>
</property>

<property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>123456you</value>
        <description>password to use against metastore database</description>
</property>

3.remote方式

   这种方式中hive服务与metastore不在同一进程中,可以是不同机器也可以是相同机器,通过hive.metastore.uris指定metastore服务器URL,同时需要单独启动metastore服务,每个客户端在配置文件中配置连接到metastore服务,客户端通过beeline来连接,这种方式下不需要知道数据库的密码。
   如果单单是连接远程mysql不能称之为远程方式,需要单独启动metastore服务,配置如下:

<property>
  <name>hive.metastore.uris</name>
  <value>thrift://192.168.1.188:9083</value>
</property>

   metastore服务启动命令如下:

	hive --service metastore &

   如果要在spark中集成hive,三种方式都需要将hive-site.xml拷贝至spark/conf目录下,如果涉及到数据库操作,还需要将数据库驱动包拷贝到lib中,或者在执行的时候同–jars指定

二、Spark服务启动

(一)、直接运行spark-sql或者spark-shell方式

   这种方式相当于每执行一次命令就会起一个spark任务,即spark-shell、spark-sql都是一个spark application

(二)、thriftserver

   thriftserver, 不管你启动多少个客户端(beeline/code),永远都是一个spark application解决了一个数据共享的问题,多个客户端可以共享数据;启动命令如下:

./start-thriftserver.sh  \
--master local[2] \
--jars ~/software/mysql-connector-java-5.1.27-bin.jar  \
--hiveconf hive.server2.thrift.port=14000 

   beeline连接指令如下,其中的端口是thriftserver指定的端口,默认为10000

beeline -u jdbc:hive2://localhost:14000 -n hadoop