使用Airflow在数据库之间移动和转换数据

使用Airflow在数据库之间移动和转换数据,airflow,Airflow,使用airflow,我从MySQL数据库中提取数据,用python进行转换,并将其加载到红移集群中 目前我使用3个任务:它们通过在本地磁盘上写入CSV来传递数据 如果不写入磁盘,我怎么做呢? 我应该用python编写一个大任务吗?(这会降低能见度) 编辑:这是一个关于气流的问题,以及选择任务粒度以及如何在任务之间传递数据的最佳实践。 这不是关于数据迁移或ETL的一般问题。在这个问题中,ETL仅用作气流任务的工作负载示例。您可以使用XCom在任务之间传递信息。您可以在文档中详细阅读,在默认情况下随

使用airflow,我从MySQL数据库中提取数据,用python进行转换,并将其加载到红移集群中

目前我使用3个任务:它们通过在本地磁盘上写入CSV来传递数据

如果不写入磁盘,我怎么做呢? 我应该用python编写一个大任务吗?(这会降低能见度)

编辑:这是一个关于气流的问题,以及选择任务粒度以及如何在任务之间传递数据的最佳实践。
这不是关于数据迁移或ETL的一般问题。在这个问题中,ETL仅用作气流任务的工作负载示例。

您可以使用XCom在任务之间传递信息。您可以在文档中详细阅读,在默认情况下随气流安装的样本DAG集中也有一个示例

有不同的方法可以实现这一点:

如果您使用的是用于MySQL的AWS RDS服务,则可以使用AWS数据管道将数据从MySQL传输到红移。他们在AWS数据管道中内置了这样的模板。您甚至可以安排从MySQL到Redshift的增量数据传输

你的桌子有多大? 如果您的表不是太大,您可以使用DataFrame或元组将整个表读入python,然后将其红移。 即使您有一个很大的表,您仍然可以分块读取该表,并将每个块推送到红移。 若你们把表读入内存,熊猫在内存使用方面几乎并没有效率


在气流中创建不同的任务不会有多大帮助。您可以创建一个函数并使用PythonOperator在dag中调用该函数,也可以创建一个python脚本并使用dag中的bash操作符执行该函数。您的数据库有多大

您在本地磁盘上写入CSV的方法对于小型数据库来说是最佳的,因此如果是这种情况,您可以为此编写Python任务

随着数据库越来越大,将会有更多的复制命令和容易出错的上传,因为您要处理分布在多个MySQL表中的数十亿行数据

您还必须准确地找出哪个CSV文件出错

确定是否需要高吞吐量、高延迟或频繁的模式更改也很重要


最后,你应该考虑像AlOOMA这样的第三方选项,并把它加载到你的红移集群中。看

这只适用于较小的数据集,而airflow的mysqlhook使用不支持python 3的MySQLdb


否则,我认为在使用airflow时,除了写入磁盘之外,没有其他选择。

我以前也做过类似的任务,但我的系统是在GCP中

我所做的是将查询到的数据写入
AVRO
文件中,这些文件可以很容易(并且非常有效)地被接收到BigQuery中

因此,在dag中有一个任务是查询数据并写入云存储中的
AVRO
文件(S3等效)。之后的一个任务是调用BigQuery操作符来接收
AVRO
文件

您可能可以对S3存储桶中的
csv
文件执行类似操作,然后从S3中的
csv
文件执行红移
COPY
命令。我相信从S3中的文件复制红移
是将数据吸收到红移中的最快方法


这些任务是作为气流中的蟒蛇操作符实现的

XCom旨在“控制和共享状态的细微形式”(引用文档)。我认为传递数据是不合适的,因为“用户应该确保使用适当大小的对象”。我修改了我的问题,使它更清楚。谢谢你,德米特里。我和你做同样的事情。你找到更好的解决办法了吗?我使用-->进程-->保存到stringio-->副本读取查询_expert@trench你找到更好的解决办法了吗?