首页 > 解决方案 > 使用 Sqoop 将表从 MySQL 移动到使用远程安装的 Airflow 安排的 Hive

问题描述

我有一个场景,我有一个 AWS EMR 设置,其中包含一些应用程序,例如 Spark、Hadoop、Hive、HCatalog、Zeppelin、Sqoop 等。而且,我还有另一台只运行 Airflow 的服务器。

我正在处理一个需求,我想使用 Sqoop 将 MySQL 表(再次位于不同的 RDS 实例上)移动到 Hive,并且此触发器必须由 Airflow 提交。

鉴于 Airflow 在远程服务器中,是否可以使用 Airflow 中可用的 SqoopOperator 来实现这一点?我不相信,那么还有其他方法可以实现吗?

提前致谢。

标签: amazon-web-servicessqoopamazon-emrairflow

解决方案


是的,这是可能的。我承认缺少有关如何使用运算符的文档,但是如果您了解 Airflow 中的钩子运算符的概念,则可以通过阅读您要使用的运算符的代码来弄清楚。在这种情况下,您需要通读SqoopHookSqoopOperator代码库。我知道如何使用 Airflow 的大部分内容来自阅读代码,虽然我没有使用过这个运算符,但我可以尽我所能在这里帮助你。

假设您要执行此 sqoop 命令:

sqoop import --connect jdbc:mysql://mysql.example.com/testDb --username root --password hadoop123 --table student 

你有一个在远程主机上运行的 Sqoop 服务器,你可以通过http://scoop.example.com:12000/sqoop/上的Scoop 客户端访问它。

首先,您需要在 Airflow Admin UI 中创建连接,调用 connection sqoop。对于连接,填写hostas scoop.example.comschemaassqoopportas 12000。如果您有密码,则需要将其放入服务器上的文件中,并extras填写一个看起来像这样的 json 字符串{'password_file':'/path/to/password.txt'}(请参阅有关此密码文件的内联代码)。

在 UI 中设置连接后,现在可以使用 DAG 文件中的 SqoopOperator 创建任务。这可能看起来像这样:

sqoop_mysql_export = SqoopOperator(conn_id='sqoop',
                                   table='student',
                                   username='root',
                                   password='password',
                                   driver='jdbc:mysql://mysql.example.com/testDb',
                                   cmd_type='import')

您可以在此处的代码中查看您可能希望为导入传递的参数的完整列表。

您可以在此处查看 SqoopOperator(实际上是操作员用来连接到 Sqoop 的 SqoopHook)如何将这些参数转换为命令行命令。

实际上,这个 SqoopOperator 只是通过将您传递的 kwargs 转换为 sqoop 客户端 CLI 命令来工作。如果您查看 SqoopHook,您会看到它是如何完成的,并且可能会弄清楚如何使其适用于您的情况。祝你好运!

要进行故障排除,我建议您通过 SSH 连接到您正在运行 Airflow 的服务器,并确认您可以从命令行运行 Scoop 客户端并连接到远程 Scoop 服务器。


推荐阅读