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特點
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)三大過程灾锯。
處理順序大致如下:
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琴许,你需要這樣算那樣算,但是本身并不直接參與計算溉躲。