AirflowException:Celery命令失败-记录的主机名与此实例不匹配';主机名

AirflowException:Celery命令失败-记录的主机名与此实例不匹配';主机名,airflow,airflow-scheduler,Airflow,Airflow Scheduler,我正在两个AWS EC2实例上运行的群集环境中运行Airflow。一个给主人,一个给工人。但工作节点在运行“$worker”时会定期抛出此错误: [2018-08-09 16:15:43553]{jobs.py:2574}警告-记录的主机名ip-1.2.3.4与此实例的主机名ip-1.2.3.4.eco.tanonprod.comanyname.io不匹配 回溯(最近一次呼叫最后一次): 文件“/usr/bin/afflow”,第27行,在 args.func(args) 文件“/usr/loc

我正在两个AWS EC2实例上运行的群集环境中运行Airflow。一个给主人,一个给工人。但工作节点在运行“$worker”时会定期抛出此错误:

[2018-08-09 16:15:43553]{jobs.py:2574}警告-记录的主机名ip-1.2.3.4与此实例的主机名ip-1.2.3.4.eco.tanonprod.comanyname.io不匹配
回溯(最近一次呼叫最后一次):
文件“/usr/bin/afflow”,第27行,在
args.func(args)
文件“/usr/local/lib/python3.6/site packages/afflow/bin/cli.py”,第387行,运行中
运行作业。运行()
文件“/usr/local/lib/python3.6/site-packages/afflow/jobs.py”,第198行,运行中
self._execute()
File“/usr/local/lib/python3.6/site packages/气流/jobs.py”,第2527行,inexecute
self.heartbeat()
文件“/usr/local/lib/python3.6/site-packages/afflow/jobs.py”,第182行,在heartbeat中
self.heartbeat\u回调(会话=会话)
文件“/usr/local/lib/python3.6/site packages/afflow/utils/db.py”,第50行,在包装器中
结果=函数(*args,**kwargs)
文件“/usr/local/lib/python3.6/site packages/afflow/jobs.py”,第2575行,在heartbeat\u回调中
引发AirflowException(“作业运行程序的主机名不匹配”)
airflow.Exception.AirflowException:作业运行程序的主机名不匹配
[2018-08-09 16:15:43671]{Cellery_executor.py:54}错误-命令“气流运行arl_source_emr_test_dag runEmrStep2WaiterTask 2018-08-07T00:00:00--local-sd/var/lib/aiffort/dags/arl_source_emr_test_dag.py”返回非零退出状态1。
[2018-08-09 16:15:43681:错误/ForkPoolWorker-30]任务气流执行器芹菜执行器执行命令[875a4da9-582e-4c10-92aa-5407f3b46d5f]引发意外:AirflowException(“芹菜命令失败”)
回溯(最近一次呼叫最后一次):
文件“/usr/local/lib/python3.6/site packages/afflow/executors/celery\u executor.py”,第52行,在execute\u命令中
子进程检查调用(命令,shell=True)
文件“/usr/lib64/python3.6/subprocess.py”,第291行,在check_调用中
引发被调用的进程错误(retcode,cmd)
subprocess.CalledProcessError:命令“airflow run arl_source_emr_test_dag runemr step2waiterTask 2018-08-07T00:00:00--local-sd/var/lib/airflow/dags/arl_source_emr_test_dag.py”返回非零退出状态1。
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python3.6/dist packages/芹菜/app/trace.py”,第382行,在trace_任务中
R=retval=fun(*args,**kwargs)
文件“/usr/lib/python3.6/dist packages/芹菜/app/trace.py”,第641行,在受保护的调用中__
返回self.run(*args,**kwargs)
文件“/usr/local/lib/python3.6/site packages/afflow/executors/celery\u executor.py”,第55行,在execute\u命令中
raise AirflowException('芹菜命令失败')
airflow.Exception.AirflowException:芹菜命令失败
发生此错误时,任务将在气流上标记为失败,因此当任务中没有任何实际错误时,我的DAG将失败

我使用Redis作为队列,postgreSQL作为元数据库。两者都是外部的AWS服务。我在我的公司环境中运行所有这些,这就是为什么服务器的全名是
ip-1.2.3.4.eco.tanonprod.comanyname.io
。看起来它想在某个地方使用这个全名,但我不知道我需要在哪里修正这个值,以便它得到
ip-1.2.3.4.eco.tanonprod.comanyname.io
而不是
ip-1.2.3.4

这个问题真正奇怪的是,它并不总是发生。当我运行DAG时,它似乎只是偶尔随机发生一次。它也会偶尔出现在我所有的DAG上,所以它不仅仅是一个DAG。我发现这很奇怪,虽然它是零星的,因为这意味着其他任务运行正在处理IP地址,无论这是什么都可以

注意:出于隐私原因,我已将真实IP地址更改为1.2.3.4

回答:


这正是我遇到的问题,AWS EC2实例上的其他用户也遇到了这个问题。

主机名在任务实例运行时设置,并设置为
self.hostname=socket.getfqdn()
,其中socket是python包
导入socket

触发此错误的比较是:

fqdn = socket.getfqdn()
if fqdn != ti.hostname:
    logging.warning("The recorded hostname {ti.hostname} "
        "does not match this instance's hostname "
        "{fqdn}".format(**locals()))
    raise AirflowException("Hostname of job runner does not match")

当辅助进程运行时,ec2实例上的主机名似乎正在更改。也许可以尝试按此处所述手动设置主机名,看看是否仍然有效。

我的Mac电脑也有类似问题。它修复了在我的Mac电脑上运行时设置
hostname\u callable=socket:gethostname
的问题。我个人发现,在我运行一个长作业时,Mac电脑会休眠时,我也会遇到类似的错误。解决方案是进入系统首选项->节能,然后选中“防止电脑在显示器关闭时自动休眠”。

啊,真是个好发现。很高兴您找到了原因。您认为实施此修复程序的最佳解决方案是什么?我不知道我是否应该手动将修复应用于需要它的Airflow文件,或者fork Airflow和cherry pick此提交具有修复?而且这似乎是我遇到另一个问题的最终原因,该问题的50分悬赏已于昨天结束,因此您可能应该获得该悬赏!抱歉,哈哈。就我个人而言,我会选择更改,而不是在版本控制之外进行更改。也就是说,在线程的更深处还有另一个PR,它有一个更健壮的解决方案,并且已经被合并,并且是1.10稳定分支的一部分。这取决于您是否要升级到1.10。请尝试
pip-install-git+https://github.com/apache/incubator-airflow.git@v1-10-stable
,强制它使用一个稳定的分支。我要添加的唯一内容是将它放在[core]部分下
fqdn = socket.getfqdn()
if fqdn != ti.hostname:
    logging.warning("The recorded hostname {ti.hostname} "
        "does not match this instance's hostname "
        "{fqdn}".format(**locals()))
    raise AirflowException("Hostname of job runner does not match")