SparkSQL與Hive on Spark的比較
簡要介紹了SparkSQL與Hive on Spark的區別與聯系
一、關於Spark
簡介
在Hadoop的整個生態系統中,Spark和MapReduce在同一個層級,即主要解決分布式計算框架的問題。
架構
Spark的架構如下圖所示,主要包含四大組件:Driver、Master、Worker和Executor。
Spark特點
· Spark可以部署在YARN上
· Spark原生支持對HDFS文件系統的訪問
· 使用Scala語言編寫
部署模型
1. 單機模型:主要用來開發測試。特點:Driver、Master、Worker和Executor都運行在同一個JVM進程之中。
2. 偽集群模型:主要用來開發測試。特點:Master、Worker都運行在同一個JVM進程之中;Master、Worker和Executor都運行於同一臺機器,無法跨機器運行;
3. 獨立集群(又叫做原生集群模式):在集群規模不是非常大的情況下,可用於生產環境。特點:Master、Worker和Executor都運行於獨立的JVM進程。
4. YARN集群:YARN生態中的ApplicationMaster角色使用Apache開發好的Spark ApplicationMaster代替,每一個YARN生態中的NodeManager角色相當於一個Spark生態中的Worker角色,由NodeManger負責Executor的啟動。
5. Mesos集群:暫無詳細調研。
二、關於
簡介
它主要用於結構化數據處理和對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)三大過程。
處理順序大致如下:
1. SQlParser生成LogicPlan Tree;
2. Analyzer和Optimizer將各種Rule作用於LogicalPlan Tree;
3. 最終優化生成的LogicalPlan生成SparkRDD;
4. 最後將生成的RDD交由Spark執行;
Spark SQL的兩個組件
1. SQLContext:Spark SQL提供SQLContext封裝Spark中的所有關系型功能。可以用之前的示例中的現有SparkContext創建SQLContext。
2. DataFrame:DataFrame是一個分布式的,按照命名列的形式組織的數據集合。DataFrame基於R語言中的data frame概念,與關系型數據庫中的數據庫表類似。通過調用將DataFrame的內容作為行RDD(RDD of Rows)返回的rdd方法,可以將DataFrame轉換成RDD。可以通過如下數據源創建DataFrame:已有的RDD、結構化數據文件、JSON數據集、Hive表、外部數據庫。
使用示例
編寫簡單的scala程序,從文本文件中加載用戶數據並從數據集中創建一個DataFrame對象。然後運行DataFrame函數,執行特定的數據選擇查詢。
文本文件customers.txt中的內容如下:
Tom,12
Mike,13
Tony,34
Lili,8
David,21
Nike,18
Bush,29
Candy,42
編寫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()
}
}
如上所示,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)
小結
結構上Hive On Spark和SparkSQL都是一個翻譯層,把一個SQL翻譯成分布式可執行的Spark程序。比如一個SQL:
SELECT item_type, sum(price)
FROM item
GROUP item_type;
上面這個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,你需要這樣算那樣算,但是本身並不直接參與計算。
參考:http://blog.csdn.net/yeruby/article/details/51448188
SparkSQL與Hive on Spark的比較