元数据相关名词
Metadata
Metadata 即元数据。元数据包含用 Hive 创建的 database、table、表的位置、类型、属性,字段顺序类型等元信息。元数据存储在关系型数据库中。如 Hive 内置的 Derby、或者第三方如 MySQL 等。
Metastore
Metastore 即元数据服务。Metastore 服务的作用是管理 metadata 元数据,对外暴露服务地址,让各种客户端通过连接 metastore 服务,由 metastore 再去连接 MySQL 数据库来存取元数据。有了 metastore 服务,就可以有多个客户端同时连接,而且这些客户端不需要知道 MySQL 数据库的用户名和密码,只需要连接 metastore 服务即可。某种程度上也保证了 Hive 元数据的安全。
Thrift 服务器 Thrift Network API 是 Apache Thrift 框架的一部分,提供了跨编程语言和网络的服务调用能力。
在 Hive 中,它被用来在远程模式下实现不同进程与 Hive Metastore 服务之间的通信。
Apache Thrift 是一个跨语言的 RPC(远程过程调用)框架,最初由 Facebook 开发,并后来捐赠给了 Apache 基金会。
支持多种编程语言,包括Java、C++、Python、Ruby、PHP、JavaScript等。
Metastore 服务配置有3种模式:内嵌模式、本地模式、远程模式。区分3种配置方式的关键是弄清楚两个问题:
配置方式
Metastore服务是否需要单独配置、单独启动?
Metadata存储位置
内嵌模式
不需要
内置的Derby数据库
本地模式
不需要
第三方RDBMS(如MySQL)
远程模式
需要
第三方RDBMS(如MySQL)
内嵌模式(Embedded Metastore)
内嵌模式 是 metastore 默认部署模式,元数据存储在内置的 Derby 数据库,并且 Derby 数据库和 metastore 服务都嵌入在主 HiveServer 进程中 ,当启动 HiveServer 进程时,Derby 和 metastore 都会启动。
不需要额外起 metastore 服务。但是一次只能支持一个活动用户,适用于测试体验,不适用于生产环境。
本地模式(Local Metastore)
本地模式 下,metastore 服务与主 HiveServer 进程在同一进程中运行,但元数据存储在单独的外部数据库(推荐使用MySQL)中。
metastore 服务通过 JDBC 与 metastore 数据库进行通信。
Hive 根据 hive.metastore.uris
参数值来判断,如果为空,则为本地模式 。
缺点是:每启动一次 Hive 服务,都内置启动了一个 metastore。
远程模式(Remote Metastore)
Metastore 服务在独立的JVM中运行,不与 HiveServer 进程共享,元数据存储在单独的外部数据库。
其他进程可以通过 Thrift Network API 与 Metastore 服务通信,适合生产环境。
在这种情况下,其他依赖hive的软件都可以通过Metastore访问hive。由于还可以完全屏蔽数据库层,因此这也带来了更好的可管理性/安全性。
远程模式下,需要配置 `hive.metastore.uris` 参数来指定 metastore 服务运行的机器 ip 和端口,并且**需要单独手动启动metastore服务**。
![image-20211114162231128](/img/hive/00/image-20211114162231128.png)
安装准备 Hive 是一款基于 Hadoop 的数据仓库软件,通常部署运行在 Linux 系统之上。因此不管使用何种方式配置 Hive Metastore,必须要先保证服务器的基础环境正常,Hadoop 集群健康可用。
服务器基础环境:
集群时间同步
防火墙关闭
主机 Host 映射
免密登录
JDK
Hadoop集群
启动 Hive 之前必须先启动 Hadoop 集群。特别要注意,需等待 HDFS 安全模式关闭之后再启动运行 Hive。Hive 不是分布式安装运行的软件,其分布式的特性主要借由 Hadoop 完成。包括分布式存储、分布式计算。
内嵌模式安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 cd /export /server/ tar zxvf apache-hive-3.1.2-bin.tar.gz mv apache-hive-3.1.2-bin hivecd /export /server/hive rm -rf lib/guava-19.0.jar cp /export /server/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/cd /export /server/hive/conf/ mv hive-env.sh.template hive-env.sh vim hive-env.shexport HADOOP_HOME=/export /server/hadoop-3.1.4export HIVE_CONF_DIR=/export /server/hive/confexport HIVE_AUX_JARS_PATH=/export /server/hive/libcd /export /server/hive bin/schematool -dbType derby -initSchema bin/hive
注意:Hive3 版本需要用户手动进行元数据初始化动作。内嵌模式下,判断是否初始化成功的依据是执行命令之后输出信息和执行命令的当前路径下是否有文件产生。
本地模式安装 本地模式和内嵌模式最大的区别就是:本地模式使用mysql来存储元数据。
Mysql 安装:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 rpm -qa|grep mariadb mariadb-libs-5.5.64-1.el7.x86_64 rpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodeps mkdir /export /software/mysql tar xvf mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar yum -y install libaio rpm -ivh mysql-community-common-5.7.29-1.el7.x86_64.rpm mysql-community-libs-5.7.29-1.el7.x86_64.rpm mysql-community-client-5.7.29-1.el7.x86_64.rpm mysql-community-server-5.7.29-1.el7.x86_64.rpm mysqld --initialize chown mysql:mysql /var/lib/mysql -R systemctl start mysqld.service cat /var/log /mysqld.log [Note] A temporary password is generated for root@localhost: o+TU+KDOm004 mysql -u root -p Enter password: mysql> alter user user() identified by "hadoop" ; Query OK, 0 rows affected (0.00 sec) mysql> use mysql; mysql> GRANT ALL PRIVILEGES ON *.* TO 'root' @'%' IDENTIFIED BY 'hadoop' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES; systemctl stop mysqld systemctl status mysqld systemctl start mysqld systemctl enable mysqld systemctl list-unit-files | grep mysqld
Hive 安装:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 cd /export /server/ tar zxvf apache-hive-3.1.2-bin.tar.gz mv apache-hive-3.1.2-bin hivecd /export /server/hive rm -rf lib/guava-19.0.jar cp /export /server/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/ mysql-connector-java-5.1.32.jarcd /export /server/hive/conf/ mv hive-env.sh.template hive-env.sh vim hive-env.shexport HADOOP_HOME=/export /server/hadoop-3.1.4export HIVE_CONF_DIR=/export /server/hive/confexport HIVE_AUX_JARS_PATH=/export /server/hive/lib vim hive-site.xmlcd /export /server/hive bin/schematool -initSchema -dbType mysql -verbos bin/hive
Hive-site.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 <configuration > <property > <name > javax.jdo.option.ConnectionURL</name > <value > jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true& useSSL=false& useUnicode=true& characterEncoding=UTF-8</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 > hadoop</value > </property > <property > <name > hive.metastore.event.db.notification.api.auth</name > <value > false</value > </property > <property > <name > hive.metastore.schema.verification</name > <value > false</value > </property > </configuration >
远程模式安装(重点) Mysql 安装:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 rpm -qa|grep mariadb mariadb-libs-5.5.64-1.el7.x86_64 rpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodeps mkdir /export /software/mysql tar xvf mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar yum -y install libaio rpm -ivh mysql-community-common-5.7.29-1.el7.x86_64.rpm mysql-community-libs-5.7.29-1.el7.x86_64.rpm mysql-community-client-5.7.29-1.el7.x86_64.rpm mysql-community-server-5.7.29-1.el7.x86_64.rpm mysqld --initialize chown mysql:mysql /var/lib/mysql -R systemctl start mysqld.service cat /var/log /mysqld.log [Note] A temporary password is generated for root@localhost: o+TU+KDOm004 mysql -u root -p Enter password: mysql> alter user user() identified by "hadoop" ; Query OK, 0 rows affected (0.00 sec) mysql> use mysql; mysql> GRANT ALL PRIVILEGES ON *.* TO 'root' @'%' IDENTIFIED BY 'hadoop' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES; systemctl stop mysqld systemctl status mysqld systemctl start mysqld systemctl enable mysqld systemctl list-unit-files | grep mysqld
Hive 安装:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 cd /export /server/ tar zxvf apache-hive-3.1.2-bin.tar.gz mv apache-hive-3.1.2-bin hivecd /export /server/hive rm -rf lib/guava-19.0.jar cp /export /server/hadoop-3.1.4/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/ mysql-connector-java-5.1.32.jarcd /export /server/hive/conf/ mv hive-env.sh.template hive-env.sh vim hive-env.shexport HADOOP_HOME=/export /server/hadoop-3.1.4export HIVE_CONF_DIR=/export /server/hive/confexport HIVE_AUX_JARS_PATH=/export /server/hive/lib vim hive-site.xmlcd /export /server/hive bin/schematool -initSchema -dbType mysql -verbos
Hive-site.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 <configuration > <property > <name > javax.jdo.option.ConnectionURL</name > <value > jdbc:mysql://node1:3306/hive?createDatabaseIfNotExist=true& useSSL=false& useUnicode=true& characterEncoding=UTF-8</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 > hadoop</value > </property > <property > <name > hive.server2.thrift.bind.host</name > <value > node1</value > </property > <property > <name > hive.metastore.uris</name > <value > thrift://node1:9083</value > </property > <property > <name > hive.metastore.event.db.notification.api.auth</name > <value > false</value > </property > <property > <name > hive.metastore.schema.verification</name > <value > false</value > </property > </configuration >
如果在远程模式下,直接运行hive服务,在执行操作的时候会报错,错误信息如下:
在远程模式下,必须首先启动 Hive metastore 服务才可以使用 hive。因为 metastore 服务和 hive server是两个单独的进程了。
远程模式 Metastore 服务手动启动
1 2 3 4 5 6 7 8 9 /export /server/hive/bin/hive --service metastore nohup /export /server/hive/bin/hive --service metastore & /export /server/hive/bin/hive --service metastore --hiveconf hive.root.logger=DEBUG,console
后台启动的输出日志信息,在/root目录下,nohup.out。