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