Airflow mysql to gcp Dag error

后端 未结 1 1318
余生分开走
余生分开走 2021-01-29 01:56

I\'m recently started working with Airflow. I\'m working on DAG that:

  1. Queries the MySQL database
  2. Extract the query and stores it in a cloud storage bucket
1条回答
  •  一向
    一向 (楼主)
    2021-01-29 02:19

    According to your traceback, your code is breaking at this point. As you can see, it process the code:

    json.dump(row_dict, tmp_file_handle)
    

    tmp_file_handle is a NamedTemporaryFile initialized with default input args, that is, it simulates a file opened with w+b mode (and therefore only accepts bytes-like data as input).

    The problem is that in Python 2 all strings are bytes whereas in Python 3 strings are texts (encoded by default as utf-8).

    If you open a Python 2 and run this code:

    In [1]: from tempfile import NamedTemporaryFile
    In [2]: tmp_f = NamedTemporaryFile(delete=True)
    In [3]: import json
    In [4]: json.dump({'1': 1}, tmp_f)
    

    It works fine.

    But if you open a Python 3 and run the same code:

    In [54]: from tempfile import NamedTemporaryFile
    In [55]: tmp_f = NamedTemporaryFile(delete=True)
    In [56]: import json
    In [57]: json.dump({'1': 1}, tmp_f)
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
     in ()
    ----> 1 json.dump({'1': 1}, tmp_f)
    
    /usr/local/lib/python3.6/json/__init__.py in dump(obj, fp, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, default, sort_keys, **kw)
        178     # a debuggability cost
        179     for chunk in iterable:
    --> 180         fp.write(chunk)
        181 
        182 
    
    /usr/local/lib/python3.6/tempfile.py in func_wrapper(*args, **kwargs)
        481             @_functools.wraps(func)
        482             def func_wrapper(*args, **kwargs):
    --> 483                 return func(*args, **kwargs)
        484             # Avoid closing the file as long as the wrapper is alive,
        485             # see issue #18879.
    
    TypeError: a bytes-like object is required, not 'str'
    

    We get the same error as yours.

    This means that Airflow is still not fully supported for Python 3 (as you can see in the test coverage, the module airflow/contrib/operators/mysql_to_gcs.py is not yet tested either in python 2 or 3). One way to confirm this would be to run your code using python 2 and see if it works.

    I'd recommend creating an issue on their JIRA requesting portability for both versions of Python.

    0 讨论(0)
提交回复
热议问题