Pinot 세그먼트 만들기

Pinot 세그먼트 만들기

Pinot 세그먼트를 만드는 방법을 알려드려요.

출처: 문서

본문

Pinot 세그먼트 만들기

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

hadoop을 사용해 세그먼트 만들기

오프라인 Pinot 워크플로

Hadoop에서 Pinot 세그먼트를 만들려면 다음 단계를 완료하는 워크플로를 만들 수 있어요:

  1. 데이터를 사전 집계, 정리, 준비해 단일 HDFS 디렉터리에 Avro 형식 파일로 작성
  2. 세그먼트 생성
  3. 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 세그먼트를 만드는 방법은 다음과 같아요.

  1. 컴파일 코드 섹션의 단계를 따라 pinot을 빌드하세요. pinot-admin.sh를 pinot-tools/target/pinot-tools-pkg/bin/pinot-admin.sh에서 찾으세요.
  2. 세그먼트로 변환해야 할 모든 CSV/JSON/AVRO 파일을 포함하는 최상위 디렉터리를 만드세요.
  3. 파일 이름 확장자는 형식 이름과 같을 것으로 예상되며(.csv, .json 또는 .avro), 대소문자를 구분하지 않아요. 데이터가 탭이나 공백으로 구분되더라도 변환기는 .csv 확장자를 기대한다는 것을 참고하세요.
  4. 입력 데이터의 스키마를 설명하는 스키마 파일을 준비하세요. 스키마는 JSON 형식이어야 해요. 이 섹션 뒷부분의 예시를 참고하세요.
  5. 특히 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 형식의 구성 파일을 제공할 수 있어요. 이 파일은 선택 사항이며 각 매개변수도 선택 사항이에요. 제공하지 않으면 아래 설명된 기본값이 사용돼요:

  1. fileFormat: 다음 중 하나를 지정하세요. 기본값은 EXCEL이에요.
    1. EXCEL
    2. MYSQL
    3. RFC4180
    4. TDF
  2. header: 입력 CSV 파일에 헤더가 없으면 이 필드로 지정할 수 있어요. 지정하면 입력 파일에 헤더 행이 포함되지 않을 것으로 기대하며, 그렇지 않으면 파싱 오류가 발생해요. 헤더의 컬럼은 CSV 파일의 나머지와 같은 구분자 문자로 구분되어야 해요.
  3. delimiter: 구분자 문자를 지정하려면 이것을 사용하세요. 기본값은 ","예요.
  4. 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 아래의 디렉터리) 것일 수 있어요.

더 알아보기 (Learn more)