通过命令行向 Airflow 添加连接以进行hive_cli失败



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

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

命令行报告成功,但 Airflow UI 中未正确设置连接类型,连接将不起作用。

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

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

此问题已在 Airflow 1.9.0 中修复,并在connectionssub 命令中添加了一些额外的参数:

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:

你是对的。

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

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

在您的情况下,conn_type是使用 models.py 中的parse_from_uri方法从提供的 URL 中提取的,该方法根据 urlparse 方法返回的scheme设置conn_type。 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 方法不会返回scheme

例如,验证这一点,尝试使用此 URI 的变体,带下划线和不带下划线:

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

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

按照代码,最终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兼容的内容。

最新更新