通过命令行为 hive_cli 添加到 Airflow 的连接失败

Adding a connection to Airflow via command line for hive_cli fails

我正在 运行ning Apache Airflow 1.8 并尝试通过命令行界面为配置单元客户端包装器添加连接。但是尝试 运行 命令

airflow connections -a --conn_id HIVE_CONN2 --conn_uri hive_cli://hiveserver/default

命令行报告成功,但 Airflow 中的连接类型设置不正确 UI,连接无法正常工作。

我认为错误与 uri 前缀(方案)中的 _ 有关。我已经确认用于拆分 uri 的 urlparse 函数不允许在 models.py.

中使用下划线

除了在 UI 中手动设置外,还有其他方法可以将连接添加到 Airflow - 这是缺陷吗? Airflow 不应为连接类型使用下划线以避免此问题。

你是对的。

conn_type 用于确定将哪个挂钩用作外部数据源/接收器的接口。

conn_type 要么从上面正确指定的 URI 中提取,要么从 UI 中创建的连接中提取(并存储在 Meta 中的连接 table 中D B)。

在您的例子中,conn_type 是使用 models.py 中的 parse_from_uri 方法从提供的 URL 中提取的,该方法从scheme return 由 url 解析方法编辑。 https://github.com/apache/incubator-airflow/blob/master/airflow/models.py

根据 https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlparse scheme 从 URI 的第一部分提取。

正如您所发现的,当 :// 之前的 url 中有下划线时,urlparse 方法不会 return scheme .

例如验证这一点,尝试使用和不使用下划线对该 URI 进行变体:

from urllib.parse import urlparse
[print(v) for v in urlparse("hive_cli://hiveserver/default")]

如果您使用直线,它的工作方式会略有不同,因为它会创建一个 JDBC 连接,但如果您不使用直线(我可以看到您不是,因为它会成为 JDBC 的一部分=19=] 在命令中)然后它 运行 是一个子进程。

按照代码,最终 hive_cli 类型是 运行 作为 subprocess.Popen,即直接在气流机器(或工人)上,而不是通过 JDBC 或一些其他的联系。

https://github.com/apache/incubator-airflow/blob/master/airflow/hooks/hive_hooks.py#L208

因此它并不真正需要 URL 类型的连接字符串,它只是使用该格式将鞋拔插入 airflow connections --con-uri 选项。由于它没有作为 URL 拼凑起来,因此将其称为 hive_cli 的选择似乎是任意的,并且在气流 cli 中不起作用。当您使用 UI 时,这一切都有效,因为它通过从 UI 形式指定 conn_type 来构建连接。

这是一个错误,类型名称应从 hive_cli 更改为 hivecli,或者其他具有描述性且与 urlparse 兼容的名称。

这已在 Airflow 1.9.0 中修复,向 connections 子命令添加了一些额外参数:

airflow connections -a --conn_id hive_cli_test --conn_type hive_cli --conn_host something/something
[2018-08-09 10:28:41,377] {__init__.py:51} INFO - Using executor SequentialExecutor

        Successfully added `conn_id`=hive_cli_test : hive_cli://:@something/something: