테이블 구성
테이블 구성 (Table Configuration)
Apache Pinot 테이블 구성 레퍼런스 문서예요. 아래 표는 테이블 수준에서 설정할 수 있는 속성을 보여줘요.
출처: 문서
본문
최상위 필드 (Top-level fields)
| 속성 | 설명 |
|---|---|
| tableName | 테이블의 이름을 지정해요. 영숫자, 하이픈('-'), 밑줄('_')만 포함해야 해요. (하이픈은 테이블 이름에 허용되지만 SQL 예약 문자이므로 사용하려면 쿼리에서 테이블 이름을 큰따옴표로 묶어야 해요. 이중 밑줄('__')은 Pinot의 다른 기능에 예약돼 있으므로 허용되지 않아요.) |
| tableType | 테이블 유형을 정의해요: 오프라인 테이블은 OFFLINE, 실시간 테이블은 REALTIME. 하이브리드 테이블은 본질적으로 두 개의 테이블 구성(각 유형별 하나), 같은 테이블 이름을 가져요. |
| isDimTable | 테이블이 차원 테이블인지 나타내는 불리언 필드 |
| description | 선택적, 사람이 읽을 수 있는 테이블 설명. 이 필드에서 Markdown을 지원해요. |
| tags | 테이블 분류와 필터링용 선택적 태그 목록 |
| quota | 할당량 관련 속성(스토리지 할당량, 쿼리 할당량) 정의. 자세한 내용은 아래 Quota 표 참고. |
| task | 테이블에 활성화된 minion 작업 정의. 자세한 내용은 Minion 참고. |
| routing | broker가 라우팅할 서버를 선택하는 방법과 세그먼트 메타데이터 기반으로 broker가 세그먼트를 프루닝하는 방법을 결정하는 속성 정의. 아래 Routing 표 참고. |
| query | 쿼리 실행 관련 속성 정의. 아래 Query 표 참고. |
| tableSamplers | 쿼리별로 sampler 쿼리 옵션으로 선택할 수 있는 이름 있는 테이블 샘플러 정의. 아래 Table samplers 참고. |
| segmentsConfig | 세그먼트 push 빈도, 유형, 보존, 스키마, 시간 컬럼 등 세그먼트 관련 속성 정의. 아래 segmentsConfig 표 참고. |
| tableIndexConfig | Pinot 테이블의 인덱싱 관련 정보 정의. Table indexing config 참고. |
| fieldConfigList | 컬럼과 해당 컬럼에 생성할 인덱스 유형 지정. Field config list 참고. |
| tenants | 이 테이블에 사용되는 server와 broker 테넌트 정의. Tenant 참고. |
| ingestionConfig | 데이터 수집 관련 속성 정의. ingestionConfig 참고. |
| upsertConfig | upsert 구성 설정. Stream ingestion with upsert 참고. |
| dedupConfig | 중복 제거 구성 설정. Stream ingestion with Dedup 참고. |
| dimensionTableConfig | 테이블이 차원 테이블이면 메모리 절약을 위해 disablePreload를 true로 설정. |
| tierConfigs | 계층형 스토리지 구성 정의. Tiered Storage 참고. |
| metadata | 테이블의 기타 메타데이터 포함. 커스텀 구성을 키-값 쌍으로 담는 문자열 맵 필드 customConfigs가 있음. |
2차 수준 필드 (Second-level fields)
다음 속성은 최상위 구성 안에 중첩할 수 있어요.
Quota
| 속성 | 형식 | 설명 |
|---|---|---|
| storage | 대소문자 구분 없는 사람이 읽을 수 있는 데이터 크기 Double + (K, M, G, T, P) | 복제 전 테이블이 사용할 수 있는 최대 스토리지 공간. 예: storage가 140G이고 replication이 3이면 최대 스토리지는 140G x 3 = 420G. 이 한도에 도달하면 오프라인 세그먼트 push가 Quota check failed for segment... 메시지와 함께 403 예외를 던져요. 실시간 테이블은 정기 검증에서 초과 시 STORAGE_QUOTA_EXCEEDED 이유 코드로 소비를 일시 중지하고, 할당량 안으로 돌아오면 세그먼트 생성을 재개해요. |
| maxQueriesPerSecond | Double | 이 테이블에서 실행 가능한 초당 최대 쿼리 수. 양수 유한 값이어야 하며 0, 음수, NaN, 무한대는 거부돼요. 생략하면 쿼리 할당량이 무제한. 초과 시 429 예외와 QUERY_QUOTA_EXCEEDED BrokerMetric이 기록돼요. |
쿼리 할당량에 대한 자세한 내용은 여기를 참고하세요.
Routing
라우팅 구성에 대한 자세한 내용은 여기를 참고하세요.
| 속성 | 설명 |
|---|---|
| segmentPrunerTypes | 활성화할 세그먼트 프루너 목록. 지원 값: partition - zookeeper에 저장된 파티션 메타데이터 기반 프루닝(기본 없음), time - timeColumnName 필터 쿼리에서 쿼리 시간 범위의 데이터가 없는 세그먼트 프루닝. |
| instanceSelectorType | 선택된 세그먼트를 기반으로 쿼리를 서빙할 서버 인스턴스. 지원 값: balanced - 각 선택 인스턴스가 서빙하는 세그먼트 수 균형(기본), replicaGroup - 복제본 그룹 라우팅 전략용 인스턴스 선택기. |
Query
| 속성 | 설명 |
|---|---|
| timeoutMs | 쿼리 타임아웃 (밀리초) |
| disableGroovy | 쿼리에서 groovy 비활성화 여부. broker 인스턴스 수준 config(pinot.broker.disable.query.groovy)를 덮어써요. |
| useApproximateFunction | 이 테이블의 single-stage 엔진에서 적격 정확 distinct-count 및 백분위 집계를 SMART 변형으로 재작성할지 여부. |
| expressionOverrideMap | 쿼리에서 덮어쓸 표현식을 구성하는 맵. 다른 도구가 자동 생성한 쿼리 등 쿼리를 제어할 수 없을 때 유용. 예: {"myFunc(a)": "b"}. |
| maxQueryResponseSizeBytes | 쿼리에 대한 모든 서버의 직렬화 응답 최대 크기를 나타내는 Long 값. 이 값은 쿼리를 처리하는 모든 서버에 균등하게 분배돼요. |
| maxServerResponseSizeBytes | 쿼리당 서버별 직렬화 응답 최대 길이를 나타내는 Long 값. |
| maxEntriesScannedInFilter | 최대 누적 numEntriesScannedInFilter 서버 측 스캔 비용에 대한 선택적 테이블별 오버라이드. |
| maxDocsScanned | 최대 누적 numDocsScanned 서버 측 스캔 비용에 대한 선택적 테이블별 오버라이드. |
| maxEntriesScannedPostFilter | 최대 누적 numEntriesScannedPostFilter 서버 측 스캔 비용에 대한 선택적 테이블별 오버라이드. |
| scanKillingMode | 서버 측 스캔 기반 킬링 모드에 대한 선택적 테이블별 오버라이드. 유효 값: disabled, logOnly, enforce(대소문자 구분 없음). |
Table samplers
| 속성 | 설명 |
|---|---|
| name | 전역 옵션에서 사용하는 샘플러 이름(예: SET sampler='small'). 테이블 구성 내에서 이름은 고유해야 해요. |
| type | 사용할 샘플러 구현. 기본 제공 샘플러 유형, 정규화된 클래스 이름, 또는 broker 주석 스캔으로 등록된 별칭. |
| properties | 샘플러별 문자열 맵. 지원 키는 샘플러 유형에 따라 다름. |
예시:
"tableSamplers": [
{
"name": "small",
"type": "firstN",
"properties": {
"numSegments": "1"
}
}
]
기본 제공 firstN 샘플러는 세그먼트 이름을 사전순으로 정렬해 처음 numSegments 항목을 유지하고, numSegments는 양의 정수여야 해요.
Segments config
| 속성 | 설명 |
|---|---|
| schemaName | Deprecated: 스키마 이름은 항상 테이블 이름과 일치해야 하며(유형 접미사 제외, 예: myTable) 이 필드를 구성해서는 안 돼요. |
| timeColumnName | 이 테이블의 시간 컬럼 이름. 스키마의 시간 컬럼 이름과 일치해야 해요. push 유형 APPEND 테이블에 필수, REFRESH에는 선택. timeColumnName은 timeColumnType과 함께 세그먼트 보존과 오프라인 대 실시간 시간 경계를 관리하는 데 사용돼요. |
| replication | 테이블의 복제본 수. replication 값 1은 세그먼트가 서버 간 복제되지 않음을 의미. |
| retentionTimeUnit | 보존 단위(예: HOURS 또는 DAYS). retentionTimeValue와 함께 세그먼트를 보존할 기간을 결정. 예: 365 DAYS는 365일보다 오래된 데이터를 가진 세그먼트가 RetentionManager Controller 주기 작업으로 주기적으로 삭제됨. 기본적으로 보존 설정 없음. |
| retentionTimeValue | 보존을 위한 숫자 값. retentionTimeUnit과 함께 보존 기간 결정. |
Table index config
이 섹션은 일반 인덱스 구성과 Star-tree 같은 다중 컬럼 인덱스를 지정하는 데 사용돼요.
Pinot 0.13 이전에는 위 구성이 특정 단일 컬럼 인덱스 구성에도 사용됐어요. 이 방식은 여전히 지원되지만 Field Config List 섹션에서 이러한 인덱스를 지정하는 것이 권장돼요.
| 속성 | 설명 |
|---|---|
| createInvertedIndexDuringSegmentGeneration | DEPRECATED (Apache Pinot PR #17951): 더 이상 사용되지 않음. 역 인덱스는 항상 세그먼트 생성 중에 만들어져요. |
| sortedColumn | 데이터에서 정렬되어 정렬 인덱스를 갖는 컬럼. 세그먼트 생성 작업이 자동으로 정렬 컬럼을 감지하므로 오프라인 테이블에는 지정할 필요 없음. |
| multiColumnTextIndexConfig | 다중 컬럼/세그먼트별 텍스트 인덱스 구성. Text search support 참고. |
| starTreeIndexConfigs | StarTree 인덱스 생성을 위한 StarTree 인덱싱 config 목록. StarTree Index 참고. |
| enableDefaultStarTree | 세그먼트에 기본 StarTree 인덱스를 생성할지 나타내는 불리언. Star-Tree index 참고. |
| enableDynamicStarTreeCreation | server가 세그먼트를 로드할 때 StarTree 생성을 허용할지 나타내는 불리언. |
| segmentPartitionConfig | broker 측 파티션 프루닝용 컬럼별 파티션 함수 구성. segmentPartitionConfig.columnPartitionMap을 routing.segmentPrunerTypes와 함께 사용. |
| tierOverwrites | 티어 이름 키의 선택적 JSON 객체. 해당 티어 로드 시 일치 객체를 tableIndexConfig에 병합해요. |
| loadMode | 서버에 세그먼트를 로드하는 방법: heap - 데이터를 직접 메모리에 로드, mmap - 오프힙 메모리에 로드. |
| columnMinMaxValueGeneratorMode | 컬럼의 min max 값 생성. 지원 값: NONE, ALL, TIME, NON_METRIC. |
| nullHandlingEnabled | (deprecated, schema의 enableColumnBasedNullHandling 사용) |
| skipSegmentPreprocess | 모든 서버 로드 경로에서 세그먼트 전처리를 건너뛸지 여부. true로 설정하면 기본 컬럼, 단일 컬럼 인덱스, star-tree 인덱스, 다중 컬럼 텍스트 인덱스, 컬럼 min/max 값 검사/업데이트를 하지 않아요. 기본: false. 주의해서 사용하세요. |
| aggregateMetrics | (deprecated, Ingestion Aggregation 사용) 스트림에만 적용. 메트릭 사전 집계를 위해 true로 설정. |
| optimizeDictionary | 단일 값 메트릭 컬럼에 사전을 비활성화하려면 true로 설정. 단일 값 컬럼에만 적용. 기본 false. |
| optimizeDictionaryForMetrics | 단일 값 메트릭 컬럼에 사전 비활성화. 단일 값 메트릭 컬럼에만 적용. 기본 false. |
| optimizeDictionaryType | true이면 세그먼트의 모든 값이 같은 길이일 때 STRING, BYTES, BIG_DECIMAL 컬럼에 고정 폭 사전을 자동 선택. 기본 false. |
| noDictionarySizeRatioThreshold | optimizeDictionaryForMetrics 활성화 시 noDictionaryIndexSize/indexWithDictionarySize가 이 임계값 미만인 메트릭 컬럼에 사전 미생성. 기본 0.85. |
| noDictionaryCardinalityRatioThreshold | optimizeDictionary 활성화 시 cardinality / totalDocs 비율이 이 임계값 미만인 컬럼에는 여전히 사전 생성. 0.1(10%) 정도가 합리적 시작점. 기본 미설정(비활성화). |
| columnMajorSegmentBuilderEnabled | 세그먼트 구축 성능을 향상시킬 수 있는 컬럼-메이저 세그먼트 빌딩 활성화 불리언. 기본 true. |
| segmentNameGeneratorType | segmentNameGenerator 유형, 기본은 SimpleSegmentNameGenerator. #segment-name-generator-spec 참고. |
Segment partition config
broker가 파티션 컬럼 기반으로 세그먼트를 프루닝하려면 tableIndexConfig.segmentPartitionConfig.columnPartitionMap을 routing.segmentPrunerTypes: ["partition"]과 함께 사용하세요.
upsert 또는 dedup 활성 테이블의 경우 Pinot은
segmentPartitionConfig를 추가/제거/수정하는 테이블 구성 업데이트를 거부해요. 파티션 구성을 변경하면 같은 기본 키를 가진 레코드가 다른 파티션이나 서버로 보내져 중복이나 잘못된 쿼리 결과가 생길 수 있어요. 파티션 함수와 파티션 수를 테이블 생성 전에 계획하세요.
columnPartitionMap의 각 항목은 하나의 컬럼을 구성해요:
| 속성 | 설명 |
|---|---|
functionName |
파티션 함수 이름. 매칭 대소문자 구분 없음. 기본 제공: Modulo, Murmur, Murmur3, FNV, HashCode, ByteArray, BoundedColumnValue. Murmur2는 Murmur의 별칭. |
numPartitions |
컬럼의 총 파티션 수. |
functionConfig |
함수별 설정을 담는 선택적 문자열 맵. |
기본 제공 파티션 함수는 다음 기본값을 사용해요:
| 함수 | 별칭 | 기본 partitionIdNormalizer |
함수별 config |
|---|---|---|---|
Modulo |
없음 | POSITIVE_MODULO |
없음 |
Murmur |
Murmur2 |
MASK |
useRawBytes |
Murmur3 |
없음 | MASK |
seed, variant (x86_32, x64_32), useRawBytes |
FNV |
없음 | MASK |
variant (fnv1_32, fnv1a_32, fnv1_64, fnv1a_64), useRawBytes |
HashCode |
없음 | PRE_MODULO_ABS |
없음 |
ByteArray |
없음 | PRE_MODULO_ABS |
없음 |
BoundedColumnValue |
없음 | NO_OP |
columnValues, columnValuesDelimiter |
partitionIdNormalizer는 BoundedColumnValue를 제외한 모든 기본 제공 함수의 공유 config 키예요. 지원 값: POSITIVE_MODULO, ABS, MASK, PRE_MODULO_ABS, NO_OP.
BoundedColumnValue는 구성된 값을 고정 파티션 ID에 매핑하고 일치하지 않는 모든 값을 파티션 0으로 보내요. numPartitions은 구성된 값 수 + 1로 설정하세요.
예시:
{
"tableIndexConfig": {
"segmentPartitionConfig": {
"columnPartitionMap": {
"memberId": {
"functionName": "FNV",
"numPartitions": 16,
"functionConfig": {
"variant": "fnv1a_32",
"partitionIdNormalizer": "ABS"
}
},
"subject": {
"functionName": "BoundedColumnValue",
"numPartitions": 4,
"functionConfig": {
"columnValues": "Maths|English|Chemistry",
"columnValuesDelimiter": "|"
}
}
}
}
}
}
Pinot은 더 이상 닫힌
PartitionFunctionFactoryenum을 사용하지 않아요. 커스텀 파티션 함수는org.apache.pinot.*아래의 public, concretePartitionFunction구현으로(int numPartitions, Map<String, String> functionConfig)public 생성자가 있을 때 시작 시 발견돼요.
Field Config List
컬럼과 해당 컬럼에 생성할 인덱스 유형을 지정해요.
| 속성 | 설명 |
|---|---|
| name | 컬럼의 이름 |
| encodingType | RAW 또는 DICTIONARY 중 하나 |
| indexes | 키가 인덱스를 식별하는 객체. 값은 각 인덱스의 구성으로 해석. |
| tierOverwrites | 티어 이름 키의 선택적 JSON 객체. 해당 티어의 필드 구성에 병합. |
| timestampConfig | timestamp 인덱스에 사용되는 세분성을 정의하는 객체 |
| properties | 인덱스와 관련된 추가 속성을 담는 키-값 쌍의 JSON. |
encodingType이 RAW이면 forward index는 원시 값을 저장해요. 컬럼은 다른 필드 수준 인덱스가 사전 ID나 사전 값을 요구하면 여전히 사전을 가질 수 있어요. 구성 업데이트의 경우 indexes.dictionary에서 해당 사전을 명시적으로 만들고 legacy tableIndexConfig.noDictionaryColumns/noDictionaryConfig에서 컬럼을 유지하지 마세요.
RAW forward index + 독립 사전 예시:
{
"fieldConfigList": [
{
"name": "myColumn",
"encodingType": "RAW",
"indexes": {
"dictionary": {},
"inverted": {}
}
}
]
}
OPEN_STRUCT 인덱스
단일 값 OPEN_STRUCT 컬럼에서 open_struct 필드 수준 인덱스를 사용하면 하나의 컬럼에 반구조화 객체를 유지하면서 자주 사용하는 키를 표준 Pinot 컬럼으로 구체화할 수 있어요.
Pinot은 OPEN_STRUCT 데이터를 두 계층으로 저장해요:
- Dense 키는
<column>$<key>라는 구체화된 자식 컬럼이 됨. - 나머지 키는
<column>$__sparse__라는 하나의 희소 JSON 컬럼에 기록.
open_struct config 객체는 다음 속성을 지원해요:
| 속성 | 설명 |
|---|---|
denseKeys |
채움 비율과 무관하게 Pinot이 항상 dense 자식 컬럼으로 구체화하는 선택적 명시적 키 집합. |
ignoredKeys |
수집 중 버릴 선택적 키 집합. 요청 불가. denseKeys, valueFieldConfigs, 스키마의 childFieldSpecs에 나타날 수 없음. 새로 수집된 데이터에만 영향. |
denseKeyMinFillRate |
Pinot이 자동 구체화 전에 문서가 키를 포함해야 하는 최소 비율. 기본 0.5. |
maxDenseKeys |
구체화할 dense 키 최대 수. -1 무제한, 0 dense 키 비활성화, 양수는 최고 채움 비율 키만 dense로 유지. |
sparseJsonIndex |
공유 희소 컬럼에 JSON 인덱스 구축 여부. 기본 false. |
perKeyMetricsEnabled |
밀봉 세그먼트에서 발견된 모든 키에 OPEN_STRUCT_LAST_SEGMENT_KEY_DOC_COUNT 방출 여부. 기본 false. |
defaultValueFieldConfig |
valueFieldConfigs에 나타나지 않는 dense 키에 적용되는 선택적 폴백 FieldConfig. |
valueFieldConfigs |
키별 FieldConfig 항목의 선택적 목록. 각 항목의 name은 OPEN_STRUCT 키 이름과 일치해야 함. |
defaultValueFieldConfig 또는 valueFieldConfigs 안의 키별 FieldConfig.indexes는 검증된 부분집합(dictionary, forward, inverted, range, bloom)만 사용할 수 있어요. forward 인덱스는 구체화된 자식 컬럼에 항상 기록돼요.
예시:
{
"fieldConfigList": [
{
"name": "attributes",
"indexes": {
"open_struct": {
"denseKeys": ["customerId", "country"],
"ignoredKeys": ["debug", "internalTrace"],
"denseKeyMinFillRate": 0.5,
"maxDenseKeys": 32,
"sparseJsonIndex": true,
"perKeyMetricsEnabled": false,
"valueFieldConfigs": [
{ "name": "customerId", "indexes": { "inverted": {} } },
{ "name": "country", "indexes": { "bloom": {} } }
]
}
}
}
]
}
실시간 테이블의 경우 지속 세그먼트 형식을 바꾸지 않고 가변 소비 세그먼트에 다른 인덱스 레이아웃을 줄 수도 있어요. Pinot은 consuming 오버라이드를 먼저 적용하고, 일반 테이블 구성 경로를 통해 유효 구성을 검증한 다음, 세그먼트가 여전히 소비 중인 동안에만 그 유효 뷰를 사용해요:
{
"tableIndexConfig": {
"noDictionaryColumns": ["profiledString"],
"tierOverwrites": {
"consuming": { "noDictionaryColumns": [] }
}
},
"fieldConfigList": [
{
"name": "profiledString",
"encodingType": "RAW",
"tierOverwrites": {
"consuming": {
"encodingType": "DICTIONARY",
"indexes": { "inverted": { "disabled": false } }
}
}
}
]
}
가변 소비 세그먼트가 사전 기반 역 인덱스 같은 추가 인덱스를 노출하도록 하려면 이 패턴을 사용하세요. 행 형태 설정은 기본 구성에 두고, 의도한 스토리지 티어 동작이 아니면 consuming이라는 실제 tierConfigs 항목을 정의하지 마세요.
Deprecated 구성 옵션
Pinot에는 여전히 지원되지만 새로운 구성 방식으로 마이그레이션하는 것이 권장되는 여러 deprecated 구성 옵션이 있어요:
indexTypes - 컬럼에 대해 활성화된 인덱스를 정의하는 옛 방식. 지원 유형: Text, FST, Timestamp, H3 (지리공간).
indexType - indexTypes와 유사하지만 문자열로 단일 인덱스 유형만 지원. 둘 다 있으면 후자는 무시돼요.
compressionCodec - 인덱스 압축 지정의 옛 방식. 이제 forward index config에서 지정 권장.
Deprecated properties - Pinot 0.13 이전에는 특정 인덱스가 이 섹션의 properties로 구성됐어요. 0.13부터 각 인덱스는 indexes 객체의 전용 섹션에서 타입 세이프하게 구성할 수 있어요.
경고: 다중값(MV) 컬럼의 forward 인덱스를 재생성하기 위해 위
forwardIndexDisabled속성을 제거하면 다음 불변식이 유지될 수 없어요: 행 내 MV 값의 순서 보장, MV 행 내 중복 항목의 중복 유실. 중복이 있는 원래 MV 데이터를 복구하려면 오프라인 작업으로 세그먼트를 재생성하고 push/새로고침하세요.
실시간 테이블 구성 (Real-time table config)
아래 섹션은 실시간 테이블에만 적용돼요.
segmentsConfig
| 속성 | 설명 |
|---|---|
| replicasPerPartition (Deprecated, replication 사용) | 스트림의 파티션별 복제본 수 |
| completionMode | 세그먼트를 다른 서버에서 다운로드할지 메모리에서 구축할지 결정. DOWNLOAD 또는 비어 있을 수 있음 |
| peerSegmentDownloadScheme | 서버에서 세그먼트를 다운로드할 프로토콜. http 또는 https 중 하나 |
Indexing config
streamConfigs 섹션은 릴리스 0.7.0부터 deprecated됐어요. streamConfigMaps를 대신 참고하세요.
Tenants
| 속성 | 설명 |
|---|---|
| broker | 세그먼트가 위치해야 하는 broker 테넌트 |
| server | 세그먼트가 위치해야 하는 server 테넌트 |
| tagOverrideConfig | 특정 조건을 충족하면 세그먼트의 테넌트를 덮어써요. 현재 realtimeConsuming 또는 realtimeCompleted 오버라이드만 지원. |
환경 변수 오버라이드 (Environment variables override)
Pinot은 사용자가 테이블 구성의 필드 값으로 ${ENV_NAME} 또는 ${ENV_NAME:DEFAULT_VALUE} 형식의 환경 변수를 정의할 수 있게 해요. Pinot 인스턴스는 런타임 중 이를 덮어써요.
테이블을 생성하거나 업데이트할 때 controller는 이제 테이블 구성에 저장하기 전에 이러한 플레이스홀더를 자체 런타임 환경에 대해 검증해요. 기본값 없는 플레이스홀더가 해석되지 않으면 Pinot은 쓰기를 거부해요.
환경 변수 정의 시 대괄호가 필요해요.
"$ENV_NAME"은 지원되지 않아요.
테이블 구성에서 기본값 없이 사용되는 환경 변수는 Controller, Broker, Server, Minion 등 모든 Pinot 구성 요소에서 사용할 수 있어야 해요. 그렇지 않으면 해당 변수를 사용할 수 없는 서비스에 따라 쿼리/소비가 영향받아요.
아래는 환경 변수를 사용해 테이블 구성의 일부로 AWS 자격증명을 설정하는 예시예요.
샘플 구성 (Sample configurations)
오프라인 테이블
아래 예시는 친숙함을 위해 일부 레거시 구성 패턴을 사용해요. 새 테이블 구성에서는
tableIndexConfig의invertedIndexColumns,rangeIndexColumns,bloomFilterColumns등 대신fieldConfigList와indexes객체를 사용하는 것을 선호하세요.segmentsConfig의timeType필드도 deprecated이며 스키마의dateTimeFieldSpec에 시간 형식을 정의하세요.
"OFFLINE": {
"tableName": "pinotTable",
"tableType": "OFFLINE",
"quota": {
"maxQueriesPerSecond": 300,
"storage": "140G"
},
"routing": {
"segmentPrunerTypes": ["partition"],
"instanceSelectorType": "replicaGroup"
},
"segmentsConfig": {
"timeColumnName": "daysSinceEpoch",
"timeType": "DAYS",
"replication": "3",
"retentionTimeUnit": "DAYS",
"retentionTimeValue": "365"
},
"tableIndexConfig": {
"invertedIndexColumns": ["foo", "bar", "moo"],
"createInvertedIndexDuringSegmentGeneration": false,
"sortedColumn": ["pk"],
"bloomFilterColumns": [],
"starTreeIndexConfigs": [],
"noDictionaryColumns": [],
"rangeIndexColumns": [],
"onHeapDictionaryColumns": [],
"varLengthDictionaryColumns": [],
"segmentPartitionConfig": {
"columnPartitionMap": {
"column_foo": {
"functionName": "Murmur",
"numPartitions": 32
}
}
},
"loadMode": "MMAP",
"columnMinMaxValueGeneratorMode": null,
"nullHandlingEnabled": false
},
"ingestionConfig": {
"batchIngestionConfig": {
"segmentIngestionType": "APPEND",
"segmentIngestionFrequency": "DAILY"
},
"filterConfig": {
"filterFunction": "Groovy({foo == \"VALUE1\"}, foo)"
},
"transformConfigs": [
{
"columnName": "bar",
"transformFunction": "lower(moo)"
},
{
"columnName": "hoursSinceEpoch",
"transformFunction": "toEpochHours(millis)"
}]
},
"tenants": {
"broker": "myBrokerTenant",
"server": "myServerTenant"
},
"metadata": {
"customConfigs": {
"key": "value"
}
}
}
실시간 테이블
아래는 실시간 테이블용 예시 테이블 구성이에요. 오프라인 테이블 구성의 모든 필드는 실시간 테이블에도 유효해요. 추가로 실시간 테이블은 몇 가지 추가 필드를 사용해요.
realtime.segment.flush.threshold.rows,realtime.segment.flush.threshold.time,realtime.segment.flush.threshold.segment.size같은 flush 키는ingestionConfig.streamIngestionConfig.streamConfigMaps아래에 있어요. Realtime segment flush threshold precedence와 Ingestion stream configs 참고.
"REALTIME": {
"tableName": "pinotTable",
"tableType": "REALTIME",
"segmentsConfig": {
"timeColumnName": "daysSinceEpoch",
"timeType": "DAYS",
"replication": "3",
"retentionTimeUnit": "DAYS",
"retentionTimeValue": "5",
"completionConfig": {
"completionMode": "DOWNLOAD"
}
},
"tableIndexConfig": {
"invertedIndexColumns": ["foo", "bar", "moo"],
"sortedColumn": ["column1"],
"noDictionaryColumns": ["metric1", "metric2"],
"loadMode": "MMAP",
"nullHandlingEnabled": false
},
"ingestionConfig": {
"streamIngestionConfig": {
"streamConfigMaps": [
{
"realtime.segment.flush.threshold.rows": "0",
"realtime.segment.flush.threshold.time": "24h",
"realtime.segment.flush.threshold.segment.size": "150M",
"stream.kafka.broker.list": "XXXX",
"stream.kafka.consumer.factory.class.name": "XXXX",
"stream.kafka.consumer.prop.auto.offset.reset": "largest",
"stream.kafka.decoder.class.name": "XXXX",
"stream.kafka.decoder.prop.schema.registry.rest.url": "XXXX",
"stream.kafka.decoder.prop.schema.registry.schema.name": "XXXX",
"stream.kafka.topic.name": "XXXX",
"streamType": "kafka"
}]
}
},
"tenants":{
"broker": "myBrokerTenant",
"server": "myServerTenant",
"tagOverrideConfig": {}
},
"metadata": {}
}