1. 程式人生 > >SparkSQL與Hive on Spark的比較

SparkSQL與Hive on Spark的比較

.cn local 順序 沒有 針對 ast custom spark manager

簡要介紹了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的查詢。通過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的比較