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 连接 URL-javax.jdo.option.ConnectionDriverName
: 元数据数据库的 JDBC 驱动类名-javax.jdo.option.ConnectionUserName
: 元数据数据库的用户名-javax.jdo.option.ConnectionPassword
: 元数据数据库的密码- 可以使用内嵌的 Derby 数据库作为元数据存储,但生产环境通常使用外部数据库。元数据管理- 查看元数据:
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;
查看函数的用法和说明。自定义函数(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;
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 在查询时会自动使用索引,无需手动指定。- 索引的优点: - 可以加快查询速度,特别是针对某些列的过滤查询。- 可以减少扫描的数据量,从而提高查询效率。- 索引的缺点: - 需要额外的存储空间来存储索引文件。- 索引文件需要定期维护,会增加数据更新的开销。
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 等,实现更复杂的数据处理需求
本文转载自: https://blog.csdn.net/xiaohanlelele/article/details/136713019
版权归原作者 xiaohanlelele 所有, 如有侵权,请联系我们删除。
版权归原作者 xiaohanlelele 所有, 如有侵权,请联系我们删除。