SparkSQL與Hive on Spark的比較

SparkSQL與Hive on Spark的比較 - 在路上的學(xué)習(xí)者 - 博客頻道 - CSDN.NET
http://blog.csdn.net/yeruby/article/details/51448188

簡要介紹了SparkSQL與Hive on Spark的區(qū)別與聯(lián)系

一红选、關(guān)于Spark
簡介
在Hadoop的整個生態(tài)系統(tǒng)中裸影,Spark和MapReduce在同一個層級殴边,即主要解決分布式計算框架的問題翰蠢。

架構(gòu)
Spark的架構(gòu)如下圖所示,主要包含四大組件:Driver棒坏、Master八匠、Worker和Executor。

spark cluster

Spark特點
Spark可以部署在YARN上
Spark原生支持對HDFS文件系統(tǒng)的訪問
使用Scala語言編寫

部署模型
單機模型:主要用來開發(fā)測試咬腕。特點:Driver欢峰、Master、Worker和Executor都運行在同一個JVM進程之中涨共。
偽集群模型:主要用來開發(fā)測試纽帖。特點:Master、Worker都運行在同一個JVM進程之中举反;Master懊直、Worker和Executor都運行于同一臺機器,無法跨機器運行火鼻;
獨立集群(又叫做原生集群模式):在集群規(guī)模不是非常大的情況下室囊,可用于生產(chǎn)環(huán)境雕崩。特點:Master、Worker和Executor都運行于獨立的JVM進程融撞。
YARN集群:YARN生態(tài)中的ApplicationMaster角色使用Apache開發(fā)好的Spark ApplicationMaster代替盼铁,每一個YARN生態(tài)中的NodeManager角色相當(dāng)于一個Spark生態(tài)中的Worker角色,由NodeManger負責(zé)Executor的啟動懦铺。
Mesos集群:暫無詳細調(diào)研捉貌。

測試
經(jīng)過測試支鸡,在宿主系統(tǒng)為CentOS6.5上(3個節(jié)點)冬念,hadoop2.7.1 + hive1.2.1(pg為元數(shù)據(jù)庫) + sqoop + flume1.6.0 + spark1.5.0可以部署。

二牧挣、關(guān)于Spark SQL
簡介
它主要用于結(jié)構(gòu)化數(shù)據(jù)處理和對Spark數(shù)據(jù)執(zhí)行類SQL的查詢急前。通過Spark SQL,可以針對不同格式的數(shù)據(jù)執(zhí)行ETL操作(如JSON瀑构,Parquet裆针,數(shù)據(jù)庫)然后完成特定的查詢操作。一般來說寺晌,Spark每支持一種新的應(yīng)用開發(fā)世吨,都會引入一個新的Context及相應(yīng)的RDD,對于SQL這一特性來說呻征,引入的就是SQLContext和SchemaRDD耘婚。注意:在Spark1.3之后,SchemaRDD已經(jīng)更名為DataFrame陆赋,但它本質(zhì)就類似一個RDD沐祷,因為可以將DataFrame無縫的轉(zhuǎn)換成一個RDD。

架構(gòu)
Spark要很好的支持SQL攒岛,要完成解析(parser)赖临、優(yōu)化(optimizer)、執(zhí)行(execution)三大過程灾锯。

spark cluster

處理順序大致如下:
SQlParser生成LogicPlan Tree兢榨;
Analyzer和Optimizer將各種Rule作用于LogicalPlan Tree;
最終優(yōu)化生成的LogicalPlan生成SparkRDD顺饮;
最后將生成的RDD交由Spark執(zhí)行吵聪;

Spark SQL的兩個組件
SQLContext:Spark SQL提供SQLContext封裝Spark中的所有關(guān)系型功能×焱唬可以用之前的示例中的現(xiàn)有SparkContext創(chuàng)建SQLContext暖璧。
DataFrame:DataFrame是一個分布式的,按照命名列的形式組織的數(shù)據(jù)集合君旦。DataFrame基于R語言中的data frame概念澎办,與關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)庫表類似嘲碱。通過調(diào)用將DataFrame的內(nèi)容作為行RDD(RDD of Rows)返回的rdd方法,可以將DataFrame轉(zhuǎn)換成RDD局蚀÷缶猓可以通過如下數(shù)據(jù)源創(chuàng)建DataFrame:已有的RDD、結(jié)構(gòu)化數(shù)據(jù)文件琅绅、JSON數(shù)據(jù)集扶欣、Hive表、外部數(shù)據(jù)庫千扶。

使用示例
編寫簡單的scala程序料祠,從文本文件中加載用戶數(shù)據(jù)并從數(shù)據(jù)集中創(chuàng)建一個DataFrame對象。然后運行DataFrame函數(shù)澎羞,執(zhí)行特定的數(shù)據(jù)選擇查詢髓绽。
文本文件customers.txt中的內(nèi)容如下:
Tom,12Mike,13Tony,34Lili,8David,21Nike,18Bush,29Candy,42
1
2
3
4
5
6
7
8

1
2
3
4
5
6
7
8

編寫Scala代碼:
import org.apache.spark.object Hello { // 創(chuàng)建一個表示用戶的自定義類 case class Person(name: String, age: Int) def main(args: Array[String]) { val conf = new SparkConf().setAppName("SparkSQL Demo") val sc = new SparkContext(conf) // 首先用已有的Spark Context對象創(chuàng)建SQLContext對象 val sqlContext = new org.apache.spark.sql.SQLContext(sc) // 導(dǎo)入語句,可以隱式地將RDD轉(zhuǎn)化成DataFrame import sqlContext.implicits. // 用數(shù)據(jù)集文本文件創(chuàng)建一個Person對象的DataFrame val people = sc.textFile("/Users/urey/data/input2.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF() // 將DataFrame注冊為一個表 people.registerTempTable("people") // SQL查詢 val teenagers = sqlContext.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19") // 輸出查詢結(jié)果妆绞,按照順序訪問結(jié)果行的各個列顺呕。 teenagers.map(t => "Name: " + t(0)).collect().foreach(println) sc.stop() }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

如上所示,Spark SQL提供了十分友好的SQL接口括饶,可以與來自多種不同數(shù)據(jù)源的數(shù)據(jù)進行交互株茶,而且所采用的語法也是團隊熟知的SQL查詢語法。這對于非技術(shù)類的項目成員图焰,如數(shù)據(jù)分析師以及數(shù)據(jù)庫管理員來說启盛,非常實用。

小結(jié)
我們了解到Apache Spark SQL如何用熟知的SQL查詢語法提供與Spark數(shù)據(jù)交互的SQL接口楞泼。Spark SQL是一個功能強大的庫驰徊,組織中的非技術(shù)團隊成員,如業(yè)務(wù)分析師和數(shù)據(jù)分析師堕阔,都可以用Spark SQL執(zhí)行數(shù)據(jù)分析棍厂。

三、關(guān)于Hive on Spark
背景
Hive on Spark是由Cloudera發(fā)起超陆,由Intel牺弹、MapR等公司共同參與的開源項目,其目的是把Spark作為Hive的一個計算引擎时呀,將Hive的查詢作為Spark的任務(wù)提交到Spark集群上進行計算张漂。通過該項目,可以提高Hive查詢的性能谨娜,同時為已經(jīng)部署了Hive或者Spark的用戶提供了更加靈活的選擇航攒,從而進一步提高Hive和Spark的普及率。

簡介
Hive on Spark是從Hive on MapReduce演進而來趴梢,Hive的整體解決方案很不錯漠畜,但是從查詢提交到結(jié)果返回需要相當(dāng)長的時間币他,查詢耗時太長,這個主要原因就是由于Hive原生是基于MapReduce的憔狞,那么如果我們不生成MapReduce Job蝴悉,而是生成Spark Job,就可以充分利用Spark的快速執(zhí)行能力來縮短HiveQL的響應(yīng)時間瘾敢。
Hive on Spark現(xiàn)在是Hive組件(從Hive1.1 release之后)的一部分拍冠。

與SparkSQL的區(qū)別
SparkSQL和Hive On Spark都是在Spark上實現(xiàn)SQL的解決方案。Spark早先有Shark項目用來實現(xiàn)SQL層簇抵,不過后來推翻重做了庆杜,就變成了SparkSQL。這是Spark官方Databricks的項目正压,Spark項目本身主推的SQL實現(xiàn)欣福。Hive On Spark比SparkSQL稍晚。Hive原本是沒有很好支持MapReduce之外的引擎的焦履,而Hive On Tez項目讓Hive得以支持和Spark近似的Planning結(jié)構(gòu)(非MapReduce的DAG)。所以在此基礎(chǔ)上雏逾,Cloudera主導(dǎo)啟動了Hive On Spark嘉裤。這個項目得到了IBM,Intel和MapR的支持(但是沒有Databricks)栖博。

使用示例
大體與SparkSQL結(jié)構(gòu)類似屑宠,只是SQL引擎不同。部分核心代碼如下:
val hiveContext = new HiveContext(sc)import hiveContext._hql("CREATE TABLE IF NOT EXIST src(key INT, value STRING)")hql("LOAD DATA LOCAL PATH '/Users/urey/data/input2.txt' INTO TABLE src")hql("FROM src SELECT key, value").collect().foreach(println)
1
2
3
4
5
6
7
8
9

1
2
3
4
5
6
7
8
9

小結(jié)
結(jié)構(gòu)上Hive On Spark和SparkSQL都是一個翻譯層仇让,把一個SQL翻譯成分布式可執(zhí)行的Spark程序典奉。比如一個SQL:
SELECT item_type, sum(price)FROM itemGROUP item_type;
1
2
3

1
2
3

上面這個SQL腳本交給Hive或者類似的SQL引擎,它會“告訴”計算引擎做如下兩個步驟:讀取item表丧叽,抽出item_type,price這兩個字段卫玖;對price計算初始的SUM(其實就是每個單獨的price作為自己的SUM)因為GROUP BY說需要根據(jù)item_type分組,所以設(shè)定shuffle的key為item_type從第一組節(jié)點分組后分發(fā)給聚合節(jié)點踊淳,讓相同的item_type匯總到同一個聚合節(jié)點假瞬,然后這些節(jié)點把每個組的Partial Sum再加在一起,就得到了最后結(jié)果迂尝。不管是Hive還是SparkSQL大致上都是做了上面這樣的工作脱茉。
需要理解的是,Hive和SparkSQL都不負責(zé)計算垄开,它們只是告訴Spark琴许,你需要這樣算那樣算,但是本身并不直接參與計算溉躲。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末榜田,一起剝皮案震驚了整個濱河市寸认,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌串慰,老刑警劉巖偏塞,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異邦鲫,居然都是意外死亡灸叼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門庆捺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來古今,“玉大人,你說我怎么就攤上這事滔以∽叫龋” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵你画,是天一觀的道長抵碟。 經(jīng)常有香客問我,道長坏匪,這世上最難降的妖魔是什么拟逮? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮适滓,結(jié)果婚禮上敦迄,老公的妹妹穿的比我還像新娘。我一直安慰自己凭迹,他們只是感情好罚屋,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嗅绸,像睡著了一般脾猛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上朽砰,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天尖滚,我揣著相機與錄音,去河邊找鬼瞧柔。 笑死漆弄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的造锅。 我是一名探鬼主播撼唾,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哥蔚!你這毒婦竟也來了倒谷?” 一聲冷哼從身側(cè)響起蛛蒙,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渤愁,沒想到半個月后牵祟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡抖格,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年诺苹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雹拄。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡收奔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出滓玖,到底是詐尸還是另有隱情坪哄,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布势篡,位于F島的核電站翩肌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏殊霞。R本人自食惡果不足惜摧阅,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绷蹲。 院中可真熱鬧,春花似錦顾孽、人聲如沸祝钢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拦英。三九已至,卻和暖如春测秸,著一層夾襖步出監(jiān)牢的瞬間疤估,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工霎冯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留铃拇,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓沈撞,卻偏偏與公主長得像慷荔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缠俺,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容