SparkSQL與Hive on Spark的比較

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

簡要介紹了SparkSQL與Hive on Spark的區別與聯系

一、關于Spark
簡介
在Hadoop的整個生態系統中,Spark和MapReduce在同一個層級,即主要解決分布式計算框架的問題。

架構
Spark的架構如下圖所示,主要包含四大組件:Driver、Master、Worker和Executor。

spark cluster

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

部署模型
單機模型:主要用來開發測試。特點:Driver、Master、Worker和Executor都運行在同一個JVM進程之中。
偽集群模型:主要用來開發測試。特點:Master、Worker都運行在同一個JVM進程之中;Master、Worker和Executor都運行于同一臺機器,無法跨機器運行;
獨立集群(又叫做原生集群模式):在集群規模不是非常大的情況下,可用于生產環境。特點:Master、Worker和Executor都運行于獨立的JVM進程。
YARN集群:YARN生態中的ApplicationMaster角色使用Apache開發好的Spark ApplicationMaster代替,每一個YARN生態中的NodeManager角色相當于一個Spark生態中的Worker角色,由NodeManger負責Executor的啟動。
Mesos集群:暫無詳細調研。

測試
經過測試,在宿主系統為CentOS6.5上(3個節點),hadoop2.7.1 + hive1.2.1(pg為元數據庫) + sqoop + flume1.6.0 + spark1.5.0可以部署。

二、關于Spark SQL
簡介
它主要用于結構化數據處理和對Spark數據執行類SQL的查詢。通過Spark SQL,可以針對不同格式的數據執行ETL操作(如JSON,Parquet,數據庫)然后完成特定的查詢操作。一般來說,Spark每支持一種新的應用開發,都會引入一個新的Context及相應的RDD,對于SQL這一特性來說,引入的就是SQLContext和SchemaRDD。注意:在Spark1.3之后,SchemaRDD已經更名為DataFrame,但它本質就類似一個RDD,因為可以將DataFrame無縫的轉換成一個RDD。

架構
Spark要很好的支持SQL,要完成解析(parser)、優化(optimizer)、執行(execution)三大過程。

spark cluster

處理順序大致如下:
SQlParser生成LogicPlan Tree;
Analyzer和Optimizer將各種Rule作用于LogicalPlan Tree;
最終優化生成的LogicalPlan生成SparkRDD;
最后將生成的RDD交由Spark執行;

Spark SQL的兩個組件
SQLContext:Spark SQL提供SQLContext封裝Spark中的所有關系型功能。可以用之前的示例中的現有SparkContext創建SQLContext。
DataFrame:DataFrame是一個分布式的,按照命名列的形式組織的數據集合。DataFrame基于R語言中的data frame概念,與關系型數據庫中的數據庫表類似。通過調用將DataFrame的內容作為行RDD(RDD of Rows)返回的rdd方法,可以將DataFrame轉換成RDD。可以通過如下數據源創建DataFrame:已有的RDD、結構化數據文件、JSON數據集、Hive表、外部數據庫。

使用示例
編寫簡單的scala程序,從文本文件中加載用戶數據并從數據集中創建一個DataFrame對象。然后運行DataFrame函數,執行特定的數據選擇查詢。
文本文件customers.txt中的內容如下:
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 { // 創建一個表示用戶的自定義類 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對象創建SQLContext對象 val sqlContext = new org.apache.spark.sql.SQLContext(sc) // 導入語句,可以隱式地將RDD轉化成DataFrame import sqlContext.implicits. // 用數據集文本文件創建一個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") // 輸出查詢結果,按照順序訪問結果行的各個列。 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接口,可以與來自多種不同數據源的數據進行交互,而且所采用的語法也是團隊熟知的SQL查詢語法。這對于非技術類的項目成員,如數據分析師以及數據庫管理員來說,非常實用。

小結
我們了解到Apache Spark SQL如何用熟知的SQL查詢語法提供與Spark數據交互的SQL接口。Spark SQL是一個功能強大的庫,組織中的非技術團隊成員,如業務分析師和數據分析師,都可以用Spark SQL執行數據分析。

三、關于Hive on Spark
背景
Hive on Spark是由Cloudera發起,由Intel、MapR等公司共同參與的開源項目,其目的是把Spark作為Hive的一個計算引擎,將Hive的查詢作為Spark的任務提交到Spark集群上進行計算。通過該項目,可以提高Hive查詢的性能,同時為已經部署了Hive或者Spark的用戶提供了更加靈活的選擇,從而進一步提高Hive和Spark的普及率。

簡介
Hive on Spark是從Hive on MapReduce演進而來,Hive的整體解決方案很不錯,但是從查詢提交到結果返回需要相當長的時間,查詢耗時太長,這個主要原因就是由于Hive原生是基于MapReduce的,那么如果我們不生成MapReduce Job,而是生成Spark Job,就可以充分利用Spark的快速執行能力來縮短HiveQL的響應時間。
Hive on Spark現在是Hive組件(從Hive1.1 release之后)的一部分。

與SparkSQL的區別
SparkSQL和Hive On Spark都是在Spark上實現SQL的解決方案。Spark早先有Shark項目用來實現SQL層,不過后來推翻重做了,就變成了SparkSQL。這是Spark官方Databricks的項目,Spark項目本身主推的SQL實現。Hive On Spark比SparkSQL稍晚。Hive原本是沒有很好支持MapReduce之外的引擎的,而Hive On Tez項目讓Hive得以支持和Spark近似的Planning結構(非MapReduce的DAG)。所以在此基礎上,Cloudera主導啟動了Hive On Spark。這個項目得到了IBM,Intel和MapR的支持(但是沒有Databricks)。

使用示例
大體與SparkSQL結構類似,只是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

小結
結構上Hive On Spark和SparkSQL都是一個翻譯層,把一個SQL翻譯成分布式可執行的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說需要根據item_type分組,所以設定shuffle的key為item_type從第一組節點分組后分發給聚合節點,讓相同的item_type匯總到同一個聚合節點,然后這些節點把每個組的Partial Sum再加在一起,就得到了最后結果。不管是Hive還是SparkSQL大致上都是做了上面這樣的工作。
需要理解的是,Hive和SparkSQL都不負責計算,它們只是告訴Spark,你需要這樣算那樣算,但是本身并不直接參與計算。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容