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

时间:2017-01-10 12:32:42

标签: airflow

使用airflow,我从MySQL数据库中提取数据,用python转换它并将其加载到Redshift集群中。

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

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

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

5 个答案:

答案 0 :(得分:1)

您可以通过不同的方式实现这一目标:

如果您正在使用AWS RDS服务进行MySQL,则可以使用AWS Data Pipeline将数据从MySQL传输到Redshift。他们在AWS Data Pipeline中使用内置模板来执行此操作。您甚至可以安排从MySQL到Redshift的增量数据传输

http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-template-redshift.html

你的桌子有多大? 如果你的表不是太大,你可以使用Pandas DataFrame或元组将整个表读入python,然后将其传输给Redshift。 即使您仍然拥有大型表,您仍然可以以块的形式读取该表并将每个块推送到Redshift。 如果您将表读入其中,Pandas在内存使用方面效率不高。

在Airflow中创建不同的任务无济于事。您可以使用PythonOperator创建单个函数并在dag中调用该函数,也可以创建一个python脚本并使用dag中的BashOperator执行它

答案 1 :(得分:1)

您的数据库有多大?

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

随着数据库变大,会有更多的COPY命令和容易上传的错误,因为你正在处理跨越多个MySQL表的数十亿行数据。

您还必须弄清楚哪个CSV文件出错了。

确定是否需要高吞吐量,高延迟或频繁的架构更改也很重要。

总之,您应该考虑使用像Alooma这样的第三方选项extract data from a MySQL database并将其加载到您的Redshift群集中。

答案 2 :(得分:1)

一种可能性是使用气流中的GenericTransfer算子。见docs

这仅适用于小型数据集,而气流的mysqlhook使用不支持python 3的MySQLdb。

否则,我不认为使用气流时还有其他选择,而不是写入磁盘。

答案 3 :(得分:0)

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

我所做的就是将查询到的数据写入AVRO文件中,可以轻松地(非常有效地)将其提取到BigQuery中。

因此,在dag中有一项任务是查询数据并写入Cloud Storage(等效于S3)中的AVRO文件。然后是调用BigQuery运算符以提取AVRO文件的一项任务。

您可能可以对S3存储桶中的csv文件执行类似操作,然后对S3中的COPY文件执行RedShift csv命令。我相信S3中文件中的RedShift COPY是将数据提取到RedShift的最快方法。

这些任务在Airflow中作为PythonOperators实现。

答案 4 :(得分:-1)

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