Kylin on Kubernetes 在 eBay 的實踐

語言: CN / TW / HK

Apache Kylin 在 eBay 已經運行了 5 年多,並於 2019 年整體遷移到了 eBay 的 Kubernetes 平臺 Tess 上,開啟了 Kylin on Kubernetes 的時代,系統的可用性和擴充套件性顯著提升,資源的管理與監控也更加簡便。目前  Kylin on Kubernetes 已貢獻至社群,歡迎多多嘗試,一起優化。

01

前言

Apache Kylin 是一個開源的、分散式的分析型資料倉庫,提供 Hadoop/Spark 之上的 SQL 查詢介面及多維分析(OLAP)能力以支援超大規模資料,最初由 eBay 開發並貢獻至開源社群。它能在亞秒內查詢巨大的表。

Kubernetes 是用於自動部署,擴充套件和管理容器化應用程式的開源系統。它將組成應用程式的容器組合成邏輯單元,以便於管理和服務發現。Kubernetes 源自 Google 15 年生產環境的運維經驗,同時凝聚了社群的最佳創意和實踐。

把 Kylin 平臺遷移到 Kubernetes 後,可以利用 Kubernetes 優勢,讓 Kylin 的部署,擴充套件和維護的成本變得更小。同時這個整合方案也把 Kylin 變成了一種更加原生的雲服務。使得使用者在雲平臺上,多了 Kylin 作為 OLAP 計算服務的一種選擇。

Kylin 在 eBay 已經運行了 5 年以上,起初直接執行在物理伺服器上。此前經歷過一次擴容,當時是通過多部署幾臺物理伺服器來實現的。但由於 Data Center 的遷移和 Tech Refresh 的需求,我們便在 2019 年年初,開始了把 Kylin 遷移到雲上的計劃。並於上半年把  Kylin  整體遷移到了 eBay 的 Kubernetes 平臺 Tess 上,開啟了 Kylin on Kubernetes 的時代。這個方案的計劃和實施主要由 allenma,kyotoYaho,mingmwang,sanjulian 等負責,我們已經把這個方案貢獻回社群。相關 PR 請參考:https://github.com/apache/kylin/pull/1182。

02

映象

關於映象,我們選擇了 Kubernetes 推薦的 Docker:Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的映象中,然後釋出到任何流行的 Linux 或 Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何影響。

關於 Kylin 的 Docker,為了解耦我們把它分為了兩個 Dockerfile: Hadoop-client 和 Kylin,Kylin 的 Dockerfile 是基於 Hadoop-client 的。考慮到構建速度的原因,我們會把相應的安裝包和原始檔等存放在本地目錄。

1. hadoop-client

上圖是 hadoop-client 映象的目錄結構,主要由兩部分組成:hdp-clients 和 Dockerfile。hdp-clients 目錄下存放相關版本的客戶端安裝包。Dockerfile 是基於 centos,首先安裝 openjdk1.8 和 krb5,然後安裝 hadoop-client 目錄下的客戶端。

2. kylin

上圖是 kylin 映象的目錄結構,主要由 4 部分組成:bin,kylin,crontab 和 Dockerfile。

bin 目錄下存放著容器啟動時必要的一些 shell 指令碼,例如啟動的指令碼,清除日誌,檢查活性和檢查可讀性等。

kylin 目錄下存放著 kylin 的二進位制包。crontab 是為了啟動定時任務配置檔案,定時去執行清除日誌等 shell 指令碼。Dockerfile 是基於之前的 hadoop-client,首先安裝一些必要的軟體,例如:cronie,sudo,unzip等,然後安裝 kylin 和關聯相關的 hadoop 配置,最後啟動定時任務和定製啟動指令碼。

03

部署

在 Kubernetes 支援多個虛擬叢集,它們底層依賴於同一個物理叢集。這些虛擬叢集被稱為名稱空間(namespace)。使用者可以通過命令列去建立,刪除和檢視現有的名稱空間,詳細資訊請參考名稱空間的管理指南文件(https://kubernetes.io/zh/docs/tasks/administer-cluster/namespaces/)。

我們首先通過命令列的方式去建立一個名叫 kylin 的名稱空間:

kubectl create namespace kylin

然後在 kylin 這個名稱空間下建立 kylin 的服務和部署檔案:

kubectl create -f {fileName}

1. Kylin 服務(service)部署:

服務部署檔案主要由埠配置(ports),選擇器(selector)和服務型別(type)三部分組成。

2. Kylin 伺服器(pod)部署

Kylin Pod 分為主要四種模式:查詢(query)伺服器,工作(job)伺服器,綜合(all)伺服器,接收器(receiver)伺服器。主要由 kylin.properties 中 kylin.server.mode 的配置不同的值所決定的。具體詳情請參考相關的 pull request(https://github.com/apache/kylin/pull/1182)。下面就是綜合(all)模式伺服器(同時具有 Job 和 Query 角色)的例項分析。

關於部署檔案的話主要由元資料(metadata),容器(container)和卷(volume)的定義組成。

1)我們先來看一下元資料的定義:在元資料(metadata)中,我們定義了相應的選擇器(selector)和標籤(label)來表明這是一個既有查詢也有構建功能的伺服器。

2)在 Kylin 的部署檔案中,存放著兩個容器分別為 kylin 和 filebeat。其中 kylin 是主容器,而 filebeat 是輔助容器(side-car)。

o   在 Kylin 的主容器中,定義了映象,資源(resource)請求,啟動指令碼及引數,對外埠,卷掛載(volumeMounts)等。除此之外,還可以配置自定義的活性(liveness)檢測,可讀性(readiness)檢測。

o   filebeat 容器是用來收集 kylin 的日誌,並統一發送到 elastic search。在這個容器中定義了映象,資源(resource)請求,啟動指令碼及引數,卷掛載(volumeMounts)等。

o   卷(volume)掛載了容器所需要的配置檔案和 log 的路徑。

3. 部署配置檔案

在部署 Kylin 伺服器之前,容器中掛載了一些 Secret 或 ConfigMap 是需要預先定義好。通過命令列來建立相應的 Secret 或 ConfigMap,由於配置中有一些敏感檔案所以會選用 Secret,如無敏感檔案的話可以用 ConfigMap 更為易讀:

kubectl create secret generic {secret name} -n kylin --from-file={file path} --from-file={file path}…

03

配套工具

對於 Kylin on Kubernetes 來說,首先需要解決的就是日誌收集和分析。關於日誌處理,首先在每個部署檔案中都會有一個 filebeat 的輔助容器,用來收集當前 Pod 中 kylin container 所產生的所有 log 檔案,包括了 kylin.log,kylin.gc.*.current,kylin.out,localhost_access_log.txt,catalina.*.log,localhost.*.log,詳細配置請檢視配置檔案中的filebeat.yml。我們推薦採用 filebeat 和 Elastic Search 的技術棧作為日誌收集和分析的解決方案,把日誌傳送到 ES 裡,通過 Kibana 來進行分析。關於搭建 ES+Kibana 的服務的話,可以參考 ES 官方文件(https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-quickstart.html),就不在此做詳細介紹了。而關於日誌的清理方面,則是利用了定時器任務(cron job)來呼叫 clean-log.sh 指令碼進行定期處理。

由於 kylin 服務依賴於 memcached 來實現查詢結果的快速儲存和使用者的 session 共享。因此建立了一個 memcached on kubernetes 的叢集。包括相應的 service 和 statefulset, 可以參考官方 Repo 中的 memcached-service.yaml 和 memcached-statefulset.yaml。

04

收益

這裡我談談對於這次實踐之後,給我們帶來了以下的收益:

  1. 提高了系統可用性,並且實現了部署的運維過程的自動化。得益於 Kubernetes 的特性,通過使用自定義的活性(liveness)檢測和可讀性(readiness)檢測來自動重啟 Pod 和加入服務,使得不需要擔心是否有哪臺伺服器的 kylin 程序掛了而沒有及時重啟,從而提高了服務的可用性。

  2. 擴容(scale up/scale out)變得十分簡單。現在只需要修改一下replica的數字就能擴充套件或者刪除一臺 kylin 的應用伺服器,相比之前部署一臺應用服務的難度和成本大大降低。

  3. 可維護性得到顯著提高。得益於 ConfigMap 和 Sercret,使得 Kylin 映象和配置檔案分離,更新配置和升級 Kylin 變得更加簡單。此外,通過 ELK 來集中分析日誌,可以方便快速定位出錯原因,大大地提高了定位問題和糾錯的效率。

  4. 藉助 Kubernetes 帶來的高度可移植性,使得在不同環境之間的遷移,變得邏輯簡單而且結果可靠。

  5. 系統資源的管理和監控有了簡便而且統一的方式,從而可以更加方便地觀測硬體資源利用率,如果結合彈性伸縮策略,可以進一步提升資源使用率,從而節省公司 IT 成本。

05

展望

最後再談談對於這次實踐的不足之處,對於接收器(receiver)的 pod 遷移來說,還需要更多手工干預。需要清理掉本地磁碟的掛載之後,才能做 pod 遷移的工作。之後也需要利用 Kubernetes 的控制器(controller)把這個步驟自動化。

06

快速上手

目前 Kylin on Kubernetes 的第一版經過社群的 review 和測試後,已經成功合併到 Github,請參考 https://github.com/apache/kylin/tree/master/kubernetes 來進行嘗試。

以上就是我們實踐過程的總結,希望拋磚引玉,各位讀者可以多多嘗試,有問題 歡迎在社群郵件組討論。

07

參考連結

1. http://kylin.apache.org/docs/install/kylin_on_kubernetes.html

2. https://github.com/apache/kylin/tree/master/kubernetes

3. https://issues.apache.org/jira/browse/KYLIN-4445

4. https://www.elastic.co/cn/what-is/elk-stack

5. http://kylin.apache.org/blog/2019/07/30/detailed-analysis-of-refine-query-cache/

往期案例與實踐

Kylin's Github Repo 傳送門

↓↓↓

https://github.com/apache/kylin

喜歡:heart:Kylin 的話,別忘了 Star :star2:一下喲~