AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs Menu

$iceberg 애그리게이션 단계

$iceberg 단계는 연결 레지스트리에서 AWS S3 버킷에 대한 연결을 지정하며, 이 버킷에서 데이터를 Apache iceberg 테이블에 쓰기 (write) 수 있습니다.

$iceberg 파이프라인에 나타나는 경우 파이프라인의 마지막 단계여야 합니다. 파이프라인당 하나의 $iceberg 단계만 사용할 수 있습니다.

$iceberg 파이프라인 단계의 프로토타입 형식은 다음과 같습니다.

{
"$iceberg": {
"connectionName": "<registered-connection>",
"bucket": "<target-bucket>",
"databaseName": "<database>",
"tableName": "<string>" | <expression>,
"path": "<key-prefix>",
"region": "<target-region>",
"mode": "cdc" | "insert",
"idFieldName": "<field-name>",
"partitionedBy": {
"<column-name>": "<partition-transform>",
. . .
},
"catalog": {
"type": "hadoop" | "glue"
},
"schemaInference": {
"mode": "json" | "nested"
}
}
}

$iceberg 단계에서는 다음 필드가 있는 문서를 사용합니다.

필드
유형
필요성
설명

connectionName

문자열

필수 사항

읽기 및 쓰기에 사용할 AWS S3 연결의 이름입니다. 이 이름은 연결 레지스트리의 연결 이름과 일치해야 합니다.

bucket

문자열

필수 사항

대상 Apache 아이스버그 데이터베이스 포함된 S3 버킷의 이름입니다.

databaseName

문자열

필수 사항

대상 테이블이 포함된 Apache Iceberg 데이터베이스의 이름입니다.

tableName

문자열 | 표현식

필수 사항

대상 Apache Iceberg 테이블의 이름입니다. Must be either a string or an expression that evaluates to a string. 문서별 동적 라우팅에 표현식을 사용합니다.

path

문자열

필수 사항

Apache Iceberg 데이터베이스에 대한 경로의 접두사 키.

region

문자열

조건부

버킷의AWS 리전 . AWS에서 실행 않는 스트림 프로세서에 필요합니다.

mode

문자열

옵션

입력 문서당 수행할 작업을 결정하기 위한 전략입니다.

  • "cdc" Atlas Stream Processing이 stream.source.operationType 메타데이터 필드를 읽어 작업 유형을 결정하도록 합니다.

  • "insert" Atlas Stream Processing이 stream.source.operationType 메타데이터 필드의 작업 유형 선언을 무시하고 각 문서를 새 행으로 대상 테이블에 추가하게 합니다.

기본값은 cdc입니다.

idFieldName

문자열

옵션

cdc 모드에서 행 키로 사용되는 필드 및 열 이름입니다.

기본값은 "_id"입니다.

partitionedBy

문서

옵션

분할 사양. 이 필드를 설정하지 않으면 $iceberg 은 idFieldName 열에 대한 기본 분할 변환을 설정합니다.

하나 이상의 키-값 쌍을 포함하는 문서 여야 합니다. 각 키는 파티션 변환을 수행할 열의 이름이어야 하며, 각 값은 사용할 파티션 변환이어야 합니다. 첫 번째 파티션 변환은 idFieldName에 대한 변환이어야 합니다.

struct 열 내부에 중첩된 필드 에서 분할하려면 필드 에 대한 점으로 한정된 경로를 지정합니다( 예시 : outer.inner.key_field). 경로는 어떤 수준에서도 list 열을 포함할 수 없습니다.

주어진 필드의 파티션 변환 값은 다음 중 하나여야 합니다.

  • "identity"

  • "year"

  • "month"

  • "day"

  • "hour"

  • { truncate: int }

  • { bucket: int }

Apache Iceberg 분할 변환에 대한 자세한 내용은 Apache Iceberg 설명서를 참조하세요.

catalog

문서

옵션

사용할 Iceberg 카탈로그 를 정의하는 문서입니다. type 필드가 "hadoop" 또는 "glue"의 값을 포함하는 문서여야 합니다.

schemaInference

문서

옵션

$iceberg가 테이블 스키마 추론하는 방법을 구성하는 문서입니다. 다음 값 중 하나를 가진 mode 필드 포함하는 문서 여야 합니다.

  • "json" Atlas Stream Processing object 및 array 필드를 JSON 문자열 열로 쓰기 (write) 하도록 합니다.

  • "nested" Atlas Stream Processing object 필드를 struct 열로, array 필드를 list 열로 쓰기 (write) 합니다.

기본값은 "json"입니다.자세한 학습 은 유형 변환을 참조하세요.

$iceberg 단계를 사용하는 경우 스트림 프로세서의 마지막 단계여야 합니다.

Atlas Stream Processing은 SP10, SP30 및 SP50 스트림 프로세서에서만 $iceberg 단계를 지원합니다. 프로세서 계층에 따라 동적 라우팅에 대해 지원되는 최대 테이블 수가 결정됩니다.

계층
최대 테이블

SP10

5

SP30

10

SP50

50

중요

동적 라우팅을 사용하는 스트림 프로세서가 해당 계층 에서 지원되는 최대 테이블 수를 초과하면 프로세서는 FAILED 상태 됩니다. 실패 원인 및 복구에 대해 학습 오류 처리 및 재시도 정책을 참조하세요.

$iceberg 단계는 스트림 프로세서의 출력 데이터의 스키마 에서 결과 Apache iceberg 테이블의 스키마 를 추론합니다. Atlas Stream Processing struct 열 내의 필드를 포함하여 스트림 의 새 필드를 관찰함에 따라 테이블 스키마 그에 따라 발전합니다.

이미 존재하지 않는 테이블을 지정하면 Apache Iceberg 가 해당 테이블을 대상으로 하는 첫 번째 메시지를 받을 때 테이블을 생성합니다.

Atlas Stream Processing은 Apache Iceberg 테이블로의 출력에 대해 최소 1회 처리를 보장합니다.

tableName 필드의 값으로 동적 표현식 을 사용할 수 있습니다. 동적 표현식을 사용하여 문서 특정 값을 캡처하면 이 값에 따라 입력 문서를 다른 테이블로 라우팅할 수 있습니다. 표현식은 문자열로 평가되어야 합니다. 예시는 동적 라우팅을 참조하세요. 자세한 내용은 표현식 연산자를 참조하세요.

동적 표현식으로 주제를 지정했지만 Atlas Stream Processing이 지정된 메시지에 대한 표현식을 평가할 수 없는 경우, Atlas Stream Processing은 구성된 경우 해당 메시지를 데드 레터 큐로 보내고 후속 메시지를 처리합니다. 데드 레터 큐 가 구성되어 있지 않은 경우 Atlas Stream Processing은 메시지를 완전히 건너뛰고 후속 메시지를 처리합니다.

Atlas Stream Processing은 $iceberg 단계의 테이블에 기록할 때 BSON 에서 Iceberg 기본 유형 으로 유형 변환을 수행합니다.

BSON
세부 정보

string

string

int

int

long

long

double

double

bool

boolean

ObjectId

string

16진수 인코딩되었습니다.

UUID

string

문자열화된 UUID

BinData

binary

UUID에 적용되지 않음

date

timestamptz

마이크로초 단위로 측정되는 UTC 시간

timestamp

timestamptz

UTC 시간, 마이크로초단위로 측정

object

string or struct

기본값 으로 기본 JSON 문자열로 직렬화됩니다. nested 모드 에서는 struct 열이 됩니다. 자세히 학습 객체 및 배열 필드를 참조하세요.

array

string or list

기본값 으로 기본 JSON 문자열로 직렬화됩니다. nested 모드 에서는 list 열이 됩니다. 자세히 학습 객체 및 배열 필드를 참조하세요.

다른 BSON types는 지원되지 않습니다. Atlas Stream Processing은 지원되지 않는 BSON types을 포함한 문서를 DLQ로 보냅니다.

schemaInference.mode 필드 Atlas Stream Processing object 및 array 필드를 Apache iceberg 테이블에 쓰는 방법을 결정합니다.

  • json 모드 에서, Atlas Stream Processing object 및 array 필드를 기본 JSON 문자열로 직렬화하여 string 열에 씁니다. json 가 기본값 모드 입니다.

  • nested 모드 에서, Atlas Stream Processing object 및 array 필드에서 빙산 중첩 유형을 추론합니다:

    • 각 object 필드 struct 열이 됩니다. Atlas Stream Processing 객체 의 해당 필드 에서 구조체의 각 필드 유형을 추론합니다. 이는 모든 중첩 수준에 적용됩니다.

    • 각 array 필드 list 열이 됩니다. Atlas Stream Processing 배열 의 null이 아닌 요소에서 목록 요소 유형을 추론합니다. 기본 요소는 모두 동일한 유형이어야 합니다. 요소가 객체인 경우 요소 유형은 모든 객체의 필드를 포함하는 struct입니다.

이 모드 대상 테이블에 일치하는 열이 없는 필드에만 적용됩니다. 열이 이미 존재하는 경우 Atlas Stream Processing 모드 무시하고 열 유형에 따라 필드 씁니다.

  • 열이 string인 경우 Atlas Stream Processing 필드 기본 JSON 문자열로 직렬화합니다.

  • 열이 struct 또는 list인 경우 Atlas Stream Processing 필드 해당 중첩 유형으로 씁니다.

입력에 새 object 또는 array 필드가 포함된 경우, Atlas Stream Processing 모드 를 사용하여 새 열의 유형을 추론합니다.

다음 예시는 $iceberg 단계의 다양한 애플리케이션을 설명합니다.

다음 예시는 Atlas 데이터베이스의 초기 내용과 변경 스트림을 추가 전용 방식으로 Apache Iceberg 테이블에 쓰는 방법을 보여주며, 해당 데이터베이스의 운영 기록의 지속형 보관을 생성합니다. 이 집계는 두 단계로 구성됩니다.

  1. $source 단계는 Atlas 데이터베이스와 연결하고 구체적으로 db 데이터베이스의 orders 컬렉션을 대상으로 지정합니다. 이를 통해 초기 동기화를 실행하여 프로세서 활성화 시점에 데이터베이스의 문서를 캡처하고 각 변경 스트림 이벤트로 전체 문서가 캡처되도록 합니다.

  2. $iceberg 단계는 AWS S3 버킷에 대한 연결을 설정하여 iceberg-warehouse/ 경로에 있는 myTable라는 이름의 테이블에 기록합니다. insert 작업만 지정하여 추가 전용 로그 스타일 쓰기 (write) 흐름을 보장합니다.

{
"$source": {
"connectionName": "atlas1",
"db": "db",
"coll": "orders",
"initialSync": {
"enable": true
},
"config": {
"fullDocument": "required"
}
},
"$iceberg": {
"connectionName": "myS3Connection",
"bucket": "myData",
"path": "iceberg-warehouse/",
"tableName": "myTable",
"mode": "insert"
}
}

다음 예시는 Atlas 컬렉션 전체를 Apache Iceberg 테이블로 반영하는 방법을 보여줍니다.

집계를 정의하기 전에 다음 변수를 설정합니다.

const isDeleteExpr = {$eq: [{$meta: "stream.source.operationType"}, "delete"]};

다음 집계는 Atlas 소스 컬렉션의 변경 사항과 동기화되어 Apache Iceberg 테이블 엔트리를 추가, 업데이트 및 삭제합니다. 이것에는 4단계가 있습니다.

  1. $source 단계는 Atlas 데이터베이스와 연결하고 구체적으로 db 데이터베이스의 orders 컬렉션을 대상으로 지정합니다. 이를 통해 초기 동기화를 실행하여 프로세서 활성화 시점에 데이터베이스의 문서를 캡처하고 각 변경 스트림 이벤트로 전체 문서가 캡처되도록 합니다.

  2. $match 단계는 operationType 에 대한 필터링을 수행하여 유효한 작업 유형 선언이 포함된 문서만 처리합니다.

  3. $replaceRoot 단계는 작업 유형에 따라 문서 루트를 변경합니다.

    • 삭제 작업의 경우 문서 루트를 문서의 키로 변경합니다. 이로 인해 문서가 삭제되었음을 기록하지만 그 내용은 추가 처리에서 제외됩니다.

    • 다른 모든 작업의 경우 문서 루트를 fullDocument로 변경하고 문서 내용을 전달하여 추가 처리하도록 하는 동안 변경 스트림 메타데이터는 제외합니다.

  4. $iceberg 단계는 AWS S3 버킷에 대한 연결을 설정하여 iceberg-warehouse/ 경로에 있는 myTable이라는 이름의 Apache 아이스버그 테이블에 기록합니다. cdc 모드 에서, 이 단계에서는 각 문서 의 stream.source.operationType 메타데이터 필드 읽어 Apache ice버그 테이블에 대해 수행할 작업을 결정합니다.

{
"$source": {
"connectionName": "atlas1",
"db": "db",
"coll": "orders",
"initialSync": {
"enable": true
},
"config": {
"fullDocument": "required"
}
},
"$match": {
"operationType": {
"$in": ["insert", "update", "delete", "replace"]
}
},
"$replaceRoot": {
"newRoot": {
"$cond": {
"if": isDeleteExpr,
"then": "$documentKey",
"else": "$fullDocument"
}
}
}
"$iceberg": {
"connectionName": "myS3Connection",
"bucket": "myData",
"path": "iceberg-warehouse/",
"tableName": "myTable",
"mode": "cdc"
}
}

다음 예시에서 Atlas Stream Processing은 동적 표현식을 사용하여 문서를 다양한 출력 대상으로 동적으로 라우팅합니다.

  1. $source 단계는 Atlas 데이터베이스와 연결을 수립하며, 구체적으로 db 데이터베이스의 a, b, c 컬렉션을 대상으로 합니다. 이를 통해 초기 동기화를 실행하여 프로세서 활성화 시점에 데이터베이스의 문서를 캡처하고 각 변경 스트림 이벤트로 전체 문서가 캡처되도록 합니다.

  2. $match 단계는 operationType 이 "insert", "update", "delete" 또는 "replace"인 문서를 필터링합니다.

  3. $replaceRoot 단계는 작업 유형에 따라 문서 루트를 변경합니다.

    • 삭제 작업의 경우 문서 루트를 문서의 키로 변경합니다. 이로 인해 문서가 삭제되었음을 기록하지만 그 내용은 추가 처리에서 제외됩니다.

    • 다른 모든 작업의 경우 문서 루트를 fullDocument로 변경하고 문서 내용을 전달하여 추가 처리하도록 하는 동안 변경 스트림 메타데이터는 제외합니다.

  4. $iceberg 단계는 myData라는 이름의 AWS S3 버킷에 대한 연결을 설정하여 iceberg-warehouse/ 경로에 있는 Apache 아이스버그 테이블에 기록합니다. 문서 메타데이터 에서 검색된 소스 collection의 이름에 따라 테이블의 이름을 결정합니다. 또한 문서 메타데이터 에 따라 수행할 작업을 결정합니다.

{
"$source": {
"connectionName": "atlas1",
"db": "db",
"coll": ["a", "b", "c"],
"initialSync": {
"enable": true
},
"config": {
"fullDocument": "required"
}
}
},
{
"$match": {
"operationType": {
"$in": ["insert", "update", "delete", "replace"]
}
}
},
{
"$replaceRoot": {
"newRoot": {
"$cond": {
"if": {
"$eq": [{ "$meta": "stream.source.operationType" }, "delete"]
},
"then": "$documentKey",
"else": "$fullDocument"
}
}
}
},
{
"$iceberg": {
"connectionName": "myS3Connection",
"databaseName": "iceberg-db",
"bucket": "myData",
"path": "iceberg-warehouse/",
"tableName": { "$meta": "stream.source.ns.coll" },
"mode": "cdc"
}
}