Azure Stream Analytics의 Azure Cosmos DB 출력은 스트림 처리 결과를 JSON 문서로 Azure Cosmos DB 컨테이너에 기록합니다. 비정형 JSON 데이터에 대한 데이터 아카이빙과 저지연 쿼리를 지원합니다. 이 출력이 어떻게 동작하는지 이해하면 시나리오가 요구하는 처리량, 일관성, 파티션 설정에 맞게 설정하는 데 도움이 됩니다.
출력 대상으로서 Azure Cosmos DB의 기본 사항
Stream Analytics에서 Azure Cosmos DB 출력은 스트림 처리 결과를 JSON 출력으로 Azure Cosmos DB 컨테이너에 기록합니다. Azure Cosmos DB에 익숙하지 않은 상태에서 시작하려면 Azure Cosmos DB 설명서를 참조하세요.
Stream Analytics는 SQL API를 통해서만 Azure Cosmos DB에 연결됩니다. 其他 Azure Cosmos DB API 尚未支援。 Stream Analytics를 다른 API로 만든 Azure Cosmos DB 계정에 지정한 경우 데이터는 올바르게 저장되지 않을 수도 있습니다. Azure Cosmos DB를 출력으로 사용할 때는 작업을 호환성 레벨 1.2로 설정하세요.
Stream Analytics는 데이터베이스에 컨테이너를 만들지 않습니다. 대신, 필요한 것들을 미리 만들어야 합니다. 그런 다음, Azure Cosmos DB 컨테이너의 청구 비용을 제어할 수 있습니다. Azure Cosmos DB API를 사용하여 컨테이너의 성능, 일관성 및 용량을 직접 조정할 수도 있습니다. 다음 섹션에서는 Azure Cosmos DB에 대한 몇 가지 컨테이너 옵션을 자세히 설명합니다.
일관성, 가용성 및 대기 시간 조정
애플리케이션 요구사항에 맞게 Azure Cosmos DB에서 데이터베이스와 컨테이너를 세밀하게 조정하고, 일관성, 가용성, 지연 시간, 처리량 사이에서 절충점을 고려하세요.
읽기 및 쓰기 지연에 대해 시나리오에서 필요한 읽기 일관성 수준에 따라 데이터베이스 계정에서 일관성 수준을 선택하세요. 처리량을 향상시키기 위해 컨테이너 내 요청 유닛(RU)을 확장하세요. 또한 기본적으로 Azure Cosmos DB는 컨테이너에 대한 각 CRUD 작업에서 동기 인덱싱을 지원합니다. 이 옵션은 Azure Cosmos DB에서 읽기 및 쓰기 성능을 제어하는 또 다른 유용한 방법입니다. 자세한 내용은 데이터베이스 및 쿼리 일관성 수준 변경 문서를 검토하세요.
Stream Analytics에서의 업서트
Azure Cosmos DB와 Stream Analytics를 통합하면 주어진 문서 ID 열을 기반으로 컨테이너에 레코드를 삽입하거나 업데이트할 수 있습니다. 이 작업을 upsert라고도 합니다. Stream Analytics는 낙관적 upsert 방식을 채택하고 있습니다. 문서 ID 충돌로 인해 삽입이 실패할 경우에만 업데이트가 수행됩니다.
호환성 레벨 1.0을 사용하여 Stream Analytics는 이 업데이트를 PATCH 작업으로 수행하여 문서의 부분 업데이트를 지원합니다. Stream Analytics는 새 속성을 추가하거나 기존 속성을 증분 방식으로 바꿉니다. 그러나 JSON 문서에서 배열 속성 값을 변경하면 전체 배열을 덮어씁니다. 즉, 배열이 병합되지 않습니다.
호환성 레벨 1.2를 사용하면 업서트 동작이 문서를 삽입하거나 교체하는 방식으로 변경됩니다. 호환성 수준 1.2에 대한 이후 섹션에서는 이 동작을 자세히 설명합니다.
들어오는 JSON 문서에 이미 ID 필드가 있으면 Azure Cosmos DB는 자동으로 그 필드를 문서 ID 열로 사용합니다. 스트림 애널리틱스는 이후 쓰기를 그렇게 처리하여 다음과 같은 상황을 발생시킵니다:
- 고유한 ID가 삽입되는 결과로 이어집니다.
- 중복 ID 및 문서 ID가 ID로 설정되면 upsert로 이어집니다.
- 첫 문서 이후 중복 ID 및 설정되지 않은 문서 ID가 오류로 이어집니다.
중복 ID가 있는 문서를 포함하여 모든 문서를 저장하려면 AS 키워드로 사용하여 쿼리에서 ID 필드의 이름을 바꿉니다. AS 키워드를 사용하거나 문서 ID 설정을 사용하여 Azure Cosmos DB에서 ID 필드를 만들거나 ID를 다른 열 값으로 바꾸도록 합니다.
Azure Cosmos DB에서 데이터 분할
Azure Cosmos DB는 워크로드에 따라 파티션 크기를 자동으로 조정합니다. 데이터를 분할할 때 무제한 컨테이너를 사용하세요. Stream Analytics는 무제한 컨테이너에 쓸 때 이전 쿼리 단계 또는 입력 분할 구성표만큼 많은 병렬 기록기를 사용합니다.
참고
Azure Stream Analytics는 최상위 수준에서 파티션 키를 사용하여 무제한 컨테이너만 지원합니다. 예를 들어 /region이 지원됩니다. 중첩된 파티션 키(예: /region/name)는 지원되지 않습니다.
선택한 파티션 키에 따라 다음과 같은 경고가 표시될 수 있습니다.
CosmosDB Output contains multiple rows and just one row per partition key. If the output latency is higher than expected, consider choosing a partition key that contains at least several hundred records per partition key.
여러 개의 서로 다른 값을 가진 파티션 키 속성을 선택하고, 이 값들에 작업을 고르게 분배하세요. 파티셔닝의 자연스러운 산물로서, 단일 파티션의 최대 처리량은 동일한 파티션 키에 관련된 요청을 제한합니다.
동일한 파티션 키 값에 속하는 문서의 스토리지 크기는 20GB로 제한됩니다(물리적 파티션 크기 제한은 50GB). 이상적인 파티션 키는 쿼리에서 필터로 자주 나타나고, 솔루션이 확장 가능하도록 충분한 카디널리티를 가진 키입니다.
Stream Analytics 쿼리와 Azure Cosmos DB에 사용되는 파티션 키는 동일할 필요가 없습니다. 완전 병렬 토폴로지의 경우, Stream Analytics 쿼리의 파티션 키로 Input Partition keyPartitionId를 사용하되, 이 선택이 Azure Cosmos DB 컨테이너의 파티션 키에 권장되는 선택은 아닐 수 있습니다.
파티션 키는 Azure Cosmos DB의 저장 프로시저 및 트리거에서 트랜잭션에 대한 경계이기도 합니다. 트랜잭션에서 함께 발생하는 문서들이 동일한 파티션 키 값을 공유하도록 파티션 키를 선택하세요. Azure Cosmos DB의 분할 문서에서는 파티션 키 선택에 대한 자세한 정보를 제공합니다.
고정된 Azure Cosmos DB 컨테이너의 경우, Stream Analytics는 컨테이너가 가득 찬 후 확장하거나 종료할 방법이 없습니다. 10GB 및 10,000RU/s의 처리량 상한 값이 적용됩니다. 고정 컨테이너에서 무제한 컨테이너(최소 1,000RU/s 처리량 및 파티션 키가 있는 하나의 컨테이너)로 데이터를 마이그레이션하려면 데이터 마이그레이션 도구 또는 변경 피드 라이브러리를 사용합니다.
여러 고정 컨테이너에 쓰는 기능은 더 이상 사용되지 않습니다. Stream Analytics 업무를 확장하는 데 사용하지 마세요.
호환성 수준이 1.2인 향상된 처리량
호환성 레벨 1.2를 사용하여 Stream Analytics는 Azure Cosmos DB에 대량 쓰기 기능을 네이티브 통합할 수 있도록 지원합니다. 이 통합을 통해 Stream Analytics는 Azure Cosmos DB에 효과적으로 쓰면서 처리량을 극대화하고 제한 요청을 효율적으로 처리할 수 있습니다.
향상된 쓰기 메커니즘은 upsert 동작의 차이 때문에 새 호환성 수준에서 사용할 수 있습니다. 1.2 이전 레벨을 사용할 때, 업서트 동작은 문서를 삽입하거나 병합하는 것입니다. 1.2를 사용하면 업서트 동작이 문서를 삽입하거나 교체하도록 변경됩니다.
1.2 이전 레벨을 사용함으로써, Stream Analytics는 맞춤형 저장 프로시저를 사용해 파티션 키별로 문서를 Azure Cosmos DB로 대량 업서트합니다. 여기서 Stream Analytics는 배치를 하나의 트랜잭션으로 기록합니다. 단일 레코드가 과도 오류(스로틀링)를 발생하더라도 스트림 애널리틱스는 전체 배치를 다시 시도해야 합니다. 이 동작 때문에 적당한 스로틀링이 있는 상황도 느리게 됩니다.
다음 예제에서는 동일한 Azure Event Hubs 입력에서 읽는 두 개의 동일한 Stream Analytics 작업을 보여 줍니다. 두 Stream Analytics 작업은 모두 통과형 쿼리를 통해 완전히 분할되며, 동일한 Azure Cosmos DB 컨테이너에 기록합니다. 왼쪽에 있는 메트릭은 호환성 수준 1.0으로 구성된 작업에서 가져온 것입니다. 오른쪽의 메트릭은 1.2로 구성된 작업에서 가져온 것입니다. Azure Cosmos DB 컨테이너의 파티션 키는 입력 이벤트에서 가져온 고유한 GUID입니다.
Event Hubs의 이벤트 수신 속도는 Azure Cosmos DB 컨테이너(20,000RU)가 수용하도록 구성된 처리량보다 2배 높으므로, Azure Cosmos DB에서 스로틀링이 발생할 것으로 예상할 수 있습니다. 그러나 1.2를 사용하는 작업은 더 높은 처리량(분당 출력 이벤트), 더 낮은 평균 SU% 사용률로 일관되게 씁니다. 당신의 환경에서는 이 차이가 몇 가지 더 많은 요인에 따라 달라집니다. 이러한 요소에는 선택한 이벤트 형식, 입력 이벤트/메시지 크기, 파티션 키 및 쿼리가 포함됩니다.
1.2를 사용함으로써 Stream Analytics는 Azure Cosmos DB에서 사용 가능한 처리량의 100%를 보다 지능적으로 활용하며, 속도 제한이나 속도 제한으로 인한 재제출이 거의 없습니다. 이 동작은 컨테이너에서 동시에 실행되는 쿼리와 같은 다른 워크로드에 대해 더 나은 환경을 제공합니다. Stream Analytics가 초당 1,000~10,000개 메시지의 싱크로 Azure Cosmos DB에서 스케일 아웃되는 방식을 확인하려면 이 Azure 샘플 프로젝트를 사용해 보세요.
Azure Cosmos DB 출력의 처리량은 1.0과 1.1을 사용할 때 동일합니다. Azure Cosmos DB에서 Stream Analytics의 호환성 수준 1.2를 사용하도록 강력히 권장됩니다.
JSON 출력에 대한 Azure Cosmos DB 설정
Stream Analytics에서 Azure Cosmos DB를 출력으로 설정할 때, 다음 속성들이 출력을 정의합니다.
| 분야 | 설명 |
|---|---|
| 출력 별칭 | Stream Analytics 쿼리에서 이 출력을 참조할 별칭입니다. |
| 구독 | Azure 구독입니다. |
| 계정 ID | Azure Cosmos DB 계정의 이름 또는 엔드포인트 URI입니다. |
| 계정 키 | Azure Cosmos DB 계정에 대한 공유 액세스 키입니다. |
| 데이터베이스 | Azure Cosmos DB 데이터베이스 이름입니다. |
| 컨테이너 이름 | 컨테이너 이름(예: MyContainer)입니다.
MyContainer라는 컨테이너 하나가 있어야 합니다. |
| 문서 ID | 선택 사항. 출력 이벤트에서 삽입 또는 업데이트 작업을 위한 고유 키 역할을 하는 열명입니다. 비워두면 Stream Analytics가 업데이트 옵션 없이 모든 이벤트를 삽입합니다. |
Azure Cosmos DB 출력을 구성한 후에는 쿼리에서 INTO 문의 대상으로 사용할 수 있습니다. Azure Cosmos DB 출력을 사용할 때는 파티션 키를 명시적으로 설정해야 합니다.
출력 레코드는 Azure Cosmos DB의 파티션 키 이름으로 명명한 대/소문자 구분 열을 포함해야 합니다. 더 많은 병렬 처리를 위해 이 문에 동일한 열을 사용하는 PARTITION BY 절이 필요할 수 있습니다.
샘플 쿼리는 다음과 같습니다.
SELECT TollBoothId, PartitionId
INTO CosmosDBOutput
FROM Input1 PARTITION BY PartitionId
오류 처리 및 재시도
Stream Analytics에서 Azure Cosmos DB으로 이벤트를 전송하는 동안 일시적인 오류, 서비스 불가 또는 제한이 발생하는 경우 Stream Analytics는 작업을 성공적으로 완료하기 위해 무한정 재시도합니다. 하지만 Unauthorized(HTTP 오류 코드 401), NotFound(HTTP 오류 코드 404), Forbidden(HTTP 오류 코드 403), BadRequest(HTTP 오류 코드 400) 실패에 대해서는 재시도를 시도하지 않습니다.
Azure Cosmos DB 출력이 실패하는 일반적인 문제들
여러 조건으로 인해 Azure Cosmos DB 출력이 실패할 수 있습니다. Stream Analytics의 출력 데이터는 컨테이너의 고유한 인덱스 제약 조건을 위반할 수 있고, 해당 컬럼이 PartitionKey 존재하지 않을 수도 있으며, 컬럼이 Id 존재하지 않을 수도 있습니다. 고유 인덱스 제약 조건에 대한 자세한 내용은 Azure Cosmos DB의 고유 키 제약 조건을 참조하세요.