【发布时间】:2018-08-17 15:48:05
【问题描述】:
我使用的是 Airflow 1.9 版,他们的软件中有一个错误,您可以阅读有关 here on my previous Stackoverflow post、here on another one of my Stackoverflow posts 和 here on Airflow's Github where the bug is reported and discussed 的信息。
长话短说,Airflow 的代码中有几个位置需要获取服务器的 IP 地址。他们通过运行以下命令来完成此操作:
socket.getfqdn()
问题在于,在 Amazon EC2-Instances (Amazon Linux 1) 上,此命令不返回 IP 地址,而是返回如下所示的主机名:
IP-1-2-3-4
哪里需要这样的IP地址:
1.2.3.4
要获取我从here 找到的这个 IP 值,我可以使用这个命令:
socket.gethostbyname(socket.gethostname())
我已经在 Python shell 中测试了该命令,它返回了正确的值。所以我在 Airflow 包上进行了搜索,以找到所有出现的 socket.getfqdn(),这就是我得到的结果:
[airflow@ip-1-2-3-4 site-packages]$ cd airflow/
[airflow@ip-1-2-3-4 airflow]$ grep -r "fqdn" .
./security/utils.py: fqdn = host
./security/utils.py: if not fqdn or fqdn == '0.0.0.0':
./security/utils.py: fqdn = get_localhost_name()
./security/utils.py: return '%s/%s@%s' % (components[0], fqdn.lower(), components[2])
./security/utils.py: return socket.getfqdn()
./security/utils.py:def get_fqdn(hostname_or_ip=None):
./security/utils.py: fqdn = socket.gethostbyaddr(hostname_or_ip)[0]
./security/utils.py: fqdn = get_localhost_name()
./security/utils.py: fqdn = hostname_or_ip
./security/utils.py: if fqdn == 'localhost':
./security/utils.py: fqdn = get_localhost_name()
./security/utils.py: return fqdn
Binary file ./security/__pycache__/utils.cpython-36.pyc matches
Binary file ./security/__pycache__/kerberos.cpython-36.pyc matches
./security/kerberos.py: principal = configuration.get('kerberos', 'principal').replace("_HOST", socket.getfqdn())
./security/kerberos.py: principal = "%s/%s" % (configuration.get('kerberos', 'principal'), socket.getfqdn())
Binary file ./contrib/auth/backends/__pycache__/kerberos_auth.cpython-36.pyc matches
./contrib/auth/backends/kerberos_auth.py: service_principal = "%s/%s" % (configuration.get('kerberos', 'principal'), utils.get_fqdn())
./www/views.py: 'airflow/circles.html', hostname=socket.getfqdn()), 404
./www/views.py: hostname=socket.getfqdn(),
Binary file ./www/__pycache__/app.cpython-36.pyc matches
Binary file ./www/__pycache__/views.cpython-36.pyc matches
./www/app.py: 'hostname': socket.getfqdn(),
Binary file ./__pycache__/jobs.cpython-36.pyc matches
Binary file ./__pycache__/models.cpython-36.pyc matches
./bin/cli.py: hostname = socket.getfqdn()
Binary file ./bin/__pycache__/cli.cpython-36.pyc matches
./config_templates/default_airflow.cfg:# gets augmented with fqdn
./jobs.py: self.hostname = socket.getfqdn()
./jobs.py: fqdn = socket.getfqdn()
./jobs.py: same_hostname = fqdn == ti.hostname
./jobs.py: "{fqdn}".format(**locals()))
Binary file ./api/auth/backend/__pycache__/kerberos_auth.cpython-36.pyc matches
./api/auth/backend/kerberos_auth.py:from socket import getfqdn
./api/auth/backend/kerberos_auth.py: hostname = getfqdn()
./models.py: self.hostname = socket.getfqdn()
./models.py: self.hostname = socket.getfqdn()
我不确定是否应该将所有出现的socket.getfqdn() 命令替换为socket.gethostbyname(socket.gethostname())。一方面,维护起来很麻烦,因为我不再使用从 Pip 安装的 Airflow 包。我尝试升级到 Airflow 版本 1.10,但它非常有问题,我无法启动并运行它。所以现在我似乎坚持使用 Airflow 1.9 版,但我需要纠正这个 Airflow 错误,因为它导致我的任务偶尔失败。
【问题讨论】:
-
到目前为止,将所有出现的
socket.getfqdn()更改为socket.gethostbyname(socket.gethostname())已经奏效。继续测试以确保它不会重新出现。如果几个小时后我没有看到它,我会说它已修复。 -
好收获!理想情况下,FQDN 绝不是 IP 地址:en.wikipedia.org/wiki/Fully_qualified_domain_name
-
支持大家等待我的未决答案/解决方案。一旦我在工作中有一些空闲时间,我将详细说明我是如何解决这个问题的。
-
你能不能只在
airflow_local_settings中修补socket.getfqdn? -
你能详细说明一下吗?
标签: amazon-ec2 ip airflow hostname airflow-scheduler