ETL 选择,构建一个直接处理 SQL 查询引擎(impala)或原生数据库的 ETL? [关闭]

Posted

技术标签:

【中文标题】ETL 选择,构建一个直接处理 SQL 查询引擎(impala)或原生数据库的 ETL? [关闭]【英文标题】:ETL choice, building an ETL that deals with SQL query engine (impala) or native database directly? [closed] 【发布时间】:2021-04-16 22:52:04 【问题描述】:

我正在尝试构建一个 ETL,将源表映射到维度星型模式模型

我们的数据仓库基本上是基于 Kudu 数据库的 Impala

我的问题是,我应该:

A- 构建一个直接使用 Python 处理 kudu 表的 ETL (link)

B- 或在 impala 中创建 UDF(相当于 SQL 中的存储过程),执行插入/连接等以将源表映射到星型模式模型,并使用 Nifi 或任何调度程序(如 Airflow 等)对其进行调度

在我看来,我认为处理本机数据库比处理其之上的 SQL 引擎要好。但这只是一个假设。

【问题讨论】:

【参考方案1】:

为什么不接近 C,:) 两者兼而有之。

各有利弊。

A - 使用 python 构建 ETL - 优点 - 更好的控制,灵活地做任何你想要的逻辑。 缺点 - 你必须在 python 中编写代码并在 sql 中编写代码。如果某件事失败了,做 RCA 将是一场噩梦。相比之下,维护可能更难。 - 在性能方面,这种方法在数据量很大的情况下会更差。

B - 使用 SQL 直接获取数据 - 优点 - 更快的性能。更少的编码。 缺点 - 难以实现复杂的逻辑。代码和时间表的维护可能很困难。

除上述之外,请考虑您/团队对 python/SQL 和未来可维护性的舒适度。 目前我们在我的 cloudera 项目中使用方法 B。我们创建视图,然后使用insert 直接加载最终表格。我们几乎不需要任何 UDF。 现在,我的建议是,请使用方法 B。并且仅在您确实无法创建复杂逻辑的情况下使用方法 A。

编辑: 可以说,我们必须加载订单表。所以我们执行以下块来加载订单和依赖的 org,cust,prod 表。

Load customer   |
load org        | --> Load Orders final.
load product    |
load order stage|

加载客户块是脚本的集合,例如-

insert overwrite cust_stg select * from cust_stg_vw; -- This loads into stage table
insert overwrite cust select * from cust_vw; -- This loads into cust table

类似地写入其他块。将它们放在块中使我们可以灵活地将它们按任何顺序/我们想要提高性能的任何位置放置。

【讨论】:

听起来合乎逻辑,但是当您使用第二种方法“我们创建视图,然后使用插入直接加载最终表格”时。你是怎么安排的?它是每 x 单位时间发生还是每插入一条记录都会发生? 我们将元素放在组/块中,然后创建链(并行或顺序),然​​后使用称为 rundeck 的调度程序工具运行它们。它基本上是一个 unix 脚本调度程序,可以根据需要创建作业。我用更多细节更新了问题。 现在很清楚了,非常感谢!

以上是关于ETL 选择,构建一个直接处理 SQL 查询引擎(impala)或原生数据库的 ETL? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Hive

hive优化

MySQL的运行模式及一些特性,引擎事务并发控制优化总结

Tardigrade:Trino 解决 ETL 场景的方案

大数据时代快速SQL引擎-Impala

SQL Server笔记1