
이 가이드는 MinIO(S3)를 스토리지로 사용하고 Trino 기반의 Hive Metastore와 통합하여 Kubernetes 환경에 Apache Kylin 4.0.1을 설치하고 구성하는 단계를 상세히 설명합니다. 이 설정은 Kylin Docker 이미지가 번들된 Hadoop 및 ZooKeeper 구성 요소를 동일한 Pod 내에서 실행하여 배포를 간소화한다고 가정합니다.
📌 필수 조건
시작하기 전에 다음 구성 요소 및 설정이 준비되어 있는지 확인하세요.
- Kylin Docker 이미지: apachekylin/apache-kylin-standalone:kylin-4.0.1-mondrian
- Kubernetes 클러스터:
- 워커 노드: 각 5코어 및 32GB 메모리 (총 15코어, 96GB)를 가진 3개 노드.
- Kylin 클러스터: 1개 Job Server Pod + 3개 Query Server Pod.
- Hive Metastore: PostgreSQL 백엔드를 가진 Trino에서 접근 가능한 Hive Metastore.
- URI: thrift://[당신의_HIVE_METASTORE_IP]:9083
- 데이터베이스 URL: jdbc:postgresql://[당신의_POSTGRES_IP]:5432/[Database명]
- MinIO (S3) 스토리지:
- 엔드포인트: http://[당신의_MINIO_IP]:80
- 접근 키: <당신의_MINIO_접근_키>
- 비밀 키: <당신의_MINIO_비밀_키>
- 버킷 이름: kylin4
⚙️ Kylin 환경 설정 단계
이 가이드의 모든 경로는 Kylin Docker 컨테이너 내부의 디렉토리를 나타냅니다. /home/admin/apache-kylin-4.0.1-bin-spark2/ 는 $KYLIN_HOME 으로 간주되고, /home/admin/hadoop-2.8.5/는 $HADOOP_HOME 으로 간주됩니다.
1. Kylin Job Server 배포 생성
Kylin Job Server는 단일 Pod로 배포됩니다. 보안 강화를 위해 MinIO 접근 및 비밀 키와 같은 민감한 값에는 Kubernetes Secret을 사용하는 것을 잊지 마세요.
apiVersion: apps/v1
kind: Deployment
metadata:
name: kylin-job-server
namespace: kylin # Kylin Pod들이 배포될 네임스페이스
spec:
replicas: 1
selector:
matchLabels:
app: kylin
role: job
template:
metadata:
labels:
app: kylin
role: job
spec:
containers:
- name: kylin
image: apachekylin/apache-kylin-standalone:kylin-4.0.1-mondrian
ports:
- containerPort: 7070 # Kylin UI 및 API 포트
env:
- name: AWS_ACCESS_KEY_ID
value: <당신의_MINIO_접근_키> # 프로덕션에서는 Kubernetes Secret 사용
- name: AWS_SECRET_ACCESS_KEY
value: <당신의_MINIO_비밀_키> # 프로덕션에서는 Kubernetes Secret 사용
# 설정 파일 관리를 위해 ConfigMap에 볼륨 마운트를 추가하는 것을 고려해 보세요.
2. Kylin Job Server 배포 생성
Kylin Job Server는 단일 Pod로 배포됩니다. 보안 강화를 위해 MinIO 접근 및 비밀 키와 같은 민감한 값에는 Kubernetes Secret을 사용하는 것을 잊지 마세요.
apiVersion: apps/v1
kind: Deployment
metadata:
name: kylin-query-server
namespace: kylin # Kylin Pod들이 배포될 네임스페이스
spec:
replicas: 3
selector:
matchLabels:
app: kylin
role: query
template:
metadata:
labels:
app: kylin
role: query
spec:
containers:
- name: kylin
image: apachekylin/apache-kylin-standalone:kylin-4.0.1-mondrian
command: ["/bin/bash", "-c"] # 컨테이너를 계속 실행
args: ["sleep infinity & wait"]
ports:
- containerPort: 7070 # Kylin UI 및 API 포트
env:
- name: AWS_ACCESS_KEY_ID
value: <당신의_MINIO_접근_키> # 프로덕션에서는 Kubernetes Secret 사용
- name: AWS_SECRET_ACCESS_KEY
value: <당신의_MINIO_비밀_키> # 프로덕션에서는 Kubernetes Secret 사용
# 설정 파일 관리를 위해 ConfigMap에 볼륨 마운트를 추가하는 것을 고려해 보세요.
3. Kylin NetworkPolicy 구성
Kylin Pods 간의 통신을 허용하도록 네트워크 정책을 설정합니다. 이 예시는 동일한 kylin 네임스페이스 내의 모든 Pod로부터의 인그레스 트래픽을 허용합니다. MinIO, Hive Metastore 및 PostgreSQL 데이터베이스와 같은 외부 서비스에 대한 특정 규칙을 추가해야 합니다.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-internal-and-traefik
namespace: kylin
spec:
podSelector: {} # 'kylin' 네임스페이스의 모든 Pod에 적용
policyTypes:
- Ingress
ingress:
- from:
# 1. 동일한 네임스페이스 내의 다른 Pod로부터의 통신 허용
- podSelector: {}
# 2. 외부 서비스(예: MinIO, Hive Metastore, PostgreSQL)로부터의 접근 허용 규칙 추가
# 예:
# - ipBlock:
# cidr: [당신의_MINIO_IP]/32
# - ipBlock:
# cidr: [당신의_HIVE_METASTORE_IP]/32
# - ipBlock:
# cidr: [당신의_POSTGRES_IP]/32
4. Pod 내 /etc/hosts 파일 수정
Kubernetes 환경에서 Pod는 일반적으로 DNS를 통해 서로를 검색합니다. 그러나 Kylin 이미지 내에 번들된 ZooKeeper와 같이 명시적인 IP-호스트명 매핑이 필요한 서비스의 경우, 각 Kylin Pod 내의 /etc/hosts 파일을 수정해야 할 수 있습니다. 이는 Pod IP 및 호스트명에 따라 이러한 항목을 동적으로 채우기 위해 Init Container를 사용하여 처리하는 경우가 많습니다. (테스트 환경에서는 /etc/hosts 파일에 내용을 수기로 작성하여 진행하였습니다.)
각 Pod의 /etc/hosts 파일에 모든 Kylin Job 및 Query 서버 Pod (그리고 잠재적으로 Kylin Pod 외부에 있는 ZooKeeper 노드)에 대한 항목을 추가해야 합니다. 예를 들면 다음과 같습니다.
# /etc/hosts 항목 예시
# 실제 Pod IP 및 호스트명으로 교체
<KYLIN_JOB_SERVER_IP> kylin-job-server-0
<KYLIN_QUERY_SERVER_1_IP> kylin-query-server-0
<KYLIN_QUERY_SERVER_2_IP> kylin-query-server-1
<KYLIN_QUERY_SERVER_3_IP> kylin-query-server-2
📦 Kylin 구성 및 종속성
이 단계에는 Kylin Docker 컨테이너 내부의 파일 수정이 포함됩니다. 이러한 수정은 사용자 정의 Docker 이미지에 포함하거나, 수정된 파일이 포함된 Kubernetes ConfigMaps를 Pod에 마운트하여 처리하는 것이 가장 좋습니다.
5. 필수 JAR 파일 다운로드
먼저 S3 통합에 필요한 AWS SDK JAR 파일을 Kylin의 lib 디렉터리에 다운로드합니다.
cd /home/admin/apache-kylin-4.0.1-bin-spark2/lib/
wget https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-bundle/1.11.271/aws-java-sdk-bundle-1.11.271.jar
6. JAR 파일 복사
다운로드한 aws-java-sdk-bundle-1.11.271.jar와 Hadoop S3 통합 JAR인 hadoop-aws-2.8.5.jar를 관련 Kylin, Hadoop, Spark 디렉터리에 복사합니다.
# AWS SDK JAR 파일 복사
cp /home/admin/apache-kylin-4.0.1-bin-spark2/lib/aws-java-sdk-bundle-1.11.271.jar /home/admin/hadoop-2.8.5/share/hadoop/common/lib/
cp /home/admin/apache-kylin-4.0.1-bin-spark2/lib/aws-java-sdk-bundle-1.11.271.jar /home/admin/apache-kylin-4.0.1-bin-spark2/ext/
cp /home/admin/apache-kylin-4.0.1-bin-spark2/lib/aws-java-sdk-bundle-1.11.271.jar /home/admin/apache-kylin-4.0.1-bin-spark2/lib/
cp /home/admin/apache-kylin-4.0.1-bin-spark2/lib/aws-java-sdk-bundle-1.11.271.jar /home/admin/spark-2.4.7-bin-hadoop2.7/jars/
# Hadoop AWS JAR 파일 복사
cp /home/admin/hadoop-2.8.5/share/hadoop/tools/lib/hadoop-aws-2.8.5.jar /home/admin/hadoop-2.8.5/share/hadoop/common/lib/
cp /home/admin/hadoop-2.8.5/share/hadoop/tools/lib/hadoop-aws-2.8.5.jar /home/admin/apache-kylin-4.0.1-bin-spark2/ext/
cp /home/admin/hadoop-2.8.5/share/hadoop/tools/lib/hadoop-aws-2.8.5.jar /home/admin/apache-kylin-4.0.1-bin-spark2/lib/
cp /home/admin/hadoop-2.8.5/share/hadoop/tools/lib/hadoop-aws-2.8.5.jar /home/admin/spark-2.4.7-bin-hadoop2.7/jars/
7. Hadoop 및 Hive 설정 파일 수정
다운로드한 aws-java-sdk-bundle-1.11.271.jar와 Hadoop S3 통합 JAR인 hadoop-aws-2.8.5.jar를 관련 Kylin, Hadoop, Spark 디렉터리에 복사합니다.
7.1. Hadoop 및 Hive 설정 파일 수정
S3A 파일 시스템 구성을 $HADOOP_HOME/etc/hadoop/core-site.xml (또는 hdfs-site.xml)에 추가합니다.
<property>
<name>fs.s3a.impl</name>
<value>org.apache.hadoop.fs.s3a.S3AFileSystem</value>
</property>
<property>
<name>fs.s3a.access.key</name>
<value><당신의_MINIO_접근_키></value>
</property>
<property>
<name>fs.s3a.secret.key</name>
<value><당신의_MINIO_비밀_키></value>
</property>
<property>
<name>fs.s3a.endpoint</name>
<value>http://[당신의_MINIO_IP]:80</value>
</property>
<property>
<name>fs.s3a.path.style.access</name>
<value>true</value>
</property>
<property>
<name>fs.s3a.connection.ssl.enabled</name>
<value>false</value>
</property>
<property>
<name>fs.s3a.connection.ssl.certificate-checks</name>
<value>false</value>
</property>
7.2. hive-site.xml 업데이트
S3A 파일 시스템 구성을 $HADOOP_HOME/etc/hadoop/core-site.xml (또는 hdfs-site.xml)에 추가합니다.
<property>
<name>hive.metastore.uris</name>
<value>thrift://[당신의_HIVE_METASTORE_IP]:9083</value>
</property>
<property>
<name>hive.metastore.db.type</name>
<value>postgres</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:postgresql://[당신의_POSTGRES_IP]:5432/[Database]</value>
<description>JDBC metastore 연결 문자열</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.postgresql.Driver</value>
<description>JDBC metastore의 드라이버 클래스 이름</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>[POSTGRES_USERNAME]</value>
<description>메타스토어 데이터베이스에 사용할 사용자 이름</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>[POSTGRES_PASSWORD]</value>
<description>메타스토어 데이터베이스에 사용할 비밀번호</description>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
7.3. Kylin core-site.xml 업데이트 (Kylin 이미지 내)
Kylin 이미지 내의 Kylin 설정 디렉토리에서 core-site.xml 파일을 수정하여 기본 파일 시스템을 S3A로 변경합니다.
# 기존 core-site.xml 링크를 삭제하고 실제 파일을 복사
rm -f /home/admin/apache-kylin-4.0.1-bin-spark2/hadoop_conf/core-site.xml
cp /home/admin/hadoop-2.8.5/etc/hadoop/core-site.xml /home/admin/apache-kylin-4.0.1-bin-spark2/hadoop_conf/
이제 /home/admin/apache-kylin-4.0.1-bin-spark2/hadoop_conf/core-site.xml 을 열고 fs.defaultFS 값을 S3A로 변경합니다.
<property>
<name>fs.defaultFS</name>
<value>s3a://kylin4</value>
</property>
7.4. Kylin core-site.xml 업데이트 (Kylin 이미지 내)
Kylin이 YARN 클러스터와 상호 작용해야 하는 경우, core-site.xml 또는 yarn-site.xml에 YARN ResourceManager 주소를 추가합니다. (Kubernetes 설정에서 별도의 YARN 클러스터를 사용하지 않는 경우 이 단계는 필요하지 않을 수 있습니다.)
<property>
<name>yarn.resourcemanager.address</name>
<value>[당신의_YARN_RM_IP]:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>[당신의_YARN_RM_IP]:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>[당신의_YARN_RM_IP]:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>[당신의_YARN_RM_IP]:8141</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>[당신의_YARN_RM_IP]:8088</value>
</property>
8. Hadoop 재시작 (Kylin Docker 이미지 내)
Kylin Docker 이미지 내에 번들된 Hadoop을 사용하는 경우, 설정 변경 후 Hadoop 서비스를 재시작해야 합니다. (참고: HDFS가 Kubernetes 환경에 별도로 배포되어 있고 Kylin이 번들된 HDFS를 직접 사용하지 않는 경우 이 단계를 건너뛸 수 있습니다.)
# NameNode 및 DataNode 시작
/home/admin/hadoop-2.8.5/sbin/hadoop-daemon.sh start namenode
/home/admin/hadoop-2.8.5/sbin/hadoop-daemon.sh start datanode
# YARN ResourceManager 및 NodeManager 시작
/home/admin/hadoop-2.8.5/sbin/yarn-daemon.sh start resourcemanager
/home/admin/hadoop-2.8.5/sbin/yarn-daemon.sh start nodemanager
# MapReduce JobHistory 서버 시작
/home/admin/hadoop-2.8.5/sbin/mr-jobhistory-daemon.sh start historyserver
9. S3A 연결 확인
MinIO에 대한 Hadoop S3A 파일 시스템이 올바르게 연결되었는지 확인합니다.
hadoop fs -ls s3a://kylin4/
10. Spark JAR 파일 정리
Spark의 JAR 파일을 백업하고 Hadoop 관련 JAR 파일로 교체하여 S3 통합을 준비합니다.
cp -aP /home/admin/spark-2.4.7-bin-hadoop2.7/jars /home/admin/spark-2.4.7-bin-hadoop2.7/jars_bak # jars 백업
rm -rf /home/admin/spark-2.4.7-bin-hadoop2.7/jars/hadoop-*
cp /home/admin/hadoop-2.8.5/share/hadoop/common/hadoop-* /home/admin/spark-2.4.7-bin-hadoop2.7/jars/
cp /home/admin/hadoop-2.8.5/share/hadoop/common/lib/htrace-core4-4.0.1-incubating.jar /home/admin/spark-2.4.7-bin-hadoop2.7/jars/
cp /home/admin/hadoop-2.8.5/share/hadoop/hdfs/hadoop-* /home/admin/spark-2.4.7-bin-hadoop2.7/jars/
cp /home/admin/hadoop-2.8.5/share/hadoop/yarn/hadoop-* /home/admin/spark-2.4.7-bin-hadoop2.7/jars/
cp /home/admin/hadoop-2.8.5/share/hadoop/mapreduce/hadoop-* /home/admin/spark-2.4.7-bin-hadoop2.7/jars/
cp /home/admin/hadoop-2.8.5/share/hadoop/tools/lib/ * /home/admin/spark-2.4.7-bin-hadoop2.7/jars/
hdfs dfs -cp /spark2_jars /spark2_jars_bak # HDFS에 sparkjars 폴더가 있는 경우 백업
hdfs dfs -rm -r /spark2_jars/ * # HDFS의 기존 spark2_jars 내용 삭제
hdfs dfs -put -f /home/admin/spark-2.4.7-bin-hadoop2.7/jars/ * hdfs://localhost:9000/spark2_jars/ # 로컬 Spark JAR 파일을 HDFS에 업로드
11. Kylin JAR 파일 정리
적절한 통합을 위해 관련 Hadoop 및 Spark JAR 파일을 Kylin의 lib 디렉터리에 복사합니다.
cp /home/admin/hadoop-2.8.5/share/hadoop/common/hadoop-* /home/admin/apache-kylin-4.0.1-bin-spark2/lib/
cp /home/admin/hadoop-2.8.5/share/hadoop/common/lib/ * /home/admin/apache-kylin-4.0.1-bin-spark2/lib/
cp /home/admin/hadoop-2.8.5/share/hadoop/hdfs/hadoop-* /home/admin/apache-kylin-4.0.1-bin-spark2/lib/
cp /home/admin/hadoop-2.8.5/share/hadoop/yarn/hadoop-* /home/admin/apache-kylin-4.0.1-bin-spark2/lib/
cp /home/admin/hadoop-2.8.5/share/hadoop/mapreduce/hadoop-* /home/admin/apache-kylin-4.0.1-bin-spark2/lib/
12. Spark 및 Kylin 로그 설정 변경
Spark 및 Kylin 로그 설정을 조정하고, HDFS 관련 로깅을 주석 처리하고 필요한 경로 및 S3 구성을 적용합니다.
12.1. spark-driver-log4j.properties 업데이트
/home/admin/apache-kylin-4.0.1-bin-spark2/conf/spark-driver-log4j.properties 파일에서 HDFS 관련 설정을 주석 처리합니다.
#overall config
#log4j.rootLogger=INFO,hdfs
log4j.rootLogger=INFO
log4j.logger.org.apache.kylin=DEBUG
log4j.logger.org.springframework=WARN
log4j.logger.org.apache.spark=WARN
#log4j.appender.stderr=org.apache.log4j.ConsoleAppender
#log4j.appender.stderr.layout=org.apache.kylin.common.logging.SensitivePatternLayout
#log4j.appender.stderr.target=System.err
#log4j.appender.stderr.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2} : %m%n
# hdfs file appender
#log4j.appender.hdfs=org.apache.kylin.engine.spark.common.logging.SparkDriverHdfsLogAppender
#log4j.appender.hdfs.kerberosEnable=${kylin.kerberos.enabled}
#log4j.appender.hdfs.kerberosPrincipal=${kylin.kerberos.principal}
#log4j.appender.hdfs.kerberosKeytab=${kylin.kerberos.keytab}
#log4j.appender.hdfs.hdfsWorkingDir=${kylin.hdfs.working.dir}
#log4j.appender.hdfs.hdfsWorkingDir=hdfs://localhost:9000/kylin4/kylin4
#log4j.appender.hdfs.logPath=${spark.driver.log4j.appender.hdfs.File}
#log4j.appender.hdfs.logQueueCapacity=5000
#flushPeriod count as millis
#log4j.appender.hdfs.flushInterval=5000
#log4j.appender.hdfs.layout=org.apache.kylin.common.logging.SensitivePatternLayout
#Don't add line number (%L) as it's too costly!
#log4j.appender.hdfs.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2} : %m%n
## Log saved under $KYLIN_HOME/logs/spark
log4j.appender.logFile=org.apache.log4j.FileAppender
log4j.appender.logFile.Threshold=DEBUG
#log4j.appender.logFile.File=${spark.driver.local.logDir}/${spark.driver.param.taskId}.log
#log4j.appender.logFile.layout=org.apache.kylin.common.logging.SensitivePatternLayout
#log4j.appender.logFile.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2} : %m%n
12.2. spark-executor-log4j.properties 업데이트
마찬가지로, /home/admin/apache-kylin-4.0.1-bin-spark2/conf/spark-executor-log4j.properties 파일에서 HDFS 관련 설정을 주석 처리합니다.
# enable this by -Dlog4j.configuration=spark-executor-log4j.properties
log4j.rootLogger=INFO,stderr
log4j.appender.stderr=org.apache.log4j.ConsoleAppender
log4j.appender.stderr.layout=org.apache.kylin.common.logging.SensitivePatternLayout
log4j.appender.stderr.target=System.err
#Don't add line number (%L) as it's too costly!
log4j.appender.stderr.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2} : %m%n
#log4j.appender.hdfs=org.apache.kylin.engine.spark.common.logging.SparkExecutorHdfsAppender
#log4j.appender.hdfs.hdfsWorkingDir=${kylin.hdfs.working.dir}
#log4j.appender.hdfs.hdfsWorkingDir=hdfs://localhost:9000/kylin4/kylin4
#log4j.appender.hdfs.metadataIdentifier=${kylin.metadata.identifier}
#log4j.appender.hdfs.category=${kylin.spark.category}
#log4j.appender.hdfs.identifier=${kylin.spark.identifier}
#log4j.appender.hdfs.jobName=${kylin.spark.jobName}
#log4j.appender.hdfs.project=${kylin.spark.project}
#log4j.appender.hdfs.rollingPeriod=5
#log4j.appender.hdfs.logQueueCapacity=5000
##flushPeriod count as millis
#log4j.appender.hdfs.flushInterval=5000
#log4j.appender.hdfs.layout=org.apache.kylin.common.logging.SensitivePatternLayout
##Don't add line number (%L) as it's too costly!
#log4j.appender.hdfs.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2} : %m%n
12.3. kylin.properties 업데이트
/home/admin/apache-kylin-4.0.1-bin-spark2/conf/kylin.properties 파일에서 Kylin의 핵심 설정을 업데이트합니다. 여기에는 S3, Hive Metastore, Spark 통합 및 클러스터 리소스 구성이 포함됩니다.
kylin.env.hadoop-conf-dir=/home/admin/apache-kylin-4.0.1-bin-spark2/hadoop_conf
kylin.storage.url=s3a://kylin4
kylin.source.hive.metadata-type=gluecatalog
kylin.source.hive.client=spark_catalog
kylin.source.hive.database-for-flat-table=kylin4
kylin.engine.spark-conf.spark.eventLog.enabled=true
kylin.engine.spark-conf.spark.history.fs.logDirectory=hdfs://localhost:9000/kylin4/spark-history
kylin.engine.spark-conf.spark.eventLog.dir=hdfs://localhost:9000/kylin4/spark-history
kylin.engine.spark-conf.spark.hadoop.yarn.timeline-service.enabled=false
kylin.engine.spark-conf.spark.yarn.submit.file.replication=1
kylin.engine.spark-conf.spark.master=yarn
kylin.engine.spark-conf.spark.driver.memory=512M
kylin.engine.spark-conf.spark.driver.memoryOverhead=512M
kylin.engine.spark-conf.spark.executor.memory=1G
kylin.engine.spark-conf.spark.executor.instances=1
kylin.engine.spark-conf.spark.executor.memoryOverhead=512M
kylin.engine.spark-conf.spark.executor.cores=1
kylin.engine.spark-conf.spark.sql.shuffle.partitions=1
kylin.engine.spark-conf.spark.yarn.jars=hdfs://localhost:9000/spark2_jars/ *
kylin.engine.spark-conf.spark.driver.extraJavaOptions=-Dkylin.hdfs.working.dir=hdfs://localhost:9000/kylin4
kylin.engine.spark-conf.spark.executor.extraJavaOptions=-Dkylin.hdfs.working.dir=hdfs://localhost:9000/kylin4
kylin.engine.spark-conf.spark.yarn.stagingDir=hdfs://localhost:9000/kylin4
kylin.engine.spark-conf.spark.executor.extraClassPath=/home/admin/apache-kylin-4.0.1-bin-spark2/lib/ *
kylin.engine.spark-conf.spark.driver.extraClassPath=/home/admin/apache-kylin-4.0.1-bin-spark2/lib/ *
kylin.engine.spark-conf.spark.jars=/home/admin/apache-kylin-4.0.1-bin-spark2/lib/ *
kylin.engine.spark-conf.spark.hadoop.fs.s3a.access.key=<YOUR_MINIO_ACCESS_KEY>
kylin.engine.spark-conf.spark.hadoop.fs.s3a.secret.key=<YOUR_MINIO_SECRET_KEY>
kylin.engine.spark-conf.spark.hadoop.fs.s3a.endpoint=http://[YOUR_MINIO_IP]:80
kylin.engine.spark-conf.spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem
kylin.engine.spark-conf.spark.hadoop.fs.s3a.path.style.access=true
kylin.engine.spark-conf.spark.hadoop.fs.s3a.connection.ssl.enabled=false
kylin.query.auto-sparder-context-enabled=true
kylin.query.sparder-context.app-name=sparder_on_docker
kylin.query.spark-conf.spark.master=yarn
kylin.query.spark-conf.spark.driver.memory=512M
kylin.query.spark-conf.spark.driver.memoryOverhead=512M
kylin.query.spark-conf.spark.executor.memory=1G
kylin.query.spark-conf.spark.executor.instances=1
kylin.query.spark-conf.spark.executor.memoryOverhead=512M
kylin.query.spark-conf.spark.executor.cores=1
kylin.query.spark-conf.spark.serializer=org.apache.spark.serializer.JavaSerializer
kylin.query.spark-conf.spark.sql.shuffle.partitions=1
kylin.query.spark-conf.spark.yarn.jars=hdfs://localhost:9000/spark2_jars/ *
kylin.query.spark-conf.spark.eventLog.enabled=true
kylin.query.spark-conf.spark.history.fs.logDirectory=hdfs://localhost:9000/kylin4/spark-history
kylin.query.spark-conf.spark.eventLog.dir=hdfs://localhost:9000/kylin4/spark-history
kylin.query.spark-conf.spark.jars=/home/admin/apache-kylin-4.0.1-bin-spark2/lib/hadoop-aws-2.8.5.jar,/home/admin/apache-kylin-4.0.1-bin-spark2/lib/aws-java-sdk-bundle-1.11.271.jar
kylin.query.spark-conf.spark.executor.extraJavaOptions=-Dkylin.hdfs.working.dir=hdfs://localhost:9000/kylin4
kylin.query.spark-conf.spark.yarn.stagingDir=hdfs://localhost:9000/kylin4
kylin.query.spark-conf.spark.hadoop.fs.s3a.access.key=<YOUR_MINIO_ACCESS_KEY>
kylin.query.spark-conf.spark.hadoop.fs.s3a.secret.key=<YOUR_MINIO_SECRET_KEY>
kylin.query.spark-conf.spark.hadoop.fs.s3a.endpoint=http://[YOUR_MINIO_IP]:80
kylin.query.spark-conf.spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem
kylin.query.spark-conf.spark.hadoop.fs.s3a.path.style.access=true
kylin.query.spark-conf.spark.hadoop.fs.s3a.connection.ssl.enabled=false
# metadata for mysql
kylin.metadata.url=kylin4@jdbc,url=jdbc:mysql://localhost:3306/kylin4,username=root,password=<YOUR_MYSQL_PASSWORD>,maxActive=10,maxIdle=10
kylin.env.hdfs-working-dir=/kylin4
kylin.env.zookeeper-base-path=/kylin4
kylin.env.zookeeper-connect-string=127.0.0.1 # Assuming ZooKeeper runs within the same Pod
kylin.storage.clean-after-delete-operation=true
12.4. spark-defaults.conf 업데이트
/home/admin/spark-2.4.7-bin-hadoop2.7/conf/spark-defaults.conf 파일에서 Spark JAR 경로를 업데이트합니다.
#spark.yarn.jars hdfs://localhost:9000/spark2_jars/ *
spark.yarn.jars /home/admin/apache-kylin-4.0.1-bin-spark2/lib/ *
spark.jars /home/admin/apache-kylin-4.0.1-bin-spark2/lib/ *
🐘 13. ZooKeeper 구성 (Kylin Pod 내)
이 섹션은 각 Kylin Pod 내부에서 ZooKeeper 인스턴스를 실행하고 이를 클러스터로 구성하는 것을 가정합니다. 보다 강력한 프로덕션 설정을 위해서는 ZooKeeper를 별도의 Kubernetes StatefulSet으로 배포하는 것을 고려하세요.
13.1. myid 파일 생성
각 ZooKeeper 노드(각 Kylin Pod)의 /data/zookeeper/ 에 myid 파일을 생성하고 고유 ID(예: 1, 2, 3)를 입력합니다. 이는 Pod당 고유한 myid 값이 보장되도록 StatefulSet 및 Init Container를 사용하여 Kubernetes에서 신중한 오케스트레이션이 필요합니다.
- 노드 1: /data/zookeeper/myid 에 1 입력
- 노드 2: /data/zookeeper/myid 에 2 입력
- 노드 3: /data/zookeeper/myid 에 3 입력
13.2. zoo.cfg 업데이트
ZooKeeper 앙상블을 구성하기 위해 /home/admin/zookeeper-3.4.6/conf/zoo.cfg 에 다음 내용을 추가합니다. IP 주소는 ZooKeeper를 실행하는 Kubernetes Pod의 실제 IP 주소 또는 해석 가능한 호스트명이어야 합니다.
server.1=[YOUR_NODE_1_IP_OR_HOSTNAME]:2888:3888
server.2=[YOUR_NODE_2_IP_OR_HOSTNAME]:2888:3888
server.3=[YOUR_NODE_3_IP_OR_HOSTNAME]:2888:3888
🚀 서비스 시작
마지막으로, 각 Pod 내에서 ZooKeeper 및 Kylin 서비스를 시작합니다.
# Start ZooKeeper
cd /home/admin/zookeeper-3.4.6/bin/
./zkServer.sh start
# Check ZooKeeper service status
./zkServer.sh status
# Start Kylin
cd /home/admin/apache-kylin-4.0.1-bin-spark2/bin
./kylin.sh start
# Check Kylin service logs
cd ..
cd logs
tail -f kylin.log
'Tech lab' 카테고리의 다른 글
[Kylin OLAP 가이드 1/4] Apache Kylin 4 아키텍처 분석: OLAP 큐브 모델링 및 쿼리 최적화 심층 가이드 (0) | 2025.07.09 |
---|---|
PostgreSQL 과 MySQL 특징 및 성능 비교 (2) | 2025.05.23 |
AI를 제조업에서 사용하다면? (feat. Cropper) (2) | 2025.05.09 |
데이터 파이프라인 모니터링 시스템 구축 (0) | 2025.04.04 |
n8n에서 파이썬(Python)을 활용하여 데이터파이프라인 구축하기 (1) | 2025.03.28 |