首页 > 解决方案 > Pandas:AWS S3 存储桶中的“read_csv”函数有时会返回“FileNotFoundError”

问题描述

我开发了一个 AWS lambda,它在“eu-west-1”区域中的 s3 事件(文件创建)上触发。此 lambda 读取触发它的“csv”文件,然后对其进行处理(因此存在!)...总执行时间最长为 4 秒。文件每 10 秒左右到达一次,并且它在几周内一直都能完美运行。今天,20 分钟,当 lambda 读取触发它的文件时,“FileNotFoundError”异常系统地导致错误。几分钟后,当我手动重新上传产生错误的文件时,lambda 成功运行。

这是 lambda 代码的示例:

import pandas as pd
import boto3

...

def lambda_handler(event, context):

    for record in event['Records']:
        bucket_name = record['s3']['bucket']['name']
        source_key = unquote_plus(record['s3']['object']['key'])

        df = pd.read_csv(f"s3://{bucket_name}/{source_key}", sep=',', index_col=0)  # Returns sometimes "FileNotFoundError"
...

以下是 lambda 执行返回的错误日志:

[ERROR] FileNotFoundError: frefin-bitbot-prd-202714940105-eu-west-1-data/data/collection/kraken/order_book/depth-100/compilation/xxbtzusd/timeframe-10/shift-0/XXBTZUSD_1599718540_1599718550_10_0.csv
Traceback (most recent call last):
  File "/var/task/entrypoint.py", line 96, in lambda_handler
    df = pd.read_csv(f"s3://{bucket_name}/{source_key}", sep=',', index_col=0)
  File "/var/task/pandas/io/parsers.py", line 686, in read_csv
    return _read(filepath_or_buffer, kwds)
  File "/var/task/pandas/io/parsers.py", line 435, in _read
    filepath_or_buffer, encoding, compression
  File "/var/task/pandas/io/common.py", line 222, in get_filepath_or_buffer
    filepath_or_buffer, mode=mode or "rb", **(storage_options or 
{}
)
  File "/var/task/fsspec/core.py", line 133, in open
    out = self.__enter__()
  File "/var/task/fsspec/core.py", line 101, in __enter__
    f = self.fs.open(self.path, mode=mode)
  File "/var/task/fsspec/spec.py", line 844, in open
    **kwargs
  File "/var/task/s3fs/core.py", line 378, in _open
    autocommit=autocommit, requester_pays=requester_pays)
  File "/var/task/s3fs/core.py", line 1097, in __init__
    cache_type=cache_type)
  File "/var/task/fsspec/spec.py", line 1134, in __init__
    self.details = fs.info(path)
  File "/var/task/s3fs/core.py", line 527, in info
    if self.version_aware or (key and self._ls_from_cache(path) is None) or refresh:
  File "/var/task/fsspec/spec.py", line 321, in _ls_from_cache
    raise FileNotFoundError(path)

我对此有两个问题:

  1. 您对此错误有解释吗?
  2. 如何最好地处理这种情况?

提前致谢

标签: pythonpandasamazon-web-servicesamazon-s3boto3

解决方案


如何最好地处理这种情况?

我没有解释为什么会发生,但我有一些想法如何处理它,或者至少尝试管理这种情况。您可以在函数中实现错误重试和指数退避。如果发生错误,您将捕获它,并以不同的延迟重试几次。

如果退避没有帮助,并且故障被隔离,您可以为您的函数设置死信队列以捕获导致这些错误的“坏”S3 事件。通过这种方式,您可以自动响应它们,例如获取通知和排除故障。


推荐阅读