Snowpipe 문제 해결

이 항목에서는 Snowpipe를 사용하여 데이터를 로드할 때 발생하는 문제를 해결하기 위한 체계적인 접근 방식을 설명합니다.

이 항목의 내용:

Snowpipe 문제를 해결하는 단계는 데이터 파일을 로드하기 위해 사용하는 워크플로에 따라 다릅니다.

클라우드 저장소 이벤트 알림을 사용한 데이터 자동 로드

오류 알림

Snowpipe에 대한 오류 알림을 구성합니다. Snowpipe에서 로딩 중에 오류가 발생하면 이 기능은 구성된 클라우드 메시징 서비스로 알림을 푸시하여 데이터 파일을 분석할 수 있게 해줍니다. 자세한 내용은 Snowpipe 오류 알림 섹션을 참조하십시오.

일반 문제 해결 단계

다음 단계를 완료하면 파일 자동 로드 실패를 유발하는 대부분의 문제를 확인할 수 있습니다.

1단계: 파이프 상태 확인

파이프의 현재 상태를 검색합니다. 결과는 JSON 형식으로 표시됩니다. 자세한 내용은 SYSTEM$PIPE_STATUS 섹션을 참조하십시오.

다음 값을 확인합니다.

lastReceivedMessageTimestamp

메시지 큐에서 수신된 마지막 이벤트 메시지의 타임스탬프를 지정합니다. 메시지와 연결된 경로가 파이프 정의의 경로와 일치하지 않는 경우와 같이 이 메시지는 특정 파이프에 적용되지 않을 수 있습니다. 또한, 생성된 데이터 오브젝트에 의해 트리거된 메시지만 자동 수집 파이프에서 사용됩니다.

예상보다 빠른 타임스탬프는 서비스 구성(즉, Amazon SQS 또는 Amazon SNS 또는 Azure Event Grid) 또는 서비스 자체에서 오류가 발생했음을 나타냅니다. 이 필드가 비어 있으면 서비스 구성 설정을 확인하십시오. 필드에 타임스탬프가 포함되어 있지만 예상보다 시간이 빠른 경우에는 서비스 구성에서 설정이 변경되었는지 확인하십시오.

lastForwardedMessageTimestamp

파이프에 전달된 일치하는 경로가 있는 마지막 《오브젝트 생성》 이벤트 메시지의 타임스탬프를 지정합니다.

이벤트 메시지가 메시지 큐에서 수신되지만 파이프로 전달되지 않는 경우, 새 데이터 파일이 생성되는 Blob 저장소 경로와 Snowflake 스테이지 및 파이프 정의에 지정된 조합 경로가 일치하지 않는 것일 수 있습니다. 스테이지 및 파이프 정의에 지정된 경로를 확인하십시오. 파이프 정의에 지정된 경로는 스테이지 정의의 모든 경로에 추가됩니다.

2단계. 테이블의 COPY 내역 보기

이벤트 메시지가 수신 및 전달되면 대상 테이블에 대한 로드 활동 내역을 쿼리합니다. 자세한 내용은 COPY_HISTORY 섹션을 참조하십시오.

STATUS 열은 특정 파일 세트의 로드 완료, 부분 로드 또는 로드 실패 여부를 보여줍니다. FIRST_ERROR_MESSAGE 열은 부분 로드 또는 로드 실패 시의 이유를 보여줍니다.

파일 세트에서 여러 문제가 발생한 경우 FIRST_ERROR_MESSAGE 열은 발생한 첫 번째 오류만 보여줍니다. 파일의 모든 오류를 살펴보려면 VALIDATION_MODE 복사 옵션을 RETURN_ALL_ERRORS 로 설정하여 COPY INTO <테이블> 문을 실행합니다. VALIDATION_MODE 복사 옵션은 COPY 문에 로드할 데이터의 유효성을 검사하고 지정된 유효성 검사 옵션에 따라 결과를 반환하도록 지시합니다. 이 복사 옵션이 지정되면 데이터가 로드되지 않습니다. 이 문에서 Snowpipe를 사용하여 로드하려고 시도한 파일 세트를 참조합니다. 복사 옵션에 대한 자세한 내용은 COPY INTO <테이블> 을 참조하십시오.

COPY_HISTORY 출력에 예상되는 파일 세트가 포함되어 있지 않은 경우 이전 기간을 쿼리합니다. 파일이 이전 파일과 중복되는 경우 원본 파일 로드 시 로드 내역에 활동이 기록된 것일 수 있습니다.

3단계: 데이터 파일 유효성 검사

로드 작업에서 데이터 파일에서 오류가 발생하면 COPY_HISTORY 테이블 함수는 각 파일에서 발생한 첫 번째 오류에 대한 설명을 제공합니다. 데이터 파일의 유효성을 검사하려면 VALIDATE_PIPE_LOAD 함수를 쿼리합니다.

Microsoft Azure Data Lake Storage Gen2 Storage에서 생성된 파일은 로드되지 않습니다.

현재, 일부 서드 파티 클라이언트는 ADLS Gen 2 REST API에서 FlushWithClose 를 호출하지 않습니다. 이 단계는 Snowpipe에 파일을 로드하도록 알리는 이벤트를 트리거하기 위해 필요합니다. REST API를 수동으로 호출하여 Snowpipe가 이러한 파일을 로드하도록 트리거합니다.

close 인자가 포함된 Flush 메서드에 대한 자세한 내용은 https://docs.microsoft.com/en-us/dotnet/api/azure.storage.files.datalake.datalakefileclient.flush를 참조하십시오. REST 매개 변수와 관련한 로드에 대한 자세한 API close 참조 정보는 https://docs.microsoft.com/en-us/rest/api/storageservices/datalakestoragegen2/path/update를 참조하십시오.

Amazon SNS 항목에 대한 구독이 삭제된 이후에는 Snowpipe가 파일 로드를 중지합니다.

사용자가 처음으로 특정 Amazon Simple Notification Service(SNS) 항목을 참조하는 파이프 오브젝트를 생성할 때 Snowflake는 Snowflake 소유 Amazon Simple Queue Service(SQS) 큐가 해당 항목을 구독하도록 합니다. AWS 관리자가 SQS 항목에 대한 SNS 구독을 삭제하면 해당 항목을 참조하는 모든 파이프가 더 이상 Amazon S3에서 이벤트 메시지를 수신하지 않습니다.

이 문제를 해결하려면 다음을 수행합니다.

  1. SNS 항목 구독이 삭제된 시점부터 72시간을 기다립니다.

    72시간 후, Amazon SNS는 삭제된 구독을 지웁니다. 자세한 내용은 Amazon SNS 설명서 를 참조하십시오.

  2. (CREATE OR REPLACE PIPE를 사용하여) 항목을 참조하는 모든 파이프를 다시 만듭니다. 파이프 정의에서 동일한 SNS 항목을 참조하십시오. 자세한 지침은 3단계: 자동 수집이 활성화된 파이프 만들기 섹션을 참조하십시오.

SNS 항목에 대한 구독을 삭제하기 전에 작동했던 모든 파이프는 이제 S3에서 다시 이벤트 메시지를 수신하기 시작해야 합니다.

SNS 항목을 다른 이름으로 만들면 72시간의 지연을 피할 수 있습니다. CREATE OR REPLACE PIPE 명령을 사용하여 이 항목을 참조하는 파이프를 모두 다시 만들고 새 항목 이름을 지정합니다.

지연된 Google Cloud Storage 또는 누락된 파일에서 로드

Pub/Sub 메시지를 사용하여 Google Cloud Storage(GCS)에서 자동 데이터 로딩이 구성되어 있는 경우 1개의 스테이징된 파일에 대한 이벤트 메시지만 읽을 수 있습니다. 또는, GCS로부터의 데이터 로드가 몇 분에서 하루 이상 지연될 수 있습니다. 일반적으로 이러한 두 가지 문제는 GCS 관리자가 Snowflake 서비스 계정에 Monitoring Viewer 역할을 부여하지 않은 경우에 발생합니다.

자세한 지침은 클라우드 저장소에 대한 보안 액세스 구성하기 의 《2단계: Pub/Sub 구독에 Snowflake 액세스 권한 부여》를 참조하십시오.

데이터를 로드하기 위해 Snowpipe REST 엔드포인트 호출하기

오류 알림

AWS(Amazon Web Services)에 호스팅된 Snowflake 계정에 Snowpipe 오류 알림에 대한 지원이 제공됩니다. 데이터 로딩 중에 오류가 발생하면 알림이 트리거되며, 이를 통해 데이터 파일을 분석할 수 있습니다. 자세한 내용은 Snowpipe 오류 알림 섹션을 참조하십시오.

일반 문제 해결 단계

다음 단계를 완료하면 파일 로딩 실패를 유발하는 대부분의 문제를 확인할 수 있습니다.

1단계 인증 문제 확인하기

Snowpipe REST 엔드포인트는 JSON 웹 토큰(JWT)이 포함된 키 페어 인증을 사용합니다.

Python/Java 수집 SDKs는 사용자를 위한 JWT를 생성합니다. REST API를 직접 호출하는 경우에는 해당 토큰을 생성해야 합니다. 요청에 JWT 토큰이 제공되지 않으면 REST 엔드포인트에서 400 오류를 반환합니다. 유효하지 않은 토큰이 제공되면 다음과 유사한 오류가 반환됩니다.

snowflake.ingest.error.IngestResponseError: Http Error: 401, Vender Code: 390144, Message: JWT token is invalid.
Copy

2단계. COPY 테이블 내역 보기

Snowpipe를 사용하여 시도한 데이터 로드를 포함하여 테이블의 로드 활동 내역을 쿼리합니다. 자세한 내용은 COPY_HISTORY 섹션을 참조하십시오. STATUS 열은 특정 파일 세트의 로드 완료, 부분 로드 또는 로드 실패 여부를 보여줍니다. FIRST_ERROR_MESSAGE 열은 부분 로드 또는 로드 실패 시의 이유를 보여줍니다.

파일 세트에서 여러 문제가 발생한 경우 FIRST_ERROR_MESSAGE 열은 발생한 첫 번째 오류만 보여줍니다. 파일의 모든 오류를 살펴보려면 VALIDATION_MODE 복사 옵션을 RETURN_ALL_ERRORS 로 설정하여 COPY INTO <테이블> 문을 실행합니다. VALIDATION_MODE 복사 옵션은 COPY 문에 로드할 데이터의 유효성을 검사하고 지정된 유효성 검사 옵션에 따라 결과를 반환하도록 지시합니다. 이 복사 옵션이 지정되면 데이터가 로드되지 않습니다. 이 문에서 Snowpipe를 사용하여 로드하려고 시도한 파일 세트를 참조합니다. 복사 옵션에 대한 자세한 내용은 COPY INTO <테이블> 을 참조하십시오.

3단계: 파이프 상태 확인하기

COPY_HISTORY 테이블 함수가 확인 중인 데이터 로드와 관련하여 0개의 결과를 반환하면 파이프의 현재 상태를 검색합니다. 결과는 JSON 형식으로 표시됩니다. 자세한 내용은 SYSTEM$PIPE_STATUS 섹션을 참조하십시오.

executionState 키는 파이프의 실행 상태를 식별합니다. 예를 들어, PAUSED 는 파이프가 현재 일시 중지되었음을 나타냅니다. 파이프 소유자는 ALTER PIPE 를 사용한 파이프 실행을 재개할 수 있습니다.

executionState 값이 파이프 시작과 관련한 문제가 있음을 나타내는 경우 error 키에서 자세한 정보를 확인하십시오.

4단계: 데이터 파일 유효성 검사

로드 작업에서 데이터 파일에서 오류가 발생하면 COPY_HISTORY 테이블 함수는 각 파일에서 발생한 첫 번째 오류에 대한 설명을 제공합니다. 데이터 파일의 유효성을 검사하려면 VALIDATE_PIPE_LOAD 함수를 쿼리합니다.

기타 문제

로드되지 않은 파일 세트

로드에 대한 COPY_HISTORY 레코드 누락

파이프의 COPY INTO <테이블> 문에 PATTERN 절이 포함되어 있는지 확인합니다. 포함된 경우, PATTERN 값으로 지정된 정규식이 로드할 모든 스테이징된 파일을 필터링하는지 확인합니다.

PATTERN 값을 수정하려면 CREATE OR REPLACE PIPE 구문을 사용하여 파이프를 다시 생성해야 합니다.

자세한 내용은 CREATE PIPE 섹션을 참조하십시오.

언로드된 파일 하위 세트를 나타내는 COPY_HISTORY 레코드

COPY_HISTORY 함수 출력이 파일의 하위 세트가 로드되지 않았음을 나타내면 파이프를 《새로 고칠》 수 있습니다.

이러한 상황이 발생할 수 있는 상황은 다음과 같습니다.

  • 이전에 외부 스테이지에서는 COPY INTO 테이블 명령을 사용하여 데이터를 대량 로드하기 위한 용도로 사용되었습니다.

  • REST API:

    • 외부 이벤트 구동 기능은 REST APIs를 호출하기 위해 사용되며 이벤트가 구성되기 전에 외부 스테이지에 이미 있던 데이터 파일의 백로그입니다.

  • 자동 수집:

    • 이벤트 알림이 구성되기 전 데이터 파일의 백로그가 이미 외부 스테이지에 있습니다.

    • 이벤트 알림이 실패하여 파일 세트가 큐에 추가되지 않았습니다.

구성된 파이프를 사용하여 외부 스테이지에서 데이터 파일을 로드하려면 ALTER PIPE … REFRESH 문을 실행합니다.

대상 테이블의 중복 데이터

SHOW PIPES 를 실행하거나 Account Usage에서 PIPES 뷰 또는 Information Schema에서 PIPES 뷰를 쿼리하여 계정의 모든 파이프 정의에 있는 COPY INTO <테이블> 문을 비교합니다. 여러 파이프가 COPY INTO <테이블> 문에서 동일한 클라우드 저장소 위치를 참조하는 경우 디렉터리 경로가 중첩되지 않는지 확인합니다. 그렇지 않으면 여러 파이프가 동일한 데이터 파일 세트를 대상 테이블로 로드할 수 있습니다. 예를 들어, 여러 파이프 정의가 <저장소_위치>/path1/<저장소_위치>/path1/path2/ 과 같이 세분화 수준이 다른 동일한 저장소 위치를 참조할 때 이러한 상황이 발생할 수 있습니다. 이 예에서, 파일이 <저장소_위치>/path1/path2/ 에서 스테이징된 경우 두 파이프 모두 파일의 복사본을 로드합니다.

수정된 데이터를 다시 로드할 수 없음, 의도하지 않게 로드된 수정된 데이터

Snowflake는 파일 로드 메타데이터를 사용하여 테이블에서 동일한 파일(및 데이터 복제)이 다시 로드되는 것을 방지합니다. Snowpipe는 나중에 수정된 경우에도(즉, eTag가 다른) 이름이 동일한 파일이 로드되는 것을 방지합니다.

파일 로드 메타데이터는 테이블이 아닌 파이프 오브젝트 와 연결됩니다. 그 결과,

  • 이미 로드된 파일과 이름이 동일한 스테이징된 파일은 수정된 경우에도 무시되며, 그러한 예는 새 행이 추가되거나 파일의 오류가 수정된 경우입니다.

  • TRUNCATE TABLE 명령을 사용하여 테이블을 자르면 메타데이터를 로드하는 Snowpipe 파일이 삭제되지 않습니다.

그러나 파이프는 14일 동안만 로드 내역 메타데이터를 유지합니다. 그러므로,

파일은 14일 이내에 다시 수정 및 스테이징됩니다.

Snowpipe는 다시 스테이징된 수정된 파일을 무시합니다. 수정된 데이터 파일을 다시 로드하려면 현재 CREATE OR REPLACE PIPE 구문을 사용하여 파이프 오브젝트를 다시 생성해야 합니다.

다음 예에서는 Snowpipe REST API를 사용하여 데이터 로드 준비하기 의 1단계 예시에 따라 mypipe 파이프를 다시 생성합니다.

create or replace pipe mypipe as copy into mytable from @mystage;
Copy
14일 후에 다시 수정 및 스테이징된 파일

Snowpipe가 데이터를 다시 로드하여 대상 테이블에 중복 레코드가 생성될 가능성이 있습니다.

또한, 활성 Snowpipe 로드에서와 동일한 버킷/컨테이너, 경로 및 대상 테이블을 참조하는 COPY INTO <테이블> 문이 실행되는 경우 중복 레코드가 대상 테이블에 로드될 수 있습니다. COPY 명령과 Snowpipe에 대한 로드 내역은 Snowflake에 별도로 저장됩니다. 내역 스테이징된 데이터를 로드한 후 파이프 구성을 사용하여 수동으로 데이터를 로드해야 하는 경우에는 ALTER PIPE … REFRESH 문을 실행합니다. 자세한 내용은 이 항목의 로드되지 않은 파일 세트 섹션을 참조하십시오.

COPY_HISTORY 뷰에서 LOAD_TIME 값 이전에 CURRENT_TIMESTAMP를 사용하여 삽입된 로드 시간

테이블 디자이너는 레코드가 테이블에 로드될 때 현재 타임스탬프를 기본값으로 삽입하는 타임스탬프 열을 추가할 수 있습니다. 목적은 테이블에 각 레코드가 로드되는 시간을 캡처하는 것이지만, 타임스탬프가 COPY_HISTORY 함수 (Information Schema) 또는 COPY_HISTORY 뷰 (Account Usage)에서 반환된 LOAD_TIME 열의 값보다 이전입니다. 그 이유는 레코드가 테이블에 삽입될 때(즉, 로드 작업에 대한 트랜잭션이 커밋될 때)가 아닌 클라우드 서비스에서 로드 작업이 컴파일될 때 CURRENT_TIMESTAMP 가 평가되기 때문입니다.

참고

현재로서는 Snowpipe의 copy_statement 에 다음 기능을 사용하지 않는 것이 좋습니다.

  • CURRENT_DATE

  • CURRENT_TIME

  • CURRENT_TIMESTAMP

  • GETDATE

  • LOCALTIME

  • LOCALTIMESTAMP

  • SYSDATE

  • SYSTIMESTAMP

이러한 함수를 사용하여 삽입된 시간 값이 COPY_HISTORY 함수 또는 COPY_HISTORY 뷰 에서 반환된 LOAD_TIME 값보다 몇 시간 빠를 수 있다는 것은 이미 알려진 문제입니다.

대신 레코드 로딩을 더 정확히 표시해주는 METADATA$START_SCAN_TIME 을 쿼리하는 것이 좋습니다.

오류: {1} 스테이지와 연결된 {0} 통합을 찾을 수 없습니다.

003139=SQL compilation error:\nIntegration ''{0}'' associated with the stage ''{1}'' cannot be found.
Copy

이 오류는 외부 스테이지와 스테이지에 연결된 저장소 통합 간의 연결이 끊어진 경우 발생할 수 있습니다. 이 오류는 저장소 통합 오브젝트가 다시 생성(CREATE OR REPLACE STORAGE INTEGRATION 사용)되었을 때 발생합니다. 스테이지는 저장소 통합 이름 대신 숨겨진 ID를 사용하여 저장소 통합에 연결됩니다. CREATE OR REPLACE 구문이 오브젝트를 삭제하고 다른 숨겨진 ID로 저장소 통합을 다시 만드는 작업이 백그라운드로 수행됩니다.

저장소 통합을 하나 이상의 스테이지에 연결한 후에 다시 만들어야 하는 경우 ALTER STAGE stage_name SET STORAGE_INTEGRATION = storage_integration_name 을 실행하여 각 스테이지와 저장소 통합 사이의 연결을 다시 설정해야 합니다.

  • 여기서 stage_name 은 스테이지의 이름입니다.

  • storage_integration_name 은 저장소 통합의 이름입니다.

정부 리전을 참조하는 Snowpipe의 오류

계정이 상업 리전에 있는 동안 Snowpipe가 정부 리전의 버킷을 참조하면 오류가 발생할 수 있습니다. 클라우드 공급자의 정부 리전에서는 이벤트 알림이 다른 상업 리전으로 전송되거나 다른 상업 리전에서 전송되는 것을 허용하지 않습니다. 자세한 내용은 AWS GovCloud(US)Azure Government 섹션을 참조하십시오.