国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Apache Trafodion技術(shù)架構(gòu)介紹

zhjx922 / 2782人閱讀

摘要:它主要包括以下幾部分采用對文本進(jìn)行文法分析,生成語法樹。對語法樹進(jìn)一步進(jìn)行分析,類似程序編譯器的語義分析,對語法合格的進(jìn)一步進(jìn)行檢查。優(yōu)化器對語法樹應(yīng)用各種規(guī)則,生成不同的執(zhí)行計(jì)劃,形成一個(gè)搜索空間。

Trafodion簡介

Trafodion是一個(gè)構(gòu)建在Hadoop/HBase基礎(chǔ)之上的關(guān)系型數(shù)據(jù)庫,它完全開源免費(fèi)。Trafodion能夠完整地支持ANSI SQL,并且提供ACID事務(wù)保證。和傳統(tǒng)關(guān)系數(shù)據(jù)庫不同的地方在于,Trafodion利用底層Hadoop的橫向擴(kuò)展能力,可以提供極高的擴(kuò)展性。而傳統(tǒng)數(shù)據(jù)庫,比如MySQL,在數(shù)據(jù)量達(dá)到P級(jí)別的時(shí)候就很難處理。而Trafodion卻可以借助HBase的擴(kuò)展性,僅通過增加普通Linux服務(wù)器就可以增加計(jì)算和存儲(chǔ)能力,進(jìn)而支持大數(shù)據(jù)應(yīng)用。

比如原來使用MySQL的用戶,如果數(shù)據(jù)量持續(xù)增加,往往需要采用前后端cache,分庫分表,讀寫分離等技術(shù)。但是這些技術(shù)帶來的弊端也很多。比如分庫分表的構(gòu)架下,不同分庫之間無法執(zhí)行join操作。采用這些復(fù)雜技術(shù)后,系統(tǒng)結(jié)構(gòu)復(fù)雜,維護(hù)和開發(fā)成本提高。這是很多客戶正在面臨的問題。

而從使用開發(fā)的角度來看,Trafodion和MySQL是完全一樣的,他們同樣是關(guān)系型數(shù)據(jù)庫,基本的功能完全一致。因此一個(gè)經(jīng)典的LAMP網(wǎng)絡(luò)應(yīng)用也可以輕松地用LATP(Linux, Apache, Trafodion, PHP) 搭建。而采用Trafodion,當(dāng)業(yè)務(wù)擴(kuò)展時(shí),通過增加節(jié)點(diǎn)就可以應(yīng)付不斷增加的數(shù)據(jù)量,應(yīng)用程序無需做任何修改,也無需考慮復(fù)雜的分庫分表,讀寫分離等技術(shù)。這樣就極大地降低了系統(tǒng)的復(fù)雜度。

這只是Trafodion的可能應(yīng)用之一,Trafodion還是一個(gè)非常適合的實(shí)時(shí)大數(shù)據(jù)分析平臺(tái)。因?yàn)樗粌H可以支持實(shí)時(shí)分析,而且能夠支持實(shí)時(shí)數(shù)據(jù)寫入,比如每秒上萬條的隨機(jī)數(shù)據(jù)插入。這是構(gòu)建實(shí)時(shí)分析所必備的能力。Stinger或者Impala雖然可以提供實(shí)時(shí)查詢,但去無法支持實(shí)時(shí)的數(shù)據(jù)插入。

比如交通實(shí)時(shí)分析,利用Stinger/Impala等技術(shù),雖然查詢和分析可以在1分鐘內(nèi)完成,但是數(shù)據(jù)卻只能定期載入,如果1小時(shí)一次,那么分析的數(shù)據(jù)樣本是1小時(shí)前的數(shù)據(jù),其分析結(jié)果也失去了時(shí)效性。比如,用戶已經(jīng)在那里堵車堵了了1個(gè)小時(shí)。

關(guān)于Trafodion的使用場景讀者可以參閱其他介紹Trafodion的系列文章。本文簡要介紹Trafodion的技術(shù)體系結(jié)構(gòu),幫助讀者基本了解Trafodion內(nèi)部運(yùn)作的原理。

讀者還可以參考https://wiki.trafodion.org/wi...。

總體結(jié)構(gòu)

Trafodion的體系結(jié)構(gòu)可以看作三層:ODBC接入層;SQL編譯執(zhí)行層;數(shù)據(jù)訪問和存儲(chǔ)層。其總體結(jié)構(gòu)如下所示:

客戶端應(yīng)用通過JDBC/ODBC訪問Trafodion。客戶連接由Trafodion的接入層負(fù)責(zé)。接入層為每一個(gè)客戶端連接分配一個(gè)master執(zhí)行器,master負(fù)責(zé)用戶連接所有query請求的執(zhí)行和結(jié)果返回。對于簡單的Query,Master進(jìn)程本身就充當(dāng)SQL執(zhí)行層;復(fù)雜的query,訪問大量數(shù)據(jù)和進(jìn)行復(fù)雜運(yùn)算的情況下,Master會(huì)啟動(dòng)一系列的ESP(Executor Server Processes)進(jìn)程進(jìn)行大規(guī)模并發(fā)執(zhí)行。ESP進(jìn)程是可以常駐內(nèi)存的,以避免啟動(dòng)開銷,但如果長期處于空閑狀態(tài)ESP進(jìn)程會(huì)退出,釋放資源。每個(gè)ESP將執(zhí)行結(jié)果返回給Master,由Master匯總并將最終結(jié)果返回給客戶端。當(dāng)Master或者ESP需要訪問數(shù)據(jù)層的時(shí)候,會(huì)通過DTM來進(jìn)行事務(wù)管理,在DTM(分布式事務(wù)管理器)的控制下調(diào)用HBase的客戶端API進(jìn)行數(shù)據(jù)的讀寫。下面分別介紹每一層的更多細(xì)節(jié)。

Trafodion的接入層

接入層的主要組件有兩個(gè):DCSMaster和MXOSRVR 。DCS Master進(jìn)程運(yùn)行在Trafodion集群的單個(gè)節(jié)點(diǎn)上,負(fù)責(zé)監(jiān)聽客戶端的連接請求。當(dāng)收到請求后,DCSMaster根據(jù)集群的工作負(fù)載平衡情況,選定集群中一個(gè)節(jié)點(diǎn)上的MXOSRVR 作為客戶端的執(zhí)行代理。DCS Master將選定的MXOSRVR信息返回客戶端,收到信息后,客戶端直接和MXOSRVR 進(jìn)行連接,此后客戶端的所有請求都由該MXOSRVR 負(fù)責(zé)處理。類似Oracle的Dedicated 模式。

當(dāng)多個(gè)客戶端請求連接時(shí),DCSMaster會(huì)平均地將客戶端連接到不同的MXOSRVR ,從而均衡地利用集群中的每個(gè)計(jì)算節(jié)點(diǎn)。而且每個(gè)客戶端都有一個(gè)多帶帶的MXOSRVR 負(fù)責(zé)其后續(xù)計(jì)算請求的執(zhí)行,以保證快速的響應(yīng)客戶query。一些數(shù)據(jù)庫系統(tǒng)只有單一的ODBC接入點(diǎn),高并發(fā)的情況下,就會(huì)出現(xiàn)排隊(duì)現(xiàn)象,而采用了以上的模型后,每個(gè)客戶端都由一個(gè)接入點(diǎn)唯一負(fù)責(zé),而且這些接入點(diǎn)平均分配在集群的各個(gè)節(jié)點(diǎn),可以充分發(fā)揮每臺(tái)計(jì)算節(jié)點(diǎn)的能力。

為了降低延遲,Trafodion啟動(dòng)的時(shí)候會(huì)預(yù)先在每個(gè)節(jié)點(diǎn)啟動(dòng)一定數(shù)量的MXOSRVR 進(jìn)程。這樣客戶端連接請求被處理時(shí),就不需要啟動(dòng)新MXOSRVR 進(jìn)程的開銷。但是Trafodion也不會(huì)預(yù)先啟動(dòng)非常多的MXOSRVR ,以免在連接請求不多的情況下浪費(fèi)資源。當(dāng)客戶請求數(shù)量大于預(yù)先啟動(dòng)的MXOSRVR 進(jìn)程數(shù)目時(shí),DCS Master再為新的連接請求啟動(dòng)新的MXOSRVR ,以便滿足高并發(fā)的客戶連接。

DCS Master是所有客戶端的唯一接入點(diǎn),因此Trafodion為其提供了HA保護(hù)。當(dāng)DCS Master故障退出,或者其所在節(jié)點(diǎn)崩潰時(shí),Trafodion會(huì)在集群的其他健康節(jié)點(diǎn)上重新啟動(dòng)一個(gè)新的DCS Master,并利用floating IP的技術(shù)保證客戶端可以繼續(xù)執(zhí)行連接。整個(gè)過程對客戶端完全透明。

Trafodion的HA機(jī)制非常復(fù)雜,需要一篇多帶帶的文章來詳細(xì)介紹,這里就不再展開敘述。

SQL編譯執(zhí)行層

客戶請求被接受后,每個(gè)ODBC客戶端都有一個(gè)多帶帶的MXOSRVR 負(fù)責(zé)。該MXOSRVR 就是master進(jìn)程,負(fù)責(zé)用戶query的執(zhí)行。一條用戶query的執(zhí)行流程大致如下:

首先,MXOSRVR 會(huì)調(diào)用compiler模塊對SQL語句進(jìn)行編譯和優(yōu)化。Trafodion擁有一個(gè)非常成熟的SQL編譯器,經(jīng)過了20年的不斷增強(qiáng)和改進(jìn),形成了一個(gè)強(qiáng)大的基于成本的優(yōu)化器,能夠生成用戶SQL的最佳執(zhí)行計(jì)劃,比如最優(yōu)的join表順序。此外,編譯器擁有一個(gè)執(zhí)行計(jì)劃緩存,如果SQL的執(zhí)行計(jì)劃已經(jīng)在緩存中,則立即返回該計(jì)劃,節(jié)省了編譯的開銷。

執(zhí)行計(jì)劃會(huì)指導(dǎo)Master如何執(zhí)行用戶query。對于簡單的query,執(zhí)行計(jì)劃僅僅需要master本身即可完成。對于復(fù)雜的query,master根據(jù)計(jì)劃會(huì)啟動(dòng)多個(gè)ESP進(jìn)程,并發(fā)地執(zhí)行query。Trafodion的執(zhí)行器是一個(gè)MPP構(gòu)架的并發(fā)處理模型。它的多數(shù)執(zhí)行操作符都支持并發(fā),比如并發(fā)join,并發(fā)aggregation等等。

Trafodion編譯器

Trafodion編譯器的主要職責(zé)就是將SQL文本解析為一個(gè)最優(yōu)的執(zhí)行計(jì)劃。它主要包括以下幾部分:

Parser:parser采用bison對SQL文本進(jìn)行文法分析,生成語法樹。Parser也負(fù)責(zé)維護(hù)執(zhí)行計(jì)劃緩存。如果能夠在這一步?jīng)Q定輸入的SQL文本在緩存中,則直接返回執(zhí)行計(jì)劃。

Binder:Binder對語法樹進(jìn)一步進(jìn)行分析,類似程序編譯器的語義分析,對語法合格的SQL進(jìn)一步進(jìn)行檢查。比如檢查Table是否存在,column數(shù)據(jù)類型是否匹配等。Binder還維護(hù)執(zhí)行計(jì)劃緩存。

Normalizer:Normalizer對Binder生成的語法樹進(jìn)行邏輯優(yōu)化。實(shí)施傳統(tǒng)意義上的基于規(guī)則的優(yōu)化,比如將查詢條件下推;將子查詢修改為semi-join;將DISTINCT轉(zhuǎn)換為groupby等等。

Analyzer:Analyzer對語法樹進(jìn)行一些補(bǔ)充,以幫助優(yōu)化器判斷是否可以運(yùn)用某些規(guī)則。比如對于底層數(shù)據(jù)分區(qū)的訪問可以有多種方式,可以直接從base table訪問,或者從索引訪問。Analyzer收集數(shù)據(jù)表的索引情況,添加進(jìn)語法樹,以便優(yōu)化器做選擇。

Optimizer:可以說這是Trafodion最值得驕傲和關(guān)注的一個(gè)核心技術(shù)。優(yōu)化器采用Cascades框架,是一個(gè)基于成本的優(yōu)化器,而且Cascades框架非常易于擴(kuò)展,開發(fā)人員可以添加新的規(guī)則來擴(kuò)展新的優(yōu)化方法。優(yōu)化器實(shí)際上可以看作一個(gè)對問題空間的搜索過程,對于同一條query,通過規(guī)則,可以生成很多等價(jià)的執(zhí)行計(jì)劃。舉一個(gè)例子:簡單的規(guī)則,比如Ajoin B => B join A,應(yīng)用該規(guī)則就會(huì)生成兩個(gè)不同的等價(jià)計(jì)劃。

優(yōu)化器對語法樹應(yīng)用各種規(guī)則,生成不同的執(zhí)行計(jì)劃,形成一個(gè)搜索空間。然后在這個(gè)搜索空間內(nèi)通過比較每個(gè)計(jì)劃的成本,來找出最優(yōu)的方案。由于規(guī)則眾多,等價(jià)的執(zhí)行計(jì)劃數(shù)量會(huì)指數(shù)級(jí)增長,導(dǎo)致搜索空間非常巨大,因此采用窮舉法一條一條的進(jìn)行比較是不現(xiàn)實(shí)的。傳統(tǒng)的優(yōu)化器框架比如 Dynamic programming是自底向上的策略,很難縮小搜索空間,而Cascades采用自頂向下的搜索策略,可以很方便地利用branch-and-bound算法,將一些分支進(jìn)行裁剪,即不需要再深入分支進(jìn)行優(yōu)化。比如某分支的cost已經(jīng)超出當(dāng)前的總cost,則對于該分支就不再進(jìn)行進(jìn)一步搜索。

Cascades還擁有MEMO數(shù)據(jù)結(jié)構(gòu),能夠記憶曾經(jīng)搜索過的分支,這進(jìn)一步增加了搜索的效率。

此外Trafodion優(yōu)化器還在多年的實(shí)踐中總結(jié)出了很多的經(jīng)驗(yàn)式規(guī)則(heuristics ),能夠進(jìn)一步減小搜索空間。

最后優(yōu)化器支持multi-pass的模式,對于簡單的query,先enable非常少量的規(guī)則,將搜索空間限定在很小范圍,因此可以高效地找到最優(yōu)解;對于復(fù)雜query,進(jìn)入第二個(gè)pass,enable所有的規(guī)則,進(jìn)一步找出更好的執(zhí)行計(jì)劃。

Pre-Code generator:optimizer選出了最優(yōu)的執(zhí)行計(jì)劃,在生成物理執(zhí)行計(jì)劃之前,pre-codegenerator再應(yīng)用一些物理優(yōu)化策略,比如常數(shù)折疊,舉例如下:假設(shè)Where條件為a=5 and b=a。 可以將b=a進(jìn)一步替換為b=5。

Generator:最后Generator將執(zhí)行計(jì)劃翻譯為可以被Trafodion執(zhí)行器執(zhí)行的物理執(zhí)行計(jì)劃。這里有一個(gè)重要步驟,優(yōu)化標(biāo)量表達(dá)式。所謂標(biāo)量表達(dá)式,即其解析結(jié)果為標(biāo)量的表達(dá)式,比如a+b+c等。Trafodion利用LLVM將多數(shù)標(biāo)量表達(dá)式編譯成運(yùn)行時(shí)的機(jī)器代碼,從而進(jìn)一步提高了執(zhí)行速度,類似JIT將部分javabytecode編譯為機(jī)器指令以便加速java程序的執(zhí)行。

成本模塊:Trafodion編譯器還有一個(gè)經(jīng)過長期調(diào)節(jié)和校準(zhǔn)的cost成本模塊,對各種SQL operator的成本進(jìn)行估計(jì)。成本計(jì)算需要對存放在表內(nèi)數(shù)據(jù)的分布情況有所了解,這是依賴對表數(shù)據(jù)進(jìn)行掃描和采樣統(tǒng)計(jì)計(jì)算出的直方圖來支持。成本模塊從直方圖中得到數(shù)據(jù)的分布情況,計(jì)算出Cardinality。它還綜合考慮了CPU,內(nèi)存消耗,消息通訊和磁盤IO等條件為各個(gè)SQL操作算子計(jì)算出一個(gè)cost vector,提供比較準(zhǔn)確的成本估計(jì)。

以上各個(gè)系統(tǒng)組件協(xié)同工作,如上圖所示,SQL語句經(jīng)過parser和Normalizer的分析之后,輸入優(yōu)化器進(jìn)行基于成本的優(yōu)化;成本估計(jì)模塊通過直方圖獲得數(shù)據(jù)分布,然后根據(jù)每個(gè)操作符自身的特點(diǎn),進(jìn)行成本估計(jì),將成本輸入優(yōu)化器。根據(jù)這些輸入,優(yōu)化器最終生成一個(gè)最優(yōu)的執(zhí)行計(jì)劃。

Trafodion執(zhí)行器

Trafodion的執(zhí)行器是一個(gè)MPP構(gòu)架的并發(fā)執(zhí)行器。它的工作模式是數(shù)據(jù)驅(qū)動(dòng),因此一旦有數(shù)據(jù)就緒,就可以返回用戶,而無需等待整個(gè)query完全結(jié)束執(zhí)行,提高了用戶響應(yīng)速度。執(zhí)行器由不同的SQL操作符組成,數(shù)據(jù)在各個(gè)操作符之間通過IPC流動(dòng),無需將中間計(jì)算結(jié)果保存到磁盤。如果中間數(shù)據(jù)太大,超過了RAM的容量,操作符會(huì)將數(shù)據(jù)overflow到磁盤上,因此Trafodion的query執(zhí)行不受物理內(nèi)存大小限制。

并發(fā)執(zhí)行

Trafodion執(zhí)行器最大的優(yōu)點(diǎn)是極佳的并發(fā)能力。多數(shù)SQL操作算子都有并發(fā)執(zhí)行的能力,包括GROUPBY,JOIN,INSERT都支持并發(fā)執(zhí)行。

這里舉一個(gè)小例子來說明Trafodion如何并發(fā)執(zhí)行一個(gè)簡單的sum(col1)聚集操作:master會(huì)在集群的每個(gè)節(jié)點(diǎn)啟動(dòng)一個(gè)ESP進(jìn)程,該進(jìn)程負(fù)責(zé)對存儲(chǔ)在該節(jié)點(diǎn)上的數(shù)據(jù)分區(qū)進(jìn)行sum聚集操作。多個(gè)ESP同時(shí)并發(fā)執(zhí)行,將最終結(jié)果發(fā)還給master,由master匯總。對于聚集,Trafodion還可以將該操作下推到數(shù)據(jù)訪問層執(zhí)行,而不需要將數(shù)據(jù)分區(qū)的每一行數(shù)據(jù)返回給ESP,由ESP逐一統(tǒng)計(jì),而是由底層的數(shù)據(jù)訪問層進(jìn)行統(tǒng)計(jì)操作,僅僅將聚集結(jié)果發(fā)給ESP,ESP再返回給master。

再看看Trafodion的Join。Trafodion支持所有的join類型,內(nèi)連接,外連接,non-equijoin,semi-join,全連接等等。在Join的實(shí)現(xiàn)方式上,支持nestloop join,merge join和hashjoin。無論哪一種join算法,都有并發(fā)執(zhí)行的能力。Trafodion支持多種并發(fā)join方法,由優(yōu)化器選擇最優(yōu)的一種。

首先介紹大家最熟悉的兩種并發(fā)join算法,即broadcast和repartition。

broadcast parallel join(hash join)

broadcast類型的join中,一個(gè)表比較小,可以完全放入單個(gè)節(jié)點(diǎn)的內(nèi)存中。在這種情況下Trafodion會(huì)將小表廣播到所有節(jié)點(diǎn)上。該并發(fā)執(zhí)行方法用于hashjoin。每個(gè)節(jié)點(diǎn)上的ESP將小表放入內(nèi)存并建立hash表,然后順序讀入本節(jié)點(diǎn)上的大表分區(qū),執(zhí)行hashjoin操作。

repartition parallel join

repartition類型的join中,兩個(gè)表都很大,無法放入單機(jī)內(nèi)存。這種情況下,優(yōu)化器生成的執(zhí)行計(jì)劃會(huì)自動(dòng)派生兩層ESP,第一層讀取數(shù)據(jù)后按照join column進(jìn)行repartition操作,將兩個(gè)Join表的數(shù)據(jù)重新分區(qū),將join column值相同的數(shù)據(jù)匯集到同一個(gè)第二層ESP中執(zhí)行join操作。然后,所有的第二層ESP將Join結(jié)果返回master進(jìn)行匯總。

以上兩種在Hadoop的應(yīng)用中經(jīng)常被使用到,被稱為mapper join和reducer join。這兩種并發(fā)join方法都需要非常大的網(wǎng)絡(luò)開銷和內(nèi)存開銷。Trafodion優(yōu)化器能夠智能地在可能的情況下選擇以下幾種并發(fā)join方法:

Matching PartitionsJoin

如果參加join的兩張表都是按照join column分區(qū)的,那么直接可以在各個(gè)節(jié)點(diǎn)的ESP中執(zhí)行本地join,因?yàn)榭隙ú恍枰渌?jié)點(diǎn)上的數(shù)據(jù)。這是最理想的情況。

Inner Child ParallelAccess (for Nested Join)

這種方法只適用于Nest Loop Join。TblA作為outer table;TblB作為inner table。TblA有兩個(gè)分區(qū),因此啟動(dòng)2個(gè)ESP,ESP1從TblA的分區(qū)1逐行讀取數(shù)據(jù),然后逐一從TblB讀取相應(yīng)的數(shù)據(jù)行進(jìn)行連接操作;同理ESP2也做同樣的工作。這種類型的join比broadcast的方法節(jié)約內(nèi)存開銷,但多個(gè)ESP可能會(huì)競爭讀取outer table。但可以支持非等值join。

Trafodion的MPP并發(fā)執(zhí)行器還有很多其他的先進(jìn)技術(shù),比如HP的專利MDAM,Adaptive Segmentation,Skewbuster等都可以顯著加速query的執(zhí)行效率降低延遲,從而達(dá)到sub-second的實(shí)時(shí)響應(yīng)。限于篇幅,MDAM等技術(shù)在這里就不展開敘述,Trafodion團(tuán)隊(duì)將陸續(xù)推出專題技術(shù)文章來多帶帶介紹這些專利技術(shù)。

數(shù)據(jù)訪問層

當(dāng)執(zhí)行器對底層數(shù)據(jù)庫表進(jìn)行讀寫時(shí),就需要調(diào)用數(shù)據(jù)訪問層的服務(wù)。Trafodion的數(shù)據(jù)都存放在HBaseTable中。HBase本身支持對數(shù)據(jù)的隨機(jī)讀寫,但是不支持ACID事務(wù)處理。因此數(shù)據(jù)訪問層必須和DTM(分布式事務(wù)管理器)相互配合,實(shí)現(xiàn)有事務(wù)保護(hù)的讀寫。事務(wù)處理在下一個(gè)小結(jié)詳細(xì)介紹。

DTM對HBase的API進(jìn)行了封裝,添加了必要的事務(wù)處理支持。其余的讀寫邏輯和原生的HBase讀寫是一樣的。因此如果不考慮事務(wù),數(shù)據(jù)訪問層就是一個(gè)標(biāo)準(zhǔn)的HBase客戶端,通過HBaseclient API訪問HBase。HBase是Trafodion數(shù)據(jù)訪問和存儲(chǔ)層的核心。也是Trafodion區(qū)別于傳統(tǒng)數(shù)據(jù)庫的最重要的地方。借助于HBase,Trafodion也可以提供極佳的水平擴(kuò)展能力,同時(shí)具有很強(qiáng)的可靠性,而這些能力是傳統(tǒng)數(shù)據(jù)庫所不具備的。

Trafodion支持的三種底層數(shù)據(jù)庫表:Trafodion表,Hive表和HBase表。數(shù)據(jù)訪問層需要負(fù)責(zé)對這三種存儲(chǔ)類型的訪問控制。

Trafodion表

Trafodion表是用戶用Trafodion的DDL語句直接創(chuàng)建的數(shù)據(jù)庫表。在底層是一張HBase表,因此從Trafodion表到HBaseTable需要一定的映射和編碼。

映射

即如何將Trafodion數(shù)據(jù)庫表映射到HBase Table。我們考慮如下這個(gè)DDL創(chuàng)建的Trafodion表:

create table sales.item(item_id int not null,

                          item_name char(10) ,

                          primary key (item_id));

首先是如何將關(guān)系數(shù)據(jù)庫的schame+table_name映射到HBaseTable。這個(gè)映射原則非常簡單,即一個(gè)trafodion表在HBase中存儲(chǔ)的表名為。例子中的item表在HBase中被映射為TRAFODION.SALES.ITEM這個(gè)HBaseTable。

其次是Trafodion表的各個(gè)column如何映射到HBase的存儲(chǔ)模式中。HBase的表內(nèi)部有ColumnFamily,每個(gè)ColumnFamily中可以有任意多的ColumnQualifier,每一個(gè)行有一個(gè)rowkey,和一個(gè)timestamp。這四個(gè)維度定義了一個(gè)數(shù)據(jù)Cell。那么Trafodion的二維表如何映射到HBase這樣的存儲(chǔ)模型中呢?

Trafodion將表的主鍵列組合起來作為HBase的rowkey。Column映射到HBase的columnqualifier,而timestamp被用作事務(wù)管理的時(shí)間戳。在目前的release中,所有列數(shù)據(jù)都存放在同一個(gè)ColumnFamily中,支持多ColumnFamily已經(jīng)在Trafodion的藍(lán)圖中,因此未來這個(gè)映射會(huì)有所改變。

編碼

HBase存儲(chǔ)的數(shù)據(jù)是沒有數(shù)據(jù)類型的。Trafodion的表卻支持不同的SQL數(shù)據(jù)類型,比如CHAR型,即按字符串進(jìn)行存儲(chǔ),”1”被編碼為ASCII碼0x41。如果SQL數(shù)據(jù)類型為INTEGER,在存儲(chǔ)到HBase中時(shí),Trafodion會(huì)直接寫入二進(jìn)制數(shù)0x00,0x00,0x00,0x01,占用4個(gè)byte;相應(yīng)的LONG型占8個(gè)byte。

Trafodion會(huì)自動(dòng)進(jìn)行類型處理,無需應(yīng)用程序自己進(jìn)行編解碼的工作。

數(shù)據(jù)分區(qū)

HBase會(huì)自動(dòng)通過split技術(shù)對數(shù)據(jù)進(jìn)行分區(qū),但是某些情況下,比如時(shí)間序列數(shù)據(jù)順序插入的情況下,大量的數(shù)據(jù)讀寫會(huì)集中在某個(gè)單一Region上,從而使得單臺(tái)RegionServer的負(fù)載高于其他的RegionServer。Trafodion支持slatedpartition功能,在創(chuàng)建表的時(shí)候通過指定SALT關(guān)鍵字,Trafodion會(huì)自動(dòng)為rowkey加入hash前綴,對表進(jìn)行pre-split,保證平均地將數(shù)據(jù)分布在集群中。用戶也可以不指定SALT關(guān)鍵字,而依賴底層HBase自動(dòng)進(jìn)行數(shù)據(jù)分區(qū)。

訪問原生HBase表

Trafodion也可以直接訪問原生HBase表,提供兩種訪問方式: Cell-Per-Row和Rowwise Per-Row。

通過Cell-Per-Row方式訪問HBase表,每一個(gè)HBase的Cell會(huì)作為SQL結(jié)果集中的一行數(shù)據(jù)。通過Rowwise Per-Row模式訪問,每一行HBase數(shù)據(jù)作為SQL結(jié)果集的一行數(shù)據(jù)。

假設(shè)Table1有2行數(shù)據(jù),每行兩個(gè)Cell:[(row1, CF1:Col1, v1), (row1,CF1:Col2, v2) , (row2, CF1:Col1, d1), (row2,CF1:Col2, d2)]。

Cell-Per-Row訪問:

select * from hbase.”_CELL_”.”table1”  

 

返回4行數(shù)據(jù)

value
(row1, CF1:Col1, v1)
(row1,CF1:Col2, v2)
(row2, CF1:Col1, d1)
(row2, CF1:Col2, d2)

通過Rowwise-Per-Row方式訪問:

select * from hbase.”_ROW_”.”table1”;

返回兩行數(shù)據(jù)

rowkey value
row1 CF1:Col1:v1 CF1:Col2:v2
row2 CF1:Col1:d1 CF1:Col2:d2

訪問原生Hive表

Trafodion可以直接訪問原生Hive表。采用特殊的schema “hive”,用戶直接使用SQL語句即可訪問。比如

select * fromhive.hive.table1;

SQL引擎會(huì)識(shí)別”hive.hive”這個(gè)特殊的schema,讀取Hive的metastore獲取table1的元數(shù)據(jù),然后直接通過libhdfs訪問HDFS上的Hive表數(shù)據(jù)。因此繞過了DTM。所以,對于原生Hive表的訪問,Trafodion不提供事務(wù)保護(hù)

關(guān)于事務(wù)

Trafodion的威爾士本意即事務(wù),因此事務(wù)處理是Trafodion非常重要的一個(gè)方面。事務(wù)是一系列query的組合。一個(gè)事務(wù)由若干操作構(gòu)成,并由begin開始,由commit或者abort結(jié)束。

Trafodion采用兩階段提交協(xié)議來保證分布式事務(wù)的完整性。每個(gè)節(jié)點(diǎn)均運(yùn)行TM進(jìn)程,所有的TM都是peerto peer對等的,而避免了單一的事務(wù)管理器的擴(kuò)展性問題和SinglePoint of Failure問題。高并發(fā)情況下,所有的活躍事務(wù)由不同節(jié)點(diǎn)上的TM分別管理,提供了很高的擴(kuò)展能力。

原生的HBase本身僅支持單行的ACID事務(wù)保證,Trafodion基于開源項(xiàng)目hbase-trx(https://github.com/hbase-trx/...)開發(fā)了目前版本的Transactionon HBase機(jī)制。提供了跨行跨表的ACID保證。hbase-trx采用MVCC機(jī)制,提供SnapShotIsolation事務(wù)隔離級(jí)別。原生的hbase-trx僅支持HBase0.94,且采用了侵入式的開發(fā)方法,大量修改了HBase的基本代碼。Trafodion團(tuán)隊(duì)吸取了hbase-trx的基本思路,利用HBase協(xié)處理器重新開發(fā)了hbase-trx,并支持HBase0.98版本。并改進(jìn)了日志實(shí)現(xiàn),能夠保證各種failure情況下數(shù)據(jù)的安全性。

目前TrafodionDTM團(tuán)隊(duì)正在和中國科學(xué)院計(jì)算所合作開發(fā)新的Transactionon HBase算法Stateful-stateless Concurrency Control (SSCC)。關(guān)于SSCC的原理,讀者可以進(jìn)一步參考開源項(xiàng)目Domino:https://github.com/domino-suc...,預(yù)計(jì)將于TrafodionR1.2版本開始提供產(chǎn)品使用。SSCC提供比SnapShot Isolation更高級(jí)的隔離級(jí)別,同時(shí)對無狀態(tài)寫操作有很高效的支持,提供更高的并發(fā)度。無狀態(tài)寫在web應(yīng)用中非常普遍,采用這一機(jī)制,Trafodion可以高效地為相關(guān)的web應(yīng)用提供強(qiáng)大的支持。

小結(jié)

Trafodion是一個(gè)復(fù)雜的大系統(tǒng),一篇短文無論如何也不可能完全說明其內(nèi)部運(yùn)作原理。筆者僅希望用最簡單的描述給各位讀者一個(gè)大體的概念,作為一個(gè)開源項(xiàng)目,Trafodion歡迎各位研讀源代碼,并共同改進(jìn)。

通過本文,希望讀者認(rèn)同以下幾個(gè)關(guān)鍵點(diǎn):

Trafodion有一個(gè)成熟的SQL編譯器,能夠進(jìn)行基于成本的優(yōu)化

Trafodion有一個(gè)先進(jìn)的MPP并發(fā)執(zhí)行引擎

Trafodion有一個(gè)創(chuàng)新的Transaction實(shí)現(xiàn)

Trafodion有一個(gè)成熟的ODBC/JDBC接入層

Trafodion構(gòu)架在HBase之上,繼承了所有HBase的優(yōu)點(diǎn)。為用戶提供極佳的水平擴(kuò)展性

本文沒有涉及到的技術(shù)話題還有很多,比如Trafodion的HA實(shí)現(xiàn),安全體系,NoSQL支持等。Trafodion團(tuán)隊(duì)會(huì)努力完善文檔,也歡迎各位讀者能夠下載Trafodion源代碼進(jìn)行使用和學(xué)習(xí),并貢獻(xiàn)您的理解和分析。

作者:劉明-易鯨捷首席架構(gòu)師

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/17786.html

相關(guān)文章

  • Apache Trafodion技術(shù)架構(gòu)介紹

    摘要:它主要包括以下幾部分采用對文本進(jìn)行文法分析,生成語法樹。對語法樹進(jìn)一步進(jìn)行分析,類似程序編譯器的語義分析,對語法合格的進(jìn)一步進(jìn)行檢查。優(yōu)化器對語法樹應(yīng)用各種規(guī)則,生成不同的執(zhí)行計(jì)劃,形成一個(gè)搜索空間。 Trafodion簡介 Trafodion是一個(gè)構(gòu)建在Hadoop/HBase基礎(chǔ)之上的關(guān)系型數(shù)據(jù)庫,它完全開源免費(fèi)。Trafodion能夠完整地支持ANSI SQL,并且提供ACID事...

    DevYK 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<