Поток воздуха «Это соединение закрыто» при запуске, но не в тесте

#python #oracle #sqlalchemy #airflow

#python #Oracle #sqlalchemy #воздушный поток

Вопрос:

Я использую airflow 1.7.1.3 и python 2.7

Я создал DAG, который отлично работает, когда я запускаю каждую задачу отдельно, используя

тест воздушного потока [myDAG] [MyTask] 2016-10-14

Однако,

триггер воздушного потока_даг [myDAG]

или

воздушный поток выполнить [myDAG] [MyTask] 2016-10-14

оба вызывают ошибку SQLAlchemy «Это соединение закрыто».

 [...]
    with self.engine.connect() as connection:
  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 2016, in connect
    return self._connection_cls(self, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 72, in __init__
    if connection is not None else engine.raw_connection()
  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 2102, in raw_connection
    self.pool.unique_connection, _connection)
  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 2072, in _wrap_pool_connect
    return fn()
  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 318, in unique_connection
    return _ConnectionFairy._checkout(self)
  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 746, in _checkout
    raise exc.InvalidRequestError("This connection is closed")
InvalidRequestError: This connection is closed
[2016-10-14 15:49:30,704] {models.py:1306} INFO - Marking task as FAILED.
[2016-10-14 15:49:30,712] {models.py:1327} ERROR - This connection is closed
 

Это подключение к базе данных Oracle 12 через SQLAlchemy, и эта ошибка возникает, когда я использую session.commit() в моем скрипте.

Есть ли у кого-нибудь какие-либо подсказки о том, что может объяснить эту разницу и ошибку?

Комментарии:

1. запрос v $resource_limit . он показывает использование процессов в базе данных. если он достиг максимального значения увеличения параметра processes в базе данных.

2. Спасибо за ваш ответ. Я проверил в базе данных, и я остаюсь в пределах границ. значение current_utilization равно 108 , значение max_utilization равно 160, а limit_value равно 300. Все остальные значения v $resource_limit находятся в пределах границ.

3. Можете ли вы также проверить журнал предупреждений.

4. Спасибо за подсказку. Я обнаружил <msg time='2016-10-17T11:52:47.755 02:00' org_id='xxxxxx' comp_id='rdbms' type='UNKNOWN' level='16' host_id='xxxxxxx' host_addr='xxxxxx' module='python@xxxxxxx' pid='8978'> <txt>Using deprecated SQLNET.ALLOWED_LOGON_VERSION parameter. </txt> </msg> , что я получаю эту ошибку при тестировании воздушного потока и запуске воздушного потока. Но, возможно , тест airlfow менее строгий. Я постараюсь исправить эту ошибку.

Ответ №1:

Это известная ошибка, описанная здесь . Вы не сможете подключиться к Oracle через SQLAlchemy, пока эта ошибка не будет исправлена.

Проблема связана с некоторым синтаксисом SQL в исходном коде. Вы не можете сказать «ВЫБЕРИТЕ 1» в Oracle, вам нужно сказать «ВЫБЕРИТЕ 1 ИЗ DUAL».

Возможно, рассмотрите возможность использования одного из хуков в Airflow: https://github.com/apache/incubator-airflow/tree/master/airflow/hooks

Похоже, что есть oracle_hook, который может вам помочь. Удачи.

Комментарии:

1. Спасибо. Это мой собственный ответ в ссылке. Я должен был обновиться здесь.

2. Я создал тикет на jira. issues.apache.org/jira/browse/AIRFLOW-603 Она все еще открыта.

3. Я исправил проблему, определив свой собственный oracle_connector и пропустив создание движка sql_alchemy. Я создал объект подключения непосредственно через cx_Oracle.