开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:SparkSQL 读写_Hive_整合】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12058
SparkSQL 读写_Hive_整合
内容介绍:
一、思路梳理
二、整合步骤
三、课堂总结
本节课主要学习如何使用 SparkSQL 访问 Hive。Hive 与前面所讲过的 JSON、Parquet 等一些文件格式有区别的,Hive 可以被称之为系统,因此使用 SparkSQL 访问 Hive 其实是通过一个系统访问另外一个系统。在该场景下,应该先进行整合。
本节课主要学习如何使用 SparkSQL 访问 Hive,从而为以后的学习打下基础。
一、思路梳理
应该怎样进行整合呢?
首先,如果要整合两个(或多个)部分的内容,应先了解一下两者可以在哪些方面进行整合,俗称“整合啥”;接下来要看 Hive 部分应如何做,最后看 Spark 部分该如何做。这就是关于整合的三个步骤。
二、整合步骤
1、“整合啥”
(1)SparkSQL 的内容
SparkSQL 中的内容我们上节课已经做过相关的了解,如 Dateset、DateFrame 等。
(2)Hive 的内容
Hive 由两大部分组成,Hive 本质上是通过一个表的概念映射了一个或多个 HDFS 上的文件,而在创建表的时候,源信息会放在 MetaStore 元数据存储当中,在通过表操作文件时,SQL 语句的内容会被翻译为 MR 程序,最终运行在 Yarn 当中。
(3)整合内容
可能有两部分要整合:第一部分,原数据存储,要使用 SparkSQL 访问 Hive 的表,就要先让 SparkSQL 能够获取表的源信息,如表的名称、在哪部分存储信息、存储的信息、schema 如何等信息,即 MetaStore 要进行整合;
第二部分,HiveSQL 语句与普通的 SQL 语句有一定区别,因此查询引擎也应进行整合。也就是说要让 SparkSQL 能够使用 HiveSQL 进行访问,因此,查询引擎 SparkSQL 已经内置了 HiveSQL 的支持,即不需要再进行整合。
因此,若要对 SparkSQL 和 Hive 进行整合的话,整合的应是 MetaStore 的元数据存储。如果想使用 SparkSQL 访问 Hive 的原数据存储,应先把 Hive 的 MetaStore 程序独立出来,将其变成独立的进程,所有人都能对 MetaStore 进行访问。
2、Hive 部分
(1)Hive 的运算情况
Hive 运算的大致的情况如下:
Hive 的服务器,叫做 HiveServer2,外部的访问者就可以连接该服务器进行 SQL 语句的查询,HiveServer 会把消息把请求转给 HiveDriver,HiveDriver 访问 MetaStore,查询表的位置、对应的文件、schema 如何、如何进行优化等,接下来 Driver 就会生成对应的物理执行计划,即 MR 程序运行在 Yarn 中。且 MetaStore 的元数据信息存储在 MySQL 中。
(2)独立 MetaStore
如何能让外部(SparkSQL)能够访问 MetaStore?默认情况下 MetaStore 隐藏在整个 Hive 进程里,因此要将其独立出来。
Hive 的 MetaStore 有三种运行模式,第一种,内嵌模式,即其在在进程当中会默认使用本地的数据库 Derby,而该本地数据库性能堪忧,并非特别优化的数据库,将数据库文件直接放在文件系统中,且其为单连接模式,不支持并发,因此该种模式在生产环境下使用非常少;
第二种,Local 模式,Local 和 Remote 都访问 MySQL 数据库,但是 MetaStore 没有独立进程,外部不容易访问,而要依附于 HiveServer2 的进程进行存活;
第三种,Remote 模式,MetaStore 访问 MySQL 数据库,且 MetaStore 是独立的进程,有自己独立的端口,外部可以直接通过独立的端口来进行访问较为方便。
因此,我们应选用 Remote 模式,即独立进程使用 MySQL 的模式。
(3)Hive 开启 MetaStore
配置 Hive 以开启 MetaStore。
①修改一下 hive-site.xml 配置文件
首先找到 Hive 的目录,即 cd/export/servers/hive 进入第一层级,再进入 cd conf,继而进入 vi hive.site.xml。
A.修改该配置文件中的一些内容。首先修改 warehouse.dir 本身的数据仓库存放的路径,即表对应的文件存放的路径。
输入/warehouse.dir
进行查找,
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
可以发现最终文件存在/user/hive/warehouse 目录中,且该目录 HDFS 的目录,即在默认情况下,当创建了内部管理表,文件就会存在该位置。
B.修改一下连接的 URL
连接的 URL 叫做 ConnectionURL,其指的是 MySQL 的 URL,按 N 键进行查找.
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node01:3306/hive?createDatabaseIfNotExist=true</value>
</property>
如何连接 MySQL 的 URL 是必须进行配置的,该 URL 指定自己 MySQL 的服务器的地址以及端口即可,此外还要指定对应的库。
C.修改一下 Drivername,
配置了要连接的 MySQL 之后,jdbc 在连接 MySQL 时应配置 MySQL 的 Driver,该驱动在 ConnectionDriverName 字段中进行配置
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.idbc.Driver</value>
</property>
该处应写 com.mysql.idbc.Driver,并且要把 MySQL 的 Jar 包拷贝到 Hive 的 lib 目录下。
D.配置 UserName
即配置访问 MySQL 数据库的名字
输入/ConnectionUserName,搜索结果是对应 Hive 的用户名。
<property>
<name>javax.jdo.optionConnectionUserName</name>
<value>username</value></property>
<property>
E.配置 ConnectionPassword
即配置访问 MySQL 的用户名的密码
<name>javax.jgo.option.ConnectionPassword</name><value>password</value>
F.配置 metastore.local
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
这一项开始可能是没有配置的,如果要运行在一个服务中,最好对其进行配置。local 要指为 false,说明 metastore 并不是本地运行的,一般情况下该属性给客户端使用,当然不配置也可以。
G.配置 metastore.urls
即配置的是 metastore 占用哪个 ip 地址
<property>
<name>hive.metastore.urls</name>
<value>thrift://node81:9083</value>
</property>
可以发现占用的端口是 9083。
将以上配置配置完成后,保存并退出即可。以上即为配置的内容,但并不是直接把些内容拷贝到 hive-site.xml 中,而是要进行修改。
②启动 Hive
输入 cd 查询,然后先 jps,显示已有 RunJar,则输入 kill -9
20670 注释 RunJar,RunJar 即 Hive 的 MetaStore。
要开启 MetaStore,默认情况下 Hive 会直接在前台运行,但实际上应在后台运行,因此使用 nohup 命令,
即 nohup/export/servers/hive/bin/hive --servers metastore 2 >&1 >> /var/log &(直接指定 service metastore),“2 >&1 >> /var/log &”是指内容输出到 log 文件。这是 nohup 命令的格式,nohup 以及后面的内容可以直接拷贝,中间的内容才是真正启动 metastored 的命令。
运行命令。运行结束后 jps 查看,结果显示 RunJar 已经在运行 Hive 配置完成。
3、Spark 部分
配置 SparkSQL。首先,Hive 当中有一个叫做 conf 的目录,输入 cd/conf 进入该目录查看,其中有一个 hive-site.xml 的文件。
如果想使用 SparkSQL 整合 Hive,而 Hive 已经配置完成,接下来要进行 SparkSQL 的配置。由于 SparkSQLspircical 可以直接读 Hive 的配置文件,则只需要把 Hive 的 hive-site.xml 复制到 SparkSQL 的 conf 录即可。
复制方式:
输入 cp hive-site.xml/export/servers/spark/conf,拷贝即可。
拷贝成功并不意味着整合完成,而是还要再去拷贝 HDFS 的配置文件到 spark 的目录下,因为 Hive 经常会把文件存在 HDFS 上,spark 要想访问 Hive 的表,就要有 HDFS 的配置。
输入 cd/export/servers/hadoop 进入该目录,继续输入 cd/etc,cd hadoop。
也就是说应拷贝两个配置文件,即拷贝 hdfs-site.xml 和 core-site.xml 到 spark 的目录。拷贝方式:输入 cp core-site.xml hdfs-site.xml/export/servers/spark/conf,spark 配置完成。
三、课堂总结
1、Hive 为什么要先去把 MetaStore 开启
因为 Hive 和 SparkSQL 整合其实本质上整合的是 MetaStore,Spark 无需使用 SQL 解析器,自身就可以解析,因此只要整合 MetaStore 即可。因此,Hive 要尽量的要把 MetaStore 独立运行起来。
2、修改一下 Hive 的配置文件
大概一共有 7 个参数需要配置,尤其是 MetaStoreURL 是必须配置的,应为其指定一个端口。
3、启动 Hive MetaStore
启动完毕后,进入到 SparkSQL,整合 Hive 的 MetaStore 环节了。以上是 Hive 方面的配置。
4、SparkSQL 方面的配置
即拷贝三个配置文件,hive-side.xml、core-side.xml 和 hdfs-site.xml。