sparkSQL的整體實(shí)現(xiàn)框架

這篇博客的目的是讓那些初次接觸sparkSQL框架的童鞋們,希望他們對sparkSQL整體框架有一個大致的了解,降低他們進(jìn)入spark世界的門檻,避免他們在剛剛接觸sparkSQL時,不知所措,不知道該學(xué)習(xí)什么,該怎么看。這也是自己工作的一個總結(jié),以便以后可以回頭查看。后續(xù)會對sparkSQL進(jìn)行一系列詳細(xì)的介紹。慢慢來吧~~~

1、sql語句的模塊解析

   當(dāng)我們寫一個查詢語句時,一般包含三個部分,select部分,from數(shù)據(jù)源部分,where限制條件部分,這三部分的內(nèi)容在sql中有專門的名稱:

公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出思禮免費(fèi)做網(wǎng)站回饋大家。

sparkSQL的整體實(shí)現(xiàn)框架

當(dāng)我們寫sql時,如上圖所示,在進(jìn)行邏輯解析時會把sql分成三個部分,project,DataSource,F(xiàn)ilter模塊,當(dāng)生成執(zhí)行部分時又把他們稱為:Result模塊、

DataSource模塊和Opertion模塊。

那么在關(guān)系數(shù)據(jù)庫中,當(dāng)我們寫完一個查詢語句進(jìn)行執(zhí)行時,發(fā)生的過程如下圖所示:

sparkSQL的整體實(shí)現(xiàn)框架

整個執(zhí)行流程是:query -> Parse -> Bind -> Optimize -> Execute

1、寫完sql查詢語句,sql的查詢引擎首先把我們的查詢語句進(jìn)行解析,也就是Parse過程,解析的過程是把我們寫的查詢語句進(jìn)行分割,把project,DataSource和Filter三個部分解析出來從而形成一個邏輯解析tree,在解析的過程中還會檢查我們的sql語法是否有錯誤,比如缺少指標(biāo)字段、數(shù)據(jù)庫中不包含這張數(shù)據(jù)表等。當(dāng)發(fā)現(xiàn)有錯誤時立即停止解析,并報錯。當(dāng)順利完成解析時,會進(jìn)入到Bind過程。

2、Bind過程,通過單詞我們可看出,這個過程是一個綁定的過程。為什么需要綁定過程?這個問題需要我們從軟件實(shí)現(xiàn)的角度去思考,如果讓我們來實(shí)現(xiàn)這個sql查詢引擎,我們應(yīng)該怎么做?他們采用的策略是首先把sql查詢語句分割,分割不同的部分,再進(jìn)行解析從而形成邏輯解析tree,然后需要知道我們需要取數(shù)據(jù)的數(shù)據(jù)表在哪里,需要哪些字段,執(zhí)行什么邏輯,這些都保存在數(shù)據(jù)庫的數(shù)據(jù)字典中,因此bind過程,其實(shí)就是把Parse過程后形成的邏輯解析tree,與數(shù)據(jù)庫的數(shù)據(jù)字典綁定的過程。綁定后會形成一個執(zhí)行tree,從而讓程序知道表在哪里,需要什么字段等等

3、完成了Bind過程后,數(shù)據(jù)庫查詢引擎會提供幾個查詢執(zhí)行計劃,并且給出了查詢執(zhí)行計劃的一些統(tǒng)計信息,既然提供了幾個執(zhí)行計劃,那么有比較就有優(yōu)劣,數(shù)據(jù)庫會根據(jù)這些執(zhí)行計劃的統(tǒng)計信息選擇一個最優(yōu)的執(zhí)行計劃,因此這個過程是Optimize(優(yōu)化)過程。

4、選擇了一個最優(yōu)的執(zhí)行計劃,那么就剩下最后一步執(zhí)行Execute,最后執(zhí)行的過程和我們解析的過程是不一樣的,當(dāng)我們知道執(zhí)行的順序,對我們以后寫sql以及優(yōu)化都是有很大的幫助的.執(zhí)行查詢后,他是先執(zhí)行where部分,然后找到數(shù)據(jù)源之?dāng)?shù)據(jù)表,最后生成select的部分,我們的最終結(jié)果。執(zhí)行的順序是:operation->DataSource->Result

雖然以上部分對sparkSQL沒有什么聯(lián)系,但是知道這些,對我們理解sparkSQL還是很有幫助的。

 

2、sparkSQL框架的架構(gòu)

要想對這個框架有一個清晰的認(rèn)識,首先我們要弄清楚,我們?yōu)槭裁葱枰猻parkSQL呢?個人建議一般情況下在寫sql能夠直接解決的問題就不要使用sparkSQL,如果想刻意使用sparkSQL,也不一定能夠加快開發(fā)的進(jìn)程。使用sparkSQL是為了解決一般用sql不能解決的復(fù)雜邏輯,使用編程語言的優(yōu)勢來解決問題。我們使用sparkSQL一般的流程如下圖:

sparkSQL的整體實(shí)現(xiàn)框架

如上圖所示,一般情況下分為兩個部分:a、把數(shù)據(jù)讀入到sparkSQL中,sparkSQL進(jìn)行數(shù)據(jù)處理或者算法實(shí)現(xiàn),然后再把處理后的數(shù)據(jù)輸出到相應(yīng)的輸出源中。

1、同樣我們也是從如果讓我們開發(fā),我們應(yīng)該怎么做,需要考慮什么問題來思考這個問題。

     a、第一個問題是,數(shù)據(jù)源有幾個,我們可能從哪些數(shù)據(jù)源讀取數(shù)據(jù)?現(xiàn)在sparkSQL支持很多的數(shù)據(jù)源,比如:hive數(shù)據(jù)倉庫、json文件,.txt,以及orc文件,同時現(xiàn)在還支持jdbc從關(guān)系數(shù)據(jù)庫中取數(shù)據(jù)。功能很強(qiáng)大。

     b、還一個需要思考的問題是數(shù)據(jù)類型怎么映射?。课覀冎喇?dāng)我們從一個數(shù)據(jù)庫表中讀入數(shù)據(jù)時,我們定義的表結(jié)構(gòu)的字段的類型和編程語言比如scala中的數(shù)據(jù)類型映射關(guān)系是怎 樣的一種映射關(guān)系?在sparkSQL中有一種來解決這個問題的方法,來實(shí)現(xiàn)數(shù)據(jù)表中的字段類型到編程語言數(shù)據(jù)類型的映射關(guān)系。這個以后詳細(xì)介紹,先了解有這個問題就行。

     c、數(shù)據(jù)有了,那么在sparkSQL中我們應(yīng)該怎么組織這些數(shù)據(jù),需要什么樣的數(shù)據(jù)結(jié)構(gòu)呢,同時我們對這些數(shù)據(jù)都可以進(jìn)行什么樣的操作?sparkSQL采用的是DataFrame數(shù)據(jù)結(jié)構(gòu)來組織讀入到sparkSQL中的數(shù)據(jù),DataFrame數(shù)據(jù)結(jié)構(gòu)其實(shí)和數(shù)據(jù)庫的表結(jié)構(gòu)差不多,數(shù)據(jù)是按照行來進(jìn)行存儲,同是還有一個schema,就相當(dāng)于數(shù)據(jù)庫的表結(jié)構(gòu),記錄著每一行數(shù)據(jù)屬于哪個字段。

     d、當(dāng)數(shù)據(jù)處理完以后,我們需要把數(shù)據(jù)放入到什么地方,并切以什么樣的格式進(jìn)行對應(yīng),這個a和b要解決的問題是相同的。

2、sparkSQL對于以上問題,的實(shí)現(xiàn)邏輯也很明確,從上圖,已經(jīng)很清楚,主要分為兩個階段,每個階段都對應(yīng)一個具體的類來實(shí)現(xiàn)。

   a、 對于第一個階段,sparkSQL中存在兩個類來解決這些問題:HiveContext,SQLContext,同事hiveContext繼承了SQLContext的所有方法,同事又對其進(jìn)行了擴(kuò)展。因?yàn)槲覀冎溃?hive和MySQL的查詢還是有一定的差別的。HiveContext只是用來處理從hive數(shù)據(jù)倉庫中讀入數(shù)據(jù)的操作,SQLContext可以處理sparkSQL能夠支持的剩下的所有的數(shù)據(jù)源。這兩個類處理的粒度是限制在對數(shù)據(jù)的讀寫上,同事對表級別的操作上,比如,讀入數(shù)據(jù)、緩存表、釋放緩存表表、注冊表、刪除注冊的表、返回表的結(jié)構(gòu)等的操作。

  b、sparkSQL處理讀入的數(shù)據(jù),采用的是DataFrame中提供的方法。因?yàn)楫?dāng)我們把數(shù)據(jù)讀入到sparkSQL中,這個數(shù)據(jù)就是DataFrame類型的。同時數(shù)據(jù)都是按照Row進(jìn)行存儲的。其中 DataFrame中提供了很多有用的方法。以后會細(xì)說。

 c、在spark1.6版本以后,又增加了一個類似于DataFrame的數(shù)據(jù)結(jié)構(gòu)DataSet,增加此數(shù)據(jù)結(jié)構(gòu)的目的DataFrame有軟肋,他只能處理按照Row進(jìn)行存儲的數(shù)據(jù),并且只能使用DataFrame中提供的方法,我們只能使用一部分RDD提供的操作。實(shí)現(xiàn)DataSet的目的就是讓我們能夠像操作RDD一樣來操作sparkSQL中的數(shù)據(jù)。

d、其中還有一些其他的類,但是現(xiàn)在在sparkSQL中最主要的就是上面的三個類,其他類以后碰到了會慢慢想清楚。

3、sparkSQL的hiveContext和SQLContext的運(yùn)行原理

     hiveContext和SQLContext與我第一部分講到的sql語句的模塊解析實(shí)現(xiàn)的原理其實(shí)是一樣的,采用了同樣的邏輯過程,并且網(wǎng)上有好多講這一塊的,就直接粘貼復(fù)制啦??!

  sqlContext總的一個過程如下圖所示:

1.SQL語句經(jīng)過SqlParse解析成UnresolvedLogicalPlan;

2.使用analyzer結(jié)合數(shù)據(jù)數(shù)據(jù)字典(catalog)進(jìn)行綁定,生成resolvedLogicalPlan;

3.使用optimizer對resolvedLogicalPlan進(jìn)行優(yōu)化,生成optimizedLogicalPlan;

4.使用SparkPlan將LogicalPlan轉(zhuǎn)換成PhysicalPlan;

5.使用prepareForExecution()將PhysicalPlan轉(zhuǎn)換成可執(zhí)行物理計劃;

6.使用execute()執(zhí)行可執(zhí)行物理計劃;

7.生成SchemaRDD。

在整個運(yùn)行過程中涉及到多個SparkSQL的組件,如SqlParse、analyzer、optimizer、SparkPlan等等

sparkSQL的整體實(shí)現(xiàn)框架

當(dāng)前名稱:sparkSQL的整體實(shí)現(xiàn)框架
文章源于:http://bm7419.com/article20/jjeejo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、移動網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、商城網(wǎng)站、網(wǎng)站設(shè)計、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)