在 Kubernetes 上部署 Kylin

Kubernetes是一个易于移植,易于扩展的,用于管理容器化的 workload 和 service 的开源平台,通过声明式的配置和自动化,使得集群运维负担大大减少。

Apache Kylin 是一个开源的的分布式的,针对大数据场景下的高性能分析型数据仓库。在 Kubernetes 集群上部署 Kylin,可以减少 Kylin 集群维护和扩容的代价。

目录

下载获取 https://github.com/apache/kylin/tree/master/kubernetes, 得到以下文件:

  • config
    这里是存放 Hadoop 和 Kylin 配置文件的地方。
  • template
    这个目录提供了两个部署模板:
    • Quick-start 模板为了单节点(Poc)目的准备的;只部署了一个 all 节点。
    • Production 模板是为多节点部署准备的;此外还集成了 Memcached 服务以满足分布式查询缓存需求,以及 filebeat(ELK stack) 以满足日志收集和分析需求。
  • docker
    Docker 镜像是在 Kubernetes 上部署 Kylin 的前置条件,请参考此路径的说明,来构建所需镜像。CDH5.x 用户可以直接从 Dockerhub 获取预先构建好的镜像。

前置条件

  1. 一个 Hadoop 集群
  2. 一个 Kubernetes 集群
  3. kylin-client 镜像
  4. 一个 Elasticsearch 集群(可选的)

如何构建所需 docker 镜像

hadoop-client 镜像

我们都知道,部署 Kylin 的节点需要包含 Hadoop 依赖,以便 Kylin 通过客户端访问 Hadoop 集群的各个组件。不幸地,每一个 Hadoop 分发版本各自不同。所以我们可以为所需的 Hadoop 分发版本构建 Docker 镜像,会有以下好处:
- 可以让对特定 Hadoop 环境更加熟悉的人负责准备该镜像,让 Kylin 用户更加方便地基于 Hadoop-Client 镜像构建 Kylin 镜像。
- Kylin 的升级会更加方便。

构建步骤
- 准备或者修改 Dockerfile。
- 获取 Spark 二进制包(例如 spark-2.3.2-bin-hadoop2.7.tgz) 到 路径provided-binary
- 运行 build-image.sh 来构建镜像。

Kylin-client 镜像

kylin-client 是一个基于 hadoop-client 的镜像, 两者分离使得 Kylin 升级更加简单。

构建步骤
- 获取 Kylin 二进制包(例如 apache-kylin-3.0.1-bin-cdh57.tar.gz) 在当前目录解压。
- 修改 Dockerfile , 将 KYLIN_VERSION 和 base image(hadoop-client) 改为合适的值。
- 运行 build-image.sh 来构建镜像。

如何在 Kubernetes 部署 Kylin

在这里,我们以如何基于 CDH5.x 环境部署 Kylin 集群。

1 进入到 kubenetes/template/production/example/deployment 路径

2 替换 Hadoop 配置文件到 (kubenetes/template/production/example/config/hadoop) 并且修改 filebeat 配置文件。

3 部署 Memcached 服务
- Apply kubernetes objects.
$ kubectl apply -f memcached/ service/cache-svc created statefulset.apps/kylin-memcached created
- 获取 Memcached 服务地址
$ kubectl run -it--image=busybox:1.28.4--rm--restart=Never sh -n test-dns If you don't see a command prompt, try pressing enter. / # nslookup cache-svc.kylin-example.svc.cluster.local Server: 10.96.0.10 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Name: cache-svc.kylin-example.svc.cluster.local Address 1: 192.168.11.44 kylin-memcached-0.cache-svc.kylin-example.svc.cluster.local / #

4 部署 Kylin 服务
- 修改 Memcached 配置
## modify memcached hostname(session sharing) ## memcachedNodes="n1:kylin-memcached-0.cache-svc.kylin-example.svc.cluster.local:11211" $ vim ../config/tomcat/context.xml modify memcached hostname(query cache) ## kylin.cache.memcached.hosts=kylin-memcached-0.cache-svc.kylin-example.svc.cluster.local:11211 $ vim ../config/kylin-job/kylin.properties $ vim ../config/kylin-query/kylin.properties
- 创建 ConfigMap
$ kubectl create configmap -n kylin-example hadoop-config \ --from-file=../config/hadoop/core-site.xml \ --from-file=../config/hadoop/hdfs-site.xml \ --from-file=../config/hadoop/yarn-site.xml \ --from-file=../config/hadoop/mapred-site.xml \ --dry-run -o yaml | kubectl apply -f - $ kubectl create configmap -n kylin-example hive-config \ --from-file=../config/hadoop/hive-site.xml \ --dry-run -o yaml | kubectl apply -f - $ kubectl create configmap -n kylin-example hbase-config \ --from-file=../config/hadoop/hbase-site.xml \ --dry-run -o yaml | kubectl apply -f - $ kubectl create configmap -n kylin-example kylin-more-config \ --from-file=../config/kylin-more/applicationContext.xml \ --from-file=../config/kylin-more/ehcache.xml \ --from-file=../config/kylin-more/ehcache-test.xml \ --from-file=../config/kylin-more/kylinMetrics.xml \ --from-file=../config/kylin-more/kylinSecurity.xml \ --dry-run -o yaml | kubectl apply -f - $ kubectl create configmap -n kylin-example kylin-job-config \ --from-file=../config/kylin-job/kylin-kafka-consumer.xml \ --from-file=../config/kylin-job/kylin_hive_conf.xml \ --from-file=../config/kylin-job/kylin_job_conf.xml \ --from-file=../config/kylin-job/kylin_job_conf_inmem.xml \ --from-file=../config/kylin-job/kylin-server-log4j.properties \ --from-file=../config/kylin-job/kylin-spark-log4j.properties \ --from-file=../config/kylin-job/kylin-tools-log4j.properties \ --from-file=../config/kylin-job/kylin.properties \ --from-file=../config/kylin-job/setenv.sh \ --from-file=../config/kylin-job/setenv-tool.sh \ --dry-run -o yaml | kubectl apply -f - $ kubectl create configmap -n kylin-example kylin-query-config \ --from-file=../config/kylin-query/kylin-kafka-consumer.xml \ --from-file=../config/kylin-query/kylin_hive_conf.xml \ --from-file=../config/kylin-query/kylin_job_conf.xml \ --from-file=../config/kylin-query/kylin_job_conf_inmem.xml \ --from-file=../config/kylin-query/kylin-server-log4j.properties \ --from-file=../config/kylin-query/kylin-spark-log4j.properties \ --from-file=../config/kylin-query/kylin-tools-log4j.properties \ --from-file=../config/kylin-query/kylin.properties \ --from-file=../config/kylin-query/setenv.sh \ --from-file=../config/kylin-query/setenv-tool.sh \ --dry-run -o yaml | kubectl apply -f - $ kubectl create configmap -n kylin-example filebeat-config \ --from-file=../config/filebeat/filebeat.yml \ --dry-run -o yaml | kubectl apply -f - $ kubectl create configmap -n kylin-example tomcat-config \ --from-file=../config/tomcat/server.xml \ --from-file=../config/tomcat/context.xml \ --dry-run -o yaml | kubectl apply -f -
- 部署 Kylin 的 Job server
$ kubectl apply -f kylin-job/ service/kylin-job-svc created statefulset.apps/kylin-job created
- 部署 Kylin 的 Query server
$ kubectl apply -f kylin-query/ service/kylin-query-svc created statefulset.apps/kylin-query created

5 访问 Web UI
- http://${HOSTNAME}:30012/kylin 对应 QueryServer

6 停止 Kylin 服务
$ kubectl delete -f memcached/ $ kubectl delete -f kylin-query/ $ kubectl delete -f kylin-job/

问题诊断

  • 获取指定 Pod 的日志
    ## Output of : sh kylin.sh start $ kubectl logs kylin-job-0 kylin -n kylin-example $ kubectl logs -f kylin-job-0 kylin -n kylin-example

  • 访问指定 Pod
    $ kubectl exec -it {POD_NAME} -n kylin-example-- bash

  • 检查指定 Pod 启动失败原因
    $ kubectl get pod {POD_NAME} -n kylin-example -o yaml

  • 如果你没有 Elasticsearch 集群,或者有替代的日志收集方案, 请从 kylin-query-stateful.yamlkylin-job-stateful.yaml 移除 filebeat 容器。

  • JIRA issue: KYLIN-4447 Kylin on kubernetes in production env

  • 尝试在 DockerHub 上寻找预先构建好的 kylin-client image: apachekylin/kylin-client.