
# Hive应用开发简介
#### Hive介绍
Hive是一个开源的，建立在Hadoop上的数据仓库框架，提供类似SQL的HQL语言操作结构化数据，其基本原理是将HQL语言自动转换成Mapreduce任务或Spark任务，从而完成对Hadoop集群中存储的海量数据进行查询和分析。
Hive主要特点如下：
- 通过HQL语言非常容易地完成数据提取、转换和加载（ETL）。
- 通过HQL完成海量结构化数据分析。
- 灵活的数据存储格式，支持JSON、CSV、TEXTFILE、RCFILE、ORCFILE、SEQUENCEFILE等存储格式，并支持自定义扩展。
- 多种客户端连接方式，支持JDBC接口。
Hive主要应用于海量数据的离线分析（如日志分析，集群状态分析）、大规模的数据挖掘（用户行为分析，兴趣分区，区域展示）等场景下。
为保证Hive服务的高可用性、用户数据的安全及访问服务的可控制，在开源社区的Hive-3.1.0版本基础上，Hive新增如下特性：
- 基于Kerberos技术的安全认证机制。
- 数据文件加密机制。
- 完善的权限管理。
开源社区的Hive特性，请参见<https://cwiki.apache.org/confluence/display/hive/designdocs>。
 #### 常用概念
- **keytab文件**
  存放用户信息的密钥文件。应用程序采用此密钥文件在MRS产品中进行API方式认证。
  
- **客户端**
  客户端直接面向用户，可通过Java API、Thrift API访问服务端进行Hive的相关操作。
  
- **HQL语言**
  Hive Query Language，类SQL语句。
  
- **HCatalog**
  HCatalog是建立在Hive元数据之上的一个表信息管理层，吸收了Hive的DDL命令。为Mapreduce提供读写接口，提供Hive命令行接口来进行数据定义和元数据查询。基于MRS的HCatalog功能，Hive、Mapreduce开发人员能够共享元数据信息，避免中间转换和调整，能够提升数据处理的效率。
  
- **WebHCat**
  WebHCat运行用户通过Rest API来执行Hive DDL，提交Mapreduce任务，查询Mapreduce任务执行结果等操作。
  
 
#### 权限要求
表1操作权限要求 
| 操作类型/作用对象 | 操作                                                                      | 权限要求                                                               |
|:---|:---|:---|
| DATABASE  | CREATE DATABASE *dbname* \[LOCATION "hdfs_path"\]                       | 如果指定了HDFS路径hdfs_path，需要是路径hdfs_path的所有者和具有RWX权限。                   |
| DATABASE  | DROP DATABASE *dbname*                                                  | 拥有数据库dbname的所有权。                                                   |
| DATABASE  | ALTER DATABASE *dbname* SET OWNER*user_or_role*                         | 具有admin权限。                                                         |
| TABLE     | CREATE TABLE *table_a*                                                  | 拥有数据库的CREATE权限。                                                    |
| TABLE     | CREATE TABLE *table_a* AS SELECT*table_b*                               | 拥有数据库的CREATE权限，对表table_b拥有SELECT权限。                                |
| TABLE     | CREATE TABLE *table_a* LIKE*table_b*                                    | 拥有数据库的CREATE权限。                                                    |
| TABLE     | CREATE \[EXTERNAL\] TABLE *table_a*LOCATION "hdfs_path"                 | 拥有数据库的CREATE权限，是HDFS上的数据路径hdfs_path的所有者和具有RWX权限。                   |
| TABLE     | DROP TABLE *table_a*                                                    | 是表table_a的所有者。                                                     |
| TABLE     | ALTER TABLE *table_a* SET LOCATION "hdfs_path"                          | 是表table_a的所有者，是HDFS上的数据路径hdfs_path的所有者和具有RWX权限。                    |
| TABLE     | ALTER TABLE *table_a* SET*FILEFORMAT*                                   | 是表table_a的所有者。                                                     |
| TABLE     | TRUNCATE TABLE *table_a*                                                | 是表table_a的所有者。                                                     |
| TABLE     | ANALYZE TABLE *table_a*COMPUTE STATISTICS                               | 对表table_a拥有SELECT和INSERT权限。                                        |
| TABLE     | SHOW TBLPROPERTIES *table_a*                                            | 对表table_a拥有SELECT权限。                                               |
| TABLE     | SHOW CREATE TABLE *table_a*                                             | 对表table_a拥有SELECT且带有WITH GRANT OPTION的权限。                          |
| Alter     | ALTER TABLE *table_a*ADD COLUMN                                         | 是表table_a的所有者。                                                     |
| Alter     | ALTER TABLE *table_a* REPLACE COLUMN                                    | 是表table_a的所有者。                                                     |
| Alter     | ALTER TABLE *table_a*RENAME                                             | 是表table_a的所有者。                                                     |
| Alter     | ALTER TABLE *table_a* SET SERDE                                         | 是表table_a的所有者。                                                     |
| Alter     | ALTER TABLE *table_a*CLUSTER BY                                         | 是表table_a的所有者。                                                     |
| PARTITION | ALTER TABLE *table_a* ADD PARTITION*partition_spec*LOCATION "hdfs_path" | 对表table_a拥有INSERT权限，是HDFS上的数据路径hdfs_path的所有者和具有RWX权限。              |
| PARTITION | ALTER TABLE *table_a* DROP PARTITION*partition_spec*                    | 对表table_a拥有DELETE权限。                                               |
| PARTITION | ALTER TABLE *table_a* PARTITION*partition_spec*SET LOCATION "hdfs_path" | 是表table_a的所有者，是HDFS上的数据路径hdfs_path的所有者和具有RWX权限。                    |
| PARTITION | ALTER TABLE *table_a* PARTITION*partition_spec*SET FILEFORMAT           | 是表table_a的所有者。                                                     |
| LOAD      | LOAD INPATH 'hdfs_path' INTO TABLE *table_a*                            | 对表table_a拥有INSERT权限，是HDFS上的数据路径hdfs_path的所有者和具有RWX权限。              |
| INSERT    | INSERT TABLE *table_a* SELECT FROM*table_b*                             | 对表table_a拥有INSERT权限，对表table_b拥有SELECT权限。拥有Yarn的default队列的Submit权限。 |
| SELECT    | SELECT \* FROM *table_a*                                                | 对表table_a拥有SELECT权限。                                               |
| SELECT    | SELECT FROM *table_a* JOIN*table_b*                                     | 对表table_a、表table_b拥有SELECT权限，拥有Yarn的default队列的Submit权限。            |
| SELECT    | SELECT FROM (SELECT FROM *table_a* UNION ALL SELECT FROM*table_b*)      | 对表table_a、表table_b拥有SELECT权限。拥有Yarn的default队列的Submit权限。            |
| EXPLAIN   | EXPLAIN \[EXTENDED\|DEPENDENCY\] *query*                                | 对相关表目录具有RX权限。                                                      |
| VIEW      | CREATE VIEW *view_name* AS SELECT ...                                   | 对相关表拥有SELECT且带有WITH GRANT OPTION的权限。                               |
| VIEW      | ALTER VIEW *view_name* RENAME TO*new_view_name*                         | 是视图view_name的所有者。                                                  |
| VIEW      | DROP VIEW *view_name*                                                   | 是视图view_name的所有者。                                                  |
| FUNCTION  | CREATE \[TEMPORARY\] FUNCTION *function_name*AS 'class_name'            | 具有admin权限。                                                         |
| FUNCTION  | DROP \[TEMPORARY\] *function_name*                                      | 具有admin权限。                                                         |
| MACRO     | CREATE TEMPORARY MACRO *macro_name* ...                                 | 具有admin权限。                                                         |
| MACRO     | DROP TEMPORARY MACRO *macro_name*                                       | 具有admin权限。                                                         |
   
![](https://support.huaweicloud.com/devg-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
- 以上所有的操作只要拥有Hive的admin权限以及对应的HDFS目录权限就能做相应的操作。
- 如果当前组件使用了Ranger进行权限控制，需基于Ranger配置相关策略进行权限管理，具体操作可参考[添加Hive的Ranger访问权限策略](https://support.huaweicloud.com/cmpntguide-mrs/mrs_01_1858.html)章节。
 
