如何解决:python代码无法通过DAG气流工作:pandas.read_csv('gs://x/y.csv')文件不存在

时间:2019-06-06 09:19:48

标签: python pandas google-cloud-storage airflow google-cloud-composer

我计算机上的代码运行正常,但是当我将其放入DAG中以通过Airflow运行时,它不起作用。我使用GCP和作曲家。其他任务在同一云存储上正常运行。作曲者拥有所需的所有权限。

def get_results():
    import pandas as pandas
    df = pandas.read_csv('gs://y/x.csv')

with models.DAG(
        ...) as dag:
     search_simmilar = python_operator.PythonOperator(
         task_id='search',
         python_callable=get_results
     )

气流日志中的错误:

File "pandas/_libs/parsers.pyx", line 695, in pandas._libs.parsers.TextReader._setup_parser_sourc
FileNotFoundError: File b'gs://y/x.csv' does not exis

4 个答案:

答案 0 :(得分:1)

检查在作曲家中安装的pandas版本。 熊猫版本0.24.0添加了对通过gcsfs库读取/写入Google Cloud Storage的支持

注意:升级熊猫版本可能会破坏现有的操作员,因为这些挂钩将使用或依赖于较早的熊猫版本。 例如。由于对熊猫的依赖,BigQueryOperator将失败。 在这种情况下,您可以选择使用PythonVirtualenvOperator或KubernetesPodOperator,在其中可以安装依赖模块(如pandas> 0.24.0)而不会影响现有环境。

答案 1 :(得分:0)

我可以想到两种解决方法:

  • 简便的方法
    • 将CSV文件与dags文件一起放入DAG.py文件夹中。
    • Composer在创建时自动将其目录结构映射到GCS,如查看airflow.cfg所示
    • 使用路径/home/airflow/gcs/dags/<path>/<to>/<file>.csv
    • 访问文件
  • 更复杂的方式(以现有的operator为例)
    • 创建一个gcs_hook
    • 运行GoogleCloudStorageHook.download(bucket, object)
    • (可选)将字节字符串另存为NamedTemporaryFile
    • 将此文件或字节字符串读入熊猫

答案 2 :(得分:0)

GCP作曲者使用Cloud Storage FUSE,它将您的作曲者dag文件夹映射到放置DAG的SELECT * from test_table order by name; ----|---- name|ord ----|---- a |1 a |2 b |3 c |4 d |5 存储桶(例如:Google cloud storage)。

我建议您将dag之间共享的文件放在映射到gs://bucket-name/dags的文件夹/home/airflow/gcs/data中。在这里,您可以了解有关gs://bucket-name/dagsGoogle cloud storage的更多信息:https://cloud.google.com/composer/docs/concepts/cloud-storage

还有一个例子:

Composer

答案 3 :(得分:0)

  1. 创建一个变量,转到“仪表板”->“管理”->“变量”,使用gc存储桶创建一个新变量。例如,我用于密钥:gcs_bucket和用于val:gs:// your_unique_key

  2. 在dag文件导入中:

FILE *inf = fopen("data.bin", "rb");
if (inf) {
  double data[N];
  size_t n;
  while ((n = fread(data, sizeof data[0], N, inf)) > 0) {
    printf("Read %zu doubles, first one %g\n", n, data[0]);
  }
  fclose(inf);
}