如何解决Snowpipe自动提取失败?

问题描述

我正在尝试从AWS S3存储桶中加载所有新文件,具体取决于其到两个SNowflake表的路径,但是即使有一个表,我也无法成功。 我尝试过的:

创建了一个阶段:

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

创建表格:

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,'e',1),REGEXP_SUBSTR(MetaDATA$FILENAME,'build_number=([0-9]+)',$1:cpu_perc::INT,$1:mem::BIGINT,$1:timestamp::TIMESTAMP
        from @DATA_SCIENCE.INFRA.jobs_resource_usage/metrics/);

通过以下方式将SQS ARN添加到存储桶的事件中:

  • 前缀:jobs_resource_usage /
  • 后缀:.json
  • 发送至:SQS队列
  • SQS队列ARN:select parse_json(SYstem$PIPE_STATUS('DATA_SCIENCE.INFRA.job_metrics')):notificationChannelName;返回的那个队列

该阶段有效,因为我可以使用以下方式列出文件

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

哪个返回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,$1: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路径,没有空格或=,但是没有成功。

我做错了什么,如何找出这里的问题?

解决方法

查看指向S3存储桶的阶段。具有不同粒度级别的多个阶段可能会导致消息队列的读取冲突。如果管道正常运行并看到消息,您将看到如前所述的lastForwardedMessageTimestamp。如果未看到该消息,则说明您的队列中没有任何消息,或者管道未正确读取队列,或者发生冲突,并且其他原因首先读取了队列消息。您是否有权检查SQS队列日志以确保消息首先显示并且队列正在工作?如果您的队列工作正常,我将再次检查您是否对队列设置具有正确的权限,并且在集成和队列中没有多个阶段发生冲突。

,

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

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