【问题标题】:View Log Failure; Airflow Celery Worker DNS is Incorrect, How Can I Fix It?查看日志失败; Airflow Celery Worker DNS 不正确,我该如何修复?
【发布时间】:2018-01-28 17:48:48
【问题描述】:

总结
我正在使用 Celery Executer 以分布式模式运行 Airflow。我在 AWS 上有两个 RHEL7 EC2 实例,一个主实例(网络服务器、调度程序、花)和一个工作线程。我无法通过 UI 查看日志。

问题的根源
(在 AWS 上)我使用的 DNS 服务器通过删除生成的 DNS 名称中的第一个八位字节来截断 DNS 记录。如果实例 IP 地址为 10.204.224.123,则 DNS A-Record 将为 IP-204-224-123.xxx.domain.com。

效果
task_instance表中记录的hostname值被记录为AWS最初提供的DNS记录,不正确。

这会导致尝试通过 UI 查看日志时失败。

*** Log file isn't local.
*** Fetching here: http://<incorrect-dns>:8793/log/<dag>/<task>/<log-timestamp>
*** Failed to fetch log file from worker.

*** Reading remote logs...
*** Unsupported remote log location.

工作环境

  • 如果我编辑(删除“-10”)用户界面试图在其中查找日志的 URL,那么我只需在地址栏中输入即可在浏览器中查看它。
  • 如果我手动修改task_instance 表:

    UPDATE task_instance SET hostname = replace(hostname,'ip-10-','ip-');
    

    然后 UI 可以找到它们(对于已运行的 dag)。

询问
如何以编程方式修改工作人员地址的存储方式?有人可以指出我处理这个的气流代码吗?我希望 UI 中的 View Log 页面能够正常工作。

【问题讨论】:

  • 作为一种变通方法 - 您可以在私有托管区域上公布“错误”的 DNS 主机名,然后该代码就会起作用。
  • 我无法控制 DNS 服务器,也无法与私有托管区域进行交互。上游问题严格来说是给定的。
  • 想通了。 aws.amazon.com/premiumsupport/knowledge-center/… 由于我使用的是公司 AMI,解决方案对我来说略有不同,但这是我最终所做的一般对应物。
  • 酷。您当时为实例分配了什么主机名?无效的?

标签: amazon-web-services amazon-ec2 dns celery airflow


【解决方案1】:

如果您使用的是 Airflow 1.9.0+,其中添加了对自定义日志记录类的支持,那么您可以编写自己的任务日志处理程序,以使用修改后的 url 格式搜索日志。这很好,因为您不必直接更改 Airflow 中的任何代码。

“查看日志”endpoint 获取所有相关的任务实例,然后从task_log_reader 下的配置中获取日志处理程序的名称。然后它会找到应该在 logging_config_class 中的处理程序来获取所有日志。

因此,您需要编写一个继承自 airflow.utils.log.FileTaskHandler 的自定义类,但 forms the log url 不同。然后,您将需要编写一个使用此类的自定义日志记录配置。您可以复制airflow.config_templates.airflow_local_settings.DEFAULT_LOGGING_CONFIG 并更改class for the file task handler。也许是这样的:

class AWSFileTaskHandler(FileTaskHandler):

    def _read(self, ti, try_number):
        ti = ti.hostname.replace(hostname,'ip-10-','ip-')
        super(AWSFileTaskHandler, self)._read(ti, try_number)

DEFAULT_LOGGING_CONFIG = {
    ... # may have to copy paste this over, I had trouble importing because it then tries to load config, endless cycle
}
MY_LOGGING_CONFIG = DEFAULT_LOGGING_CONFIG.copy()
MY_LOGGING_CONFIG['handlers']['file.task']['class'] = 'foo.bar.AWSFileTaskHandler'

最后,记得在你的气流配置文件中设置logging_config_class = foo.bar.MY_LOGGING_CONFIG

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2019-04-24
    相关资源
    最近更新 更多