1. 概述
Lakehouse架构提供了强大的外部对象联邦能力,允许用户在不移动数据的情况下访问和分析存储在多个异构数据源中的数据。本指南详细介绍了外部Catalog、外部Schema和外部表的使用场景、配置方法和最佳实践。
1.1 外部对象层次结构
Catalog(目录) > Schema(模式) > Table(表)
- 外部Catalog:顶层容器,映射外部数据系统
- 外部Schema:中间层容器,类似于数据库
- 外部表:底层对象,直接访问外部数据源的数据文件
2. 适用场景
2.1 外部Catalog适用场景
1. 多数据源统一管理
- 场景:企业拥有多个数据平台(Hive、Databricks等)
- 优势:无需数据迁移,直接在Lakehouse中访问所有数据源
- 应用:数据治理、统一元数据管理
2. 跨平台数据联邦查询
- 场景:需要同时分析存储在不同系统中的数据
- 优势:无需ETL,实时查询多个数据源
- 应用:跨系统报表、综合分析
3. 数据湖仓一体架构
- 场景:构建统一的数据分析平台
- 优势:兼顾数据湖的灵活性和数据仓库的性能
- 应用:从历史数据到实时数据的全链路分析
4. 渐进式数据迁移
- 场景:分阶段将数据从旧系统迁移到新系统
- 优势:在迁移过程中保持业务连续性
- 应用:系统升级、架构转型
2.2 外部Schema适用场景
1. Hive****元数据集成
- 场景:连接已有的Hive元数据服务(HMS)
- 优势:复用现有元数据,无需重新定义表结构
- 应用:大数据平台整合
2. 数据库级别的访问控制
- 场景:按照Schema级别分配权限
- 优势:简化权限管理,提高安全性
- 应用:多部门数据共享
3. 外部数据库映射
- 场景:将外部数据库作为整体引入Lakehouse
- 优势:保持原有数据组织结构
- 应用:数据库迁移、跨数据库分析
2.3 外部表适用场景
1. 对象存储数据直接查询
- 场景:分析存储在S3/OSS/COS等对象存储中的数据文件
- 优势:避免数据复制,节省存储空间
- 应用:日志分析、大文件处理
2. 流式数据接入
- 场景:连接Kafka等消息队列系统
- 优势:实时数据查询和处理
- 应用:实时监控、事件处理
3. 数据湖格式支持
- 场景:访问Delta、Hudi等开源数据湖格式
- 优势:利用开源生态系统,避免数据孤岛
- 应用:数据湖构建、开源兼容
4. 冷热数据分离
- 场景:将冷数据存储在成本较低的外部存储中
- 优势:优化存储成本和查询性能
- 应用:数据归档、成本优化
3. 配置指南
3.1 外部Catalog配置
创建Catalog连接
-- 创建连接到Databricks的Catalog连接
CREATE CATALOG CONNECTION IF NOT EXISTS databricks_conn
TYPE databricks
HOST = 'https://dbc-12345678-9abc.cloud.databricks.com'
CLIENT_ID = 'client_id_value'
CLIENT_SECRET = 'client_secret_value'
ACCESS_REGION = 'us-west-2';
-- 创建连接到Hive的Catalog连接
CREATE CATALOG CONNECTION IF NOT EXISTS hive_conn
TYPE hms
hive_metastore_uris = 'metastore-host'
storage_connection = 9083;
创建外部Catalog
-- 基于上面的连接创建外部Catalog
CREATE EXTERNAL CATALOG databricks_catalog
CONNECTION databricks_conn;
CREATE EXTERNAL CATALOG hive_catalog
CONNECTION hive_conn;
3.2 外部Schema配置
-- 创建映射hive中的databse
CREATE EXTERNAL SCHEMA external_db_schema
CONNECTION hive_catalog
OPTIONS ( 'schema'='default');
3.3 外部表配置
-- 创建Delta Lake外部表
CREATE EXTERNAL TABLE delta_sales
USING DELTA
CONNECTION oss_delta
LOCATION 'oss://bucketname/delta-format/sales/'
COMMENT 'Delta外部表示例';
-- 创建Kafka外部表
CREATE EXTERNAL TABLE kafka_messages (
key STRING,
value STRING,
topic STRING,
partition INT,
offset BIGINT,
timestamp BIGINT
)
USING KAFKA
CONNECTION kafka_conn
OPTIONS (
'kafka.bootstrap.servers' = 'broker:9092',
'subscribe' = 'test-topic'
);
4. 查询使用
4.1 查询外部Catalog中的表
-- 使用三层语法查询外部Catalog中的表
SELECT * FROM databricks_catalog.default.sales
WHERE region = 'APAC'
LIMIT 10;
-- 关联查询外部Catalog和内部表
SELECT a.customer_id, a.order_total, b.customer_name
FROM databricks_catalog.sales.orders a
JOIN internal_schema.customers b
ON a.customer_id = b.id
WHERE a.order_date >= '2024-01-01';
4.2 查询外部Schema中的表
-- 查询外部Schema中的表
SELECT * FROM external_db_schema.customer_table
WHERE register_date > '2023-01-01';
4.3 查询外部表
-- 查询Delta外部表
SELECT product, SUM(price) as total_sales
FROM delta_sales
WHERE sale_date BETWEEN '2024-01-01' AND '2024-04-30'
GROUP BY product
ORDER BY total_sales DESC;
-- 查询Kafka外部表
SELECT * FROM kafka_messages
WHERE timestamp > 1715132800000 -- 2024-05-08 00:00:00 UTC
LIMIT 100;
5. 性能优化最佳实践
5.1 数据导入策略
由于外部表中的数据存储在Lakehouse外部,查询性能可能不如内部表。对于频繁查询的数据,建议导入到内部表:
-- 将外部表数据导入内部表
INSERT INTO internal_sales_table
SELECT * FROM databricks_catalog.sales.orders
WHERE order_date >= '2024-01-01';
5.2 分区和筛选
利用分区信息和筛选条件减少数据扫描量:
-- 使用分区筛选
SELECT * FROM delta_sales
WHERE sale_date = '2024-05-15' -- 此处使用分区字段可大幅提升性能
AND product = 'Laptop';
6. 管理和监控
6.1 查看外部对象
-- 查看所有Catalog
SHOW CATALOGS;
-- 查看所有外部Schema
SHOW SCHEMAS EXTENDED WHERE type='external';
-- 查看外部Schema中的表
SHOW TABLES IN external_db_schema;
-- 检查外部表结构
DESCRIBE TABLE delta_sales;
7. 典型案例
7.1 数据湖与数据仓库统一查询
场景:企业同时拥有Hive数据湖和Databricks数据仓库,需要进行跨平台分析。
解决方案:
- 创建连接到Hive和Databricks的外部Catalog
- 使用联邦查询关联两个平台的数据
- 构建统一视图提供一致的数据访问层
7.2 历史数据归档与查询
场景:将历史数据归档到对象存储,但仍需要偶尔查询。
解决方案:
- 将历史数据以Delta或Parquet格式存储在对象存储中
- 创建外部表映射归档数据
- 按需查询,无需占用主存储空间
7.3 实时数据与批处理数据整合
场景:需要同时分析Kafka中的实时数据和数据仓库中的历史数据。
解决方案:
- 创建Kafka外部表处理实时数据
- 使用联邦查询将实时数据与历史数据关联
- 构建实时仪表板展示综合分析结果
8. 故障排除
8.1 连接问题
- 症状: 无法连接到外部数据源
- 解决方案:
- 检查网络连接和防火墙设置
- 验证连接凭证是否有效
- 确认外部服务是否可用
8.2 性能问题
- 症状: 外部表查询性能较慢
- 解决方案:
- 使用分区过滤减少数据扫描量
- 考虑将频繁查询的数据导入内部表
9. 总结
Lakehouse的外部对象功能提供了强大的数据联邦能力,使企业能够在不移动数据的情况下整合多个异构数据源。通过合理利用外部Catalog、外部Schema和外部表,可以构建统一的数据分析平台,实现数据湖仓一体化架构,提升数据价值。