開源的Spark SQL并不支持高可用,但實(shí)際應(yīng)用中高可用對(duì)于用戶意義重大。中興大數(shù)據(jù)平臺(tái)DAP在對(duì)應(yīng)的ZDH中實(shí)現(xiàn)了Spark SQL的高可用。
Spark SQL的高可用,是兩個(gè)Spark SQL服務(wù)上線的時(shí)候向SQL進(jìn)行注冊(cè),用戶連接的JDBC URL指定為Zookeeper的列表,連接的時(shí)候會(huì)通過Zookeeper集群獲取Spark SQL節(jié)點(diǎn)信息,然后連接到Spark SQL服務(wù)節(jié)點(diǎn)。
Spark SQL元數(shù)據(jù)雙主主要是用MySQL實(shí)現(xiàn),MySQL支持單向、異步復(fù)制,復(fù)制過程中一個(gè)服務(wù)器充當(dāng)主服務(wù)器,而一個(gè)或多個(gè)其它服務(wù)器充當(dāng)從服務(wù)器。主服務(wù)器將更新寫入二進(jìn)制日志文件,并維護(hù)日志文件的索引以跟蹤日志循環(huán)。從服務(wù)器接收從那時(shí)起發(fā)生的任何更新,然后封鎖并等待主服務(wù)器通知下一次更新。
在實(shí)際項(xiàng)目中,兩臺(tái)分布于異地的主機(jī)上安裝有MySQL數(shù)據(jù)庫(kù),兩臺(tái)服務(wù)器互為主備,當(dāng)其中一臺(tái)機(jī)器出現(xiàn)故障時(shí),另外一臺(tái)能夠接管服務(wù)器上的應(yīng)用,這就需要兩臺(tái)數(shù)據(jù)庫(kù)的數(shù)據(jù)要實(shí)時(shí)保持一致,在這里使用MySQL的同步功能實(shí)現(xiàn)雙機(jī)的同步復(fù)制。
實(shí)現(xiàn)方案
目前SparkSQL節(jié)點(diǎn)訪問雙主的元數(shù)據(jù)庫(kù)主要考慮兩種方案:
SparkSQL節(jié)點(diǎn)直接連接MySQL節(jié)點(diǎn):
下圖中SparkSQL節(jié)點(diǎn)分別連接單個(gè)MySQL節(jié)點(diǎn),不同SparkSQL節(jié)點(diǎn)對(duì)元數(shù)據(jù)庫(kù)的更改會(huì)在MySQL節(jié)點(diǎn)之間進(jìn)行同步。
?
?
?
SparkSQL節(jié)點(diǎn)通過MetaStore節(jié)點(diǎn)連接元數(shù)據(jù)庫(kù):
?
下圖中SparkSQL節(jié)點(diǎn)分別連接多個(gè)MetaStore節(jié)點(diǎn),每個(gè)MetaStore節(jié)點(diǎn)連接對(duì)應(yīng)的MySQL節(jié)點(diǎn),不同SparkSQL節(jié)點(diǎn)對(duì)元數(shù)據(jù)庫(kù)的更改會(huì)在MySQL節(jié)點(diǎn)之間進(jìn)行同步。
?
?
上面兩種SparkSQL節(jié)點(diǎn)訪問雙主的元數(shù)據(jù)庫(kù)方案下,客戶端獲取SparkSQL服務(wù)的方式是相同的,主要通過如下方式:
?
Beeline連接
?
?
程序通過JDBC端口訪問
?
Beeline方式首先通過Zookeeper集群獲取SparkSQL節(jié)點(diǎn)信息,然后連接到SparkSQL服務(wù)節(jié)點(diǎn)。當(dāng)連接的SparkSQL節(jié)點(diǎn)異常時(shí),可以通過重試幾次獲取SparkSQL服務(wù)。
程序通過JDBC端口連接到對(duì)應(yīng)的SparkSQL節(jié)點(diǎn)的方式下,如果正在連接的SparkSQL節(jié)點(diǎn)出現(xiàn)異常,可以通過在代碼中進(jìn)行異常捕獲的方式重新獲取SparkSQL服務(wù)。
下面主要對(duì)兩種方案的功能可行性以及異常情況進(jìn)行驗(yàn)證。
?
測(cè)試環(huán)境
?
MySQL:10.43.183.121和10.43.183.122兩臺(tái)主機(jī)
SparkSQL: 10.43.183.121和10.43.183.122兩臺(tái)主機(jī)
Hive MetaStoreServer: 10.43.183.121和10.43.183.122兩臺(tái)主機(jī)
?
測(cè)試場(chǎng)景
?
場(chǎng)景一:SparkSQL節(jié)點(diǎn)直接連接MySQL高可用驗(yàn)證
每個(gè)SparkSQL節(jié)點(diǎn)直接連接一個(gè)MySQL節(jié)點(diǎn)。驗(yàn)證元數(shù)據(jù)能否成功同步以及MySQL節(jié)點(diǎn)失效能否自動(dòng)切換。
測(cè)試步驟如下:
1.?修改配置
SparkSQL配置修改如下:
?
?
10.43.183.121對(duì)應(yīng)的JDBC連接配置為10.43.183.121上的MySQL
10.43.183.122對(duì)應(yīng)的JDBC連接配置為10.43.183.122上的MySQL
2.?Beeline連接10.43.183.121節(jié)點(diǎn)的SparkSQL。
3.?創(chuàng)建表test,分別查找兩個(gè)MySQL的hiveomm數(shù)據(jù)庫(kù)的tbls表,可以看到test記錄。表明元數(shù)據(jù)同步成功。
4.?將SparkSQL當(dāng)前連接的MySQL停掉。
5. Beeline 界面執(zhí)行“show tables”命令,查詢異常。
6.?斷開Beeline連接并多次重新連接10.43.183.121節(jié)點(diǎn)的SparkSQL,連接異常。
7.?用SQL URL連接SparkSQL服務(wù)!connectjdbc:hive2://10.43.183.121:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=sparkThriftServer重試若干次可以連接上SparkSQL服務(wù),通過“show tables”命令可以查到test表。
8.?啟動(dòng)MySQL節(jié)點(diǎn),Beeline重新連接10.43.183.121節(jié)點(diǎn),可以連接到SparkSQL節(jié)點(diǎn)。執(zhí)行“show tables”命令,可以查詢到test表信息。
測(cè)試結(jié)論:
?
MySQL之間的元數(shù)據(jù)可以同步。
?
?
MySQL節(jié)點(diǎn)掛掉會(huì)導(dǎo)致Beeline無法查詢。
?
?
Beeline重新連接無法連接到對(duì)應(yīng)的SparkSQL節(jié)點(diǎn)。
?
?
Beeline通過SQL URL連接SparkSQL服務(wù),可以在嘗試一定次數(shù)之后連接到可用的SparkSQL節(jié)點(diǎn)。
?
?
場(chǎng)景二: SparkSQL節(jié)點(diǎn)通過HiveMetaStoreServer節(jié)點(diǎn)連接MySQL高可用驗(yàn)證
?
MetaStoreServer節(jié)點(diǎn)主要用于MySQL節(jié)點(diǎn)失效時(shí)的容錯(cuò),每個(gè)MetaStoreServer節(jié)點(diǎn)對(duì)應(yīng)一個(gè)MySQL節(jié)點(diǎn),每個(gè)SparkSQL節(jié)點(diǎn)配置多個(gè)MetaStoreServer節(jié)點(diǎn)。驗(yàn)證元數(shù)據(jù)能否成功同步以及MySQL節(jié)點(diǎn)失效能否自動(dòng)切換。
測(cè)試步驟如下:
1.?修改配置
電子發(fā)燒友App




評(píng)論