本文档风哥主要介绍Podman数据仓库,包括数据仓库的概念、架构、组件以及数据仓库的部署、集成和管理等内容。风哥教程参考Podman官方文档Data Warehouse部分,适合容器管理员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 数据仓库概念
数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。Podman数据仓库是指使用Podman容器技术部署和管理的数据仓库系统,包括数据存储、数据处理、数据分析等功能。更多视频教程www.fgedu.net.cn
- 面向主题:围绕企业的核心业务主题组织数据
- 集成性:从多个数据源集成数据
- 稳定性:数据一旦进入数据仓库,很少修改
- 历史性:存储历史数据,支持时间维度分析
1.2 数据仓库架构
Podman数据仓库的架构主要包括:
- 数据源层:来自企业内部和外部的各种数据源
- 数据集成层:ETL(提取、转换、加载)过程
- 数据存储层:数据仓库核心存储
- 数据服务层:数据访问和服务接口
- 数据分析层:OLAP(在线分析处理)和数据挖掘
- 应用层:业务智能和决策支持系统
1.3 数据仓库组件
Podman数据仓库的组件主要包括:
- 数据存储:PostgreSQL、MySQL、MongoDB等数据库
- ETL工具:Apache Airflow、Talend、Pentaho等
- OLAP工具:Apache Kylin、Mondrian等
- BI工具:Tableau、Power BI、Grafana等
- 数据集成:Apache Kafka、RabbitMQ等
- 监控工具:Prometheus、Grafana等
Part02-生产环境规划与建议
2.1 数据仓库策略
生产环境中Podman数据仓库的策略:
## 数据模型策略
– 维度建模:星型模型、雪花模型
– 实体关系模型:ER模型
– 数据集市:部门级数据仓库
## 数据集成策略
– ETL策略:批量ETL、实时ETL
– 数据质量:数据清洗、数据转换、数据验证
– 元数据管理:数据字典、数据血缘、数据 lineage
## 数据存储策略
– 存储架构:分布式存储、云存储
– 数据分区:按时间、按业务主题
– 数据压缩:减少存储成本
– 数据归档:历史数据归档
## 数据安全策略
– 访问控制:基于角色的访问控制
– 数据加密:传输加密、存储加密
– 审计日志:记录数据访问和操作
2.2 数据仓库需求
生产环境中Podman数据仓库的需求:
## 功能需求
– 数据集成:从多个数据源集成数据
– 数据存储:存储大量历史数据
– 数据处理:ETL处理、数据转换
– 数据分析:OLAP分析、数据挖掘
– 数据服务:提供数据访问接口
## 性能需求
– 查询性能:快速响应复杂查询
– 加载性能:高效处理大批量数据
– 扩展性:支持数据量和用户量的增长
– 可靠性:高可用性和数据一致性
## 技术需求
– 容器化:使用Podman容器技术
– 编排:使用Podman Compose或Kubernetes
– 监控:监控系统性能和数据质量
– 备份:定期备份数据和配置
## 非功能需求
– 安全性:数据安全和访问控制
– 可维护性:易于管理和维护
– 可扩展性:支持业务增长
– 成本效益:合理的资源利用
2.3 数据仓库设计
生产环境中Podman数据仓库的设计:
- 数据模型设计:维度建模、实体关系模型
- 存储设计:数据分区、数据压缩、数据归档
- ETL设计:数据提取、转换、加载流程
- 架构设计:分层架构、组件布局
- 安全设计:访问控制、数据加密、审计日志
Part03-生产环境项目实施方案
3.1 数据仓库部署
3.1.1 部署PostgreSQL数据仓库
# 运行PostgreSQL容器
$ podman run -d –name fgedu-postgres \
–cpus 4 \
–memory 8g \
-v /Podman/fgdata/postgres/data:/var/lib/postgresql/data:z \
-e POSTGRES_USER=fgedu \
-e POSTGRES_PASSWORD=fgedu123 \
-e POSTGRES_DB=fgedudb \
-p 5432:5432 \
docker.io/library/postgres:15
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab docker.io/library/postgres postgres 2 minutes ago Up 2 minutes ago 0.0.0.0:5432->5432/tcp fgedu-postgres
# 连接PostgreSQL
$ podman exec -it fgedu-postgres psql -U fgedu -d fgedudb
# 输出日志
psql (15.0 (Debian 15.0-1.pgdg110+1))
Type “help” for help.
fgedudb=#
3.2 数据仓库集成
3.2.1 部署Apache Airflow ETL工具
# 运行Airflow容器
$ podman run -d –name fgedu-airflow \
–cpus 2 \
–memory 4g \
-v /Podman/fgdata/airflow/dags:/opt/airflow/dags:z \
-v /Podman/fgdata/airflow/logs:/opt/airflow/logs:z \
-v /Podman/fgdata/airflow/plugins:/opt/airflow/plugins:z \
-e AIRFLOW__CORE__EXECUTOR=LocalExecutor \
-e AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://fgedu:fgedu123@fgedu-postgres:5432/fgedudb \
-e AIRFLOW__WEBSERVER__SECRET_KEY=secret_key \
-p 8080:8080 \
–link fgedu-postgres:fgedu-postgres \
docker.io/apache/airflow:2.6.0
# 初始化Airflow
$ podman exec fgedu-airflow airflow db init
$ podman exec fgedu-airflow airflow users create \
–username admin \
–firstname Admin \
–lastname User \
–role Admin \
–email admin@example.com \
–password admin
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab docker.io/library/postgres postgres 5 minutes ago Up 5 minutes ago 0.0.0.0:5432->5432/tcp fgedu-postgres
1234567890ab docker.io/apache/airflow bash -c airflow 2 minutes ago Up 2 minutes ago 0.0.0.0:8080->8080/tcp fgedu-airflow
3.3 数据仓库管理
3.3.1 部署Grafana监控工具
# 运行Grafana容器
$ podman run -d –name fgedu-grafana \
–cpus 1 \
–memory 2g \
-v /Podman/fgdata/grafana/data:/var/lib/grafana:z \
-v /Podman/fgdata/grafana/provisioning:/etc/grafana/provisioning:z \
-p 3000:3000 \
docker.io/grafana/grafana:9.5.0
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab docker.io/library/postgres postgres 10 minutes ago Up 10 minutes ago 0.0.0.0:5432->5432/tcp fgedu-postgres
1234567890ab docker.io/apache/airflow bash -c airflow 7 minutes ago Up 7 minutes ago 0.0.0.0:8080->8080/tcp fgedu-airflow
9876543210ab docker.io/grafana/grafana grafana-server 2 minutes ago Up 2 minutes ago 0.0.0.0:3000->3000/tcp fgedu-grafana
Part04-生产案例与实战讲解
4.1 数据仓库实施
4.1.1 构建销售数据仓库
# 创建销售数据模型
$ podman exec -it fgedu-postgres psql -U fgedu -d fgedudb
# 创建维度表
CREATE TABLE dim_product (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR(255) NOT NULL,
product_category VARCHAR(100) NOT NULL,
product_price DECIMAL(10, 2) NOT NULL
);
CREATE TABLE dim_customer (
customer_id SERIAL PRIMARY KEY,
customer_name VARCHAR(255) NOT NULL,
customer_address VARCHAR(255) NOT NULL,
customer_email VARCHAR(255) NOT NULL
);
CREATE TABLE dim_date (
date_id SERIAL PRIMARY KEY,
date DATE NOT NULL,
year INT NOT NULL,
month INT NOT NULL,
day INT NOT NULL,
quarter INT NOT NULL
);
# 创建事实表
CREATE TABLE fact_sales (
sales_id SERIAL PRIMARY KEY,
product_id INT REFERENCES dim_product(product_id),
customer_id INT REFERENCES dim_customer(customer_id),
date_id INT REFERENCES dim_date(date_id),
quantity INT NOT NULL,
amount DECIMAL(10, 2) NOT NULL
);
# 插入测试数据
INSERT INTO dim_product (product_name, product_category, product_price) VALUES
(‘Product A’, ‘Category 1’, 100.00),
(‘Product B’, ‘Category 1’, 200.00),
(‘Product C’, ‘Category 2’, 300.00);
INSERT INTO dim_customer (customer_name, customer_address, customer_email) VALUES
(‘Customer 1’, ‘Address 1’, ‘customer1@example.com’),
(‘Customer 2’, ‘Address 2’, ‘customer2@example.com’);
INSERT INTO dim_date (date, year, month, day, quarter) VALUES
(‘2026-01-01’, 2026, 1, 1, 1),
(‘2026-01-02’, 2026, 1, 2, 1),
(‘2026-02-01’, 2026, 2, 1, 1);
INSERT INTO fact_sales (product_id, customer_id, date_id, quantity, amount) VALUES
(1, 1, 1, 2, 200.00),
(2, 1, 1, 1, 200.00),
(3, 2, 2, 1, 300.00),
(1, 2, 3, 3, 300.00);
# 提交事务
COMMIT;
# 退出PostgreSQL
\q
4.2 数据仓库ETL
4.2.1 创建ETL工作流
# 创建DAG文件
$ cat > /Podman/fgdata/airflow/dags/sales_etl.py << EOF
from airflow import DAG
from airflow.operators.postgres_operator import PostgresOperator
from datetime import datetime, timedelta
default_args = {
'owner': 'fgedu',
'depends_on_past': False,
'start_date': datetime(2026, 4, 10),
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
dag = DAG(
'sales_etl',
default_args=default_args,
description='Sales data ETL workflow',
schedule_interval=timedelta(days=1),
)
# 提取数据
extract_data = PostgresOperator(
task_id='extract_data',
postgres_conn_id='postgres_default',
sql="""
SELECT
p.product_id,
p.product_name,
p.product_category,
p.product_price,
c.customer_id,
c.customer_name,
c.customer_address,
c.customer_email,
d.date_id,
d.date,
d.year,
d.month,
d.day,
d.quarter,
s.quantity,
s.amount
FROM
fact_sales s
JOIN
dim_product p ON s.product_id = p.product_id
JOIN
dim_customer c ON s.customer_id = c.customer_id
JOIN
dim_date d ON s.date_id = d.date_id
""",
dag=dag,
)
# 转换数据
transform_data = PostgresOperator(
task_id='transform_data',
postgres_conn_id='postgres_default',
sql="""
CREATE TABLE IF NOT EXISTS sales_summary AS
SELECT
d.year,
d.month,
p.product_category,
SUM(s.quantity) AS total_quantity,
SUM(s.amount) AS total_amount
FROM
fact_sales s
JOIN
dim_product p ON s.product_id = p.product_id
JOIN
dim_date d ON s.date_id = d.date_id
GROUP BY
d.year, d.month, p.product_category
""",
dag=dag,
)
# 加载数据
load_data = PostgresOperator(
task_id='load_data',
postgres_conn_id='postgres_default',
sql="""
INSERT INTO sales_summary (year, month, product_category, total_quantity, total_amount)
SELECT
d.year,
d.month,
p.product_category,
SUM(s.quantity) AS total_quantity,
SUM(s.amount) AS total_amount
FROM
fact_sales s
JOIN
dim_product p ON s.product_id = p.product_id
JOIN
dim_date d ON s.date_id = d.date_id
GROUP BY
d.year, d.month, p.product_category
ON CONFLICT (year, month, product_category) DO UPDATE
SET
total_quantity = EXCLUDED.total_quantity,
total_amount = EXCLUDED.total_amount
""",
dag=dag,
)
extract_data >> transform_data >> load_data
EOF
# 查看DAG文件
$ ls -la /Podman/fgdata/airflow/dags/
# 输出日志
total 12
drwxr-xr-x 2 root root 4096 Apr 10 10:00 .
drwxr-xr-x 5 root root 4096 Apr 10 10:00 ..
-rw-r–r– 1 root root 2048 Apr 10 10:00 sales_etl.py
4.3 数据仓库查询
4.3.1 执行数据仓库查询
# 连接PostgreSQL
$ podman exec -it fgedu-postgres psql -U fgedu -d fgedudb
# 查询销售汇总数据
SELECT
d.year,
d.month,
p.product_category,
SUM(s.quantity) AS total_quantity,
SUM(s.amount) AS total_amount
FROM
fact_sales s
JOIN
dim_product p ON s.product_id = p.product_id
JOIN
dim_date d ON s.date_id = d.date_id
GROUP BY
d.year, d.month, p.product_category
ORDER BY
d.year, d.month, p.product_category;
# 输出日志
year | month | product_category | total_quantity | total_amount
——+——-+——————+—————-+————–
2026 | 1 | Category 1 | 3 | 400.00
2026 | 1 | Category 2 | 1 | 300.00
2026 | 2 | Category 1 | 3 | 300.00
(3 rows)
# 查询客户销售数据
SELECT
c.customer_name,
SUM(s.quantity) AS total_quantity,
SUM(s.amount) AS total_amount
FROM
fact_sales s
JOIN
dim_customer c ON s.customer_id = c.customer_id
GROUP BY
c.customer_name
ORDER BY
total_amount DESC;
# 输出日志
customer_name | total_quantity | total_amount
—————+—————-+————–
Customer 2 | 4 | 600.00
Customer 1 | 3 | 400.00
(2 rows)
# 退出PostgreSQL
\q
Part05-风哥经验总结与分享
5.1 数据仓库最佳实践
Podman数据仓库的最佳实践:
- 容器化部署:使用Podman容器技术部署数据仓库组件,提高部署效率和一致性
- 分层架构:采用分层架构设计,清晰分离数据仓库的各个组件
- 数据模型设计:使用维度建模,提高查询性能和数据可读性
- ETL优化:优化ETL流程,提高数据处理效率
- 性能优化:优化数据库配置,提高查询性能
- 监控管理:建立完善的监控和管理系统,确保数据仓库的正常运行
- 备份恢复:定期备份数据和配置,确保数据安全
- 安全管理:加强数据安全和访问控制,保护敏感数据
5.2 数据仓库性能优化
Podman数据仓库的性能优化:
## 数据库优化
– 配置PostgreSQL参数:shared_buffers、work_mem、maintenance_work_mem
– 创建索引:为常用查询字段创建索引
– 分区表:按时间或业务主题分区
– 预计算:创建汇总表,减少查询计算量
## ETL优化
– 批量处理:使用批量操作,减少数据库交互
– 并行处理:使用多线程或分布式处理
– 增量加载:只处理新增或变更的数据
– 数据压缩:减少数据传输和存储成本
## 存储优化
– 使用SSD存储:提高I/O性能
– 配置合适的存储驱动:overlay2
– 合理设置卷大小:避免空间不足
– 定期清理:清理无用数据,释放空间
## 网络优化
– 使用主机网络模式:减少网络开销
– 配置网络参数:优化网络连接
– 本地部署:减少网络延迟
5.3 数据仓库维护
Podman数据仓库的维护:
## 定期备份
– 数据库备份:pg_dump、pg_basebackup
– 配置备份:备份容器配置和ETL脚本
– 数据备份:备份数据文件和卷
## 定期清理
– 清理无用数据:删除过期数据
– 清理日志:清理数据库和应用日志
– 清理临时文件:清理临时数据和缓存
## 监控管理
– 监控系统性能:CPU、内存、磁盘、网络
– 监控数据库性能:查询执行时间、连接数
– 监控ETL任务:任务执行状态、执行时间
– 监控数据质量:数据完整性、一致性
## 版本管理
– 容器镜像版本:使用固定版本标签
– 应用配置版本:版本控制配置文件
– ETL脚本版本:版本控制ETL脚本
– 数据模型版本:版本控制数据模型
## 故障处理
– 建立故障处理流程:快速响应和解决故障
– 制定应急预案:应对各种故障情况
– 定期演练:测试故障恢复流程
– 持续改进:总结故障处理经验
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
