如何对 Snowpipe 自动摄取故障进行故障排除?

Posted

技术标签:

【中文标题】如何对 Snowpipe 自动摄取故障进行故障排除?【英文标题】:How to troubleshoot Snowpipe auto ingest failures? 【发布时间】:2020-08-13 10:02:50 【问题描述】:

我正在尝试从 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, 1, 'e', 1),
            REGEXP_SUBSTR(METADATA$FILENAME,'build_number=([0-9]+)',1, 1, 'e', 1),
            $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,'job_name=(.*)/',1, 1, 'e', 1),
          REGEXP_SUBSTR(METADATA$FILENAME,'build_number=([0-9]+)',1, 1, 'e', 1),
        $1:cpu_perc::INT,
        $1:mem::BIGINT,
        $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 路径,没有任何空格或=s,但没有成功。

我做错了什么,我怎么知道这里有什么问题?

【问题讨论】:

这里可以发一条json记录吗 嗨 - 您是否尝试过此处雪花文档的“重要”部分中列出的 7 个步骤:docs.snowflake.com/en/sql-reference/sql/… 【参考方案1】:

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

【讨论】:

原来舞台路径有问题,把_换成-。所以这里的关键是缺少 lastForwardedMessageTimestamp。【参考方案2】:

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

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

【讨论】:

以上是关于如何对 Snowpipe 自动摄取故障进行故障排除?的主要内容,如果未能解决你的问题,请参考以下文章

Snowpipe 自动摄取

Snowpipe 自动摄取配置看起来会触发所有管道

来自 S3 最佳实践的 Snowpipe 连续摄取

如何对 Web API 项目进行故障排除?

如何通过科学的方式对 Docker 进行故障检测和排除?

如何对无法加载的 VSTO 插件进行故障排除?