JSON 기반 배치 simple task 인덱싱

JSON 기반 배치 simple task 인덱싱

정보

이 페이지는 ingestion spec을 사용한 네이티브 배치 수집을 설명해요. 어떤 수집 방법이 적합한지는 ingestion methods 표를 참고해 주세요.

simple task(태스크 타입 index)는 indexing service 안에서 단일 태스크로 단일 스레드로 실행됩니다. 병렬·확장 가능한 옵션이 필요하다면 index_parallel 태스크나 SQL 기반 배치 수집을 고려해 보세요.

출처: 문서

본문

Simple task 예시

샘플 태스크는 다음과 같아요.

{  "type" : "index",  "spec" : {    "dataSchema" : {      "dataSource" : "wikipedia",      "timestampSpec" : {        "column" : "timestamp",        "format" : "auto"      },      "dimensionsSpec" : {        "dimensions": ["country", "page","language","user","unpatrolled","newPage","robot","anonymous","namespace","continent","region","city"],        "dimensionExclusions" : []      },      "metricsSpec" : [        {          "type" : "count",          "name" : "count"        },        {          "type" : "doubleSum",          "name" : "added",          "fieldName" : "added"        },        {          "type" : "doubleSum",          "name" : "deleted",          "fieldName" : "deleted"        },        {          "type" : "doubleSum",          "name" : "delta",          "fieldName" : "delta"        }      ],      "granularitySpec" : {        "type" : "uniform",        "segmentGranularity" : "DAY",        "queryGranularity" : "NONE",        "intervals" : [ "2013-08-31/2013-09-01" ]      }    },    "ioConfig" : {      "type" : "index",      "inputSource" : {        "type" : "local",        "baseDir" : "examples/indexing/",        "filter" : "wikipedia_data.json"       },       "inputFormat": {         "type": "json"       }    },    "tuningConfig" : {      "type" : "index",      "partitionsSpec": {        "type": "hashed",        "partitionDimensions": ["country"],        "targetRowsPerSegment": 5000000      }    }  }}

Simple task 구성

| property | description | required? | | type | 태스크 타입. 항상 index여야 함 | yes | | id | 태스크 ID. 명시하지 않으면 Druid가 태스크 타입, 데이터 소스 이름, interval, 날짜-시간 스탬프로 태스크 ID를 생성 | no | | spec | data schema, IO config, tuning config를 포함한 ingestion spec | yes | | context | 다양한 태스크 구성 파라미터를 지정하는 컨텍스트. 자세한 내용은 Task context parameters 참고 | no |

dataSchema

이 필드는 필수입니다. 자세한 내용은 수집 문서의 dataSchema 섹션을 참고하세요.

dataSchema의 granularitySpec에서 intervals를 명시하지 않으면, Local Index Task는 시작할 때 잠글 범위를 정하기 위해 데이터를 한 번 더 훑습니다. intervals를 명시하면 지정된 interval 밖의 행은 버려져요. 데이터의 시간 범위를 안다면 intervals를 명시하는 것을 권장합니다. 태스크가 추가 패스를 건너뛸 수 있고, 예상 밖의 타임스탬프를 가진 튀는 데이터가 있을 때 그 범위 밖의 데이터를 실수로 대체하는 일도 막아 주기 때문이에요.

ioConfig

| property | description | default | required? | | type | 태스크 타입. 항상 "index"여야 함 | none | yes | | inputFormat | 입력 데이터를 어떻게 파싱할지 지정하는 inputFormat | none | yes | | appendToExisting | 세그먼트를 최신 버전의 추가 샤드로 만들어, 세그먼트 집합을 대체하는 대신 효과적으로 append함. 즉 원래 파티셔닝 방식과 무관하게 어떤 datasource에도 새 세그먼트를 append할 수 있음. append된 세그먼트에는 반드시 dynamic 파티셔닝 타입을 사용해야 하고, 다른 타입을 지정하면 태스크가 오류로 실패함 | false | no | | dropExisting | 이 설정이 false면 수집은 평소처럼 진행됨. true로 설정하고 appendToExisting도 false로 하면 아래 설명대로 진짜 "replace" 기능이 적용됨. true이고 appendToExisting이 false이고 granularitySpec에 interval이 하나 이상 포함되어 있다면, 수집 태스크는 입력 데이터가 있는 시간 청크 interval에는 일반 세그먼트를, 데이터가 없는 다른 시간 청크에는 tombstones를 만들음. 태스크가 새 세그먼트를 게시할 때 데이터 세그먼트와 tombstone 세그먼트를 함께 게시함. 데이터 세그먼트와 tombstone의 순효과는 '입력 데이터가 없는 시간 청크조차' granularitySpec interval에 포함된 입력 데이터가 interval의 모든 기존 데이터를 대체하는 'replace' 시맨틱을 완전히 지키는 것. 극단적으로 granularitySpec interval에 들어오는 입력 데이터셋이 비어 있으면, 그 interval의 모든 기존 데이터가 빈 데이터셋(즉 아무것도 없음 — 모든 기존 데이터가 tombstones로 덮임)으로 대체됨. 수집이 실패하면 세그먼트와 tombstone은 게시되지 않음. 다음 두 조합은 지원되지 않고 수집을 오류로 실패시킴: dropExisting이 true인데 granularitySpec에 interval이 지정되지 않음, 또는 appendToExisting이 true이고 dropExisting이 true. 경고: 이 기능은 아직 베타이며 알려진 버그는 없지만 주의해서 사용할 것. | false | no |

tuningConfig

tuningConfig는 선택 사항이며, 지정하지 않으면 기본 파라미터가 사용됩니다. 자세한 내용은 아래를 참고하세요.

| property | description | default | required? | | type | 태스크 타입. 항상 "index"여야 함 | none | yes | | maxRowsInMemory | 디스크로의 중간 persist가 언제 일어날지 결정하는 데 사용. 보통 사용자가 설정할 필요는 없지만, 데이터 성격에 따라 행이 바이트로 짧다면 백만 행을 메모리에 저장하고 싶지 않을 수 있고 이때 이 값을 설정함 | 1000000 | no | | maxBytesInMemory | 디스크로의 중간 persist가 언제 일어날지 결정하는 데 사용. 보통 내부적으로 계산되므로 사용자가 설정할 필요 없음. 이 값은 persist 전에 힙 메모리에 모을 바이트 수를 나타내며, 메모리 사용의 대략적 추정치에 기반하고 실제 사용량은 아님. 인덱싱의 최대 힙 메모리 사용량은 maxBytesInMemory * (2 + maxPendingPersists). 참고로 maxBytesInMemory는 중간 persist에서 만들어진 아티팩트의 힙 사용도 포함함. 즉 매 persist 후 다음 persist까지 사용 가능한 maxBytesInMemory 양이 줄어들고, 모든 중간 persisted 아티팩트의 바이트 합이 maxBytesInMemory를 초과하면 태스크가 실패함 | max JVM 메모리의 1/6 | no | | maxTotalRows | Deprecated. 대신 partitionsSpec 사용. 푸시를 기다리는 세그먼트의 총 행 수. 중간 push가 언제 일어날지 결정하는 데 사용 | 20000000 | no | | numShards | Deprecated. 대신 partitionsSpec 사용. 만들 샤드 수를 직접 지정. 이 값이 지정되고 granularitySpec에 intervals가 지정되면 index task는 데이터를 훑어 interval/파티션을 결정하는 패스를 건너뜀 | null | no | | partitionDimensions | Deprecated. 대신 partitionsSpec 사용. 파티셔닝할 dimension들. 비워두면 모든 dimension 선택. forceGuaranteedRollup = true일 때만 사용되며 그 외에는 무시됨 | null | no | | partitionsSpec | 각 timeChunk에서 데이터를 어떻게 파티셔닝할지 정의. PartitionsSpec 참고 | forceGuaranteedRollup = false면 dynamic, forceGuaranteedRollup = true면 hashed | no | | indexSpec | 인덱싱 시점에 사용할 세그먼트 저장 형식 옵션 정의. IndexSpec 참고 | null | no | | indexSpecForIntermediatePersists | 인덱싱 시점에 중간 persisted 임시 세그먼트에 사용할 세그먼트 저장 형식 옵션 정의. 중간 세그먼트의 dimension/metric 압축을 비활성화해서 최종 병합에 필요한 메모리를 줄일 수 있음. 다만 중간 세그먼트의 압축을 끄면 최종 세그먼트로 병합되기 전 사용 중에 페이지 캐시 사용이 늘어날 수 있음. 가능한 값은 IndexSpec 참고 | indexSpec과 동일 | no | | maxPendingPersists | pending 상태로 시작되지 않은 채 대기할 수 있는 persist 최대 개수. 새 중간 persist로 이 한도가 초과되면 수집은 현재 실행 중인 persist가 끝날 때까지 블록됨. 인덱싱의 최대 힙 메모리 사용량은 maxRowsInMemory * (2 + maxPendingPersists)에 비례 | 0 (수집과 동시에 실행될 수 있는 persist는 1개이고, 큐에 쌓일 수 있는 것은 없음을 의미) | no | | forceGuaranteedRollup | perfect rollup을 강제함. perfect rollup은 생성된 세그먼트의 총 크기와 쿼리 시간을 최적화하지만 인덱싱 시간은 늘어남. true로 설정하면 index task는 전체 입력 데이터를 두 번 읽음: 한 번은 시간 청크별 최적 파티션 수를 찾기 위해, 한 번은 세그먼트 생성용. 결과 세그먼트는 hash 파티셔닝됨. 이 플래그는 IOConfig의 appendToExisting과 함께 사용할 수 없음. 자세한 내용은 아래 Segment pushing modes 섹션 참고 | false | no | | reportParseExceptions | DEPRECATED. true면 파싱 중 발생한 예외를 던져 수집을 중단하고, false면 파싱할 수 없는 행·필드를 건너뜀. reportParseExceptions를 true로 설정하면 maxParseExceptions와 maxSavedParseExceptions의 기존 구성을 덮어써서 maxParseExceptions를 0으로, maxSavedParseExceptions를 최대 1로 제한함 | false | no | | pushTimeout | 세그먼트 푸시를 기다리는 밀리초. 0 이상이어야 하고, 0은 영원히 기다림을 의미 | 0 | no | | segmentWriteOutMediumFactory | 세그먼트를 만들 때 사용할 세그먼트 write-out 매체. SegmentWriteOutMediumFactory 참고 | 미지정, druid.peon.defaultSegmentWriteOutMediumFactory.type 값 사용 | no | | logParseExceptions | true면 파싱 예외 발생 시 오류가 발생한 행 정보를 포함한 오류 메시지를 로깅 | false | no | | maxParseExceptions | 태스크가 수집을 중단하고 실패하기 전에 발생할 수 있는 파싱 예외 최대 개수. reportParseExceptions가 설정되면 무시됨 | unlimited | no | | maxSavedParseExceptions | 파싱 예외 발생 시 Druid가 가장 최근 파싱 예외들을 추적할 수 있음. "maxSavedParseExceptions"는 저장할 예외 인스턴스 수를 제한. 저장된 예외는 태스크 완료 후 task completion report에서 확인 가능. reportParseExceptions가 설정되면 무시됨 | 0 | no |

partitionsSpec

PartitionsSpec는 보조 파티셔닝 방법을 기술해요. 원하는 롤업 모드에 따라 다른 partitionsSpec을 사용해야 합니다. perfect rollup에는 hashed를 사용하세요.

| property | description | default | required? | | type | 항상 hashed여야 함 | none | yes | | maxRowsPerSegment | 샤딩에 사용. 각 세그먼트에 몇 행이 들어갈지 결정 | 5000000 | no | | numShards | 만들 샤드 수를 직접 지정. 이 값이 지정되고 granularitySpec에 intervals가 지정되면 index task는 데이터를 훑어 interval/파티션을 결정하는 패스를 건너뜀. maxRowsPerSegment가 설정되면 numShards를 지정할 수 없음 | null | no | | partitionDimensions | 파티셔닝할 dimension들. 비워두면 모든 dimension 선택 | null | no | | partitionFunction | 파티션 dimension의 해시를 계산하는 함수. Hash partition function 참고 | murmur3_32_abs | no |

best-effort rollup에는 dynamic을 사용하세요.

| property | description | default | required? | | type | 항상 dynamic이어야 함 | none | yes | | maxRowsPerSegment | 샤딩에 사용. 각 세그먼트에 몇 행이 들어갈지 결정 | 5000000 | no | | maxTotalRows | 푸시를 기다리는 세그먼트의 총 행 수 | 20000000 | no |

세그먼트 푸시 모드 (Segment pushing modes)

simple task 인덱싱으로 데이터를 수집하는 동안 Druid는 입력 데이터에서 세그먼트를 만들어 푸시해요. simple task index는 롤업 타입에 따라 다음 세그먼트 푸시 모드를 지원합니다.

  • 벌크 푸시 모드(Bulk pushing mode): perfect rollup에 사용. Druid는 index task의 맨 끝에서 모든 세그먼트를 푸시함. 그때까지 Druid는 생성된 세그먼트를 index task를 실행하는 서비스의 메모리와 로컬 스토리지에 저장. 이 모드는 스토리지 용량이 제한된 환경에서 문제가 될 수 있어 프로덕션에는 권장하지 않음. 벌크 푸시 모드를 활성화하려면 TuningConfig에서 forceGuaranteedRollup을 설정. 벌크 푸시는 IOConfig의 appendToExisting과 함께 사용할 수 없음.
  • 증분 푸시 모드(Incremental pushing mode): best-effort rollup에 사용. Druid는 인덱싱 태스크가 진행되는 동안 세그먼트를 점진적으로 푸시함. index task는 수집된 총 행 수가 maxTotalRows를 초과할 때까지 데이터를 수집하면서 생성된 세그먼트를 태스크를 실행하는 서비스의 메모리·디스크에 저장. 그 시점에 index task는 지금까지 만든 모든 세그먼트를 즉시 푸시하고, 푸시된 세그먼트를 정리한 뒤 남은 데이터 수집을 계속함.

더 알아보기 (Learn more)