2016-09-26 41 views
0

作爲一個氣流和Python新手,甚至不知道我是否問正確的問題,但無論如何要問。 我在CentOS系統上配置了氣流。使用遠程MySql實例作爲後端。在我的代碼,需要得到一些變量,代碼如下所示:氣流數據庫會話不提供任何環境可變

import os 
from airflow.models import Variable 

print(os.environ['SHELL']) 
local_env['SHELL'] = Variable.get('SHELL') 

而且我得到了以下錯誤:

Traceback (most recent call last): File "test2.py", line 5, in local_env['SHELL'] = Variable.get('SHELL') File "/com/work/airflowenv/lib/python2.7/site-packages/airflow/utils/db.py", line 53, in wrapper result = func(*args, **kwargs) File "/com/work/airflowenv/lib/python2.7/site-packages/airflow/models.py", line 3134, in get raise ValueError('Variable {} does not exist'.format(key)) ValueError: Variable SHELL does not exist

它是Variable.get()方法引發異常在models.py中的這段代碼中:

@classmethod 
    @provide_session 
    def get(cls, key, default_var=None, deserialize_json=False, session=None): 
     obj = session.query(cls).filter(cls.key == key).first() 
     if obj is None: 
      if default_var is not None: 
       return default_var 
      else: 
       raise ValueError('Variable {} does not exist'.format(key)) 

其中session.query已經產生無。不太明白會話是如何注入的。以及爲什麼這些會話變量沒有設置。我們應該在遠程MySQL實例上設置一些東西嗎?

順便說一句,我們有另一臺機器上的另一個相同的氣流實例與本地mysql實例。並運行我獨自提供支架上的文字沒有問題:

[2016-09-27 01:54:48,341] {init.py:36} INFO - Using executor

LocalExecutor

/bin/bash /bin/bash

任何設置氣流時,我錯過了什麼? 謝謝,

+0

嘿,我想出了什麼是錯的,在氣流後端數據庫中,有一個稱爲變量的表需要手動填充。由於我沒有將這張表作爲引導步驟填充,因此查詢它們會讓我得到空的數據集。 此外,如果有一些API可以手動填充變量,而無需再次初始化db,那將會很不錯。 由於「變量」表是氣流後端數據庫中的默認表格之一,因此我們應該能夠在初始化數據庫時分配變量。但我無法在任何文件中找到它。有人可以指出我在哪裏找到它? –

回答

0

好吧,終於得到了問題的解決。我所做的是打印查詢,並找出變量必須來自某個稱爲變量的關係數據庫表。挖掘後端數據庫,找到數據庫,將其與工作數據進行比較,並發現「可變」表數據錯過了。 添加這些變量的方法很簡單: 其他變量的氣流變量-s SHELL/bin/bash 等等。

0

通常情況下,當需要使用Airflow db存儲某些信息時,Airflow中的Variable模型已被用作輕量級鍵值存儲。

如果你想存儲執行參數,特別是看起來像一個靜態參數,我建議把它作爲你的DAG定義中的參數文件。