如何排查 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 添加到存储桶的事件中:
- 前缀: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';
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=''
我正在尝试根据 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 添加到存储桶的事件中:
- 前缀: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';
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='