Pinot 세그먼트 만들기
Pinot 세그먼트 만들기
Pinot 세그먼트를 만드는 방법을 알려드려요.
출처: 문서
본문
Pinot 세그먼트 만들기
Pinot 세그먼트는 Hadoop에서 오프라인으로, 또는 데이터 파일에서 명령줄로 만들 수 있어요. 그런 다음 Controller REST 엔드포인트를 사용해 세그먼트를 해당 세그먼트가 속한 테이블에 추가할 수 있어요. Pinot 세그먼트는 실시간 소스(예: Kafka)에서 데이터를 수집해 만들 수도 있어요.
hadoop을 사용해 세그먼트 만들기

오프라인 Pinot 워크플로
Hadoop에서 Pinot 세그먼트를 만들려면 다음 단계를 완료하는 워크플로를 만들 수 있어요:
- 데이터를 사전 집계, 정리, 준비해 단일 HDFS 디렉터리에 Avro 형식 파일로 작성
- 세그먼트 생성
- Pinot 클러스터에 세그먼트 업로드
1단계는 Pig, Hive, Spark 같은 선호하는 도구로 할 수 있고, Pinot은 2단계와 3단계를 수행할 두 개의 MapReduce 작업을 제공해요.
작업 구성 (Configuring the job)
아래와 같은 작업 속성 구성 파일을 만드세요:
# === Index segment creation job config ===
# path.to.input: Avro 파일을 포함한 입력 디렉터리
path.to.input=/user/pinot/input/data
# path.to.output: Pinot 세그먼트를 포함한 출력 디렉터리
path.to.output=/user/pinot/output
# path.to.schema: 테이블의 스키마 파일, 로컬 저장
path.to.schema=flights-schema.json
# segment.table.name: 세그먼트를 생성할 테이블의 이름
segment.table.name=flights
# === Segment tar push job config ===
# push.to.hosts: push할 controller 호스트 이름의 쉼표 구분 목록
push.to.hosts=controller_host_0,controller_host_1
# push.to.port: controller가 실행되는 포트
push.to.port=8888
작업 실행 (Executing the job)
Pinot Hadoop 모듈은 워크플로에 통합해 Pinot 세그먼트를 생성할 수 있는 작업을 포함해요.
mvn clean install -DskipTests -Pbuild-shaded-jar
hadoop jar pinot-hadoop-<version>-SNAPSHOT-shaded.jar SegmentCreation job.properties
그런 다음 SegmentTarPush 작업을 사용해 controller REST API를 통해 세그먼트를 push 할 수 있어요.
hadoop jar pinot-hadoop-<version>-SNAPSHOT-shaded.jar SegmentTarPush job.properties
Hadoop 밖에서 Pinot 세그먼트 만들기
CSV/JSON/AVRO 같은 표준 형식에서 Pinot 세그먼트를 만드는 방법은 다음과 같아요.
- 컴파일 코드 섹션의 단계를 따라 pinot을 빌드하세요.
pinot-admin.sh를pinot-tools/target/pinot-tools-pkg/bin/pinot-admin.sh에서 찾으세요. - 세그먼트로 변환해야 할 모든 CSV/JSON/AVRO 파일을 포함하는 최상위 디렉터리를 만드세요.
- 파일 이름 확장자는 형식 이름과 같을 것으로 예상되며(
.csv,.json또는.avro), 대소문자를 구분하지 않아요. 데이터가 탭이나 공백으로 구분되더라도 변환기는.csv확장자를 기대한다는 것을 참고하세요. - 입력 데이터의 스키마를 설명하는 스키마 파일을 준비하세요. 스키마는 JSON 형식이어야 해요. 이 섹션 뒷부분의 예시를 참고하세요.
- 특히 CSV 형식의 경우 선택적 csv 구성 파일(역시 JSON 형식)을 제공할 수 있어요. CSV 파일의 구분자/헤더 같은 매개변수를 구성하는 데 사용돼요. 자세한 설명은 아래에 이어져요.
pinot-admin 명령을 실행해 세그먼트를 생성하세요. 명령은 다음과 같이 호출할 수 있어요. "\[ ]" 안의 옵션은 선택 사항이에요. -format의 기본값은 AVRO예요.
bin/pinot-admin.sh CreateSegment -dataDir <input_data_dir> [-format [CSV/JSON/AVRO]] [-readerConfigFile <csv_config_file>] [-generatorConfigFile <generator_config_file>] -segmentName <segment_name> -schemaFile <input_schema_file> -tableName <table_name> -outDir <output_data_dir> [-overwrite]
CSV의 다양한 매개변수를 구성하려면 JSON 형식의 구성 파일을 제공할 수 있어요. 이 파일은 선택 사항이며 각 매개변수도 선택 사항이에요. 제공하지 않으면 아래 설명된 기본값이 사용돼요:
- fileFormat: 다음 중 하나를 지정하세요. 기본값은 EXCEL이에요.
- EXCEL
- MYSQL
- RFC4180
- TDF
- header: 입력 CSV 파일에 헤더가 없으면 이 필드로 지정할 수 있어요. 지정하면 입력 파일에 헤더 행이 포함되지 않을 것으로 기대하며, 그렇지 않으면 파싱 오류가 발생해요. 헤더의 컬럼은 CSV 파일의 나머지와 같은 구분자 문자로 구분되어야 해요.
- delimiter: 구분자 문자를 지정하려면 이것을 사용하세요. 기본값은 ","예요.
- multiValueDelimiter: 다중값 컬럼의 각 값에 대한 구분자 문자를 지정하려면 이것을 사용하세요. 기본값은 ";"예요.
샘플 구성 파일은 아래와 같아요.
{
"fileFormat": "EXCEL",
"header": "col1,col2,col3,col4",
"delimiter": "\t",
"multiValueDelimiter": ","
}
샘플 스키마:
{
"schemaName": "flights",
"dimensionFieldSpecs": [
{
"name": "flightNumber",
"dataType": "LONG"
},
{
"name": "tags",
"dataType": "STRING",
"singleValueField": false
}
],
"metricFieldSpecs": [
{
"name": "price",
"dataType": "DOUBLE"
}
],
"timeFieldSpec": {
"incomingGranularitySpec": {
"name": "daysSinceEpoch",
"dataType": "INT",
"timeType": "DAYS"
}
}
}
오프라인 세그먼트를 Pinot으로 push하기
curl을 사용해 세그먼트를 Pinot으로 push할 수 있어요. v1 /segments 엔드포인트의 경우 대상 테이블을 명시적으로 지정하세요:
curl -X POST -F segment=@<segment-tar-file-path> \
"http://controllerHost:controllerPort/segments?tableName=<tableName>"
v1 엔드포인트는 tableName 요청 매개변수, 선택적 Pinot-TableName 헤더, 세그먼트 메타데이터에 포함된 segment.table.name 전반에 걸쳐 대상 테이블을 엄격히 바인딩해요. 둘 이상이 제공되면 모든 값이 같은 테이블을 식별해야 해요. 누락, 빈 값, 유효하지 않거나 충돌하는 값은 HTTP 400을 반환해요. 인증은 Pinot이 세그먼트 데이터를 가져오거나 저장하기 전에 정확한 대상 테이블에 대해 평가돼요.
기존 세그먼트 아티팩트를 의도적으로 다른 대상 테이블에 업로드할 때 — 예를 들어 포함된 소스 테이블 메타데이터가 대상과 다른 세그먼트를 승격하거나 재사용할 때 — /v2/segments를 사용하세요. v2 엔드포인트는 대상 오버라이드 동작을 유지하면서 인증과 데이터베이스 헤더를 최종 대상에 바인딩해요.
또는 pinot-admin.sh 유틸리티를 사용해 하나 이상의 세그먼트를 업로드할 수 있어요:
pinot-tools/target/pinot-tools-pkg/bin//pinot-admin.sh UploadSegment -controllerHost <hostname> -controllerPort <port> -segmentDir <segmentDirectoryPath>
이 명령은 segmentDirectoryPath에서 발견된 모든 세그먼트를 업로드해요. 세그먼트는 tar 압축(segmentDirectoryPath 아래의 파일)이거나 압축되지 않은(segmentDirectoryPath 아래의 디렉터리) 것일 수 있어요.