Apache Hive 是构建在 Hadoop 之上的数据仓库软件,它将结构化的数据文件映射为一张数据库表,并提供了一种名为 HiveQL(HQL)的类 SQL 查询语言。Hive 主要用于大数据集的批处理查询,非常适合数据仓库应用程序,如日志分析、数据挖掘等。
一、 权限管理:角色与用户
Hive 的权限管理模型类似于传统数据库,基于用户(User)、角色(Role) 和权限(Privilege)。注意:Hive 的权限控制需要结合 Hadoop 的用户认证体系。
1. 创建角色并授予权限
首先,需要启用 Hive 的授权功能。在 hive-site.xml
中配置:
<property>
<name>hive.security.authorization.enabled</name>
<value>true</value>
</property>
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value> <!-- 根据你的安全模式调整 -->
</property>
然后,通过 Hive CLI 或 Beeline 进行操作。
- 创建角色:
CREATE ROLE role_name;
CREATE ROLE data_reader;
CREATE ROLE data_writer;
授予权限:GRANT privilege_type ON object_type object_name TO ROLE role_name;
privilege_type
:SELECT
,INSERT
,UPDATE
,DELETE
,ALL
等。object_type
:TABLE
,DATABASE
,VIEW
等。
-- 授予 data_reader 角色对数据库 mydb 下所有表的 SELECT 权限
GRANT SELECT ON DATABASE mydb TO ROLE data_reader;
-- 授予 data_writer 角色对表 mydb.sales 的 INSERT 权限
GRANT INSERT ON TABLE mydb.sales TO ROLE data_writer;
2. 创建用户并授予角色
Hive 本身不创建用户。用户由操作系统或 LDAP 等外部系统管理。我们通常使用现有的系统用户(如 user1
)。Hive 的任务是将角色授予这些用户。
- 将角色授予用户:
GRANT ROLE role_name TO USER user_name;
-- 将 data_reader 角色授予 Linux 用户 alice
GRANT ROLE data_reader TO USER alice;
-- 将 data_writer 角色授予 Linux 用户 bob
GRANT ROLE data_writer TO USER bob;
- 现在,用户
alice
就可以查询mydb
数据库下的所有表了。
3. 回收角色/用户权限
- 回收用户的角色:
REVOKE ROLE role_name FROM USER user_name;
REVOKE ROLE data_writer FROM USER bob;
回收角色的权限:REVOKE privilege_type ON object_type object_name FROM ROLE role_name;
-- 回收 data_reader 角色对 mydb 数据库的 SELECT 权限
REVOKE SELECT ON DATABASE mydb FROM ROLE data_reader;
删除角色:DROP ROLE role_name;
DROP ROLE data_reader;
二、 基本数据操作(增删改查)
Hive 的传统模型是“写时模式”(读时校验),更擅长批量导入和查询。新版本的 Hive(LLAP)也支持了更好的 ACID 事务功能。
- 创建表:
CREATE TABLE employees (
id INT,
name STRING,
salary FLOAT,
department STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
插入数据(增 – Insert):
Hive 通常不从逐条插入,而是批量加载数据。
-- 从HDFS文件加载数据(推荐,高效)
LOAD DATA INPATH '/user/hive/data/employees.csv' INTO TABLE employees;
-- 使用INSERT...VALUES(适用于少量数据,需开启ACID)
INSERT INTO TABLE employees VALUES (101, 'Alice', 55000, 'Engineering');
查询数据(查 – Select):
-- 简单查询
SELECT * FROM employees;
-- 条件过滤和聚合
SELECT department, AVG(salary) AS avg_salary
FROM employees
WHERE salary > 50000
GROUP BY department;
更新数据(改 – Update):
需要将表创建为支持事务的 ORC 表。
CREATE TABLE employees_transactional (
id INT,
name STRING,
salary FLOAT,
department STRING
)
STORED AS ORC
TBLPROPERTIES ('transactional'='true');
-- 然后才能执行更新
UPDATE employees_transactional
SET salary = 60000
WHERE id = 101;
删除数据(删 – Delete):
同样需要事务表支持。
DELETE FROM employees_transactional WHERE id = 101;
三、 创建视图(View)
视图是一个虚拟表,其内容由查询定义。它简化了复杂查询,并提供了逻辑层面的数据安全。
-- 创建一个视图,只显示工程部门的员工
CREATE VIEW engineering_employees AS
SELECT id, name, salary
FROM employees
WHERE department = 'Engineering';
-- 之后可以像查询普通表一样查询视图
SELECT * FROM engineering_employees WHERE salary > 70000;
四、 创建存储桶(Bucketed Table)
存储桶是一种将表数据按某列的值进行哈希分区后存储的技术,能极大提升等值连接(JOIN)和采样(SAMPLING)的效率。
CREATE TABLE user_actions_bucketed (
user_id INT,
action STRING,
timestamp BIGINT
)
CLUSTERED BY (user_id) INTO 4 BUCKETS -- 根据 user_id 哈希成 4 个桶
STORED AS ORC;
注意:向桶表插入数据时,需要设置 hive.enforce.bucketing = true
。
五、 模式(Schema)、实例(Instance)与数据库(Database)的区别
这是一个非常重要的概念区分。
- 数据库(Database) / 模式(Schema):
- 在 Hive 中,
DATABASE
和SCHEMA
是可互换的同义词。CREATE DATABASE db1
和CREATE SCHEMA db1
效果完全相同。 - 它们的主要作用是命名空间,用于隔离表、视图、函数等对象,避免命名冲突。例如,你可以有
db1.employees
和db2.employees
两个同名的表。 - 可以理解为一个逻辑上的数据容器。
- 在 Hive 中,
- 实例(Instance):
- 这个概念在 Hive 中并不像在传统关系型数据库(如 Oracle、MySQL)中那么突出。
- 通常指的是 一个独立部署、安装和运行的 Hive 服务。这个服务包括:
- Hive Metastore:存储所有元数据(表结构、数据库信息等)的服务。
- HiveServer2 (HS2):提供 JDBC/ODBC 接口,供客户端提交查询的服务。
- 一个 Hive 实例 可以管理多个数据库(模式)。
- 举例:公司A部署了一套 Hive(包含一个 Metastore 和一个 HiveServer2),这就是一个 Hive 实例。这个实例下可以创建
log_db
(日志数据库)、user_db
(用户数据库)等多个模式。
简单总结:
- 实例(Instance) -> 一个完整的 Hive 服务(就像一栋大楼)。
- 数据库/模式(Database/Schema) -> 这栋大楼里的一个个房间,用来分门别类地存放不同的家具(表)。
- 表(Table) -> 房间里的家具,比如床、桌子,是实际存放数据的地方。