一赫蛇、說明
Moonbox(計(jì)算服務(wù)平臺),是一個(gè)DVtaaS(Data Virtualization as a Service)平臺解決方案赂鲤。Moonbox面向數(shù)據(jù)倉庫工程師/數(shù)據(jù)分析師/數(shù)據(jù)科學(xué)家等噪径, 基于數(shù)據(jù)虛擬化設(shè)計(jì)思想,致力于提供批量計(jì)算服務(wù)解決方案数初。Moonbox負(fù)責(zé)屏蔽底層數(shù)據(jù)源的物理和使用細(xì)節(jié)找爱,為用戶帶來虛擬數(shù)據(jù)庫般使用體驗(yàn),用戶只需通過統(tǒng)一SQL語言泡孩,即可透明實(shí)現(xiàn)跨異構(gòu)數(shù)據(jù)系統(tǒng)混算和寫出车摄。此外Moonbox還提供數(shù)據(jù)服務(wù)、數(shù)據(jù)管理仑鸥、數(shù)據(jù)工具吮播、數(shù)據(jù)開發(fā)等基礎(chǔ)支持,可支撐更加敏捷和靈活的數(shù)據(jù)應(yīng)用架構(gòu)和邏輯數(shù)倉實(shí)踐眼俊。
二意狠、架構(gòu)
上圖展示的是Moonbox的架構(gòu)圖〈郑可以看到Moonbox的計(jì)算引擎部分也是基于Spark引擎做的环戈,并沒有自研。Moonbox對Spark進(jìn)行擴(kuò)展和優(yōu)化澎灸,增加了很多企業(yè)級的數(shù)據(jù)庫能力院塞,比如用戶、租戶性昭、權(quán)限拦止、 類存儲過程等。從上圖看糜颠,Moonbox整個(gè)服務(wù)端是一個(gè)分布式的架構(gòu)汹族,所以它也是高可用的。
Moonbox總體上由四部分組成其兴,分別是客戶端鞠抑、接入層、Grid以及存儲計(jì)算層忌警。
客戶端
客戶端有如下幾種:
rest api
以restful api的方式提供batch作業(yè)提交、查詢作業(yè)執(zhí)行狀態(tài)、取消作業(yè)服務(wù)法绵。
jdbc
提供jdbc驅(qū)動(dòng)箕速,可以使用jdbc編程訪問, 使用戶擁有數(shù)據(jù)庫般的使用體驗(yàn)。
odbc
提供odbc支持朋譬,用戶可以使用sas連接moonbox進(jìn)行數(shù)據(jù)分析盐茎。
cli
命令行工具,基于jline實(shí)現(xiàn)徙赢。通過cli可以完成DDL(Data Definition Language)字柠、DML(Data Manipulation Language)、DCL(Data Control Language)以及Query操作狡赐。
zeppelin
提供zeppelin moonbox interpreter窑业,可以使用zeppelin快速進(jìn)行原型驗(yàn)證和SQL開發(fā)。
davinci
通過jdbc支持ABD Stack(敏捷大數(shù)據(jù)技術(shù)棧)中數(shù)據(jù)可視化平臺davinci的接入枕屉,進(jìn)行數(shù)據(jù)查詢并展示常柄。
接入層
接入層包括http server、tcp server和thrift server搀擂,實(shí)現(xiàn)客戶端接入西潘,并進(jìn)行用戶登錄認(rèn)證。
分布式服務(wù)層
Grid是Moonbox分布式服務(wù)層哨颂。Grid使用master-slave集群工作模式喷市,支持master主備切換。Grid有Master威恼、Worker品姓、App三種角色:
Master負(fù)責(zé)接收所有的用戶請求,根據(jù)請求模式(adhoc/batch)將請求調(diào)度到合適的App上沃测。
Worker向Master注冊,負(fù)責(zé)該節(jié)點(diǎn)上App的啟動(dòng)和停止缭黔,每個(gè)Worker節(jié)點(diǎn)可以啟動(dòng)多個(gè)不同種類的App。
App也會向Master注冊,App是真正處理計(jì)算的角色,可以是一個(gè)Spark App, 也可以是其他自定義的App蒂破。
計(jì)算/存儲層
Moonbox默認(rèn)使用Spark作為計(jì)算引擎馏谨,將一個(gè)常駐的Spark作業(yè)稱之為一個(gè)App, 支持standalone和yarn運(yùn)行模式。Spark App處理用戶發(fā)過來的請求附迷,包括用戶體系管理操作惧互、權(quán)限管理操作、SQL解析喇伯、下推優(yōu)化喊儡、執(zhí)行引擎選擇等,并提交真正的計(jì)算任務(wù)稻据。當(dāng)計(jì)算邏輯可以完全下推到數(shù)據(jù)源計(jì)算時(shí)艾猜,Moonbox將計(jì)算任務(wù)直接mapping成數(shù)據(jù)源的查詢語言進(jìn)行下推計(jì)算,以減小啟動(dòng)分布式作業(yè)的開銷。數(shù)據(jù)源除了可以是hdfs這種純存儲系統(tǒng)匆赃,mysql淤毛、elasticsearch這種帶計(jì)算能力的存儲系統(tǒng),還可以是presto等計(jì)算引擎算柳,Moonbox將他們統(tǒng)一視為數(shù)據(jù)源低淡。
三、安裝說明
部署機(jī)器:
? ? 192.168.210.23
? ? 192.168.210.24
? ? 192.168.210.25
安裝目錄:
/opt/moonbox
環(huán)境準(zhǔn)備
已安裝Apache Spark 2.2.0
(此版本僅支持Apache Spark 2.2.0, 其他Spark 版本后續(xù)會兼容)
已安裝MySQL并啟動(dòng),且開啟遠(yuǎn)程訪問
各安裝節(jié)點(diǎn)已經(jīng)配置ssh免密登錄
下載
網(wǎng)址:https://github.com/edp963/moonbox/releases/tag/0.3.0-beta
解壓
tar -zxvf moonbox-assembly_2.11-0.3.0-beta-dist.tar.gz
修改配置文件
配置文件位于conf目錄下
step 1: 修改slaves
·???????? ??mv slaves.example slaves
·???????? ??vim slaves
將會看到如下內(nèi)容:
? localhost
請根據(jù)實(shí)際情況修改為需要部署worker節(jié)點(diǎn)的地址, 每行一個(gè)地址
step 2: 修改moonbox-env.sh
? mv moonbox-env.sh.example moonbox-env.sh
? chmod u+x moonbox-env.sh
? vim moonbox-env.sh
將會看到如下內(nèi)容:
? export JAVA_HOME=path/to/installed/dir
? export SPARK_HOME=path/to/installed/dir
? export YARN_CONF_DIR=path/to/yarn/conf/dir
? export MOONBOX_SSH_OPTS="-p 22"
? export MOONBOX_HOME=path/to/installed/dir
? # export MOONBOX_LOCAL_HOSTNAME=localhost
? export MOONBOX_MASTER_HOST=localhost
? export MOONBOX_MASTER_PORT=2551
請根據(jù)實(shí)際情況修改
step 3: 修改moonbox-defaults.conf
? mv moonbox-defaults.conf.example moonbox-defaults.conf
? vim moonbox-defaults.conf
將會看到以下內(nèi)容,其中:
catalog
配置元數(shù)據(jù)存儲位置, 必須修改, 請根據(jù)實(shí)際情況修改
rest
配置rest服務(wù), 按需修改
tcp
配置tcp(jdbc)服務(wù), 按需修改
local
配置Spark Local模式作業(yè), 值為數(shù)組, 有多少個(gè)元素表示每個(gè)Worker節(jié)點(diǎn)啟動(dòng)多少個(gè)Spark Local模式作業(yè)瞬项。如不需要可刪除蔗蹋。
cluster
配置Spark yarn模式作業(yè), 值為數(shù)組, 有多少個(gè)元素表示每個(gè)Worker節(jié)點(diǎn)啟動(dòng)多少個(gè)Spark Yarn模式作業(yè)。如不需要可刪除囱淋。
moonbox { deploy { catalog { implementation = "mysql" url = "jdbc:mysql://host:3306/moonbox?createDatabaseIfNotExist=true" user = "root" password = "123456" driver = "com.mysql.jdbc.Driver" } rest { enable = true port = 9099 request.timeout = "600s" idle.timeout= "600s" } tcp { enable = true port = 10010 } } mixcal { pushdown.enable = true column.permission.enable = true spark.sql.cbo.enabled = true spark.sql.constraintPropagation.enabled = false local = [{}] cluster = [{ spark.hadoop.yarn.resourcemanager.hostname = "master" spark.hadoop.yarn.resourcemanager.address = "master:8032" spark.yarn.stagingDir = "hdfs://master:8020/tmp" spark.yarn.access.namenodes = "hdfs://master:8020" spark.loglevel = "ERROR" spark.cores.max = 2spark.yarn.am.memory = "512m"spark.yarn.am.cores = 1 spark.executor.instances = 2 spark.executor.cores = 1 spark.executor.memory = "2g" }] } }
optional: 如果HDFS 配置了高可用(HA)猪杭、或者HDFS 配置了kerberos、或者YARN 配置了高可用(HA)绎橘、或者YARN 配置了kerberos
將cluster元素中相關(guān)部分改為以下配置, 請根據(jù)實(shí)際情況修改胁孙。具體值可查閱hdfs配置文件和yarn配置文件。
#### HDFS HA ####
spark.hadoop.fs.defaultFS="hdfs://service_name" spark.hadoop.dfs.nameservices="service_name" spark.hadoop.dfs.ha.namenodes.service_name="xxx1,xxx2" spark.hadoop.dfs.namenode.rpc-address.abdt.xxx1="xxx1_host:8020" spark.hadoop.dfs.namenode.rpc-address.abdt.xxx2="xxx2_host:8020" spark.hadoop.dfs.client.failover.proxy.provider.abdt="org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
spark.yarn.stagingDir = "hdfs://service_name/tmp"
? #### HDFS kerberos ####
? dfs.namenode.kerberos.principal = ""
? dfs.namenode.kerberos.keytab = ""
? #### YARN HA ####
? spark.hadoop.yarn.resourcemanager.ha.enabled=true
? spark.hadoop.yarn.resourcemanager.ha.rm-ids="yyy1,yyy2"
? spark.hadoop.yarn.resourcemanager.hostname.rm1="yyy1_host"
? spark.hadoop.yarn.resourcemanager.hostname.rm2="yyy2_host"
? #### YARN kerberos ####
? spark.yarn.principal = ""
? spark.yarn.keytab = ""
分發(fā)安裝包
將MySQL Jdbc驅(qū)動(dòng)包放置到libs和runtime目錄下, 然后將整個(gè)moonbox安裝目錄拷貝到所有安裝節(jié)點(diǎn), 確保位置與主節(jié)點(diǎn)位置一致称鳞。
啟動(dòng)集群
在master節(jié)點(diǎn)執(zhí)行
?? sbin/start-all.sh
停止集群
在master節(jié)點(diǎn)執(zhí)行
?? sbin/stop-all.sh
檢查集群是否成功啟動(dòng)
在master節(jié)點(diǎn)執(zhí)行如下命令, 將會看到 MoonboxMaster 進(jìn)程
?? jps | grep Moonbox
在worker節(jié)點(diǎn)執(zhí)行如下命令, 將會看到 MoonboxWorker 進(jìn)程
?? jps | grep Moonbox
在worker節(jié)點(diǎn)執(zhí)行如下命令, 將會看到與配置文件對應(yīng)個(gè)數(shù)的 SparkSubmit 進(jìn)程
?? jps -m | grep Spark
使用moonbox-cluster命令查看集群信息
?? bin/moonbox-cluster workers
?? bin/moonbox-cluster apps
如果檢查通過, 則集群啟動(dòng)成功, 即可參閱examples部分開始體驗(yàn)啦涮较。 如果檢查失敗, 可通過查看master節(jié)點(diǎn)或者worker節(jié)點(diǎn)上logs目錄下的日志進(jìn)行問題排查。
四冈止、使用說明
應(yīng)用場景一:數(shù)據(jù)查詢
用戶使用
使用sally登錄
bin/moonbox-shell -u sally -p 123456 -r local
掛載數(shù)據(jù)源 (根據(jù)自己的實(shí)際數(shù)據(jù)庫更改)
mount database mb_mysql options(
? type 'mysql',
url 'jdbc:mysql://host:port/database',
? user 'user',
? password 'password',
? driver 'com.mysql.jdbc.Driver'
)
列出所有數(shù)據(jù)庫
show database
列出當(dāng)前庫下所有表
show tables