前言
我尽可能的会把使用的细节写的详细一点,为后来的小伙伴节约点时间。
一、问题
- 如果用 sql-client.sh 来提交无法保存元数据,每次创建的表都在一个 session 中,而这个 session 保存在内存中。我们每次重启 sql-client.sh 后,元数据都会丢失。每次重新创建非常麻烦,flink 提供了一种选择, 让我们可以读取 hive 元数据。
- 也就是我们 hive 中的表都可以通过 sql-client.sh 来读取。这对实现流批一体,和元数据的一致性也很有好处。
二、原理解析
Hive 的真实数据是存储在 HDFS 上的。
Hive 的元数据是存储在 Mysql 中的。
我们要提供服务去访问元数据,那么就需要启动两个服务,一个是 Metastore,另外一个是 HiveServer2。
Metastore 是提供 Hive Cli 访问元数据的服务。
HiveServer2 是提供给第三方 Client 访问的服务, HiveServer2 通过再通过 Metastore 访问 Mysql。
整个的 Hive 元数据访问流程如下:
Flink Sql Client ⟹ HiveServer2 ⟹ Metastore ⟹ Mysql
三、实战
选择的版本
- Mysql 5.7
- Flink 1.12.3
- Hive 3.1.2
- Hadoop 3.1.3
其中选择版本的时候一定要记住对应的版本,然后下载 jar 包不要下载错了。
1. 配置 Hadoop 的环境变量
export HADOOP_CLASSPATH=`hadoop classpath`
测试一下
说明配置成功
2. hive/conf/hive-site.xml 配置
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node1:3306/metastore?useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node1</value>
</property>
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<property>
<name>hive.zookeeper.quorum</name>
<value>node1,node2,node3</value>
</property>
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thritf://node1:9083</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<!--Spark依赖位置-->
<property>
<name>spark.yarn.jars</name>
<value>hdfs://node1:8020/spark-jars/*</value>
</property>
<!--Hive执行引擎-->
<property>
<name>hive.execution.engine</name>
<value>spark</value>
</property>
<!--Hive和spark连接超时时间-->
<property>
<name>hive.spark.client.connect.timeout</name>
<value>10000ms</value>
</property>
</configuration>
主要关注的配置
因为 sql-client.sh 的启动会读取hive 的配置(hive-site.xml),然后通过 hive 的配置文件找到一些服务,所以 hive 的配置文件里面要配置下面三个配置。
① HiveServer2 的地址
通过参数 hive.server2.thrift.bind.host
配置地址
通过参数 hive.server2.thrift.port
配置端口
② Metastore 的地址
通过参数 hive.metastore.uris
配置
③ Mysql 的地址。
通过参数 javax.jdo.option.ConnectionURL
配置
3. sql-client-defaults.yaml 配置
catalogs:
- name: flink
type: hive
hive-conf-dir: /opt/module/hive/conf
execution:
planner: blink
type: streaming
...
...
...
current-catalog: flink # 此处要和上面配置的 -name 名字一致
current-database: default # 选择数据库。
主要通过要找到 hive 的配置文件。
通过 hive-conf-dir
来配置 hive-site.xml 的位置。
4. 启动 hive 的服务
# 先启动 metastore
nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &
# 再启动 hiveserver2
nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &
5. jar 包下载
主要有几点注意:
① flink 版本
② flink 对应的 scala 版本
③ flink 对应的 hive 版本
上图可以看到不同版本的 hive 对应的jar 包不一样。
libfb303
这个包不是每个 hive-exec
都有的。一定要注意。
hive-exec-3.1.0.jar
libfb303-0.9.3.jar
flink-connector-hive_2.11-1.12.3.jar
flink-shaded-hadoop-2-uber-2.8.3-9.0.jar
flink-sql-connector-hive-3.1.2_2.11-1.12.3.jar
前三个 jar 数读取 hive 元数据必须的。
第四个 jar 是 flink 操作 hadoop 的 jar。我有 2.8.3 也可以读取 hadoop 3.1.3。最新的 shaded 自己打包的时候有错误。官方现在出新的了,可以去下载新的。
最后一个 jar 可以通过 sql 读取 hive。
flink-shaded-hadoop-3-uber-3.1.1.7.2.1.0-327-9.0.jar
flink-shaded-hadoop-2-uber-2.8.3-10.0.jar
我的全部 jar 包
6. 启动 flink。
# 启动 Flink SQL 客户端
bin/sql-client.sh embedded
No default environment specified.
Searching for '/opt/module/flink-1.12.3/conf/sql-client-defaults.yaml'...found.
Reading default environment from: file:/opt/module/flink-1.12.3/conf/sql-client-defaults.yaml
No session environment specified.
2021-05-01 13:50:10,397 INFO org.apache.hadoop.hive.conf.HiveConf [] - Found configuration file file:/opt/module/hive/conf/hive-site.xml
2021-05-01 13:50:10,567 WARN org.apache.hadoop.hive.conf.HiveConf [] - HiveConf of name hive.metastore.local does not exist
2021-05-01 13:50:10,786 INFO org.apache.hadoop.hive.metastore.HiveMetaStoreClient [] - Trying to connect to metastore with URI thritf://node1:9083
2021-05-01 13:50:10,801 INFO org.apache.hadoop.hive.metastore.HiveMetaStoreClient [] - Opened a connection to metastore, current connections: 1
2021-05-01 13:50:10,814 INFO org.apache.hadoop.hive.metastore.HiveMetaStoreClient [] - Connected to metastore.
2021-05-01 13:50:10,814 INFO org.apache.hadoop.hive.metastore.RetryingMetaStoreClient [] - RetryingMetaStoreClient proxy=class org.apache.hadoop.hive.metastore.HiveMetaStoreClient ugi=lzq (auth:SIMPLE) retries=1 delay=1 lifetime=0
Command history file path: /home/lzq/.flink-sql-history
7. 在 sql-client.sh 里面查看 hive 的 catalog 和 表。
show catalogs;
# 上面的配置就是说我某人使用的 catalog 是 flink
show tables;
我的所有服务
解释一下都是 什么服务
6928 SqlClient # hive sql 客户端
4819 SqlClient # flink sql 客户端
10564 DataNode # hdfs datanode
6039 RunJar # org.apache.hadoop.hive.cli.CliDriver
11081 NodeManager # yarn
2043 RunJar # HiveServer2 org.apache.hive.service.server.HiveServer2
1787 RunJar # metastore org.apache.hadoop.hive.metastore.HiveMetaStore
10763 QuorumPeerMain # zookeeper
10396 NameNode # hdfs namenode
30220 TaskManagerRunner # flink worker
29789 StandaloneSessionClusterEntrypoint # flink StandaloneSession 集群入口