常見術(shù)語
- Kubernetes:K8s室琢,是一個(gè)可移植的、可擴(kuò)展的開源平臺(tái),用于管理容器化的工作負(fù)載和服務(wù)真仲,可促進(jìn)聲明式配置和自動(dòng)化
- Yarn:hadoop 2.0 引入的 集群資源管理系統(tǒng) 喇颁。用戶可以將各種服務(wù)框架部署在 YARN 上漏健,由 YARN 進(jìn)行統(tǒng)一地管理和資源分配
- Spark:基于內(nèi)存計(jì)算的通用大規(guī)模數(shù)據(jù)處理框架
- Livy:通過REST的方式將代碼片段或是序列化的二進(jìn)制代碼提交到Spark集群中去執(zhí)行
“不良”動(dòng)機(jī)
自2018年2月28日發(fā)布Spark v2.3.0起,即可在Kubernetes上運(yùn)行Spark橘霎。我們現(xiàn)在用的版本是v2.4.3蔫浆,當(dāng)然,與類似Hadoop的集群上眾所周知的Yarn設(shè)置相比仍然缺乏很多姐叁。 對(duì)應(yīng)于官方文檔用戶瓦盛,可以通過spark-submit CLI腳本在Kubernetes上運(yùn)行Spark。 實(shí)際上外潜,它是唯一內(nèi)置在Apache Spark Kubernetes相關(guān)功能以及某些配置選項(xiàng)中的功能原环。 Apache文檔中的調(diào)試建議太差,無法輕松使用处窥,并且僅適用于基于控制臺(tái)的工具聋呢。 調(diào)度程序集成也不可用填硕,這使得在Kubernetes上開箱即用Spark來設(shè)置便捷的管道變得非常棘手凫乖。 反過來钓葫,基于Yarn的Hadoop群集具有所有UI,代理嵌灰,調(diào)度程序和API弄匕,會(huì)讓數(shù)據(jù)RD更愉快的工作。
So what~
另一方面沽瞭,使用與Yarn相反的Kubernetes集群具有明顯的好處(2019年7月比較):
- Price:比較Azure Cloud上的類似群集設(shè)置迁匠,可以發(fā)現(xiàn)AKS比HDInsight Spark便宜35%。
- Scale:Cloud中的Kubernetes集群支持彈性自動(dòng)擴(kuò)展驹溃,并具有非吵巧ィ酷的相關(guān)功能,例如:Nodepools豌鹤。 反之亡哄,Hadoop集群的擴(kuò)展速度遠(yuǎn)遠(yuǎn)沒有那么快,可以手動(dòng)或自動(dòng)完成(2019年7月預(yù)覽)布疙。
- Integrations:我們可以在包裝在Docker容器中的Kubernetes集群中運(yùn)行任何工作負(fù)載蚊惯。至少我還沒見過寫過Yarn App的人愿卸。
- Support:我們無法完全控制Cloud提供的群集設(shè)置,并且通常在發(fā)行后的幾個(gè)月內(nèi)沒有可用的最新版本的軟件截型。但是趴荸,使用Kubernetes,我們完全可以自己構(gòu)建映像宦焦。
- Other Kuebernetes pros:具有Helm的CI / CD发钝,可一鍵單擊即可使用的監(jiān)視堆棧,獲得了廣泛的歡迎和社區(qū)支持波闹。當(dāng)然還有HYPE諸如此類的優(yōu)秀工具酝豪。
當(dāng)我們了解Kubernetes的優(yōu)勢(shì)之后,那就開始干精堕,嘗試提高 Spark on K8s可行性吧孵淘。
設(shè)計(jì)理念
基于Spark on K8s解決方案的核心是Apache Livy。 Apache Livy是一項(xiàng)服務(wù)锄码,可通過REST接口輕松與Spark集群進(jìn)行交互夺英。 它受到Apache Incubator社區(qū)和Azure HDInsight團(tuán)隊(duì)的支持晌涕,該團(tuán)隊(duì)將其置于Yarn群集設(shè)置中的一等公民(你懂的)滋捶,進(jìn)行了諸多工業(yè)設(shè)計(jì)的集成,諸如多用戶支持余黎、端到端安全重窟、HTTPS/SSL、基于SASL認(rèn)證的RPC通信機(jī)制惧财、失敗恢復(fù)等企業(yè)級(jí)關(guān)鍵特性巡扇。
當(dāng)然缺點(diǎn)也是很明顯的 ,Livy設(shè)計(jì)的初衷就為Yarn編寫的垮衷,慶幸的是厅翔,2019年4月10日,Apache Incubator社區(qū)聲明全面支持Spark on K8s搀突。
Livy服務(wù)器只是包裝了與Spark集群交互的所有邏輯刀闷,并提供了簡單的REST接口。
具體實(shí)施
1. 搭建K8s集群
網(wǎng)上教程多如牛毛仰迁,過程省略... 建議1.14及以上版本甸昏,2019最新k8s集群搭建教程 (centos k8s 搭建)
2. 制作Livy-server鏡像
2.1 Livy.conf
livy配置,注意要制定master節(jié)點(diǎn)指向 k8s的master節(jié)點(diǎn)徐许,用來對(duì)接K8s的api-server
2.2 Dockerfile
2.3 Livy.yaml
--- 預(yù)留10000~10010服務(wù)端口施蜜,不考慮資源情況下,理論上可以最大并發(fā)11個(gè)driver
apiVersion: v1
kind: Service
metadata:
name: livy-server
namespace: default
spec:
type: NodePort
selector:
app: livy-server
ports:
- name: http
protocol: TCP
nodePort: 31988
port: 31988
targetPort: 31988
- name: rpc0
protocol: TCP
nodePort: 31839
port: 10000
targetPort: 10000
- name: rpc1
protocol: TCP
nodePort: 31612
port: 10001
targetPort: 10001
- name: rpc2
protocol: TCP
nodePort: 31228
port: 10002
targetPort: 10002
- name: rpc3
protocol: TCP
nodePort: 31477
port: 10003
targetPort: 10003
- name: rpc4
protocol: TCP
nodePort: 31384
port: 10004
targetPort: 10004
- name: rpc5
protocol: TCP
nodePort: 31003
port: 10005
targetPort: 10005
- name: rpc6
protocol: TCP
nodePort: 31842
port: 10006
targetPort: 10006
- name: rpc7
protocol: TCP
nodePort: 31795
port: 10007
targetPort: 10007
- name: rpc8
protocol: TCP
nodePort: 31703
port: 10008
targetPort: 10008
- name: rpc9
protocol: TCP
nodePort: 31930
port: 10009
targetPort: 10009
- name: rpc10
protocol: TCP
nodePort: 31068
port: 10010
targetPort: 10010
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: livy-server
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: livy-server
template:
metadata:
labels:
app: livy-server
spec:
hostname: livy-server
serviceAccount: spark
serviceAccountName: spark
containers:
- name: livy-server
image: 10.102.0.21:5000/spark/livyserver:0.7.0b
securityContext:
privileged: true
runAsUser: 0
resources:
limits:
cpu: "2"
memory: 2Gi
requests:
cpu: 200m
memory: 512Mi
ports:
- containerPort: 31988
3. livy-server盤它
查看livy-spark的pod
3.1 提交一個(gè)batch任務(wù)
可看出id為28的batch任務(wù)已創(chuàng)建雌隅,狀態(tài)為starting
3.2 查看某個(gè)batch任務(wù)
可看出任務(wù)在pending中
3.3 任務(wù)完成
在livy的GUI界面上可以看到求圓周率的任務(wù)已完成翻默,并且通過接口看到任務(wù)狀態(tài)為success
未完待續(xù)
上面只是Spark云化服務(wù)的基礎(chǔ)部分缸沃,為了達(dá)到工業(yè)級(jí)的Spark云化服務(wù)平臺(tái),我們還有很多事情要做修械,如安全認(rèn)證中間件和泌、緩存中間件、分布式消息隊(duì)列祠肥、多存儲(chǔ)源混合(數(shù)據(jù)湖支持武氓,多類型存儲(chǔ))等等。
最后引用一張我心中完美的Spark as Service的架構(gòu)圖