1 Hive 概述
1.1 Hive 简介
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 的架构
– (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 SQL 转换操作符
– 操作符是 Hive 的最小的处理单元
– 每个操作符代表 HDFS 的一个操作或者一道 MapReduce 作业
• Operator(操作符)
– Operator 都是 hive 定义的一个处理过程
– Operator 都定义有:
– protected List <Operator<? extends Serializable >> childOperators;
– protected List <Operator<? extends Serializable >> parentOperators;
– protected boolean done; // 初始化值为 false
查询操作 表扫描操作 限制输出 文件输出操作。
ANTLR 词法语法分析工具解析 hql
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 官方文档阅读
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
...
Metadata( 元 数 据 存 储 ) 在 嵌 入 式 Derby 数 据 库 中 , 其 磁 盘 存 储 位 置 由 名 为javax.jdo.option.Connectionurl 的 hive 配置变量决定。默认情况下,此位置为./metastore_db(参见 conf/hive-default.xml)。在嵌入式模式下使用 Derby
最多一次允许一个用户。若要将 Derby 配置为在服务器模式下运行,请参见服务器模式下使用 Derby 的 Hive。若要为 Hive 元存储配置除 Derby 以外的数据库,请参见 HiveMetastore Administration。
需要用到 mysql,所以我们先安装 mysql。
2.4.2 Mysql 安装
先将四台虚拟机拍快照,然后再进行安装。
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 |
说明安排配置 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
表中没有具体的数据
执行插入 sql
hive> insert into test values(1,1); |
http://node3:8088/cluster
配置 hadoop 好的话,此处可以看到执行的 MR 任务。
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 的?
答案:通过环境变量。
返回->返回
服务区端配置以上五个参数即可。
规划:
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 的环境变量:
|
4. 修改 node3 上的 hive_site.xml 文件(黄色部分为添加的内容)
|
5. 修改 node4 上的 hive_site.xml 文件
|
6. node3 上启动 hive 服务端程序
查看已经占用的端口号:
|
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 命令即可
删除 jline 冲突的 jar 包
|
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> create table psn(id int,age int);
建表后:
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
|
^A 默认的分隔符,如何改为自定义的分隔符呢?在后续建表时可以指定,带着疑问继续学习。