【问题标题】:airflow S3ToGoogleCloudStorageOperator No space left on device气流 S3ToGoogleCloudStorageOperator 设备上没有剩余空间
【发布时间】:2019-02-23 06:59:02
【问题描述】:

我正在尝试使用 Airflow 及其 Operator S3ToGoogleCloudStorageOperator 将大文件从 S3 传输到 GCP。我已经能够传输 400 Mb 的文件,但如果我尝试更大,我会失败:2Gb 我收到以下错误:

[2018-09-19 12:30:43,907] {models.py:1736} 错误 - [Errno 28] 没有空格 留在设备 Traceback 上(最近一次通话最后一次):
文件“/home/jma/airflow/env/lib/python3.5/site-packages/airflow/models.py”, 第 1633 行,在 _run_raw_task 结果 = task_copy.execute(context=context)
文件“/home/jma/airflow/env/lib/python3.5/site-packages/airflow/contrib/operators/s3_to_gcs_operator.py”,第 156 行,在执行 file_object.download_fileobj(f)
文件“/home/jma/airflow/env/lib/python3.5/site-packages/boto3/s3/inject.py”, 第 760 行,在 object_download_fileobj ExtraArgs=ExtraArgs, 回调=回调,配置=配置)
文件“/home/jma/airflow/env/lib/python3.5/site-packages/boto3/s3/inject.py”,第 678 行,在 download_fileobj 返回 future.result()
文件“/home/jma/airflow/env/lib/python3.5/site-packages/s3transfer/futures.py”,第 73 行,结果返回 self._coordinator.result()
文件“/home/jma/airflow/env/lib/python3.5/site-packages/s3transfer/futures.py”,第 233 行,结果引发 self._exception
调用中的文件“/home/jma/airflow/env/lib/python3.5/site-packages/s3transfer/tasks.py”,第 126 行,返回 self._execute_main(kwargs)
_execute_main 中的文件“/home/jma/airflow/env/lib/python3.5/site-packages/s3transfer/tasks.py”,第 150 行 return_value = self._main(**kwargs)
_main fileobj.write(data)
中的文件“/home/jma/airflow/env/lib/python3.5/site-packages/s3transfer/download.py”,第 583 行 文件“/home/jma/airflow/env/lib/python3.5/tempfile.py”,第 622 行,在 func_wrapper 返回 func(*args, **kwargs) OSError: [Errno 28] 设备上没有剩余空间

DAG 的完整代码可以在other SO question 中找到。

文件不会直接从 S3 传输到 GCP,而是下载到运行 Airflow 的机器上。查看痕迹,似乎 boto 可能是负责任的,但仍然无法弄清楚如何解决此问题,即为要临时复制的文件分配一个文件夹。

我想移动非常大的文件,如何设置才能不受限制?

我在 GCP 中从 Google Cloud Shell 运行 Airflow 1.10,我的主目录中有 4 Gb 的可用空间(要移动的文件是 2 Gb)

【问题讨论】:

  • 尝试以下解决方案:stackoverflow.com/questions/6998083/…
  • 实例有多少物理内存?
  • @cwurtz,Google Cloud Shell 在具有 1.7Gb 的 g1-small 实例上运行,如 kaxil 提供的链接中所建议的,拥有 2Gb 文件可能是一个问题

标签: google-cloud-platform boto3 airflow google-cloud-shell


【解决方案1】:

我认为最好的选择是使用谷歌云存储的传输服务。您可以轻松地将数据从 S3 移动到 GCP [1]。我认为信息量不是问题,但是请记住请求数量的限制[2]

[1]https://cloud.google.com/storage-transfer/docs/ [2]https://cloud.google.com/storage-transfer/quotas

【讨论】:

  • 是的,我们已经看到了这个选项,我现在正在实施一个测试。我预见的问题(称我为悲观主义者)是我们将在另一个调度器中拥有一个调度器,因为我们需要继续使用 Airflow 来完成整个过程。你知道有什么项目在做类似的事情,这样我们就不会落入同样的陷阱吗?
  • 不幸的是,我不知道另一个项目/工具来完成这个。如果您按块执行这种大传输怎么办?错误:“设备上没有剩余空间”,肯定是由于当文件上传到 GCS 时,信息缓存在需要空间的临时文件夹中。另一种选择可能是在具有更多资源的机器上运行它。
  • 感谢您的 cmets,@ETDeveloper。使用 Google Transfer 的诀窍不是指定时间,而是立即启动(在我有限的测试显示的范围内)传输,因此您基本上可以忽略 Google Transfer 上的调度程序,然后您需要跟踪传输状态以知道操作已经完成。
  • 是的,这是一个重要的限制,现在我明白你为什么使用 Airflow。也许您可以为 Google Transfer Service [1] 创建一个功能请求。我知道这不是一个立竿见影的解决方案,但它会帮助 GCP 工程团队在他们的雷达 [1] cloud.google.com/support/docs/issue-trackers#feature_requests
猜你喜欢
  • 1970-01-01
  • 2012-12-29
  • 2012-01-14
  • 2012-05-15
  • 2018-11-22
  • 2015-07-21
  • 2020-12-16
  • 2014-11-20
  • 2018-12-27
相关资源
最近更新 更多