如何确定哪个 DAG/任务导致节点内存问题?
How do I identify which DAG / task is causing Node memory issues?
我们的 DAG 中的任务经常失败,在遵循 Google 的 troubleshooting steps 之后,我确定了根本原因是内存不足导致的内存逐出。
这与我在 Composer Monitoring 选项卡的每个节点的内存利用率图表中看到的相符。我们的机器支持 8 GB 节点,最大峰值为 16 GB。
Screen shot of memory utilization per node graph, which shows memory spikes
我卡住的地方是确定哪些 DAG 导致了内存峰值。 (我的假设是 "DAG A" 可能导致内存峰值,导致 "DAG B" 被驱逐)。我想重新访问代码,看看是否可以在增加机器大小之前对其进行优化。
如何连接点以了解给定 Kubernetes 节点在给定时间正在处理哪些任务?
如果您需要知道哪个 DAG 运行在给定时间的哪个实例中,一种方法是使用 Airflow 元数据数据库。
为此,请按照以下步骤操作:
- 转到 GKE 页面并单击您的集群。
- 在您的集群页面中,单击页面顶部的 连接 按钮(在部署和复制之间)
弹出窗口 window 将打开,其中包含两个选项。点击云端 Shell 中的 运行。之后,将使用如下命令打开 Cloud Shell 实例。只需按回车键提交此命令。
gcloud container clusters get-credentials <cluter_id> --zone <cluster_zone> --project <project_id>`
然后运行下面的命令部署临时MySQL镜像
kubectl run mysql-cli-tmp-deployment \
--generator=run-pod/v1 \
--rm --stdin --tty \
--image mysql:latest \
-- \
bash
运行 下面的命令连接到您的 MySQL 实例
mysql \
--user root \
--host airflow-sqlproxy-service.default
现在您可以使用SHOW DATABASES;
来确定我们需要什么数据库。如果您使用的是新版本的 Composer,数据库名称将类似于 composer-< some_version >-airflow-< some_version >-< some_hash >。对于旧版本,名称将为 airflow-db。确定你的数据库后,只要输入命令use <your_database>;
现在如果你 运行 SHOW TABLES:
你会发现很多不同的信息。为了您的目的,我建议您 运行 select * from job limit 10;
通过 运行 这个查询,你会看到这个 table 有很多关于任务的信息:DAG id,开始日期,结束日期,主机名(集群中的每个节点都有一个主机名)[。 ..]
最后,作为最后一步,我想解释一下如何确定哪个主机名与哪个节点相关联。
- 转到 GKE 页面并单击 Workloads
- 点击airflow-worker
- 向下滚动到 Managed pods 部分,您将找到主机名。如果你点击其中任何一个,你将能够在下一页看到它的节点。
利用这些信息,您将能够 运行 查询以确定哪个 DAG 运行在给定时间的哪个实例中。
我们的 DAG 中的任务经常失败,在遵循 Google 的 troubleshooting steps 之后,我确定了根本原因是内存不足导致的内存逐出。
这与我在 Composer Monitoring 选项卡的每个节点的内存利用率图表中看到的相符。我们的机器支持 8 GB 节点,最大峰值为 16 GB。
Screen shot of memory utilization per node graph, which shows memory spikes
我卡住的地方是确定哪些 DAG 导致了内存峰值。 (我的假设是 "DAG A" 可能导致内存峰值,导致 "DAG B" 被驱逐)。我想重新访问代码,看看是否可以在增加机器大小之前对其进行优化。
如何连接点以了解给定 Kubernetes 节点在给定时间正在处理哪些任务?
如果您需要知道哪个 DAG 运行在给定时间的哪个实例中,一种方法是使用 Airflow 元数据数据库。 为此,请按照以下步骤操作:
- 转到 GKE 页面并单击您的集群。
- 在您的集群页面中,单击页面顶部的 连接 按钮(在部署和复制之间)
弹出窗口 window 将打开,其中包含两个选项。点击云端 Shell 中的 运行。之后,将使用如下命令打开 Cloud Shell 实例。只需按回车键提交此命令。
gcloud container clusters get-credentials <cluter_id> --zone <cluster_zone> --project <project_id>`
然后运行下面的命令部署临时MySQL镜像
kubectl run mysql-cli-tmp-deployment \ --generator=run-pod/v1 \ --rm --stdin --tty \ --image mysql:latest \ -- \ bash
运行 下面的命令连接到您的 MySQL 实例
mysql \ --user root \ --host airflow-sqlproxy-service.default
现在您可以使用
SHOW DATABASES;
来确定我们需要什么数据库。如果您使用的是新版本的 Composer,数据库名称将类似于 composer-< some_version >-airflow-< some_version >-< some_hash >。对于旧版本,名称将为 airflow-db。确定你的数据库后,只要输入命令use <your_database>;
现在如果你 运行
SHOW TABLES:
你会发现很多不同的信息。为了您的目的,我建议您 运行select * from job limit 10;
通过 运行 这个查询,你会看到这个 table 有很多关于任务的信息:DAG id,开始日期,结束日期,主机名(集群中的每个节点都有一个主机名)[。 ..]最后,作为最后一步,我想解释一下如何确定哪个主机名与哪个节点相关联。
- 转到 GKE 页面并单击 Workloads
- 点击airflow-worker
- 向下滚动到 Managed pods 部分,您将找到主机名。如果你点击其中任何一个,你将能够在下一页看到它的节点。
利用这些信息,您将能够 运行 查询以确定哪个 DAG 运行在给定时间的哪个实例中。