分布式離線計算 HiveSQL

2021-10-17 11:33:23 字數 4251 閱讀 8408

目錄

mapreduce實現sql的原理

hive的架構

hive如何實現join操作 總結

hive 簡介,hive是hadoop大資料倉儲hive。在資料倉儲中,sql是最常用的分析工具,既然一條sql可以通過mapreduce程式實現,那麼有沒有工具能夠自動將sql生成mapreduce**呢,答案就是hive。

mapreduce的出現大大簡化了大資料程式設計的難度,使得大資料計算不再是高不可攀的技術聖殿,普通工程師也能使用mapreduce開發大資料程式。但是對於經常需要進行大資料計算的人,比如從事研究商業智慧型(bi)的資料分析師來說,他們通常使用sql進行大資料分析和統計,mapreduce程式設計還是有一定的門檻。而且如果每次統計和分析都開發相應的mapreduce程式,成本也確實太高了。那麼有沒有更簡單的辦法,可以直接將sql執行在大資料平台上呢?

在給出答案前,我們先看看如何用mapreduce實現sql資料分析。

對於常見的一條sql分析語句,mapreduce如何程式設計實現?

select pageid, age, count(1) from pv_users group by pageid, age;
這是一條非常常見的sql統計分析語句,統計不同年齡的使用者訪問不同網頁的興趣偏好,對於產品運營和設計很有價值。具體資料輸入和執行結果請看下面的圖示。

左邊是要分析的資料表,右邊是分析結果。實際上把左邊表相同的行進行累計求和,就得到右邊的表了,看起來跟wordcount的計算很相似。確實也是這樣,我們看下這條sql語句的mapreduce的計算過程,按照mapreduce程式設計模型,map和reduce函式的輸入輸出以及函式處理過程分別是什麼。首先,看下map函式的輸入key和value,我們主要看value。value就是左邊表中每一行的資料,比如<1, 25>這樣。map函式的輸出就是以輸入的value作為key,value統一設為1,比如<<1, 25>, 1>這樣。map函式的輸出經過shuffle以後,相同的key及其對應的value被放在一起組成乙個, 1>被map函式輸出兩次,那麼到了reduce這裡,就變成輸入<<2, 25>,<1, 1>>,這裡的key是<2, 25>,value集合是<1, 1>。在reduce函式內部,value集合裡所有的數字被相加,然後輸出。所以reduce的輸出就是<<2, 25>, 2>。講起來有點拗口,我把這個過程畫成了一張圖,看起來就清楚多了。

這樣一條很有實用價值的sql就被很簡單的mapreduce計算過程處理好了。在資料倉儲中,sql是最常用的分析工具,既然一條sql可以通過mapreduce程式實現,那麼有沒有工具能夠自動將sql生成mapreduce**呢?這樣資料分析師只要輸入sql,就可以自動生成mapreduce可執行的**,然後提交hadoop執行,也就完美解決了我們最開始提出的問題。問題的答案,也就是這個神奇的工具就是hadoop大資料倉儲hive。

hive能夠直接處理我們輸入的sql語句(hive的sql語法和資料庫標準sql略有不同),呼叫mapreduce計算框架完成資料分析操作。下面是它的架構圖,我們結合架構圖來看看hive是如何實現將sql生成mapreduce可執行**的。

我們通過hive的client(hive的命令列工具,jdbc等)向hive提交sql命令。如果是建立資料表的ddl(資料定義語言),hive就會通過執行引擎driver將資料表的資訊記錄在metastore元資料元件中,這個元件通常用乙個關聯式資料庫實現,記錄表名、欄位名、字段型別、關聯hdfs檔案路徑等這些資料庫的meta資訊(元資訊)。如果我們提交的是查詢分析資料的dql(資料查詢語句),driver就會將該語句提交給自己的編譯器compiler進行語法分析、語法解析、語法優化等一系列操作,最後生成乙個mapreduce執行計畫。然後根據執行計畫生成乙個mapreduce的作業,提交給hadoop mapreduce計算框架處理。對於乙個較簡單的sql命令,比如:

select * from status_updates where status like 『michael jackson』;
它對應的hive執行計畫如下圖。

hive內部預置了很多函式,hive的執行計畫就是根據sql語句生成這些函式的dag(有向無環圖),然後封裝進mapreduce的map和reduce函式中。這個例子中,map函式呼叫了三個hive內建函式tablescanoperator、filteroperator、fileoutputoperator,就完成了map計算,而且無需reduce函式。

除了上面這些簡單的聚合(group by)、過濾(where)操作,hive還能執行連線(join on)操作。文章開頭的例子中,pv_users表的資料在實際中是無法直接得到的,因為pageid資料來自使用者訪問日誌,每個使用者進行一次頁面瀏覽,就會生成一條訪問記錄,儲存在page_view表中。而age年齡資訊則記錄在使用者表user中。

這兩張表都有乙個相同的字段userid,根據這個字段可以將兩張表連線起來,生成前面例子的pv_users表,sql命令是

select pv.pageid, u.age from page_view pv join user u on (pv.userid = u.userid);
同樣,這個sql命令也可以轉化為mapreduce計算,連線的過程如下圖所示。

從圖上看,join的mapreduce計算過程和前面的group by稍有不同,因為join涉及兩張表,來自兩個檔案(夾),所以需要在map輸出的時候進行標記,比如來自第一張表的輸出value就記錄為<1, x>,這裡的1表示資料來自第一張表。這樣經過shuffle以後,相同的key被輸入到同乙個reduce函式,就可以根據表的標記對value資料求笛卡爾積,用第一張表的每條記錄和第二張表的每條記錄連線,輸出就是join的結果。所以我們如果開啟hive的源**,看join相關的**,會看到乙個兩層for迴圈,對來自兩張表的記錄進行連線操作。

在實踐中,工程師其實並不需要經常編寫mapreduce程式,因為**最主要的大資料處理就是sql分析,也因此hive在大資料應用中的作用非常重要。後面隨著hive的普及,我們對於在hadoop上執行sql的需求越加強烈,對大資料sql的應用場景也多樣化起來,於是又開發了各種大資料sql引擎。

cloudera開發了impala,這是一種執行在hdfs上的mpp架構的sql引擎。和mapreduce啟動map和reduce兩種執行程序,將計算過程分成兩個階段進行計算不同,impala在所有datanode伺服器上部署相同的impalad程序,多個impalad程序相互協作,共同完成sql計算。在一些統計場景中,impala可以做到毫秒級的計算速度。

後來spark出道以後,也迅速推出了自己的sql引擎shark,也就是後來的spark sql,將sql語句解析成spark的執行計畫,在spark上執行。由於spark比mapreduce快很多,spark sql也相應比hive快很多,並且隨著spark的普及,spark sql也逐漸被人們接受。後來hive推出了hive on spark,將hive的執行計畫轉換成spark的計算模型,當然這是後話了。

此外,我們還希望在nosql的資料庫上執行sql,畢竟sql發展了幾十年,積累了龐大的使用者群體,很多人習慣了用sql解決問題。於是saleforce推出了phoenix,乙個執行在hbase上的sql引擎。

hive本身的技術架構其實並沒有什麼創新,資料庫相關的技術和架構已經非常成熟,只要將這些技術架構應用到mapreduce上就得到了hadoop大資料倉儲hive。但是想到將兩種技術嫁接到一起,卻是極具創新性的,通過嫁接產生出的hive可以極大降低大資料的應用門檻,也使hadoop大資料技術得到大規模普及。

MapReduce分布式離線計算框架的部署

基於hadoop2.x的搭建 啟動集群 關閉集群 進入自己的hadoop安裝包解壓資料夾中的etc hadoop資料夾 cd home hadoop 2.6.5 etc hadoop將mapred site.xml.template模板檔案更名為mapred site.xml mv mapred s...

分布式計算

定義 研究如何把乙個需要非常巨大的計算能力才能解決的問題分成許多小的部分,然後把這些部分分配給許多計算機進行處理,最後把這些計算結果綜合起來得到最終的結果。什麼是分布式系統 分布式系統 distributed system 是由多台計算機和通訊的軟體通過計算機網路連線組成 本地區域網或者廣域網 分布...

分布式計算0

分布式系統可以建立精確的數學模型,其上的演算法與性質都是可以證明的,這是最近看一本分布式演算法的專著的感受。其中在論及分布式系統的時間概念時,談到其邏輯時鐘是整個系統上的乙個序關係 這個序關係可以把系統中的事件序列對映到乙個自然數集合上 event 除因果事件外,則還有平行事件的存在。故這種對映關係...