BigSQL發(fā)動(dòng)機(jī)的結(jié)構(gòu)和工作原理
BigSQL簡(jiǎn)介
為了更好在Hadoop平臺(tái)上使用大家熟悉的SQL處理和分析,減少開(kāi)發(fā)人員使用MapReduce帶來(lái)的巨大工作量,及與大量成熟的數(shù)據(jù)處理工具和應(yīng)用的集成,IBM 推出的SQL on Hadoop的產(chǎn)品--BigSQL 。我們知道關(guān)系型數(shù)據(jù)技術(shù)源于 IBM,在過(guò)去的幾十年,IBM 在關(guān)系型數(shù)據(jù)庫(kù)領(lǐng)域累積了大量先進(jìn)的技術(shù)和豐富的經(jīng)驗(yàn),也擁有很多優(yōu)秀的基于 RDBMS 技術(shù)的產(chǎn)品和工具。 IBM 將在RDBMS積累先進(jìn)的技術(shù)運(yùn)用到了 BigSQL 當(dāng)中,使得它無(wú)論從性能上、SQL 語(yǔ)法的支持上、與其他應(yīng)用的集成上、安全性等方面都有了非常強(qiáng)大的功能。

BigSQL的功能特點(diǎn)如下:
支持廣泛的、標(biāo)準(zhǔn)的SQL ,包括
– SELECT:查詢功能遵循 SQL 2011 語(yǔ)言標(biāo)準(zhǔn)的規(guī)范,支持Join、Union、Aggregate和子查詢等.
– GRANT/REVOKE,INSERT … INTO
– SQL PL:包括存儲(chǔ)過(guò)程、SQL 體函數(shù)、用戶自定義函數(shù)、及豐富的標(biāo)量函數(shù)、表函數(shù)和聯(lián)機(jī)分析處理 (OLAP) 函數(shù)
– JDBC 和 ODBC 驅(qū)動(dòng)
基于成本的優(yōu)化、優(yōu)秀的數(shù)據(jù)處理性能
– 采用 MPP 引擎 (C++) 代替 Java MapReduce
– 基于成本的優(yōu)化器,超過(guò)140個(gè)SQL語(yǔ)句重寫規(guī)則
– 持續(xù)運(yùn)行的守護(hù)進(jìn)程,避免啟動(dòng)開(kāi)銷
– 節(jié)點(diǎn)間數(shù)據(jù)流動(dòng)以避免持久化中間結(jié)果
– 基于內(nèi)存的操作,同時(shí)具備在超過(guò)可用內(nèi)存時(shí)(匯總、排序等操作)將數(shù)據(jù)溢出到磁盤。
支持各種存儲(chǔ)格式
– 支持DFS、Hive、HBase 等數(shù)據(jù)存儲(chǔ)
– 文本 (帶分隔符)、順序文件、RCFile、ORC、Avro、Parquet 等格式
通過(guò) LOAD、聯(lián)邦查詢實(shí)現(xiàn)與RDBMS數(shù)據(jù)庫(kù)集成
BigSQL架構(gòu)
在描述BigSQL架構(gòu)之前,我們先回顧一下HDFS集群架構(gòu)。
一個(gè)HDFS集群是由一個(gè)Namenode和一定數(shù)目的Datanodes組成Namenode是一個(gè)中心服務(wù)器,負(fù)責(zé)管理文件系統(tǒng)的名字空間(namespace)以及客戶端對(duì)文件的訪問(wèn)。集群中的Datanode一般是一個(gè)節(jié)點(diǎn)一個(gè),負(fù)責(zé)管理它所在節(jié)點(diǎn)上的存儲(chǔ)。HDFS暴露了文件系統(tǒng)的名字空間,用戶能夠以文件的形式在上面存儲(chǔ)數(shù)據(jù)。從內(nèi)部看,一個(gè)文件其實(shí)被分成一個(gè)或多個(gè)數(shù)據(jù)塊,這些塊存儲(chǔ)在一組Datanode上。Namenode執(zhí)行文件系統(tǒng)的名字空間操作,比如打開(kāi)、關(guān)閉、重命名文件或目錄。它也負(fù)責(zé)確定數(shù)據(jù)塊到具體Datanode節(jié)點(diǎn)的映射。Datanode負(fù)責(zé)處理文件系統(tǒng)客戶端的讀寫請(qǐng)求。在Namenode的統(tǒng)一調(diào)度下進(jìn)行數(shù)據(jù)塊的創(chuàng)建、刪除和復(fù)制。HDFS架構(gòu)如下圖所示:

理解了HDFS的主從架構(gòu),我們很自然地想到SQL on Hadoop的架構(gòu)也應(yīng)該很相似,因?yàn)檫@樣能更好的利用HDFS分布式數(shù)據(jù)存儲(chǔ)和處理的特點(diǎn)。事實(shí)上,BigSQL 也是一個(gè)主從的架構(gòu),是一種Shared-Nothing架構(gòu),它包含管理節(jié)點(diǎn)和工作節(jié)點(diǎn)。管理節(jié)點(diǎn)(也叫Head Node或Coordinator Node)負(fù)責(zé)接收客戶端發(fā)送的 SQL語(yǔ)句,經(jīng)過(guò)編譯和優(yōu)化生成并行的執(zhí)行計(jì)劃,然后將執(zhí)行計(jì)劃分發(fā)給多個(gè)工作節(jié)點(diǎn)(即Worker Node)。工作節(jié)點(diǎn)并行地執(zhí)行各自的子任務(wù),對(duì)進(jìn)行數(shù)據(jù)存取和計(jì)算。最后管理節(jié)點(diǎn)將各工作節(jié)點(diǎn)的結(jié)果匯總成最后的結(jié)果返回非客戶端。整個(gè)架構(gòu)如下圖所示:

接下來(lái)我們對(duì)這個(gè)架構(gòu)中的每個(gè)組件進(jìn)行描述,讓讀者更好的理解BigSQL組件的作用。
管理節(jié)點(diǎn)
BigSQL的管理節(jié)點(diǎn)是整個(gè)架構(gòu)中的“大腦”,它負(fù)責(zé)建立和監(jiān)聽(tīng)JDBC/ODBC連接、接收SQL語(yǔ)句、編譯和優(yōu)化查詢、生成并行執(zhí)行計(jì)劃和子任務(wù)、將子任務(wù)推送給工作節(jié)點(diǎn)并協(xié)調(diào)查詢的執(zhí)行,匯總子任務(wù)返回的結(jié)果等。同時(shí),管理節(jié)點(diǎn)還可以使用傳統(tǒng)的RDBMS表存儲(chǔ)用戶數(shù)據(jù)(數(shù)據(jù)量較小的參考數(shù)據(jù)),以便在關(guān)聯(lián)查詢中使用。管理節(jié)點(diǎn)包含三個(gè)模塊,Coordinator、Catalog和Scheduler 。
Coordinator
Coordinator線程負(fù)責(zé)建立建立和監(jiān)聽(tīng)客戶端連接,接收SQL,對(duì)SQL 進(jìn)行解析、編譯、優(yōu)化,生成一個(gè)分布式的執(zhí)行計(jì)劃并推送到各個(gè)工作節(jié)點(diǎn)。
Catalog
在DB2里,Catalog記錄做表和索引的統(tǒng)計(jì)信息,為優(yōu)化器在進(jìn)行成本計(jì)算是提供參考信息。同理,BigSQL 做了類似的事情,將這些統(tǒng)計(jì)信息存儲(chǔ)在自己的 Catalog 里面,以幫助優(yōu)化查詢。BigSQL 提供了一條 ANALYZE 命令,運(yùn)行該命令既能收集統(tǒng)計(jì)信息并更新到 Catalog中。
我們要注意區(qū)分 BigSQL Catalog和Hive Metastore (也叫HCatalog)概念。Hive Metastore是一個(gè)存儲(chǔ)元數(shù)據(jù)信息的地方,這些元數(shù)據(jù)包括表定義相關(guān)的數(shù)據(jù),比如位置、列名和類型、分區(qū)信息、讀寫table 涉及的類名等等。只要在 Hive Metastore 中定義了數(shù)據(jù)并且可在 Hadoop 集群中訪問(wèn)該數(shù)據(jù),那么 Big SQL 就可訪問(wèn)該數(shù)據(jù)。
Scheduler
Scheduler是幫助執(zhí)行查詢的服務(wù)線程,它負(fù)責(zé)查詢 Hive Metastore,得到表的元數(shù)據(jù)信息,這個(gè)元數(shù)據(jù)信息其中就包含了每一塊數(shù)據(jù)的存放位置,從而幫助Coordinator將子任務(wù)推送到合適的點(diǎn)上,盡量保證計(jì)算和數(shù)據(jù)在同一個(gè)節(jié)點(diǎn)上,以減少節(jié)點(diǎn)間的數(shù)據(jù)傳輸。
工作節(jié)點(diǎn)
工作節(jié)點(diǎn)(也是HDFS的Data Node)是實(shí)際執(zhí)行子任務(wù)的地方。它有包含一個(gè)Worker進(jìn)程(又含 Reader/Writer多線程),用于讀取和處理HDFS 上的數(shù)據(jù)。這些 Reader/Writer 大部分都是由 C++寫的,運(yùn)行速度非常快。在工作節(jié)點(diǎn)上,Reader/Writer可能會(huì)用到臨時(shí)表,比如在涉及到多個(gè)表的連接查詢中會(huì)產(chǎn)生臨時(shí)數(shù)據(jù)并保存到臨時(shí)表。這些臨時(shí)表通常情況下會(huì)被盡量地保存在內(nèi)存中,以提升查詢速度。如果計(jì)算時(shí)內(nèi)存不夠用,Worker也會(huì)將數(shù)據(jù)溢出到磁盤上。
BigSQL執(zhí)行查詢的過(guò)程
理解BigSQL所包含的組件之后,我們來(lái)看看BigSQL引擎是如何執(zhí)行查詢的。SQL查詢語(yǔ)句的執(zhí)行過(guò)程如圖所示:

o 應(yīng)用程序根據(jù)用戶配置,通過(guò)JDBC/ODBC連接到BigSQL管理節(jié)點(diǎn)。
o 管理節(jié)點(diǎn)的Coordinator線程會(huì)訪問(wèn)Hive Metastore和自己的Catalog,獲取數(shù)據(jù)存儲(chǔ)的元數(shù)據(jù)和統(tǒng)計(jì)信息。
o Coordinator結(jié)合元數(shù)據(jù)和統(tǒng)計(jì)信息對(duì)SQL語(yǔ)句進(jìn)行編譯和優(yōu)化,生成并行執(zhí)行計(jì)劃。
o 運(yùn)行時(shí)引擎根據(jù)數(shù)據(jù)分布的元數(shù)據(jù)信息將并行執(zhí)行計(jì)劃分發(fā)到各個(gè)工作節(jié)點(diǎn)。
o 工作節(jié)點(diǎn)接收到查詢計(jì)劃,分派給專門的線程(Reader/Writer),這些線程知道如何讀寫HDFS數(shù)據(jù)。運(yùn)行時(shí)引擎將會(huì)將謂詞下壓,使查詢和投影靠近數(shù)據(jù)進(jìn)行處理,避免數(shù)據(jù)搬遷。
o 如果處理過(guò)程中產(chǎn)生臨時(shí)數(shù)據(jù),如排序數(shù)據(jù),則會(huì)將臨時(shí)數(shù)據(jù)Cache到臨時(shí)表。
o 工作節(jié)點(diǎn)將處理結(jié)果返回給管理節(jié)點(diǎn),管理節(jié)點(diǎn)的Coordinator匯總所有子任務(wù)的結(jié)果后返回給應(yīng)用。
BigSQL 高可用
管理節(jié)點(diǎn)是BigSQL的大腦,它不但要指揮工作節(jié)點(diǎn)如何干活,還要存儲(chǔ)Catalog數(shù)據(jù)、連接信息、當(dāng)前查詢?nèi)蝿?wù)等信息。因此,管理節(jié)點(diǎn)實(shí)現(xiàn)高可用是重要的,也是必要的。工作節(jié)點(diǎn)不需要高可用,因?yàn)閿?shù)據(jù)本身是高可用的,而Worker又沒(méi)有狀態(tài)需要保存。然而,當(dāng)工作節(jié)點(diǎn)發(fā)生故障(如因?yàn)榇疟P故障導(dǎo)致數(shù)據(jù)無(wú)法訪問(wèn)),BigSQL的Scheduler會(huì)將故障節(jié)點(diǎn)加入到“黑名單”,并自動(dòng)在其他工作節(jié)點(diǎn)重新提交查詢。注意,BigSQL HA為BigSQL的元數(shù)據(jù)存儲(chǔ)(Catalog)和Scheduler提供高可用,而Hadoop Name Node和Hive Matestore的高可用不是該方案的內(nèi)容。
BigSQL HA 采用 “log-shipping” 機(jī)制保持Primary管理節(jié)點(diǎn)和Standby管理節(jié)點(diǎn)同步。這里用的兩個(gè)關(guān)鍵技術(shù):DB2 HADR和TSAMP。DB2 HADR技術(shù)用于將Primary節(jié)點(diǎn)的交易日志實(shí)時(shí)傳輸給Standby節(jié)點(diǎn),Standby節(jié)點(diǎn)則持續(xù)回訪所受到的日志,以保持BigSQL Catalog數(shù)據(jù)實(shí)時(shí)同步。TSAMP則對(duì)Primary和Standby節(jié)點(diǎn)的狀態(tài)進(jìn)行監(jiān)控,并自動(dòng)執(zhí)行故障切換動(dòng)作。

小結(jié)
o BigSQL架構(gòu)參考了博大精深的DB2數(shù)據(jù)庫(kù)引擎技術(shù)。
o 實(shí)現(xiàn)大量并行的SQL引擎以代替低效、復(fù)雜的MR。
o Shared-nothing架構(gòu)消除擴(kuò)展性和網(wǎng)絡(luò)瓶頸問(wèn)題。
o 計(jì)算推送到數(shù)據(jù)本地,而不是將數(shù)據(jù)搬到到計(jì)算節(jié)點(diǎn)。
o 采用C++實(shí)現(xiàn),性能更優(yōu)。
o 節(jié)點(diǎn)間(多個(gè)工作節(jié)點(diǎn))和節(jié)點(diǎn)內(nèi)(多個(gè)Reader/Writer線程)并行處理。
BigSQL的基礎(chǔ)介紹請(qǐng)參考另一篇文章《BigInsights金剛鉆之首:BigSQL - SQL onHadoop》。
詳情請(qǐng)咨詢!
客服熱線:023-66090381