阅读量:0
1.hive入门:
Hive 简介
- Hive 是一个建立在 Hadoop 之上的数据仓库工具
- 提供 SQL 查询功能,将 SQL 语句转换为 MapReduce 任务在 Hadoop 上执行
- 支持常见的数据类型和 SQL 语法,方便数据分析和处理
Hive 架构
- 客户端: Hive CLI、JDBC/ODBC
- 元数据存储: 通常使用 MySQL 或 PostgreSQL
- 执行引擎: MapReduce、Spark、Tez 等
- 数据存储: HDFS、云存储等
Hive 数据模型
- 数据库(Database)
- 表(Table)
- 内部表(Managed Table)
- 外部表(External Table)
- 分区(Partition)
- 桶(Bucket)
Hive 数据类型
- 基本数据类型: STRING、INT、BIGINT、FLOAT、DOUBLE 等
- 复杂数据类型: ARRAY、MAP、STRUCT
Hive 常用 SQL 语句
- DDL: CREATE/DROP/ALTER DATABASE/TABLE
- DML: INSERT/LOAD DATA
-查询语句: SELECT/WHERE/GROUP BY/ORDER BY 等
Hive 优化
- 分区优化
- 桶优化
- 压缩优化
- 索引优化
Hive 与 Spark SQL 对比
- Spark SQL 是基于内存的执行引擎,性能更优
- Hive 基于磁盘,适合处理大数据量
2.hive数据库及表操作:
数据库操作
- 创建数据库:
CREATE DATABASE [IF NOT EXISTS] database_name;
- 切换数据库:
USE database_name;
- 查看数据库:
SHOW DATABASES;
- 删除数据库:
DROP DATABASE [IF EXISTS] database_name [CASCADE];
- 创建数据库:
表操作
- 创建表:
- 内部表:
CREATE TABLE [IF NOT EXISTS] table_name (col_name data_type, ...) [COMMENT 'table_comment'] [PARTITIONED BY (col_name data_type, ...)] [CLUSTERED BY (col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] [LOCATION 'hdfs_path'];
- 外部表:
CREATE EXTERNAL TABLE [IF NOT EXISTS] table_name (col_name data_type, ...) [COMMENT 'table_comment'] [PARTITIONED BY (col_name data_type, ...)] [CLUSTERED BY (col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] [ROW FORMAT row_format] [STORED AS file_format] LOCATION 'hdfs_path';
- 内部表:
- 查看表:
SHOW TABLES [IN database_name] [LIKE 'pattern'];
- 描述表:
DESCRIBE [EXTENDED|FORMATTED] table_name;
- 修改表:
- 重命名表:
ALTER TABLE table_name RENAME TO new_table_name;
- 增加/修改/删除列:
ALTER TABLE table_name ADD|CHANGE|REPLACE COLUMNS (col_name data_type [COMMENT 'col_comment'], ...);
- 增加/删除分区:
ALTER TABLE table_name ADD|DROP PARTITION (partcol_name=partcol_value, ...);
- 修改表:
- 增加/删除分区:
ALTER TABLE table_name ADD|DROP PARTITION (partcol_name=partcol_value, ...);
- 增加/修改/删除列:
ALTER TABLE table_name ADD|CHANGE|REPLACE COLUMNS (col_name data_type [COMMENT 'col_comment'], ...);
- 重命名表:
ALTER TABLE table_name RENAME TO new_table_name;
- 删除表:
DROP TABLE [IF EXISTS] table_name;
- DROP TABLE [IF EXISTS] table_name;
- 增加/删除分区:
- 重命名表:
- 创建表:
3.hive元数据:
元数据存储
- Hive 的元数据存储在关系型数据库中,如 MySQL、PostgreSQL 等。
- 元数据包括数据库、表、分区、列、函数等信息。
- 元数据存储在 Hive Metastore 中,可以通过 Thrift 服务访问。
元数据配置
- Hive 的元数据配置在
hive-site.xml
中进行设置。 - 主要配置项包括:
javax.jdo.option.ConnectionURL
: 元数据数据库的 JDBC 连接 URLjavax.jdo.option.ConnectionDriverName
: 元数据数据库的 JDBC 驱动类名javax.jdo.option.ConnectionUserName
: 元数据数据库的用户名javax.jdo.option.ConnectionPassword
: 元数据数据库的密码
- 可以使用内嵌的 Derby 数据库作为元数据存储,但生产环境通常使用外部数据库。
- Hive 的元数据配置在
元数据管理
- 查看元数据:
SHOW DATABASES;
,SHOW TABLES;
,DESCRIBE table_name;
等 - 管理元数据:
CREATE DATABASE/TABLE
,ALTER TABLE
,DROP TABLE
等 - 备份和恢复元数据:
- 备份: 导出 Hive Metastore 数据库
- 恢复: 导入备份的 Metastore 数据库
- 查看元数据:
元数据缓存
- Hive 会缓存一些常用的元数据信息,以提高查询性能。
- 缓存的元数据包括表信息、分区信息等。
- 可以通过配置
hive.metastore.cache.pinobjtypes
来控制缓存的对象类型。
元数据安全
- 元数据库应该设置合适的访问权限,防止未授权的访问。
- 定期备份元数据,以防止数据丢失。
- 监控元数据库的健康状况,及时发现和解决问题。
4.hive高级操作:
分区表
- 分区表可以提高查询性能,按照某些列对数据进行分区存储。
- 创建分区表:
CREATE TABLE table_name PARTITIONED BY (col1 INT, col2 STRING);
- 添加分区:
ALTER TABLE table_name ADD PARTITION (col1=1, col2='abc');
- 删除分区:
ALTER TABLE table_name DROP PARTITION (col1=1, col2='abc');
- 优化分区表: 合并小文件、优化分区裁剪等。
外部表
- 外部表指向已经存在的数据源,不受 Hive 管理。
- 创建外部表:
CREATE EXTERNAL TABLE table_name LOCATION '/path/to/data';
- 外部表适用于数据源不受 Hive 控制的情况。
- 删除外部表时,只会删除元数据,不会删除实际数据。
分桶表
- 分桶表根据某些列的 hash 值将数据划分到不同的桶中存储。
- 创建分桶表:
CREATE TABLE table_name CLUSTERED BY (col1) INTO 16 BUCKETS;
- 分桶表可以提高连接查询的性能。
- 分桶表适用于数据量大、查询复杂的场景。
视图
- 视图是一个虚拟的表,存储的是查询语句,而不是实际数据。
- 创建视图:
CREATE VIEW view_name AS SELECT * FROM table_name;
- 视图可以简化查询、隐藏复杂的逻辑、提高安全性。
- 视图是只读的,不支持 INSERT/UPDATE/DELETE 操作。
函数
- Hive 支持自定义函数(UDF/UDAF/UDTF)扩展功能。
- 创建函数:
CREATE FUNCTION function_name AS 'class.name' USING JAR '/path/to/jar';
- 内置函数:
COUNT()
,SUM()
,AVG()
等聚合函数,SUBSTRING()
,CONCAT()
等字符串函数等。 - 自定义函数可以实现复杂的数据处理逻辑。
调度和监控
- Hive 可以与调度系统(如 Oozie)集成,实现定时任务调度。
- 可以使用 Hive 的日志和 Hadoop 的监控工具(如 Ganglia)监控 Hive 的运行状况。
- 监控指标包括查询执行时间、资源使用情况、错误信息等。
5.hive函与streamimg:
内置函数
- Hive 提供了丰富的内置函数,包括:
- 数学函数:
ABS()
,ROUND()
,SQRT()
等 - 字符串函数:
CONCAT()
,SUBSTR()
,TRIM()
等 - 日期函数:
YEAR()
,MONTH()
,DATEDIFF()
等 - 聚合函数:
COUNT()
,SUM()
,AVG()
等
- 数学函数:
- 可以使用
DESCRIBE FUNCTION function_name;
查看函数的用法和说明。
- Hive 提供了丰富的内置函数,包括:
自定义函数(UDF)
- 用户可以编写自己的 UDF 来扩展 Hive 的功能。
- 创建 UDF: 继承
org.apache.hadoop.hive.ql.exec.UDF
类,实现evaluate()
方法。 - 注册 UDF:
CREATE FUNCTION function_name AS 'class.name' USING JAR '/path/to/jar';
- 使用 UDF:
SELECT function_name(col1, col2) FROM table_name;
自定义聚合函数(UDAF)
- UDAF 用于实现复杂的聚合逻辑,如求中位数、计算标准差等。
- 创建 UDAF: 继承
org.apache.hadoop.hive.ql.exec.UDAF
类,实现init()
,iterate()
,terminatePartial()
,merge()
,terminate()
方法。 - 注册 UDAF:
CREATE AGGREGATE FUNCTION function_name AS 'class.name' USING JAR '/path/to/jar';
- 使用 UDAF:
SELECT function_name(col1) FROM table_name;
自定义表生成函数(UDTF)
- UDTF 用于将一行输入转换为多行输出,如
explode()
函数。 - 创建 UDTF: 继承
org.apache.hadoop.hive.ql.exec.UDTF
类,实现initialize()
,process()
,close()
方法。 - 注册 UDTF:
CREATE FUNCTION function_name AS 'class.name' USING JAR '/path/to/jar';
- 使用 UDTF:
SELECT function_name(col1) FROM table_name LATERAL VIEW function_name(col1) tmp AS output_col;
- UDTF 用于将一行输入转换为多行输出,如
Streaming
- Hive Streaming 允许用户使用外部程序(如 Python、Java)处理数据。
- 使用 Streaming 时,Hive 会启动外部进程,通过标准输入/输出与之通信。
- 优点:
- 可以使用任意语言编写 Mapper 和 Reducer 逻辑
- 可以处理复杂的数据转换和清洗任务
- 缺点:
- 性能可能会比原生 Hive 查询低
- 需要额外维护外部程序
6.hive视图与索引:
视图
- 视图是一个虚拟的表,存储的是查询语句,而不是实际数据。
- 创建视图:
CREATE VIEW view_name AS SELECT * FROM table_name;
- 视图的优点:
- 简化查询: 将复杂的查询逻辑封装在视图中,方便重复使用。
- 隐藏复杂逻辑: 通过视图可以隐藏表结构的复杂性。
- 提高安全性: 通过视图可以控制用户对数据的访问权限。
- 视图的局限性:
- 视图是只读的,不支持 INSERT/UPDATE/DELETE 操作。
- 视图查询性能可能会比直接查询表差,因为需要执行视图定义的查询。
物化视图
- 物化视图是一种特殊的视图,它将查询结果缓存到磁盘上。
- 创建物化视图:
CREATE MATERIALIZED VIEW mv_name AS SELECT * FROM table_name;
- 物化视图的优点:
- 查询性能更好,因为数据已经预先计算好并存储在磁盘上。
- 可以定期刷新,保持数据的实时性。
- 物化视图的缺点:
- 需要额外的存储空间来存储物化视图数据。
- 需要定期维护物化视图,保持数据的一致性。
索引
- Hive 支持两种索引类型:
- 基于文件的索引: 为表中的某些列创建索引文件,加快查询速度。
- 基于 bitmap 的索引: 为表中的某些列创建 bitmap 索引,适用于基数较低的列。
- 创建索引:
CREATE INDEX index_name ON TABLE table_name (col1, col2) AS 'index.handler.class' WITH DEFERRED REBUILD;
- 使用索引: Hive 在查询时会自动使用索引,无需手动指定。
- 索引的优点:
- 可以加快查询速度,特别是针对某些列的过滤查询。
- 可以减少扫描的数据量,从而提高查询效率。
- 索引的缺点:
- 需要额外的存储空间来存储索引文件。
- 索引文件需要定期维护,会增加数据更新的开销。
- Hive 支持两种索引类型:
7.hive调优:
数据输入优化:
- 使用合适的文件格式,如 Parquet、ORC 等压缩格式
- 合理设置分区,提高查询效率
- 使用分桶技术,提高数据处理性能
SQL 语句优化:
- 尽量使用 WHERE 条件过滤,减少扫描数据量
- 合理使用 JOIN 操作,选择合适的 JOIN 策略
- 使用 LIMIT 语句限制返回结果数量
- 对于复杂的 SQL,可以使用 Hive 的优化器规则进行优化
资源配置优化:
- 合理设置 Hive 的 JVM 参数,如堆内存大小、垃圾回收策略等
- 配置合适的 MapReduce 任务资源,如 Mapper/Reducer 数量、内存等
- 使用 Tez 引擎替代 MapReduce,提高查询性能
并发优化:
- 合理设置 Hive 的并发度,如 Mapper/Reducer 数量
- 使用 Hive 的动态分区功能,提高并发性能
- 合理配置 HDFS 的块大小和复制因子,提高并行处理能力
其他优化技巧:
- 使用 Hive 的缓存机制,如元数据缓存、查询结果缓存等
- 使用 Hive 的索引功能,提高查询性能
- 定期维护 Hive 的统计信息,提高查询优化器的决策质量
8.hive与hbase集成:
数据存储集成:
- Hive 可以直接读取 HBase 表中的数据,通过 HBaseStorageHandler 实现
- 可以将 Hive 表映射到 HBase 表,实现数据的双向访问
查询优化集成:
- Hive 可以利用 HBase 的索引机制,提高查询性能
- 可以在 Hive 中使用 HBase 的过滤器功能,减少扫描数据量
事务处理集成:
- Hive 不支持事务,但可以利用 HBase 的事务特性来实现更新、删除等操作
- 可以使用 Hive 的 ACID 表特性与 HBase 的事务特性相结合
数据处理集成:
- Hive 可以利用 HBase 的 coprocessor 机制,实现复杂的数据处理逻辑
- 可以在 Hive 中使用 HBase 的 MapReduce 功能,进行分布式数据处理
元数据管理集成:
- Hive 的元数据可以存储在 HBase 中,实现元数据的高可用和扩展性
- 可以利用 HBase 的分布式特性,提高元数据的访问性能
安全性集成:
- Hive 可以利用 HBase 的安全机制,如基于 Kerberos 的认证和授权
- 可以在 Hive 中使用 HBase 的 ACL 机制,实现细粒度的数据访问控制
9.数据迁移框架sqoop:
Sqoop 概述
- Sqoop 是一个用于在 Hadoop 和关系型数据库之间传输数据的工具
- 支持从关系型数据库向 HDFS、Hive、HBase 等大数据组件的数据导入和导出
Sqoop 架构
- Sqoop 客户端:负责接收用户的导入/导出命令,并生成相应的 MapReduce 作业
- Sqoop 服务端:负责执行 MapReduce 作业,完成数据的导入/导出
Sqoop 支持的数据库
- 主流的关系型数据库,如 MySQL、Oracle、PostgreSQL、SQL Server 等
- 支持自定义 JDBC 驱动,扩展支持更多数据库
Sqoop 导入数据
- 全表导入:将整个表导入到 HDFS、Hive 或 HBase
- 增量导入:仅导入自上次导入后新增的数据
- 自定义 SQL 导入:通过自定义 SQL 语句导入数据
Sqoop 导出数据
- 将 HDFS、Hive 或 HBase 中的数据导出到关系型数据库
- 支持并行导出,提高导出效率
Sqoop 高级功能
- 支持数据压缩,提高数据传输效率
- 支持自定义 MapReduce 作业,实现更复杂的数据处理逻辑
- 支持 Kerberos 认证,确保数据传输的安全性
Sqoop 最佳实践
- 合理设置 Sqoop 的并发度,提高数据传输效率
- 针对不同的数据库和数据量,选择合适的导入/导出策略
- 结合其他大数据组件,如 Hive、HBase 等,实现更复杂的数据处理需求