简介
基于Hadoop的数据仓库工具,可以将结构化的数据文件映射成一张表,并提供SQL查询功能;
- Hive可以将SQL语句转化为MapReduce任务执行;
- 不仅可以分析HDFS文件系统中的数据还可以分析其他存储系统;
数据单元
- 元数据:数据的各项属性信息;
- 表:分内部表和外部表,内部表数据存储再数据仓库得目录中,删除内部表时,表数据及其元数据一同被删除;外部表创建时,可以存储在指定的HDFS目录中,也可以存储在数据仓库中,还可以与指定的HDFS目录中的数据相关联,外部表删除时,元数据被删除,实际数据不会被删除;
- 分区:每个表可以有一个或多个分区
- 桶:每个分区会根据表某列的数据的哈希值分为若干个桶,每个桶对应分区下的一个数据文件
数据类型
- 基本数据类型
- 整型 :TINYINT、SMALLINT、INT、BIGINT
- 布尔:TRUE/FALSE
- 浮点:FLOAT、DOUBLE
- 定型: DECIMAL
- 字符型: STRING、VARCHAR、CHAR
- 日期和时间型: TIMESTAMP、DATE
- 二进制: BINARY
- 复杂数据类型
- 结构体
- 键值对
- 数组
Hive架构

- CLI(Command line Interface)
- HiveServer2:为远程客户端(如Beeline,JDBC)提供可以执行Hive的查询服务;
- Driver:Hive的一个组件,负责将HiveSQL解析为MapReduce任务,并提交给Hadoop集群;
- Metastore Server:元数据服务,所有客户端都需要通过Metastore Server来访问存在关系数据库中的元数据;
运行模式
-
内嵌模式:默认方式,使用内嵌的Derby数据库存储元数据,并将数据存储于磁盘上,只允许一个会话;

-
本地模式:元数据存储于其他关系型数据库,常用MYSQL,支持多会话;

- 远程模式:Metastore Server分离出来,作为单独进程,可以部署多个,运行在不同计算机;

远程安装配置
安装文件下载
- 官方下载地址:https://dlcdn.apache.org/hive/hive-3.1.3/
- 解压
tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /home
安装环境变量
sudo vi /etc/profile
//追加内容
export HIVE_HOME=/home/apache-hive-2.3.3-bin
export PATH=$HIVE_HOME/bin:$PATH
source /etc/profile
关联Hadoop
cp hive-env.sh.template hive-env.sh
vim hive-env.sh
//追加
export HADOOP_HOME=/home/hadoop-3.2.4
创建数仓目录
hadoop fs -mkdir /tmp
hadoop fs -mkdir -p /user/hive/warehouse hadoop fs -chmod g+w /tmp
hadoop fs -chmod g+w /user/hive/warehouse
配置MYSQL
create database hive_db;
create user hive IDENTIFIED by 'hive';
grant all privileges on hive_db.* to hive@'%';
flush privileges;
配置Hive
- MySQL的驱动包mysql-connector-java-8.0.11.jar上传到安装目录lib包内
- hive-site.xml文件
<configuration>
<!--MySQL数据库连接信息 -->
<property><!--连接MySQL的驱动类 -->
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<property><!--MySQL连接地址,此处连接远程数据库,可根据实际情况进行修改 -->
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.126.134:3306/hive_db?
createDatabaseIfNotExist=true&useSSL=fasle
</value>
</property>
<property><!--MySQL用户名 -->
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property><!--MySQL密码 -->
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
<property> <!--Hive数据库在HDFS中的存放地址-->
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property><!--Hive本地缓存目录-->
<name>hive.exec.local.scratchdir</name>
<value>/tmp/hive</value>
</property>
<property><!--Hive在HDFS中的缓存目录-->
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
</property>
<property><!--从远程文件系统中添加资源的本地临时目录-->
<name>hive.downloaded.resources.dir</name>
<value>/tmp/hive</value>
</property>
<property><!--Hive运行时的结构化日志目录-->
<name>hive.querylog.location</name>
<value>/tmp/hive</value>
</property>
<property><!--日志功能开启时,存储操作日志的最高级目录-->
<name>hive.server2.logging.operation.log.location</name>
<value>/tmp/hive</value>
</property>
<!--在Hive提示符中包含当前数据库-->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!--在查询输出中打印列的名称-->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
</configuration>
初始化元数据
schematool -dbType mysql -initSchema
报错1:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/hive-3.1.3/lib/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/hadoop-3.2.4/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar!/org/slf4j/impl/StaticLoggerBinder.class]
解决方案:删除 log4j-slf4j-impl-2.17.1.jar包
报错2:
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
解决方案:hive内的guava.jar和hadoop内的版本不一致,删除低版本,把高版本复制过去;
linux01安装Hive客户端
#分发安装包
scp -r hive-3.1.3/ linux01:/home
- linux01节点修改配置文件hive-site.xml,追加以下内容
<!--Hive数据仓库在HDFS中的存储目录-->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!--是否启用本地服务器连接Hive,false为非本地模式,即远程模式-->
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<!--Hive服务端Metastore Server连接地址,默认监听端口9083-->
<property>
<name>hive.metastore.uris</name>
<value>thrift://linux00:9083</value>
</property>
- linux00启动metastore
#启动metastore
hive --service metastore &
#进入命令行,linux00,linu01均可
hive
Beeline CLI的使用
用户访问权限
hadoop 开通代理用户访问权限,修改hadoop core-site.xml,添加以下内容
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
启动Beeline
beeline
!connect jdbc:hive2://linux00:10000
用户名root,密码可以空
#或者
beeline -u jdbc:hive2://linux00:10000 -n root
Hive数据库操作
创建数据库
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, …)];
修改数据库
#修改自定义属性
ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES(property_name=property_value, …);
#修改数据库所有者
ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role;
#修改数据库库存位置
ALTER (DATABASE|SCHEMA) database_name SET LOCATION hdfs_path;
删除数据库
#RESTRICT|CASCADE:约束|级联,默认约束,库内有表不能删除。
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
Hive表操作
内部表
#建表
CREATE TABLE student(id INT,name STRING);
#查看表结构
desc table_name;
#详细表结构
desc formatted tb_name;
#插入数据
INSERT INTO student VALUES(1000,'xiaoming');
#导入数据,
CREATE TABLE score(
sno INT,
name STRING,
score INT)
row format delimited fields terminated by '\t';
load data local inpath '/home/test/score.txt' into table score;
#删除表
drop table tb_name;
外部表
#创建外部表,指定位置或关联位置
create external table ex_tb (id int,name string) row format delimited fields terminated by ' ' location '/input/hive';
#导入数据
load data local inpath '/home/test/tb.txt' into table ex_tb;

分区表
Hive可以使用关键字PARTITIONED BY 对一张表进行分区操作,可以根据某一列的值将表分为多个分区,每个分区对应数仓中的一个目录,查询数据时,根据where田间只查询指定分区,不需要全表扫描;分区类比于mysql索引;

#创建分区表
create table test_db.student (id int,name string,gender string) partitioned by (age int ) row format delimited fields terminated by ' ';
#导入数据,age列均为17
load data local inpath '/home/test/stuent.txt' into table test_db.student partition (age = 17)
#添加分区
ALTER TABLE student ADD PARTITION(age=21);
#删除分区
ALTER TABLE student drop PARTITION(age=21);
#查看分区
show partitions test_db.student;
#查询数据
select * from test_db.student;
分桶表
Hive中可以将表或者分区表进一步细分成桶,是对数据更细粒度的划分,以提高查询效率;
创建表时指定分桶的列及桶的数量,添加数据时,hive对分桶列的值进行哈希计算,并将结果除以桶的个数,最后取余,根据余数分配到不同的桶中;
分区列不能作为分桶列,否则一个分区的数据将全部被分配到同一个桶中;
#创建分桶表
create table user_info (user_id int,name string) clustered by (user_id) into 6 buckets
row format delimited fields terminated by ' ';
创建临时表,分桶表不能直接导入数据
create table user_info_tmp (user_id int,name string) row format delimited fields terminated by ' ';
#导入数据到临时表
load data local inpath '/home/test/userinfo.txt' into table test_db.user_info_tmp ;
#导入数据到分桶表
insert into test_db.user_info select user_id,name from user_info_tmp;
#分桶表数据抽样 x表示从第几个桶开始抽取,分桶的倍数因子,即桶的间隔数;
select * from user_info tablesample(bucket x out of y);
表查询
SELECT [ALL | DISTINCT] select_expr, select_expr, …
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY col_list]
[CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY col_list]
]
[LIMIT [offset,] rows]
- sort by:对进入reducer中的数据进行排序
- distribute by:控制键值对如何划分到reducer
- cluster by: 同时具备 sort by和distribute by 的功能 只能升序排列
hive命令
#指定使用的数据库
hive --database test_db
#执行sql语句,非交互界面
hive -e "select * from student;"
#执行本地系统或hdfs系统指定的sql脚本
hive -f /home/test/hive.sql
hive -f hdfs://linux00:8020/input/hive.sql
#设置属性
hive –-hiveconf mapred.reduce.tasks=10
SET mapred.reduce.tasks;
set mapred.reduce.tasks=10
#hive cli 中也可以执行linux shell命令,感叹号开头,分号结尾;
hive与hbase整合
整合的核心是将hive和hbase的表进行绑定,表级别建立映射关系;
修改hive-site.xml
<!--配置ZooKeeper集群的访问地址 -->
<property>
<name>hive.zookeeper.quorum</name>
<value>linux00:2181,linux01:2181,linux02:2181</value>
</property>
<!--配置依赖的HBase、ZooKeeper的jar文件 -->
<property>
<name>hive.aux.jars.path</name>
<value>
file:///home/hbase-2.4.17/lib/hbase-common-2.4.17.jar,
file:///home/hbase-2.4.17/lib/hbase-client-2.4.17.jar,
file:///home/hbase-2.4.17/lib/hbase-server-2.4.17.jar,
file:///home/hbase-2.4.17/lib/hbase-hadoop2-compat-2.4.17.jar,
file:///home/hbase-2.4.17/lib/netty-buffer-4.1.45.Final.jar,
file:///home/hbase-2.4.17/lib/netty-codec-4.1.45.Final.jar,
file:///home/hbase-2.4.17/lib/netty-common-4.1.45.Final.jar,
file:///home/hbase-2.4.17/lib/netty-handler-4.1.45.Final.jar,
file:///home/hbase-2.4.17/lib/netty-resolver-4.1.45.Final.jar,
file:///home/hbase-2.4.17/lib/netty-transport-4.1.45.Final.jar,
file:///home/hbase-2.4.17/lib/netty-transport-native-epoll-
4.1.45.Final.jar,
file:///home/hbase-2.4.17/lib/netty-transport-native-unix-common-
4.1.45.Final.jar,
file:///home/hbase-2.4.17/lib/hbase-protocol-2.4.17.jar,
file:///home/azookeeper-3.6.4/lib/zookeeper-3.6.4.jar
</value>
</property>
hive建表同时创建hbase表
#建表,SERDEPROPERTIES关键字指定映射关系;TBLPROPERTIES关键字只限定hbase表属性信息;
STORED BY关键字指定hive与hbase的通信工具
CREATE TABLE hive_student(id INT,name STRING)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:name")
TBLPROPERTIES ("hbase.table.name" = "hive_student");
hive创建外部表关联hbase
hive> CREATE EXTERNAL TABLE hive_hbase_student(id int,name string,age int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" = ":key,cf1:name,cf1:age"
)
TBLPROPERTIES("hbase.table.name" = "hbase_student");
930

被折叠的 条评论
为什么被折叠?



