我们中的许多人都根据后来发展的需求对数据进行了更改。当我们意识到这一点时,回滚就变得不可能了。变化不仅仅是一个常数;而是一个常数。它是管理数据的重要组成部分,需要采用复杂的方法。输入 Dremio 数据目录 Nessie 的类似 Git 的功能。
正如 Git 已成为软件开发的基础一样,数据工程师也需要类似的工具来并行工作、比较数据版本、促进生产更改并在需要时回滚数据。 Nessie 为数据工程师提供了类似 Git 的版本控制系统,用于管理数据版本、分支、合并和提交。当多个数据工程师同时处理和转换数据时,这非常有帮助。 Nessie 允许每个工程师在不同的分支中工作,同时以主分支的形式维护单一事实来源。此功能使数据工程团队能够在面对不断变化的情况下协作维护数据质量。
本文提供了分步指南,演示 Nessie、Dremio 和 MinIO 如何协同工作以提高数据工程工作流程中的数据质量和协作。无论您是数据工程师、机器学习工程师,还是现代数据湖爱好者,此博客都可以为您提供有效增强数据版本控制实践所需的知识和工具。
Nessie 允许类似 Git 的工作负载,让您可以测试、开发并推送到生产环境。让我们分解一些关键概念:
分支:就像在 Git 中一样,Nessie 中的分支允许您同时处理不同的数据工程任务。例如,您可能有一个用于功能开发、数据清理和数据转换的分支。每个分支都可以有自己的一组数据更改。
提交:在 Nessie 中,提交代表特定时间点的数据快照。当您对数据进行更改时,您会创建一个新的提交来记录这些更改。提交链接到特定分支。当您需要将数据恢复到稳定或已知良好的状态时,Nessie 可以轻松选择特定的提交并回滚到该数据版本。这确保了数据质量和一致性。
合并:Nessie 允许您将一个分支的更改合并到另一个分支。这类似于合并 Git 中的代码更改。合并分支时,该分支中所做的数据更改将成为目标分支的一部分。
Dremio是一个分布式分析引擎,作为开源平台运行,为数据探索、转换和协作工作提供直观的自助服务界面。它的设计基于
我们已经探索了如何使用 Kubernetes 部署 Dremio,以及如何
MinIO是高性能对象存储。以其卓越的品质而闻名
你将需要
这部分教程基于Dremio的
首先,打开终端并导航到您克隆/下载存储库的文件夹,然后运行以下命令来启动 Dremio。
docker-compose up dremio
稍等片刻,然后导航至http://localhost:9047
以访问 Dremio。更新请求的字段,然后单击下一步。
接下来,运行以下命令来启动 MinIO。
docker-compose up minio
下面的最后一个docker-compose up
命令将启动 Nessie。
docker-compose up nessie
导航到http://localhost:9001
使用用户名和密码minioadmin:minioadmin
登录 MinIO。系统会提示您创建存储桶。
创建一个名为iceberg-datalake
。
然后返回 Dremio http://localhost:9047
,单击“添加源”并选择“Nessie”。
nessie
http://nessie:19120/api/v2
none
暂时不要单击“保存”。相反,在左侧的导航面板中,单击“存储”。 MinIO 是 S3-API 兼容的对象存储,可以使用与 AWS S3 相同的连接路径。
minioadmin
minioadmin
/iceberg-datalake
向下滚动查看下一组说明。
Connection Properties
下的Add Property
按钮以创建和配置以下属性。fs.s3a.path.style.access
为true
fs.s3a.endpoint
的端点minio:9000
dremio.s3.compat
为true
Encrypt connection
然后单击“保存”。您现在应该在数据源中看到 Nessie Catalogs。
在 Dremio 中,导航到左侧的 SQL Runner。确保文本编辑器右上方区域的Context
设置为我们的 Nessie 源。否则,您将必须引用nessie.SalesData
等上下文,而不仅仅是SalesData
来运行此查询。复制并粘贴下面的 SQL 并运行。
CREATE TABLE SalesData ( id INT, product_name VARCHAR, sales_amount DECIMAL, transaction_date DATE ) PARTITION BY (transaction_date);
运行下面的查询将数据插入到您刚刚创建的表中。
INSERT INTO SalesData (id, product_name, sales_amount, transaction_date) VALUES (1, 'ProductA', 1500.00, '2023-10-15'), (2, 'ProductB', 2000.00, '2023-10-15'), (3, 'ProductA', 1200.00, '2023-10-16'), (4, 'ProductC', 1800.00, '2023-10-16'), (5, 'ProductB', 2200.00, '2023-10-17');
导航回 MinIO,可以看到您的数据湖已填充了 Iceberg 表。
返回 Dremio,网址为http://localhost:9047
。首先使用AT BRANCH
语法查询主分支上的表:
SELECT * FROM nessie.SalesData AT BRANCH main;
创建 ETL(提取转换和加载)分支,以便您可以在不影响生产的情况下处理和转换数据。
CREATE BRANCH etl_06092023 in nessie
在 ETL 分支中,将新数据插入表中:
USE BRANCH etl_06092023 in nessie; INSERT INTO nessie.SalesData (id, product_name, sales_amount, transaction_date) VALUES (6, 'ProductC', 1400.00, '2023-10-18');
确认 ETL 分支中新数据的立即可用性:
SELECT * FROM nessie.SalesData AT BRANCH etl_06092023;
请注意主分支上用户的更改是隔离的:
SELECT * FROM nessie.SalesData AT BRANCH main;
将 ETL 分支的更改合并回主分支:
MERGE BRANCH etl_06092023 INTO main in nessie;
再次选择主分支可以看到更改确实已经合并了。
SELECT * FROM nessie.SalesData AT BRANCH main
这种分支策略使数据工程师能够独立处理跨多个表的大量事务。当准备就绪时,数据工程师可以将这些事务合并到主分支内的单个、全面的多表事务中。
这篇博文深入探讨了数据工程中类似 Git 的版本控制的力量,强调了如何
让我们知道您的数据湖屋是什么样的
也出现在这里。