快速使用Hive进行数据分析
在企业数据仓库场景中,业务系统积累了大量的用户信息数据(如用户编号、姓名、性别、年龄、地址等),管理员或开发人员需要使用SQL语句对这些结构化数据进行统计分析。但传统的MapReduce开发需要编写Java代码,开发周期长且门槛较高。如何在不需要开发专门MapReduce应用的前提下,通过类SQL语句快速实现数据统计分析?Hive作为基于Hadoop的数据仓库工具,提供了类SQL的HQL查询能力,可将结构化的数据文件映射为数据库表,使熟悉SQL的用户能快速进行数据仓库统计分析。本文以用户信息表管理为例,介绍如何使用Hive快速进行数据分析。
基本概念:
- 内部表(Managed Table):Hive管理的表,表的数据存储位置由Hive控制(默认在HDFS的“/user/hive/warehouse/”目录下)。删除内部表时,表数据和元数据都会被删除。
- 外部分区表(External Partitioned Table):Hive不管理数据本身的表,表数据存储在用户指定的HDFS路径下,删除表时仅删除元数据而保留数据。分区表按分区键将数据分散到不同目录,提升查询效率。
- beeline:Hive的交互式命令行客户端工具,通过JDBC连接HiveServer2服务执行HQL语句。在MRS集群中,通过beeline可执行建表、查询、删除等操作。
背景信息
假定用户开发一个应用程序,用于管理企业中的使用A业务的用户信息,使用Hive客户端实现A业务操作流程如下:
普通表的操作:
- 创建用户信息表user_info。
- 在用户信息中新增用户的学历、职称信息。
- 根据用户编号查询用户姓名和地址。
- A业务结束后,删除用户信息表。
前提条件
- 已安装Hive客户端。了解如何安装客户端,请参考安装客户端(3.x及之后版本)。
- 当前用户已具有创建Hive表的权限。如果集群启用了Kerberos认证,需配置具有对应权限的角色。
操作步骤
- 以客户端安装用户,登录安装客户端的节点,客户端安装详细操作请参见安装客户端(3.x及之后版本)。
- 执行以下命令切换到客户端目录,客户端安装目录如:/opt/client。
cd /opt/client - 执行以下命令配置环境变量。
source bigdata_env
- 如果当前集群已启用Kerberos认证,执行以下命令认证当前用户,当前用户需要具有创建Hive表的权限,具体请参见创建角色配置拥有对应权限的角色,参考创建用户为用户绑定对应角色。如果当前集群未启用Kerberos认证,则无需执行此命令。
kinit MRS集群用户
例如,kinit hiveuser。
- 运行Hive客户端命令,实现A业务。
- 内部表操作
- 执行以下命令登录Hive客户端命令行:
beeline
- 根据表1创建用户信息表user_info并添加相关数据,例如:
创建表user_info:
create table user_info(id string,name string,gender string,age int,addr string);
向表user_info中插入数据:
insert into table user_info(id,name,gender,age,addr) values("12005000201","A","男",19,"A城市"); - 在用户信息表user_info中新增用户的学历、职称信息。
以增加编号为12005000201的用户的学历、职称信息为例,其他用户类似。
alter table user_info add columns(education string,technical string);
- 根据用户编号查询用户姓名和地址。
以查询编号为12005000201的用户姓名和地址为例,其他用户类似。
select name,addr from user_info where id='12005000201';
- 删除用户信息表。
drop table user_info;
- 执行以下命令退出Hive客户端。
!q
- 执行以下命令登录Hive客户端命令行:
- 外部分区表操作
- 可使用insert语句直接向外部表中插入数据,也可以使用load data命令导入HDFS中的文件数据到外部表中。如果需要使用load data命令导入文件数据,需执行以下操作:
- 根据表1数据创建文件。例如,文件名为“txt.log”,以空格拆分字段,以换行符作为行分隔符。
- 执行以下命令上传文件至HDFS中,例如“/tmp”目录下。
hdfs dfs -put txt.log /tmp
- 执行以下命令创建外部表数据存储路径:
hdfs dfs -mkdir /hive/
创建“/hive/user_info”目录:
hdfs dfs -mkdir /hive/user_info
- 执行以下命令登录Hive客户端命令行:
beeline
- 执行以下命令创建表:
create external table user_info(id string,name string,gender string,age int,addr string) partitioned by(year string) row format delimited fields terminated by ' ' lines terminated by '\n' stored as textfile location '/hive/user_info';
其中:
- fields terminated:表示分隔的字符,如按空格分隔,则值为' '。
- lines terminated:表示分行的字符,如按换行分隔,则值为'\n'。
- /hive/user_info:存储表user_info数据的HDFS路径。
- 导入数据。
- 使用insert语句插入数据,以插入编号为12005000201的用户相关信息为例,其他用户类似。
insert into user_info partition(year="2018") values ("12005000201","A","男",19,"A城市"); - 使用load data命令导入文件数据。
load data inpath '/tmp/txt.log' into table user_info partition (year='2011');
其中,“/tmp/txt.log”为5.a上传至HDFS的数据文件。
- 使用insert语句插入数据,以插入编号为12005000201的用户相关信息为例,其他用户类似。
- 执行以下命令查询导入数据。
select * from user_info;
- 执行以下命令删除用户信息表。
drop table user_info;
- 执行以下命令退出Hive客户端。
!q
- 可使用insert语句直接向外部表中插入数据,也可以使用load data命令导入HDFS中的文件数据到外部表中。如果需要使用load data命令导入文件数据,需执行以下操作:
- 内部表操作
验证操作:
在beeline客户端执行命令查看表是否创建成功。执行查询语句验证数据是否正确导入。
show tables;
退出beeline后,可通过HDFS客户端查看内部表数据是否被删除、外部分区表数据是否保留。
常见问题
- beeline连接Hive失败
连接失败的常见原因包括:未执行kinit认证(Kerberos集群)、HiveServer服务异常、用户没有Hive访问权限、beeline客户端配置错误。
如启用了Kerberos认证,请先执行kinit命令完成认证。在Manager的服务列表页面查看Hive服务状态是否良好。确认当前用户已被授予Hive访问权限。
如仍无法连接,请联系管理员检查Hive服务的beeline连接配置。
- 执行建表语句报错无权限
当前用户没有创建表的权限,或Ranger中未配置对应的Hive访问策略。
如启用了Ranger鉴权,请在Ranger中为该用户配置Hive的建表权限策略。
- 删除内部表后数据也被删除,如何保留数据
内部表的数据由Hive完全管理,删除内部表时表数据和元数据会被同时清除,这是Hive内部表的默认行为。
如需在删除表时保留数据,请使用外部分区表(external table)。创建外部表时通过LOCATION参数指定数据存储路径,删除表时仅清除元数据,HDFS上的原始数据将保留。
相关文档
- 了解如何安装MRS集群客户端,请参考安装客户端(3.x及之后版本)。
- 了解Hive SQL相关语法说明,请参考Hive常见SQL语法说明。
- 了解Hive常见日志,请参考Hive日志介绍。