Snowpipe暂停重启后停止从Stage摄取数据,如何加载积压及新增数据
根因说明
从你提供的Snowpipe状态可以判断:Snowpipe本身运行状态正常(executionState为RUNNING),但暂停期间落入Stage的文件对应的对象存储事件通知已经丢失,所以Snowpipe不会自动触发处理这些历史积压文件,才会出现pendingFileCount不为0但队列无待消费消息的情况。
操作步骤
1. 加载2021-05-13 12:52:16.913之后的积压数据
两种方案二选一即可:
方案A:使用COPY INTO手动同步(适合小批量积压)
使用和Snowpipe完全一致的文件格式、转换规则执行COPY命令,默认不会重复加载已经被Snowpipe处理过的文件:
COPY INTO <你的目标表名> FROM @<你的Stage名称>/<可选文件路径前缀> FILE_FORMAT = (FORMAT_NAME = '<Snowpipe使用的文件格式名>') -- 可选指定文件匹配规则,例如 PATTERN = '.*\\.parquet$' MODIFIED_AFTER = '2021-05-13 12:52:16.913' FORCE = FALSE;
方案B:使用PIPE REFRESH异步加载(适合大批量积压,无需会话保持)
触发Snowpipe重新扫描指定时间后的Stage文件,走Snowpipe本身的异步摄取逻辑:
ALTER PIPE <你的Snowpipe名称> REFRESH MODIFIED_AFTER = '2021-05-13 12:52:16.913';
2. 恢复Snowpipe后续新文件自动摄取
当前Snowpipe运行状态正常,仅需验证事件通知链路正常即可:
- 确认你的对象存储(如S3)的事件通知规则配置正常,目标SQS队列和Snowpipe状态返回的
notificationChannelName一致,触发事件为对象创建类事件 - 手动上传一个测试小文件到Stage对应路径,1-2分钟后执行以下SQL验证是否自动摄取成功:
SELECT * FROM TABLE(INFORMATION_SCHEMA.COPY_HISTORY( TABLE_NAME => '<你的目标表名>', START_TIME => DATEADD('hour', -1, CURRENT_TIMESTAMP()) )) ORDER BY LAST_LOAD_TIME DESC LIMIT 10;
- 若测试文件未自动摄取,执行以下命令刷新Snowpipe元数据即可:
ALTER PIPE <你的Snowpipe名称> SET PIPE_EXECUTION_PAUSED = FALSE;
内容的提问来源于stack exchange,提问作者MichiFranz
相关产品推荐
相关产品推荐

