1 Hive 概述

1.1 Hive 简介

http://hive.apache.org/

hive 多租户 开源 hive client_mysql

Apache Hive 数据仓库软件方便了使用 SQL 读取、写入和管理驻留在分布式存储中的大型数据集。结构可以投影到已经存储的数据上。提供命令行工具和 JDBC 驱动程序将用户连接到 Hive。

Hive 产生的原因:非 java 编程者通过 SQL 语句对 hdfs 的数据做 mapreduce 操作。

对比项

Hive

关系型数据库

查询语音

HQL

SQL

数据存储

HDFS

Local FS or RawDevice

执行器

MapReducer

Executor

数据 insert

支持批量导入和单条插入

支持批量导入和单条插入

数据 Update 和 delete

支持追加,不支持删除

行级别更新和删除

数据规模

执行延迟

分区

支持

支持

索引

v0.8 后支持

支持

数据加载模式

读时模式(快)

写时模式(慢)age int

扩展性

应用场景

海量数据查询

实时查询

1.2 Hive 架构

hive 多租户 开源 hive client_hive 多租户 开源_02

• Hive 的架构

– (1)用户接口主要有三个:CLI,JDBC/ODBC 和 WebUI。其中最常用的是 CLI,Cli 启动的时候,会同时启动一个 Hive 副本。Client 是 Hive 的客户端,用户连接至 Hive Server。在启动 Client 模式的时候,需要指出 Hive Server所在节点,并且在该节点启动 Hive Server。 WUI 是通过浏览器访问 Hive。

– (2)Hive 将元数据存储在数据库中,如 mysql、derby(hive 自带的内存数据库)。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。

– (3)解释器( SQL Parser )、编译器( Compiler )、优化器( Optimizer )完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有执行器( Executor )调用 MapReduce执行。

– (4)Hive 的数据存储在 HDFS 中,大部分的查询、计算由 MapReduce 完成(包含*的查询,比如 select * from tbl 不会生成 MapRedcue 任务)。

– select id,name from psn;

hive 多租户 开源 hive client_hive_03

• Hive 的架构

– 编译器将一个 Hive SQL 转换操作符

– 操作符是 Hive 的最小的处理单元

– 每个操作符代表 HDFS 的一个操作或者一道 MapReduce 作业

• Operator(操作符)

– Operator 都是 hive 定义的一个处理过程

– Operator 都定义有:

– protected List <Operator<? extends Serializable >> childOperators;

– protected List <Operator<? extends Serializable >> parentOperators;

– protected boolean done; // 初始化值为 false

hive 多租户 开源 hive client_Hive_04

查询操作 表扫描操作 限制输出 文件输出操作。

ANTLR 词法语法分析工具解析 hql

hive 多租户 开源 hive client_hive 多租户 开源_05


 

2 Hive 三种方式区别和搭建

Hive 中 metastore(元数据存储)的三种模式:

a)内嵌 Derby 模式

b)直连数据库模式

c)远程服务器模式

2.1内嵌 Derby 模式

此模式连接到一个 In-memory 的数据库 Derby,一般用于 Unit Test(单元测试目前用的也少),一台服务器即可,基本不用。

2.2直连数据库(mysql)模式

通过网络连接到一个数据库中,是最经常使用到的模式。

2.3远程服务器模式

用于非 Java 客户端访问元数据库,在服务器端启动 MetaStoreServer,客户端利用Thrift 协议通过 MetaStoreServer 访问元数据库。起到了解耦的作用,如果更换其他数据库只需要修改 MetaStoreServer 即可。

2.4安装

2.4.1 官方文档阅读

hive 多租户 开源 hive client_hive_06

hive 多租户 开源 hive client_hive 多租户 开源_07

Installing Hive from a Stable Release(从稳定版本安装 hive)

Start by downloading the most recent stable release of Hive from one of the Apache download mirrors (see Hive

Releases).(下载 hive)

Next you need to unpack the tarball. This will result in the creation of a subdirectory

named hive-x.y.z (where x.y.z is the release number):

$ tar -xzvf hive-x.y.z.tar.gz

Set the environment variable HIVE_HOME to point to the installation directory:
 

$ cd hive-x.y.z
$ export HIVE_HOME={{pwd}}

Finally, add $HIVE_HOME/bin to your PATH:

$ export PATH=$HIVE_HOME/bin:$PATH

Building Hive from Source (源码安装)

Running Hive

               Running Hive CLI

               Running HiveServer2 and Beeline

...

hive 多租户 开源 hive client_hive 多租户 开源_08

hive 多租户 开源 hive client_hive_09

hive 多租户 开源 hive client_hive 多租户 开源_10

hive 多租户 开源 hive client_mysql_11

hive 多租户 开源 hive client_mysql_12

Metadata( 元 数 据 存 储 ) 在 嵌 入 式 Derby 数 据 库 中 , 其 磁 盘 存 储 位 置 由 名 为javax.jdo.option.Connectionurl 的 hive 配置变量决定。默认情况下,此位置为./metastore_db(参见 conf/hive-default.xml)。在嵌入式模式下使用 Derby
最多一次允许一个用户。若要将 Derby 配置为在服务器模式下运行,请参见服务器模式下使用 Derby 的 Hive。若要为 Hive 元存储配置除 Derby 以外的数据库,请参见 HiveMetastore Administration。

hive 多租户 开源 hive client_hive_13

hive 多租户 开源 hive client_mysql_14


 

需要用到 mysql,所以我们先安装 mysql。

2.4.2 Mysql 安装

hive 多租户 开源 hive client_mysql_15

先将四台虚拟机拍快照,然后再进行安装。

Node1 上安装:

需要下载 mysql 的四个 rpm 包:

mysql-community-client-5.7.18-1.el6.x86_64.rpm
mysql-community-common-5.7.18-1.el6.x86_64.rpm
mysql-community-libs-5.7.18-1.el6.x86_64.rpm
mysql-community-server-5.7.18-1.el6.x86_64.rpm

1、rpm -qa | grep -i mysql

2、将上一步找到的 mysql 相关的包都删除

rpm -e --nodeps mysql-libs* //*号指代实际包名, 请实际情况输入完整包名
rpm -e mysql-server*(如果有)
rpm -e mysql-client*(如果有)

3、检查并删除老版本 mysql 的开发头文件和库

命令:

rm -rf /usr/lib/mysql
rm -fr /usr/include/mysql
rm -f /etc/my.cnf
rm -fr /var/lib/mysql
rm -fr /usr/share/mysql

注意:卸载后/var/lib/mysql 中的数据及/etc/my.cnf 不会删除,如果确定没用后就手工删除

4、安装 perl

yum install perl -y

5、下载 numactl-2.0.9-2.el6.x86_64.rpm 并安装

rpm -ivh numactl-2.0.9-2.el6.x86_64.rpm

6、安装 mysql(有顺序要求)

rpm -ivh mysql-community-common-5.7.18-1.el6.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.18-1.el6.x86_64.rpm
rpm -ivh mysql-community-client-5.7.18-1.el6.x86_64.rpm
rpm -ivh mysql-community-server-5.7.18-1.el6.x86_64.rpm

执行这个,自动识别安装顺序:

rpm -ivh mysql-community-*

7、修改/etc/my.cnf 文件,设置数据库的编码方式:

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character_set_server=utf8

9、如果出现错误,请查看/etc/my.cnf 文件中指定的错误 log 日志的文件

10、service mysqld start

11、找到随机密码:

    在/var/log/mysqld.log 中有一行:

         A temporary password is generated for root@localhost,后面就是随机密码

# mysql -uroot -p"yAe7QGVJ;HlR"使用随机密码登录系统

12、修改默认密码:

set global validate_password_policy=0;
set global validate_password_length=6;
set password for 'root'@'localhost'=password('123456');

搞定

13、查看编码方式

mysql> show variables like '%character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
mysql>

14、给 root 设置远程登录权限

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;

15、chkconfig mysqld on 设置开机启动

[root@node1 ~]# chkconfig mysqld on 开机启动 mysql 服务
[root@node1 ~]# ./startdfs.sh 启动 hadoop 集群
[root@node3 ~]# start-yarn.sh 启动 NM,和 node3 上 RM
[root@node4 ~]# yarn-daemon.sh start resourcemanager

启动 node4 上 RM

2.4.3 直连数据库(mysql)模式安装

将 apache-hive-1.2.1-bin.tar.gz 和mysql-connector-java-5.1.32-bin.jar 上传到 node2 的/opt/apps 目录下。

[root@node2 apps]# tar -zxvf apache-hive-1.2.1-bin.tar.gz -C /opt
[root@node2 apps]# cd /opt/
[root@node2 opt]# ls
apache-hive-1.2.1-bin hadoop-2.6.5 zookeeper-3.4.6.tar.gz
apps zookeeper-3.4.6
[root@node2 opt]# mv apache-hive-1.2.1-bin/ hive-1.2.1
[root@node2 opt]# ls
apps hive-1.2.1 zookeeper-3.4.6.tar.gz
hadoop-2.6.5 zookeeper-3.4.6
[root@node2 opt]# vim /etc/profile
export HIVE_HOME=/opt/hive-1.2.1
export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin
[root@node2 hive-1.2.1]# source /etc/profile
[root@node2 hive-1.2.1]# cd conf/
[root@node2 conf]# ls
beeline-log4j.properties.template
hive-exec-log4j.properties.template
hive-default.xml.template hive-log4j.properties.template
hive-env.sh.template ivysettings.xml
[root@node2 conf]# cp hive-default.xml.template hive-site.xml
[root@node2 conf]# vim hive-site.xml

这种存储方式需要在远端服务器运行一个 mysql 服务器,并且需要在 Hive 服务器启动meta 服务。

这里用 mysql 的测试服务器,ip 位 192.168.20.81,新建 hive 数据库,字符集位latine1

<property>

    <name>hive.metastore.warehouse.dir</name>

    <value>/user/hive/warehouse</value>

</property>

<property>

    <name>javax.jdo.option.ConnectionURL</name>

    <value>jdbc:mysql://192.168.20.81:3306/hive?createDatabaseIfNotExist=true</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>

 

[root@node2 conf]# vim hive-site.xml
--><configuration>
光标位置 <!-- WARNING!!! This file is auto generated for
:.,$-1d
将以上各个属性配置拷贝过来,然后保存并退出
然后启动 hive
[root@node2 conf]# hive
抛错:
The specified datastore driver ("com.mysql.jdbc.Driver") was not
found in the CLASSPATH 找不到 mysql 的驱动类
[root@node2 conf]# cp /opt/apps/mysql-connector-java-5.1.32-bin.jar
/opt/hive-1.2.1/lib/
[root@node2 conf]# hive
抛错
Exception in thread "main" java.lang.IncompatibleClassChangeError:
Found class jline.Terminal, but interface was expected
原因是 jline jar 包冲突了。
[root@node2 lib]# pwd
/opt/hive-1.2.1/lib
[root@node2 lib]# ls jline*
jline-2.12.jar
[root@node2 lib]# cd /opt/hadoop-2.6.5/share/hadoop/yarn/lib
[root@node2 lib]# pwd
/opt/hadoop-2.6.5/share/hadoop/yarn/lib
[root@node2 lib]# ls jline*
jline-0.9.94.jar
将低版本的 jline jar 包删除
[root@node2 lib]# rm -f jline-0.9.94.jar
[root@node2 lib]# ls jline*
ls: cannot access jline*: No such file or directory
[root@node2 lib]# cp /opt/hive-1.2.1/lib/jline-2.12.jar ./
[root@node2 lib]# hive
Logging initialized using configuration in
jar:file:/opt/hive-1.2.1/lib/hive-common-1.2.1.jar!/hive-log4j.pr
operties
hive>

说明安排配置 ok 了。

hive> show tables;

OK

Time taken: 1.015 seconds

hive> create table test(id int ,age int);

OK

Time taken: 0.343 seconds

hive> show tables;

OK

test

Time taken: 0.038 seconds, Fetched: 1 row(s)

访问 active 的 namenode:

192.168.20.51:50070 或者 192.168.20.52:50070

hive 多租户 开源 hive client_hive 多租户 开源_16

表中没有具体的数据

hive 多租户 开源 hive client_mysql_17

执行插入 sql

hive> insert into test values(1,1);

http://node3:8088/cluster

hive 多租户 开源 hive client_hive 多租户 开源_18


 

配置 hadoop 好的话,此处可以看到执行的 MR 任务。

hive 多租户 开源 hive client_Hive_19

Node1 中连接上 mysql 查看:

[root@node1 ~]# mysql -uroot -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

......

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| hive |

| mysql |

| test |

+--------------------+

4 rows in set (0.00 sec)

mysql> use hive

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show tables;

+---------------------------+

| Tables_in_hive |

+---------------------------+

| BUCKETING_COLS |

| CDS |

| COLUMNS_V2 | 保存列信息

....

| TBLS | 保存表相关信息

| VERSION |

+---------------------------+

29 rows in set (0.00 sec)

mysql> select * from TBLS;

+--------+-------------+-------+------------------+-------+------

-----+-------+----------+---------------+--------------------+---

-----------------+

| TBL_ID | CREATE_TIME | DB_ID | LAST_ACCESS_TIME | OWNER | RETENTION

| SD_ID | TBL_NAME | TBL_TYPE | VIEW_EXPANDED_TEXT |

VIEW_ORIGINAL_TEXT |

+--------+-------------+-------+------------------+-------+------

-----+-------+----------+---------------+--------------------+---

-----------------+

| 1 | 1580565872 | 1 | 0 | root | 0 |

1 | test | MANAGED_TABLE | NULL | NULL |

+--------+-------------+-------+------------------+-------+------

-----+-------+----------+---------------+--------------------+---

-----------------+

1 row in set (0.01 sec)

mysql> select * from COLUMNS_V2;

+-------+---------+-------------+-----------+-------------+

| CD_ID | COMMENT | COLUMN_NAME | TYPE_NAME | INTEGER_IDX |

+-------+---------+-------------+-----------+-------------+

| 1 | NULL | age | int | 1 |

| 1 | NULL | id | int | 0 |

+-------+---------+-------------+-----------+-------------+

2 rows in set (0.00 sec)

mysql>

注:这里把 hive 的服务端和客户端都放在同一台服务器上了。服务端和客户端可以拆开,

思考:hive 是如何连接到 hdfs 的?

2.4.4 远程服务器模式安装

思考:hive 是如何连接到 hdfs 的?

答案:通过环境变量。

hive 多租户 开源 hive client_hive 多租户 开源_20

hive 多租户 开源 hive client_Hive_21

hive 多租户 开源 hive client_mysql_22

返回->返回

hive 多租户 开源 hive client_hive_23

hive 多租户 开源 hive client_Hive_24

hive 多租户 开源 hive client_Hive_25

服务区端配置以上五个参数即可。

hive 多租户 开源 hive client_hive 多租户 开源_26

规划:

node3 为服务器端

node4 为客户端

具体安装配置步骤:

     1.从 node2 上将/opt/hive_1.2.1 拷贝到 node3 和 node4 上

[root@node2 opt]# scp -r /opt/hive-1.2.1/ node3:/opt/
[root@node2 opt]# scp -r /opt/hive-1.2.1/ node4:/opt/

      2.配置 node3 上 hive 的环境变量:

[root@node3 opt]# vim /etc/profile

export HIVE_HOME=/opt/hive-1.2.1export

PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$H

ADOOP_HOME/sbin:$HIVE_HOME/bin

[root@node3 opt]# source /etc/profile

     3.配置 node4 上 hive 的环境变量:

[root@node4 opt]# vim /etc/profile
 export HIVE_HOME=/opt/hive-1.2.1export
 PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$H
 ADOOP_HOME/sbin:$HIVE_HOME/bin
 [root@node4 opt]# source /etc/profile

      4. 修改 node3 上的 hive_site.xml 文件(黄色部分为添加的内容)

<configuration>
     <property>
         <name>hive.metastore.warehouse.dir</name>
         <value>/user/hive_remote/warehouse</value>
     </property>
     <property>
         <name>javax.jdo.option.ConnectionURL</name>
         <value>jdbc:mysql://192.168.20.61:3306/hive_remote?createDatabaseIfNotExist=true</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>
 </configuration>

    5. 修改 node4 上的 hive_site.xml 文件

[root@node4 ~]# cd /opt/hive-1.2.1/conf/
 [root@node4 conf]# vim hive-site.xml
 <configuration>
     <property>
         <name>hive.metastore.warehouse.dir</name>
         <value>/user/hive_remote/warehouse</value>
     </property>
     <property>
         <name>hive.metastore.uris</name>
         <value>thrift://192.168.20.63:9083</value>
     </property>
 </configuration>

    6. node3 上启动 hive 服务端程序

查看已经占用的端口号:

[root@node3 conf]# ss -nal # netstat -nlpt
 State Recv-Q Send-Q Local Address:Port Peer Address:Port
 LISTEN 0 128 :::22 :::*
 LISTEN 0 128 *:22 *:*
 LISTEN 0 100 ::1:25 :::*
 LISTEN 0 100 127.0.0.1:25 *:*
 LISTEN 0 128 *:50010 *:*
 LISTEN 0 50 :::58170 :::*
 LISTEN 0 128 *:50075 *:*
 LISTEN 0 128 *:8480 *:*
 LISTEN 0 50 ::ffff:192.168.20.53:2881 :::*
 LISTEN 0 128 *:50020 *:*
 LISTEN 0 128 *:8485 *:*
 LISTEN 0 50 :::2181 :::*
 LISTEN 0 50 ::ffff:192.168.20.53:3881 :::*

9083 并没有被占用。然后执行如下命令:

[root@node3 conf]# hive --service metastore
Starting Hive Metastore Server

该命令为阻塞命令,想查看效果,需要再开一个连接终端。

[root@node3 ~]# ss -nal
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 :::22 :::*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 *:50010 *:*
LISTEN 0 50 :::58170 :::*
LISTEN 0 50 *:9083 *:*
LISTEN 0 128 *:50075 *:*
LISTEN 0 128 *:8480 *:*
LISTEN 0 50 ::ffff:192.168.20.53:2881 :::*
LISTEN 0 128 *:50020 *:*
LISTEN 0 128 *:8485 *:*
LISTEN 0 50 :::2181 :::*
LISTEN 0 50 ::ffff:192.168.20.53:3881 :::*

9083 端口便被占用了。

     7. Node4 客户端直接使用 hive 命令即可

[root@node4 conf]# hive
 Logging initialized using configuration in
 jar:file:/opt/hive-1.2.1/lib/hive-common-1.2.1.jar!/hive-log4j.properties
 [ERROR] Terminal initialization failed; falling back to unsupported
 java.lang.IncompatibleClassChangeError: Found class jline.Terminal,
 but interface was expected

删除 jline 冲突的 jar 包

[root@node4 conf]# cd /opt/hadoop-2.6.5/share/hadoop/yarn/lib/
 [root@node4 lib]# pwd
 /opt/hadoop-2.6.5/share/hadoop/yarn/lib
 [root@node4 lib]# rm -f jline-0.9.94.jar
 [root@node4 lib]# cp /opt/hive-1.2.1/lib/jline-2.12.jar ./
 [root@node4 lib]# hive
 Logging initialized using configuration in
 jar:file:/opt/hive-1.2.1/lib/hive-common-1.2.1.jar!/hive-log4j.pr
 operties
 hive>

    8. 检测

A. node1 上查看是否多一个数据库实例 hive_remote

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hive |
| hive_remote |
| mysql |
| test |
+--------------------+
5 rows in set (0.00 sec)

B. Node4 上创建表 psn

建表前:

hive 多租户 开源 hive client_Hive_27

hive> create table psn(id int,age int);

建表后:

hive 多租户 开源 hive client_hive 多租户 开源_28


 

C. node4 上插入数据

hive> insert into psn values(1,1);
Query ID = root_20200201233940_fdd57c2a-33d6-49d5-98a8-1895064944f2
Total jobs = 3
Launching Job 1 out of 3

hive 多租户 开源 hive client_mysql_29

[root@node3 opt]# hdfs dfs -cat /user/hive_remote/warehouse/psn/*
 [root@node3 opt]# hdfs dfs -get /user/hive_remote/warehouse/psn/*
 [root@node3 opt]# ls
 000000_0 hadoop-2.6.5 zookeeper-3.4.6
 apps hive-1.2.1 zookeeper-3.4.6.tar.gz
 [root@node3 opt]# cat -A 000000_0
1^A1$

^A 默认的分隔符,如何改为自定义的分隔符呢?在后续建表时可以指定,带着疑问继续学习。