日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

分布式离线计算—HiveSQL

發布時間:2024/4/15 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分布式离线计算—HiveSQL 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文作者:極客教程

原文地址:Hive 簡介

目錄

MapReduce實現SQL的原理

Hive的架構

Hive如何實現join操作

總結

Hive 簡介,Hive是Hadoop大數據倉庫Hive。在數據倉庫中,SQL是最常用的分析工具,既然一條SQL可以通過MapReduce程序實現,那么有沒有工具能夠自動將SQL生成MapReduce代碼呢,答案就是Hive。

MapReduce的出現大大簡化了大數據編程的難度,使得大數據計算不再是高不可攀的技術圣殿,普通工程師也能使用MapReduce開發大數據程序。但是對于經常需要進行大數據計算的人,比如從事研究商業智能(BI)的數據分析師來說,他們通常使用SQL進行大數據分析和統計,MapReduce編程還是有一定的門檻。而且如果每次統計和分析都開發相應的MapReduce程序,成本也確實太高了。那么有沒有更簡單的辦法,可以直接將SQL運行在大數據平臺上呢?

在給出答案前,我們先看看如何用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被放在一起組成一個<Key, Value集合>,作為輸入交給reduce函數處理。比如<<2, 25>, 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的架構

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函數。

?

Hive如何實現join操作

除了上面這些簡單的聚合(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大數據技術得到大規模普及。

總結

以上是生活随笔為你收集整理的分布式离线计算—HiveSQL的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。