不久前,我使用一个处于暂停状态的测试 DAG 设置了气流的测试安装。
现在,在这个系统运行了几个星期而实际上没有做太多事情(除了一些测试运行之外)之后,我想转储数据库并意识到它是巨大的。
这是由于 dag_pickle 表,气流显然会创建一个 pickle 对象并每秒将其保存在数据库中。
但是,数据库中的这些 pickle 行都与 dag 无关,dag 行中的pickle_id字段为空:
mysql> select * from dag;
+------------------+-----------+-----------+-----------+----------------------------+--------------+----------------------------+----------------+-----------+---------------------------------------+---------+
| dag_id | is_paused | is_subdag | is_active | last_scheduler_run | last_pickled | last_expired | scheduler_lock | pickle_id | fileloc | owners |
+------------------+-----------+-----------+-----------+----------------------------+--------------+----------------------------+----------------+-----------+---------------------------------------+---------+
| test_dag | 1 | 0 | 1 | 2017-05-10 11:13:57.987710 | NULL | 2017-05-10 09:40:19.449429 | NULL | NULL | /opt/airflow/dags/test_dag.py | airflow |
+------------------+-----------+-----------+-----------+----------------------------+--------------+----------------------------+----------------+-----------+---------------------------------------+---------+
1 row in set (0.00 sec)
检查 dag_pickle 表,我们看到每秒都会创建一行:
mysql> select max(created_dttm), count(*), now() from dag_pickle;
+----------------------------+----------+---------------------+
| max(created_dttm) | count(*) | now() |
+----------------------------+----------+---------------------+
| 2017-05-10 11:20:26.000000 | 1893572 | 2017-05-10 11:20:26 |
+----------------------------+----------+---------------------+
1 row in set (13.71 sec)
mysql> select max(created_dttm), count(*), now() from dag_pickle;
+----------------------------+----------+---------------------+
| max(created_dttm) | count(*) | now() |
----------------------------+----------+---------------------+
| 2017-05-10 11:20:40.000000 | 1893586 | 2017-05-10 11:20:41 |
+----------------------------+----------+---------------------+
1 row in set (12.55 sec)
mysql> SELECT 1893586-1893572 as delta, TIMEDIFF('2017-05-10 11:20:41','2017-05-10 11:20:26') as time_delta;
+-------+------------+
| delta | time_delta |
+-------+------------+
| 14 | 00:00:15 |
+-------+------------+
1 row in set (0.00 sec)
(如您所见,这个表太大以至于它成为一个操作负担,它现在是 7.5 GB 大小)
我现在的问题是:
所有这些泡菜行都用于任何用途,还是我可以保存删除它们?(我假设后者,因为没有来自 dag 的引用)是否有一些清理程序可以从数据库中删除未使用的内容?
这是我的配置错误还是气流错误?我可以配置气流,以便仅在实际需要时创建这些泡菜对象吗?
donot_pickle配置选项到底有什么影响,如果 donot_pickle 设置为True ,我还能从另一台机器上的工作人员运行 DAG吗?
谢谢!