Hive简介
Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据。它架构在Hadoop之上。
Hive并不是一个完整的数据库, Hadoop以及HDFS的设计本身约束和局限性地限制了Hive所能胜任的工作。其中最大的限制就是Hive不支持记录级别的更新、插入或者删除操作。
同时hive用户可以通过查询生成新表或者将查询结果导人到文件中。因为Hadoop是一个面向批处理的系统,而MapReduce任务的启动过程需要消耗较长的时间,所以Hive查询延时比较严重。传统数据库中在秒级别可以完成的查询,在Hive中,即使数据集相对较小,往往也需要执行更长的时间。
由于 Hive 采用了类似SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。数据库可以用在 Online 的应用中,而Hive 是为数据仓库而设计的它能够将结构化的文件映射为一张数据表,并能提供SQL查询功能,即将SQL语言转化为MapReduce任务进行运行。
hive与传统结构化查询语言对比
| HiveQL | SQL(结构化查询语言) |
ANSI SQL | 不完全支持 | 支持 |
更新 | insert OVERWRITE\INTO TABLE | UPDATE\INSERT\DELETE |
事务 | 不支持 | 支持 |
模式 | 读模式 | 写模式 |
数据保存 | HDFS | 块设备、本地文件系统 |
延时 | 高 | 低 |
多表插入 | 支持 | 不支持 |
子查询 | 完全支持 | 只能用在From子句中 |
视图 | Read-only | Updatable |
可扩展性 | 高 | 低 |
数据规模 | 大 | 小 |
Hive在Hadoop生态系统所处位置
1.环境准备
本次教学基于centos 7.1系统
本次平台搭建需要三台云主机:
master作为 client 客户端
slave1作为 hive server 服务器端
slave2用于安装 mysql server
同时需要软件包:
apache-hive-2.1.1-bin.tar.gz
下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hive/
mysql-connector-java-5.1.5-bin.jar
下载地址:https://dev.mysql.com/downloads/connector/j/
需要将apache-hive-2.1.1-bin.tar.gz上传到master 节点
2.搭建开始
slave2节点执行:
2.1 安装 EPEL 源:
yum -y install epel-release
2.2 安装 MySQL server 包,下载源安装包:
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
注意如果报错没找到命令就先安装wget命令
2.3安装源:
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
查看是否安装成功:cd /etc/yum.repos.d
目录下会有Centos-Vault.repo epel-testing.repo mysql-community-source.repo
epel.repo mysql-community.repo
2.4启动mysql
重载所有修改过的配置文件:systemctl daemon-reload
开启服务:systemctl start mysqld
开机自启:systemctl enable mysqld
获取初密码:grep password /var/log/mysqld.log
登陆 MySQL:mysql -uroot -p
2.5更改数据库安全策略
设置密码强度为低级:set global validate_password_policy= 0;
设置密码长度:set global validate_password_length=4;
修改本地密码:alter user 'root'@'localhost' identified by '123456';
退出:exit
ps:密码强度分级如下: 0 为 low 级别,只检查长度; 1 为 medium 级别(默认),符合长度为 8,且必须含有数字,大小写,特殊 字符; 2 为 strong 级别,密码难度更大一些,需要包括字典文件。 密码长度最低长为 4,当设置长度为 1、2、3 时,其长度依然为 4。
2.6 设置远程登录
以新密码登陆 MySQL:mysql -uroot -p123456
创建用户:create user 'root'@'%' identified by '123456';
允许远程连接:grant all privileges on *.* to 'root'@'%' with grant option;
刷新权限:flush privileges;
2.7Slave1 上安装 hive
master 中操作如下:
mkdir -p /usr/hive
tar -zxvf /opt/soft/apache-hive-2.1.1-bin.tar.gz -C /usr/hive/
然后再slave1节点也创建hive文件夹
scp -r /usr/hive/apache-hive-2.1.1-bin root@slave1:/usr/hive/
2.8修改环境变量
修改/etc/profile 文件设置 hive 环境变量。(master 和 slave1 都执 )。
vi /etc/profile
export HIVE_HOME=/usr/hive/apache-hive-2.1.1-bin
export PATH=$PATH:$HIVE_HOME/bin
验证环境变量
source /etc/profile
2.9修改配置文件
将上传到lib的mysql-connector-java-5.1.5-bin.jar分发到slave1
scp /lib/mysql-connector-java-5.1.5-bin.jar
root@slave1:/usr/hive/apache-hive-2.1.1-bin/lib
然后修改slave1 的配置文件(在/usr/hive/apache-hive-2.1.1-bin/conf文件)
生成配置文件
cp .template
在配置文件添加:
HADOOP_HOME=/usr/hadoop/hadoop-2.7.3(根据自己设置来)
创建hive-site.xml文件
[root@slave1 conf]# vi 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://slave2: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>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
在master节点配置客户端
由于客户端需要和 Hadoop 通信,所以需要更改 Hadoop 中 jline 的版本。即 保留一个高版本的 jline jar 包,从 hive 的 lib 包中拷贝到 Hadoop 中 lib 位置为/usr/hadoop/hadoop-2.7.3/share/hadoop/yarn/lib。
cp /usr/hive/apache-hive-2.1.1-bin/lib/jline-2.12.jar /usr/hadoop/hadoop-2.7.3/share/hadoop/yarn/lib/
同样修改
[root@master conf]# vi hive-site.xml
<configuration>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive_remote/warehouse</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://slave1:9083</value>
</property>
</configuration>
3.启动hive
在slave1节点输入bin/hive(在/usr/hive/apache-hive-2.1.1-bin输入)
同样在master输入 bin/hive
成功进入hive它会显示 hive>
在hive内输入: hive>show databases;
查看是否返回数据库列表,返回则成功。
同时输入jps查看进程会显示RunJar
4.命令解析
查询类
show databases; //查看某个数据库
use 数据库; //进入某个数据库
show 表名; //展示所有表
desc 表名; // 显示表结构
show partitions 表名; //显示表名的分区
show create 表名; //显示创建表的结构
# 创建内部表
create table 表名; //创建一个表
例如:create table user;
create table 表名 like 表名; //创建一个表,结构与xxx一样
例如:create table AAA like BBB; //创建一个AAA,结构与BBB一样
# 创建外部表
create external table表名 ; //创建外部一个表,
例如:create external table user;
# 内外部表转化
alter table 表名 set TBLPROPROTIES ('EXTERNAL'='TRUE'); //内部表转外部表
例如:alter table user set TBLPROPROTIES ('EXTERNAL'='TRUE');
alter table 表名 set TBLPROPROTIES ('EXTERNAL'='FALSE'); //外部表转内部表
例如:alter table user set TBLPROPROTIES ('EXTERNAL'='FALSE');
# 表结构修改
alter table 表名 rename to 新表名; //重命名表
例如:alter table user rename to demo; //将user表重命名为demo
alter table 表名 add columns (newcol1 int comment ‘新增’);// 修改字段
例如:alter table table_name add columns (newcol1 int comment ‘新增’);
alter table 表名 replace columns (col1 int,col2 string,col3 string);// 删除表
例如:alter table table_name change col_name new_col_name new_type;
drop table 表名;//删除分区
例如:drop table table_name;
5.hive实例讲解
1.启动Hive并通过Hive查看hadoop所有文件路径。
[root@master ~]# hive
hive> dfs -ls;
Found 1 items
drwxr-xr-x - root hdfs 0 2019-04-07 23:14 .hiveJars
2. 使用Hive工具来创建数据表bigdata,将zhangjing.txt导入到该表中,其中bigdatae表的数据结构如下表所示。导入完成后,通过hive查询数据表bigdata中数据在HDFS所处的文件位置列表信息,将以上操作命令(相关数据库命令语言请全部使用小写格式)和输出结果以文本形式提交到答题框。
stname(string) | stID(int) | class(string) | opt_cour(string) |
create table bigdatae (stname string,stID int,class string,opt_cour string)row format delimited fields terminated by '\t';
load data local inpath '/root/fujian/Hive/zhangjing.txt' into table bigdatae;
show create table bigdatae;
Hive和数据库的异同
1.查询语言。由于 SQL 被广泛的应用在数据仓库中,因此专门针对Hive的特性设计了类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。
2.数据存储位置。Hive是建立在Hadoop之上的,所有Hive的数据都是存储在HDFS中的。而数据库则可以将数据保存在块设备或者本地文件系统中。
3.数据格式。Hive中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格、”\t”、”\x001″)、行分隔符(”\n”)以及读取文件数据的方法(Hive中默认有三个文件格式TextFile,SequenceFile以及RCFile)。由于在加载数据的过程中,不需要从用户数据格式到Hive定义的数据格式的转换,因此,Hive在加载的过程中不会对数据本身进行任何修改,而只是将数据内容复制或者移动到相应的HDFS目录中。而在数据库中,不同的数据库有不同的存储引擎,定义了自己的数据格式。所有数据都会按照一定的组织存储,因此,数据库加载数据的过程会比较耗时。
4.数据更新。由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用INSERT INTO ... VALUES添加数据,使用UPDATE ... SET修改数据。
5.索引。之前已经说过,Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key建立索引。Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于MapReduce的引入, Hive可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了Hive不适合在线数据查询。
6.执行。Hive中大多数查询的执行是通过Hadoop提供的MapReduce来实现的(类似select * from tbl的查询不需要MapReduce)。而数据库通常有自己的执行引擎。
7.执行延迟。之前提到,Hive在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致Hive执行延迟高的因素是MapReduce框架。由于MapReduce本身具有较高的延迟,因此在利用MapReduce执行Hive查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。
8.可扩展性。由于Hive是建立在Hadoop之上的,因此Hive的可扩展性是和Hadoop的可扩展性是一致的。而数据库由于ACID语义的严格限制,扩展行非常有限。
9.数据规模。由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。