Хорошо, из коробки нельзя запустить работника потока воздуха Python 2 на общем кластере потока воздуха Python 3:
Airflow использует SQLAlchemy (я полагаю, что для чтения и записи метаданных о группах обеспечения доступности баз данных в базу данных). Когда вы запускаете группу обеспечения доступности баз данных на работнике, она считывает из базы данных маринованную информацию об этой группе доступности базы данных. Если ваши другие нерабочие компоненты находятся в Python 3, они будут записывать в БД в Pickle 4, в то время как рабочий будет пытаться читать из БД в Python 2.
В частности, посмотрите в SQLAlchemy посмотрите на sqltypes.py:
class PickleType(TypeDecorator):
"""Holds Python objects, which are serialized using pickle.
PickleType builds upon the Binary type to apply Python's
``pickle.dumps()`` to incoming objects, and ``pickle.loads()`` on
the way out, allowing any pickleable Python object to be stored as
a serialized binary field.
To allow ORM change events to propagate for elements associated
with :class:`.PickleType`, see :ref:`mutable_toplevel`.
"""
impl = LargeBinary
def __init__(self, protocol=pickle.HIGHEST_PROTOCOL,
pickler=None, comparator=None):
и затем в compat.py, который в конечном итоге делает травление в sqltypes.py.
py36 = sys.version_info >= (3, 6)
py33 = sys.version_info >= (3, 3)
py35 = sys.version_info >= (3, 5)
py32 = sys.version_info >= (3, 2)
py3k = sys.version_info >= (3, 0)
py2k = sys.version_info < (3, 0)
py265 = sys.version_info >= (2, 6, 5)
jython = sys.platform.startswith('java')
pypy = hasattr(sys, 'pypy_version_info')
win32 = sys.platform.startswith('win')
cpython = not pypy and not jython # TODO: something better for this ?
import collections
next = next
if py3k:
import pickle
else:
try:
import cPickle as pickle
except ImportError:
import pickle
Также donot_pickle = True в потоке воздуха, похоже, не влияет на это ??? Может быть, потому что согласно здесь это относится только к засыпкам?