如何排查 Snowpipe 自动摄取失败问题?

How to troubleshoot Snowpipe auto ingest failures?

我正在尝试根据 AWS S3 存储桶到两个 Snowflake table 的路径从 AWS S3 存储桶加载所有新文件,但即使使用一个 table 我也无法成功。 我尝试过的:

创建了一个舞台:

CREATE or replace STAGE DATA_SCIENCE.INFRA.jobs_resource_usage URL = 's3://om/jobs-resource-usage/'
  storage_integration = om_s3 FILE_FORMAT=(TYPE='JSON');

创建了 table:

create or replace TABLE DATA_SCIENCE.INFRA.job_metrics (
  job_name STRING,
  build_number INT,
  cpu_perc INT,
  mem BIGINT,
  "timestamp" TIMESTAMP
  );

创建了一个管道:

create or replace pipe DATA_SCIENCE.INFRA.job_metrics auto_ingest=true as
    copy into DATA_SCIENCE.INFRA.job_metrics
        from (select
            REGEXP_SUBSTR(METADATA$FILENAME,'job_name=(.*)/',1, 1, 'e', 1),
            REGEXP_SUBSTR(METADATA$FILENAME,'build_number=([0-9]+)',1, 1, 'e', 1),
            :cpu_perc::INT,
            :mem::BIGINT,
            :timestamp::TIMESTAMP
        from @DATA_SCIENCE.INFRA.jobs_resource_usage/metrics/);

将 SQS ARN 添加到存储桶的事件中:

这个舞台很管用,因为我可以像这样列出文件:

ls '@DATA_SCIENCE.INFRA.jobs_resource_usage/metrics/job_name=Ingest job';

returns S3 文件名(包括一个示例以查看其格式):

s3://om/jobs-resource-usage/metrics/job_name=Ingest job/build_number=144.json

我可以成功手动加载文件:

copy into DATA_SCIENCE.INFRA.job_metrics
    from (select
          REGEXP_SUBSTR(METADATA$FILENAME,'job_name=(.*)/',1, 1, 'e', 1),
          REGEXP_SUBSTR(METADATA$FILENAME,'build_number=([0-9]+)',1, 1, 'e', 1),
        :cpu_perc::INT,
        :mem::BIGINT,
        :timestamp::TIMESTAMP
        from @DATA_SCIENCE.INFRA.jobs_resource_usage/metrics/)
        files=('job_name=Ingest job/build_number=144.json');

但是,管道没有加载任何东西。 如果我做一个

select SYSTEM$PIPE_STATUS('DATA_SCIENCE.INFRA.job_metrics');

我可以看到它收到通知消息:

{"executionState":"RUNNING","pendingFileCount":0,"notificationChannelName":"arn:aws:sqs:us-west-2:494544507972:sf-snowpipe-concealed","numOutstandingMessagesOnChannel":7,"lastReceivedMessageTimestamp":"2020-08-13T09:59:21.107Z"}

但是我看不到任何lastForwardedMessageTimestamp条目,这表明路径匹配有问题? 我已经尝试使用前导斜线进行多种排列,并将文件直接上传到 metrics 路径,没有任何空格或 =s,但没有成功。

我做错了什么,我怎么能找出问题所在?

查看您指向 S3 存储桶的阶段。具有不同粒度级别的多个阶段可能会导致消息队列的读取冲突。如果管道正常工作并看到消息,您将看到您提到的 lastForwardedMessageTimestamp。如果你没有看到,你的队列中没有任何消息,或者管道没有正确读取队列,或者存在冲突,其他东西首先读取队列消息。您是否有权检查您的 SQS 队列日志以确保消息首先显示并且您的队列正在运行?如果您的队列工作正常,我会仔细检查您是否有权正确设置队列,并且您的集成和队列没有多个阶段冲突。

看起来您的管道创建语句末尾可能缺少 file_format = (type = 'JSON')

此外,根据文档,您可能还需要在管道定义中设置 aws_sns_topic=''