目录大纲
Part01-基础概念与理论知识
1.1 Hive架构概述
1.2 Hive数据模型
1.3 Hive存储格式
Part02-生产环境规划与建议
2.1 Hive架构规划
2.2 元数据存储规划
2.3 存储格式规划
Part03-生产环境项目实施方案
3.1 Hive安装配置
3.2 数据库与表管理
3.3 数据导入导出
3.4 元数据管理
Part04-生产案例与实战讲解
4.1 数据仓库分层案例
4.2 数据建模案例
4.3 数据治理案例
Part05-风哥经验总结与分享
5.1 Hive最佳实践
5.2 数据仓库经验总结
Part01-基础概念与理论知识
1.1 Hive架构概述
Hive是构建在Hadoop之上的数据仓库工具。更多视频教程www.fgedu.net.cn Hive将结构化数据文件映射为表,提供类SQL查询功能。
1.2 Hive数据模型
Hive数据模型包括数据库、表、分区、桶等概念。学习交流加群风哥微信: itpux-com
– Database:数据库,表的命名空间
– Table:表,分为内部表和外部表
– Partition:分区,按列值划分数据
– Bucket:桶,按哈希划分数据
1.3 Hive存储格式
Hive支持多种存储格式。from bigdata视频:www.itpux.com
hive -e “SHOW FORMATS;”
TextFile
SequenceFile
RCFile
ORC
Parquet
Avro
JSON
Part02-生产环境规划与建议
2.1 Hive架构规划
Hive架构规划需要考虑计算引擎和元数据存储。更多学习教程公众号风哥教程itpux_com
– 计算引擎:推荐使用Tez或Spark
– 元数据存储:使用MySQL存储元数据
– 部署模式:HiveServer2 + Metastore分离部署
2.2 元数据存储规划
元数据存储是Hive的核心组件。学习交流加群风哥QQ113257174
cat /bigdata/app/hive/conf/hive-site.xml | grep -A3 “metastore”
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://fgedu01:3306/hive_metastore?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
2.3 存储格式规划
存储格式选择影响查询性能。风哥提示:列式存储格式适合分析场景。
– ORC:适合Hive原生场景,压缩比高
– Parquet:适合Spark场景,兼容性好
– TextFile:适合数据导入导出
– 分区格式:按日期分区
Part03-生产环境项目实施方案
3.1 Hive安装配置
3.1.1 安装Hive
wget https://downloads.apache.org/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
tar -xzf apache-hive-3.1.3-bin.tar.gz -C /bigdata/app/
ln -s /bigdata/app/apache-hive-3.1.3-bin /bigdata/app/hive
# 配置环境变量
export HIVE_HOME=/bigdata/app/hive
export PATH=$PATH:$HIVE_HOME/bin
# 初始化元数据库
schematool -dbType mysql -initSchema
# 完成
# 环境变量
# 配置完成
# 初始化元数据
Metastore connection URL: jdbc:mysql://fgedu01:3306/hive_metastore
Metastore Connection Driver: com.mysql.cj.jdbc.Driver
Metastore connection User: hive
Starting metastore schema initialization to 3.1.0
Initialization script hive-schema-3.1.0.mysql.sql
Initialization script completed
schemaTool completed
3.1.2 启动Hive服务
nohup hive –service metastore > /bigdata/logs/metastore.log 2>&1 &
# 启动HiveServer2服务
nohup hive –service hiveserver2 > /bigdata/logs/hiveserver2.log 2>&1 &
# 验证服务
netstat -tlnp | grep -E “9083|10000”
# 测试连接
beeline -u “jdbc:hive2://fgedu01:10000” -e “SHOW DATABASES;”
# Metastore启动成功
# HiveServer2启动成功
# 服务验证
tcp 0 0 0.0.0.0:9083 0.0.0.0:* LISTEN 12345/java
tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 12346/java
# 连接测试
Connecting to jdbc:hive2://fgedu01:10000
Connected to: Apache Hive
+—————-+
| database_name |
+—————-+
| default |
+—————-+
1 row selected (0.5 seconds)
3.2 数据库与表管理
3.2.1 创建数据库
hive -e “CREATE DATABASE IF NOT EXISTS fgedudb LOCATION ‘/bigdata/warehouse/fgedudb.db’;”
# 查看数据库
hive -e “SHOW DATABASES;”
# 查看数据库属性
hive -e “DESCRIBE DATABASE EXTENDED fgedudb;”
OK
Time taken: 0.5 seconds
# 数据库列表
default
fgedudb
Time taken: 0.3 seconds
# 数据库属性
db_name: fgedudb
location: hdfs://fgedu01:9000/bigdata/warehouse/fgedudb.db
owner_name: fgedu
owner_type: USER
3.2.2 创建表
hive -e “
CREATE TABLE IF NOT EXISTS fgedudb.fgedu_user (
user_id BIGINT,
user_name STRING,
age INT,
gender STRING,
create_time TIMESTAMP
)
COMMENT ‘用户信息表’
PARTITIONED BY (dt STRING)
STORED AS ORC
TBLPROPERTIES (‘orc.compress’=’SNAPPY’);
“
# 创建外部表
hive -e “
CREATE EXTERNAL TABLE IF NOT EXISTS fgedudb.fgedu_order (
order_id BIGINT,
user_id BIGINT,
order_amount DECIMAL(10,2),
order_time TIMESTAMP
)
COMMENT ‘订单信息表’
PARTITIONED BY (dt STRING)
STORED AS PARQUET
LOCATION ‘/bigdata/warehouse/fgedudb.db/fgedu_order’;
“
# 查看表结构
hive -e “DESCRIBE FORMATTED fgedudb.fgedu_user;”
OK
Time taken: 1.5 seconds
# 创建外部表
OK
Time taken: 1.2 seconds
# 表结构
# col_name data_type comment
user_id bigint
user_name string
age int
gender string
create_time timestamp
# Partition Information
# col_name data_type comment
dt string
# Detailed Table Information
Table Type: MANAGED_TABLE
Storage Format: ORC
Compression: SNAPPY
3.3 数据导入导出
3.3.1 数据导入
hive -e “
LOAD DATA LOCAL INPATH ‘/bigdata/data/users.csv’
OVERWRITE INTO TABLE fgedudb.fgedu_user PARTITION(dt=’20240118′);
“
# 从HDFS导入数据
hive -e “
LOAD DATA INPATH ‘/bigdata/warehouse/staging/orders/’
OVERWRITE INTO TABLE fgedudb.fgedu_order PARTITION(dt=’20240118′);
“
# 使用INSERT导入数据
hive -e “
INSERT OVERWRITE TABLE fgedudb.fgedu_user PARTITION(dt=’20240118′)
SELECT user_id, user_name, age, gender, create_time
FROM fgedudb.fgedu_user_staging;
“
# 查看数据
hive -e “SELECT COUNT(*) FROM fgedudb.fgedu_user WHERE dt=’20240118′;”
Loading data to table fgedudb.fgedu_user partition (dt=20240118)
OK
Time taken: 5.0 seconds
# HDFS导入
Loading data to table fgedudb.fgedu_order partition (dt=20240118)
OK
Time taken: 3.0 seconds
# INSERT导入
Loading data to table fgedudb.fgedu_user partition (dt=20240118)
OK
Time taken: 30.0 seconds
# 数据统计
1000000
Time taken: 10.0 seconds
3.3.2 数据导出
hive -e “
INSERT OVERWRITE LOCAL DIRECTORY ‘/bigdata/export/users/’
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’
SELECT * FROM fgedudb.fgedu_user WHERE dt=’20240118′;
“
# 导出到HDFS
hive -e “
INSERT OVERWRITE DIRECTORY ‘/bigdata/export/orders/’
STORED AS PARQUET
SELECT * FROM fgedudb.fgedu_order WHERE dt=’20240118′;
“
# 验证导出
hdfs dfs -ls /bigdata/export/orders/
OK
Time taken: 15.0 seconds
# HDFS导出
OK
Time taken: 10.0 seconds
# 导出验证
Found 1 items
-rwxr-xr-x 3 fgedu fgedu 52428800 2024-01-18 10:00 /bigdata/export/orders/000000_0
3.4 元数据管理
3.4.1 查看元数据
hive -e “SHOW TABLES IN fgedudb;”
# 查看分区信息
hive -e “SHOW PARTITIONS fgedudb.fgedu_user;”
# 查看表统计信息
hive -e “ANALYZE TABLE fgedudb.fgedu_user COMPUTE STATISTICS;”
hive -e “DESCRIBE EXTENDED fgedudb.fgedu_user;”
# 查看列统计信息
hive -e “ANALYZE TABLE fgedudb.fgedu_user COMPUTE STATISTICS FOR COLUMNS;”
fgedu_order
fgedu_user
Time taken: 0.3 seconds
# 分区列表
dt=20240117
dt=20240118
Time taken: 0.2 seconds
# 表统计
Table: fgedudb.fgedu_user
numRows: 1000000
rawDataSize: 100000000
totalSize: 52428800
# 列统计
Column: user_id
min: 1
max: 1000000
ndv: 1000000
3.4.2 元数据备份
mysqldump -h fgedu01 -u hive -p hive_metastore > /backup/hive/metastore_$(date +%Y%m%d).sql
# 备份表结构
hive -e “SHOW CREATE TABLE fgedudb.fgedu_user;” > /backup/hive/fgedu_user_ddl.sql
# 验证备份
ls -la /backup/hive/
# 备份完成
# 表结构备份
# 备份完成
# 备份验证
total 10240
-rw-r–r– 1 root root 5242880 Jan 18 10:30 metastore_20240118.sql
-rw-r–r– 1 root root 2048 Jan 18 10:30 fgedu_user_ddl.sql
Part04-生产案例与实战讲解
4.1 数据仓库分层案例
数据仓库分层是数据治理的重要手段。更多视频教程www.fgedu.net.cn
hive -e “CREATE DATABASE IF NOT EXISTS ods LOCATION ‘/bigdata/warehouse/ods.db’;”
# 创建DWD层
hive -e “CREATE DATABASE IF NOT EXISTS dwd LOCATION ‘/bigdata/warehouse/dwd.db’;”
# 创建DWS层
hive -e “CREATE DATABASE IF NOT EXISTS dws LOCATION ‘/bigdata/warehouse/dws.db’;”
# 创建ADS层
hive -e “CREATE DATABASE IF NOT EXISTS ads LOCATION ‘/bigdata/warehouse/ads.db’;”
# 查看数据库
hive -e “SHOW DATABASES;”
OK
OK
OK
OK
# 数据库列表
default
ods
dwd
dws
ads
fgedudb
Time taken: 0.5 seconds
4.2 数据建模案例
数据建模是数据仓库的核心工作。学习交流加群风哥微信: itpux-com
hive -e “
CREATE TABLE IF NOT EXISTS dwd.dim_user (
user_id BIGINT,
user_name STRING,
gender STRING,
age INT,
city STRING,
register_time TIMESTAMP,
etl_time TIMESTAMP
)
COMMENT ‘用户维度表’
STORED AS ORC;
“
# 创建事实表
hive -e “
CREATE TABLE IF NOT EXISTS dwd.fact_order (
order_id BIGINT,
user_id BIGINT,
product_id BIGINT,
order_amount DECIMAL(10,2),
order_quantity INT,
order_time TIMESTAMP,
etl_time TIMESTAMP
)
COMMENT ‘订单事实表’
PARTITIONED BY (dt STRING)
STORED AS ORC;
“
# 创建汇总表
hive -e “
CREATE TABLE IF NOT EXISTS dws.agg_user_order (
user_id BIGINT,
order_count BIGINT,
order_amount DECIMAL(15,2),
first_order_time TIMESTAMP,
last_order_time TIMESTAMP,
etl_time TIMESTAMP
)
COMMENT ‘用户订单汇总表’
PARTITIONED BY (dt STRING)
STORED AS ORC;
”
OK
Time taken: 1.5 seconds
# 创建事实表
OK
Time taken: 1.2 seconds
# 创建汇总表
OK
Time taken: 1.0 seconds
4.3 数据治理案例
4.3.1 数据质量检查
hive -e “
SELECT ‘total_records’ AS metric, COUNT(*) AS value FROM dwd.fact_order WHERE dt=’20240118′
UNION ALL
SELECT ‘null_user_id’, COUNT(*) FROM dwd.fact_order WHERE dt=’20240118′ AND user_id IS NULL
UNION ALL
SELECT ‘null_order_amount’, COUNT(*) FROM dwd.fact_order WHERE dt=’20240118′ AND order_amount IS NULL;
“
# 检查数据一致性
hive -e “
SELECT COUNT(*) AS orphan_records
FROM dwd.fact_order o
LEFT JOIN dwd.dim_user u ON o.user_id = u.user_id
WHERE o.dt=’20240118′ AND u.user_id IS NULL;
”
total_records 1000000
null_user_id 0
null_order_amount 0
Time taken: 30.0 seconds
# 数据一致性检查
orphan_records 0
Time taken: 60.0 seconds
4.3.2 数据生命周期管理
hive -e “
ALTER TABLE dwd.fact_order SET TBLPROPERTIES (
‘retention’=’365’,
‘auto.purge’=’true’
);
“
# 清理过期分区
hive -e “
ALTER TABLE dwd.fact_order DROP IF EXISTS PARTITION (dt < '20230101');
“
# 查看分区
hive -e “SHOW PARTITIONS dwd.fact_order;”
OK
Time taken: 0.5 seconds
# 清理分区
Dropping partition dt=20221201
Dropping partition dt=20221202
…
OK
Time taken: 10.0 seconds
# 分区列表
dt=20240101
dt=20240102
…
dt=20240118
Time taken: 0.3 seconds
Part05-风哥经验总结与分享
5.1 Hive最佳实践
在实际生产环境中,Hive使用需要注意以下几点:from bigdata视频:www.itpux.com
1. 使用分区表提高查询效率
2. 选择合适的存储格式
3. 定期收集统计信息
4. 合理设置并行度
5. 做好数据生命周期管理
5.2 数据仓库经验总结
5.2.1 数据仓库建议
– 建立清晰的分层架构
– 制定数据规范
– 做好数据质量管控
– 定期优化表结构
– 建立数据字典
5.2.2 Hive运维脚本
# hive_maintenance.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
echo “=== Hive Maintenance ===”
echo “Date: $(date)”
# 1. 收集统计信息
echo “=== Collect Statistics ===”
hive -e “ANALYZE TABLE dwd.fact_order COMPUTE STATISTICS FOR COLUMNS;”
# 2. 清理过期数据
echo “=== Cleanup Old Data ===”
OLD_DATE=$(date -d “365 days ago” +%Y%m%d)
hive -e “ALTER TABLE dwd.fact_order DROP IF EXISTS PARTITION (dt < '${OLD_DATE}');"
# 3. 压缩表
echo “=== Compact Tables ===”
hive -e “ALTER TABLE dwd.fact_order COMPACT ‘major’;”
# 4. 备份元数据
echo “=== Backup Metadata ===”
mysqldump -h fgedu01 -u hive -p hive_metastore > /backup/hive/metastore_$(date +%Y%m%d).sql
echo “=== Maintenance Completed ===”
./hive_maintenance.sh
=== Hive Maintenance ===
Date: Thu Jan 18 11:00:00 CST 2024
=== Collect Statistics ===
OK
=== Cleanup Old Data ===
OK
=== Compact Tables ===
Compaction enqueued
=== Backup Metadata ===
# 备份完成
=== Maintenance Completed ===
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
