雪花云数据平台-如何解决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, 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添加到bucket的事件中,带有:

  • 前缀: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,但都没有成功。

我做错了什么,我怎么能弄清楚这里出了什么问题?

查看指向S3存储桶的阶段。具有不同粒度级别的多个阶段可能会导致消息队列的读取冲突。如果管道工作正常并看到消息,您将看到一个如您所述的最后ForwardedMessageTimestamp。如果您没有看到这一点,那么您的队列中没有任何消息,或者管道没有正确读取队列,或者存在冲突,其他人正在首先读取队列消息。您是否有权检查您的SQS队列日志,以确保消息首先出现,并且您的队列正在工作?如果您的队列工作正常,我会仔细检查您是否具有正确设置队列的权限,并且您的集成和队列上没有多个阶段冲突。

管道创建语句的末尾可能缺少file_format=(type='JSON'(

此外,根据文档,您可能需要将aws_sns_topic设置为'<sns_topic_arn>'在管道定义中还有

最新更新