HDFS

HDFS

Pinot과 함께 HDFS를 사용하도록 구성하는 방법(데이터 가져오기와 딥 스토리지 포함)을 보여 주는 가이드예요.

출처: HDFS

본문

pinot-hdfs 플러그인을 사용해 Hadoop 분산 파일시스템(HDFS)을 활성화하세요. 컨트롤러나 서버에 다음 구성을 추가해요:

-Dplugins.dir=/opt/pinot/plugins -Dplugins.include=pinot-hdfs

참고 기본적으로 Pinot은 모든 플러그인을 로드하므로 플러그인을 그냥 놓기만 하면 돼요. 또한 -Dplugins.include를 지정하면 사용할 모든 플러그인을 넣어야 해요. 예: pinot-json, pinot-avro, pinot-kafka-3.0...

HDFS 구현은 다음 옵션을 제공해요:

  • hadoop.conf.path: hdfs-site.xml, core-site.xml 같은 Hadoop XML 구성 파일이 있는 디렉터리의 절대 경로.
  • hadoop.write.checksum: 객체를 푸시할 때 체크섬 생성. 기본값은 false.
  • hadoop.kerberos.principle
  • hadoop.kerberos.keytab
  • hadoop.allow.insecure: 구성된 원격 사용자를 JVM 전역 Hadoop 로그인 사용자로 설치해 Kerberos 없이 HDFS 클러스터에 접근하려면 true로 설정. 기본값은 false.
  • hadoop.user.name: hadoop.allow.insecure가 true일 때 사용할 Hadoop 사용자 이름.

이 속성들은 각각 pinot.[node].storage.factory.class.hdfs. 접두사가 붙어야 하는데, node는 controller 또는 server예요.

kerberos 구성은 Hadoop 설치가 Kerberos로 보호된 경우에만 사용해야 해요. Kerberos를 이용해 Hadoop을 보호하는 방법은 안전 모드 Hadoop 문서를 참고하세요.

Kerberos가 없는 HDFS 클러스터의 경우 스토리지 팩토리에 두 비보안 액세스 속성 모두를 구성하세요. 이 모드는 Pinot JVM의 전역 Hadoop 로그인 사용자를 바꾸므로, 프로세스가 하나의 HDFS 신원으로 동작해야 할 때만 사용하세요.

pinot.controller.storage.factory.hdfs.hadoop.allow.insecure=true
pinot.controller.storage.factory.hdfs.hadoop.user.name=pinot

Hadoop 설치에서 적절한 Hadoop 의존성 jar를 Pinot 시작 스크립트에 제공해야 해요.

export HADOOP_HOME=/local/hadoop/
export HADOOP_VERSION=2.7.1
export HADOOP_GUAVA_VERSION=11.0.2
export HADOOP_GSON_VERSION=2.2.4
export CLASSPATH_PREFIX="${HADOOP_HOME}/share/hadoop/hdfs/hadoop-hdfs-${HADOOP_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/lib/hadoop-annotations-${HADOOP_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/lib/hadoop-auth-${HADOOP_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/hadoop-common-${HADOOP_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/lib/guava-${HADOOP_GUAVA_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/lib/gson-${HADOOP_GSON_VERSION}.jar"

HDFS 세그먼트를 Pinot 컨트롤러에 푸시하기

HDFS 세그먼트 파일을 Pinot 컨트롤러에 푸시하려면, 새로 만든 세그먼트의 HDFS 경로를 Pinot 컨트롤러에 보내세요. 컨트롤러가 파일을 다운로드해요.

이 curl 예제는 컨트롤러가 세그먼트 파일을 적절한 테이블로 다운로드하도록 요청해요:

curl -X POST -H "UPLOAD_TYPE:URI" -H "DOWNLOAD_URI:hdfs://nameservice1/hadoop/path/to/segment/file.

예제

잡 스펙

스탠드얼론 잡:

executionFrameworkSpec:
    name: 'standalone'
    segmentGenerationJobRunnerClassName: 'org.apache.pinot.plugin.ingestion.batch.standalone.SegmentGenerationJobRunner'
    segmentTarPushJobRunnerClassName: 'org.apache.pinot.plugin.ingestion.batch.standalone.SegmentTarPushJobRunner'
    segmentUriPushJobRunnerClassName: 'org.apache.pinot.plugin.ingestion.batch.standalone.SegmentUriPushJobRunner'
jobType: SegmentCreationAndTarPush
inputDirURI: 'hdfs:///path/to/input/directory/'
outputDirURI: 'hdfs:///path/to/output/directory/'
includeFileNamePath: 'glob:**/*.csv'
overwriteOutput: true
pinotFSSpecs:
    - scheme: hdfs
      className: org.apache.pinot.plugin.filesystem.HadoopPinotFS
      configs:
        hadoop.conf.path: 'path/to/conf/directory/'
recordReaderSpec:
    dataFormat: 'csv'
    className: 'org.apache.pinot.plugin.inputformat.csv.CSVRecordReader'
    configClassName: 'org.apache.pinot.plugin.inputformat.csv.CSVRecordReaderConfig'
tableSpec:
    tableName: 'students'
pinotClusterSpecs:
    - controllerURI: 'http://localhost:9000'

Hadoop 잡:

executionFrameworkSpec:
    name: 'hadoop'
    segmentGenerationJobRunnerClassName: 'org.apache.pinot.plugin.ingestion.batch.hadoop.HadoopSegmentGenerationJobRunner'
    segmentTarPushJobRunnerClassName: 'org.apache.pinot.plugin.ingestion.batch.hadoop.HadoopSegmentTarPushJobRunner'
    segmentUriPushJobRunnerClassName: 'org.apache.pinot.plugin.ingestion.batch.hadoop.HadoopSegmentUriPushJobRunner'
    extraConfigs:
      stagingDir: 'hdfs:///path/to/staging/directory/'
jobType: SegmentCreationAndTarPush
inputDirURI: 'hdfs:///path/to/input/directory/'
outputDirURI: 'hdfs:///path/to/output/directory/'
includeFileNamePath: 'glob:**/*.csv'
overwriteOutput: true
pinotFSSpecs:
    - scheme: hdfs
      className: org.apache.pinot.plugin.filesystem.HadoopPinotFS
      configs:
        hadoop.conf.path: '/etc/hadoop/conf/'
recordReaderSpec:
    dataFormat: 'csv'
    className: 'org.apache.pinot.plugin.inputformat.csv.CSVRecordReader'
    configClassName: 'org.apache.pinot.plugin.inputformat.csv.CSVRecordReaderConfig'
tableSpec:
    tableName: 'students'
pinotClusterSpecs:
    - controllerURI: 'http://localhost:9000'

컨트롤러 구성

controller.data.dir=hdfs://path/to/data/directory/
controller.local.temp.dir=/path/to/local/temp/directory
controller.enable.split.commit=true
pinot.controller.storage.factory.class.hdfs=org.apache.pinot.plugin.filesystem.HadoopPinotFS
pinot.controller.storage.factory.hdfs.hadoop.conf.path=path/to/conf/directory/
pinot.controller.segment.fetcher.protocols=file,http,hdfs
pinot.controller.segment.fetcher.hdfs.class=org.apache.pinot.common.utils.fetcher.PinotFSSegmentFetcher
pinot.controller.segment.fetcher.hdfs.hadoop.kerberos.principle=<your kerberos principal>
pinot.controller.segment.fetcher.hdfs.hadoop.kerberos.keytab=<your kerberos keytab>

서버 구성

pinot.server.instance.enable.split.commit=true
pinot.server.storage.factory.class.hdfs=org.apache.pinot.plugin.filesystem.HadoopPinotFS
pinot.server.storage.factory.hdfs.hadoop.conf.path=path/to/conf/directory/
pinot.server.segment.fetcher.protocols=file,http,hdfs
pinot.server.segment.fetcher.hdfs.class=org.apache.pinot.common.utils.fetcher.PinotFSSegmentFetcher
pinot.server.segment.fetcher.hdfs.hadoop.kerberos.principle=<your kerberos principal>
pinot.server.segment.fetcher.hdfs.hadoop.kerberos.keytab=<your kerberos keytab>

Minion 구성

storage.factory.class.hdfs=org.apache.pinot.plugin.filesystem.HadoopPinotFS
storage.factory.hdfs.hadoop.conf.path=path/to/conf/directory
segment.fetcher.protocols=file,http,hdfs
segment.fetcher.hdfs.class=org.apache.pinot.common.utils.fetcher.PinotFSSegmentFetcher
segment.fetcher.hdfs.hadoop.kerberos.principle=<your kerberos principal>
segment.fetcher.hdfs.hadoop.kerberos.keytab=<your kerberos keytab>

HDFS를 딥 스토리지로 사용

HDFS를 딥 스토리지로 사용하려면 각 Pinot 구성 요소에 HDFS 플러그인과 적절한 스토리지 팩토리·세그먼트 페처 속성을 구성하세요. 아래 섹션은 각 구성 요소의 완전한 구성과 시작 예제를 제공해요.

서버 설정

구성
pinot.server.instance.enable.split.commit=true
pinot.server.storage.factory.class.hdfs=org.apache.pinot.plugin.filesystem.HadoopPinotFS
pinot.server.storage.factory.hdfs.hadoop.conf.path=/path/to/hadoop/conf/directory/
# 서버의 경우, HDFS 경로 접근 시 지정된 keytab과 principal을 사용하도록 HadoopPinotFS 플러그인에 지시
pinot.server.storage.factory.hdfs.hadoop.kerberos.principle=<hdfs-principle>
pinot.server.storage.factory.hdfs.hadoop.kerberos.keytab=<hdfs-keytab>
pinot.server.segment.fetcher.protocols=file,http,hdfs
pinot.server.segment.fetcher.hdfs.class=org.apache.pinot.common.utils.fetcher.PinotFSSegmentFetcher
pinot.server.segment.fetcher.hdfs.hadoop.kerberos.principle=<your kerberos principal>
pinot.server.segment.fetcher.hdfs.hadoop.kerberos.keytab=<your kerberos keytab>
pinot.set.instance.id.to.hostname=true
pinot.server.instance.dataDir=/path/in/local/filesystem/for/pinot/data/server/index
pinot.server.instance.segmentTarDir=/path/in/local/filesystem/for/pinot/data/server/segment
pinot.server.grpc.enable=true
pinot.server.grpc.port=8090
실행
export HADOOP_HOME=/path/to/hadoop/home
export HADOOP_VERSION=2.7.1
export HADOOP_GUAVA_VERSION=11.0.2
export HADOOP_GSON_VERSION=2.2.4
export GC_LOG_LOCATION=/path/to/gc/log/file
export PINOT_VERSION=0.10.0
export PINOT_DISTRIBUTION_DIR=/path/to/apache-pinot-${PINOT_VERSION}-bin/
export SERVER_CONF_DIR=/path/to/pinot/conf/dir/
export ZOOKEEPER_ADDRESS=localhost:2181

export CLASSPATH_PREFIX="${HADOOP_HOME}/share/hadoop/hdfs/hadoop-hdfs-${HADOOP_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/lib/hadoop-annotations-${HADOOP_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/lib/hadoop-auth-${HADOOP_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/hadoop-common-${HADOOP_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/lib/guava-${HADOOP_GUAVA_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/lib/gson-${HADOOP_GSON_VERSION}.jar"
export JAVA_OPTS="-Xms4G -Xmx16G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Xloggc:${GC_LOG_LOCATION}/gc-pinot-server.log"
${PINOT_DISTRIBUTION_DIR}/bin/start-server.sh  -zkAddress ${ZOOKEEPER_ADDRESS} -configFileName ${SERVER_CONF_DIR}/server.conf

컨트롤러 설정

구성
controller.data.dir=hdfs://path/in/hdfs/for/controller/segment
controller.local.temp.dir=/tmp/pinot/
controller.zk.str=<ZOOKEEPER_HOST:ZOOKEEPER_PORT>
controller.enable.split.commit=true
controller.access.protocols.http.port=9000
controller.helix.cluster.name=PinotCluster
pinot.controller.storage.factory.class.hdfs=org.apache.pinot.plugin.filesystem.HadoopPinotFS
pinot.controller.storage.factory.hdfs.hadoop.conf.path=/path/to/hadoop/conf/directory/
# 컨트롤러의 경우, controller.data.dir에 정의된 HDFS 경로 접근 시 지정된 keytab과 principal을 사용하도록 HadoopPinotFS 플러그인에 지시
pinot.controller.storage.factory.hdfs.hadoop.kerberos.principle=<hdfs-principle>
pinot.controller.storage.factory.hdfs.hadoop.kerberos.keytab=<hdfs-keytab>
pinot.controller.segment.fetcher.protocols=file,http,hdfs
pinot.controller.segment.fetcher.hdfs.class=org.apache.pinot.common.utils.fetcher.PinotFSSegmentFetcher
pinot.controller.segment.fetcher.hdfs.hadoop.kerberos.principle=<your kerberos principal>
pinot.controller.segment.fetcher.hdfs.hadoop.kerberos.keytab=<your kerberos keytab>
controller.vip.port=9000
controller.port=9000
pinot.set.instance.id.to.hostname=true
pinot.server.grpc.enable=true
실행
export HADOOP_HOME=/path/to/hadoop/home
export HADOOP_VERSION=2.7.1
export HADOOP_GUAVA_VERSION=11.0.2
export HADOOP_GSON_VERSION=2.2.4
export GC_LOG_LOCATION=/path/to/gc/log/file
export PINOT_VERSION=0.10.0
export PINOT_DISTRIBUTION_DIR=/path/to/apache-pinot-${PINOT_VERSION}-bin/
export SERVER_CONF_DIR=/path/to/pinot/conf/dir/
export ZOOKEEPER_ADDRESS=localhost:2181

export CLASSPATH_PREFIX="${HADOOP_HOME}/share/hadoop/hdfs/hadoop-hdfs-${HADOOP_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/lib/hadoop-annotations-${HADOOP_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/lib/hadoop-auth-${HADOOP_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/hadoop-common-${HADOOP_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/lib/guava-${HADOOP_GUAVA_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/lib/gson-${HADOOP_GSON_VERSION}.jar"
export JAVA_OPTS="-Xms8G -Xmx12G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Xloggc:${GC_LOG_LOCATION}/gc-pinot-controller.log"
${PINOT_DISTRIBUTION_DIR}/bin/start-controller.sh -configFileName ${SERVER_CONF_DIR}/controller.conf

브로커 설정

구성
pinot.set.instance.id.to.hostname=true
pinot.server.grpc.enable=true
실행
export HADOOP_HOME=/path/to/hadoop/home
export HADOOP_VERSION=2.7.1
export HADOOP_GUAVA_VERSION=11.0.2
export HADOOP_GSON_VERSION=2.2.4
export GC_LOG_LOCATION=/path/to/gc/log/file
export PINOT_VERSION=0.10.0
export PINOT_DISTRIBUTION_DIR=/path/to/apache-pinot-${PINOT_VERSION}-bin/
export SERVER_CONF_DIR=/path/to/pinot/conf/dir/
export ZOOKEEPER_ADDRESS=localhost:2181

export CLASSPATH_PREFIX="${HADOOP_HOME}/share/hadoop/hdfs/hadoop-hdfs-${HADOOP_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/lib/hadoop-annotations-${HADOOP_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/lib/hadoop-auth-${HADOOP_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/hadoop-common-${HADOOP_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/lib/guava-${HADOOP_GUAVA_VERSION}.jar:${HADOOP_HOME}/share/hadoop/common/lib/gson-${HADOOP_GSON_VERSION}.jar"
export JAVA_OPTS="-Xms4G -Xmx4G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Xloggc:${GC_LOG_LOCATION}/gc-pinot-broker.log"
${PINOT_DISTRIBUTION_DIR}/bin/start-broker.sh -zkAddress ${ZOOKEEPER_ADDRESS} -configFileName  ${SERVER_CONF_DIR}/broker.conf

Kerberos 인증

Kerberos 보안이 활성화된 HDFS를 사용할 때 Pinot은 두 가지 인증 방법을 제공해요:

1. 자동 인증 (권장)

위에 표시된 storage.factory Kerberos 속성을 구성하면 Pinot은 지정된 keytab과 principal을 사용해 Kerberos 인증을 자동으로 처리해요. 이는 수동 kinit 명령이 필요 없고, 티켓 만료 후에도 지속적인 인증을 보장해요.

이 속성이 필요한 이유

storage.factory Kerberos 속성은 Pinot의 HDFS 통합에서 중요한 역할을 해요:

컨트롤러의 경우:

  • 컨트롤러는 controller.data.dir을 사용해 세그먼트 메타데이터와 기타 데이터를 HDFS에 저장해요.
  • controller.data.dir이 HDFS 경로(예: hdfs://namenode:8020/pinot/data)를 가리키면 HadoopPinotFS 플러그인은 접근을 위해 Kerberos 자격증명이 필요해요.
  • storage.factory Kerberos 속성이 없으면 컨트롤러는 HDFS에 읽기/쓰기가 실패해 세그먼트 업로드와 메타데이터 연산이 실패해요.
  • 이 속성들은 HadoopPinotFS 플러그인이 keytab 파일로 프로그래매틱하게 인증하도록 해요.

서버의 경우:

  • 서버는 세그먼트 다운로드와 딥 스토리지 접근을 포함한 다양한 HDFS 연산에 HadoopPinotFS를 사용해요.
  • 서버가 HDFS 딥 스토리지에 저장된 세그먼트에 접근할 때는 유효한 Kerberos 자격증명이 필요해요.
  • storage.factory 속성은 서버 재시작과 티켓 만료에도 지속되는 영구 인증을 제공해요.
두 세트의 Kerberos 속성 이해

구성에 두 세트의 Kerberos 속성이 있다는 걸 볼 수 있어요:

  1. storage.factory 속성 (권장):

    • pinot.controller.storage.factory.hdfs.hadoop.kerberos.principal
    • pinot.controller.storage.factory.hdfs.hadoop.kerberos.keytab
    • pinot.server.storage.factory.hdfs.hadoop.kerberos.principal
    • pinot.server.storage.factory.hdfs.hadoop.kerberos.keytab

    목적: 이 속성들은 HadoopPinotFS 스토리지 팩토리의 Kerberos 인증을 구성하며, 스토리지 팩토리를 통한 컨트롤러·서버 딥 스토리지 연산과 일반 HDFS 파일시스템 연산을 처리해요.

    필요한 이유: 스토리지 팩토리는 시작 시 초기화되고 구성 요소의 전체 수명 동안 HDFS 접근에 사용돼요. 이 속성이 없으면 스토리지 팩토리를 통한 HDFS 연산이 인증 오류로 실패해요.

  2. segment.fetcher 속성 (레거시, 후방 호환용):

    • pinot.controller.segment.fetcher.hdfs.hadoop.kerberos.principle (호환성을 위해 "principle" 오타 유지)
    • pinot.controller.segment.fetcher.hdfs.hadoop.kerberos.keytab
    • pinot.server.segment.fetcher.hdfs.hadoop.kerberos.principle
    • pinot.server.segment.fetcher.hdfs.hadoop.kerberos.keytab

    목적: 이 속성들은 특히 세그먼트 페처 구성 요소의 Kerberos를 구성해요.

    둘 다 필요한 이유: 기능이 일부 겹치지만, 둘 다 있으면 모든 HDFS 접근 패턴을 완전히 커버하고 기존 배포와의 후방 호환이 보장되며 세그먼트 페처가 독립적으로 동작해요.

자동 인증의 장점
  • 수동 kinit 명령 실행이 필요 없어 운영 오버헤드와 휴먼 에러를 줄여요.
  • Kerberos 티켓은 보통 24시간(구성 가능) 후 만료되는데, keytab 기반 인증으로 Pinot은 내부에서 티켓을 자동 갱신해 서비스 중단을 방지해요.
  • keytab 파일은 스크립트나 구성에 비밀번호를 저장하지 않으면서 안전한 장기 자격증명을 제공해요.

2. 수동 인증 (레거시)

대안으로 Pinot 구성 요소 시작 전에 kinit을 사용해 수동으로 인증할 수 있어요:

kinit -kt <your kerberos keytab> <your kerberos principal>

수동 인증의 한계:

  • 티켓 만료: Kerberos 티켓은 보통 24시간 후 만료되어 재인증이 필요해요.
  • 서비스 중단: Pinot 실행 중 티켓이 만료되면 재인증 전까지 HDFS 연산이 실패해요.
  • 운영 부담: 모니터링과 수동 개입이 필요하며, 특히 24/7 운영 시스템에서 문제돼요.
  • 자동화 어려움: 자동화된 배포 파이프라인에 통합하기 어려워요.

경고 수동 인증은 프로덕션 환경에 권장되지 않아요. 프로덕션 배포에는 항상 storage.factory Kerberos 속성을 사용하세요.

문제 해결

HDFS 파일시스템 문제

No FileSystem for scheme"hdfs" 오류가 발생하면 클래스 로딩 문제일 가능성이 높아요.

해결하려면 core-site.xml에 다음 속성을 추가해 보세요:

fs.hdfs.impl org.apache.hadoop.hdfs.DistributedFileSystem

그리고 /opt/pinot/lib/hadoop-common-<release-version>.jar를 클래스패스에 내보내세요.

Kerberos 인증 문제

오류: "Failed to authenticate with Kerberos"

가능한 원인:

  1. 잘못된 keytab 경로: keytab 파일 경로가 절대 경로이고 Pinot 프로세스가 접근 가능한지 확인.
  2. 잘못된 principal 이름: principal 이름이 keytab 파일의 것과 일치하는지 확인.
  3. keytab 파일 권한: keytab 파일은 Pinot을 실행하는 사용자가 읽을 수 있어야 함(보통 chmod 400 또는 chmod 600).

해결책:

# keytab에 올바른 principal이 있는지 확인
klist -kt /path/to/your.keytab

# 수동으로 인증 테스트
kinit -kt /path/to/your.keytab [email protected]

# 인증 성공 여부 확인
klist
오류: "GSSException: No valid credentials provided"

원인: 주로 storage.factory Kerberos 속성이 설정되지 않았거나, keytab 파일 경로가 잘못됐거나 파일이 없거나, Kerberos 구성(krb5.conf)이 제대로 설정되지 않았을 때 발생해요.

해결책:

  1. 모든 storage.factory Kerberos 속성이 구성에 올바르게 설정됐는지 확인.
  2. keytab 파일이 존재하고 올바른 권한이 있는지 확인.
  3. /etc/krb5.conf(또는 $JAVA_HOME/jre/lib/security/krb5.conf)가 Kerberos realm 설정으로 제대로 구성됐는지 확인.
오류: "Unable to obtain Kerberos password" 또는 "Clock skew too great"

원인: Pinot 서버와 Kerberos KDC 사이의 시간 동기화 문제.

해결책:

# 시간 동기화 확인
date
# NTP가 실행되고 동기화됐는지 확인
sudo systemctl status ntpd
# 또는 chrony의 경우
sudo systemctl status chronyd

Kerberos는 클라이언트와 KDC 사이의 시계 동기화가 5분(기본값) 이내여야 해요.

오류: "HDFS operation fails after running for several hours"

원인: 주로 storage.factory 속성 대신 수동 kinit을 사용했고 Kerberos 티켓(기본 24시간)이 만료됐을 때 발생해요.

해결책:

  1. 자동 티켓 갱신을 활성화하려면 storage.factory Kerberos 속성을 구성.
  2. 시작 스크립트에서 수동 kinit 제거.
  3. 구성을 적용하려면 Pinot 구성 요소 재시작.
Kerberos 구성 검증

Kerberos 설정이 올바르게 동작하는지 확인하려면:

# 1. keytab 인증 테스트
kinit -kt /path/to/your.keytab [email protected]

# 2. HDFS 디렉터리를 나열할 수 있는지 확인
hdfs dfs -ls /

# 3. 인증 메시지에 대한 Pinot 로그 확인
tail -f /path/to/pinot/logs/pinot-controller.log | grep -i kerberos
tail -f /path/to/pinot/logs/pinot-server.log | grep -i kerberos

# 4. 성공적인 인증 메시지가 보이는지 확인. 예:
# "Login successful for user <principal> using keytab file <keytab-path>"
모범 사례
  1. 구성의 keytab 파일에 절대 경로 사용.
  2. keytab 파일을 적절한 권한(400 또는 600)으로 보호.
  3. 프로덕션에는 사용자 principal 대신 서비스 principal(예: pinot/hostname@REALM) 사용.
  4. 자동 갱신이 동작하는지 로그에서 Kerberos 티켓 만료를 모니터링.
  5. keytab 파일을 안전한 위치에 백업.
  6. 프로덕션 전에 비프로덕션 환경에서 구성 테스트.

더 알아보기 (Learn more)