Hive on Mapreduce
Hive的原理大家可以參考這篇大數據時代的技術hive:hive介紹,實際的一些操作可以看這篇筆記:新手的Hive指南,至于還有興趣看Hive優化方法可以看看我總結的這篇Hive性能優化上的一些總結
Hive on Mapreduce執行流程
執行流程詳細解析
- Step 1:UI(user interface) 調用 executeQuery 接口,發送 HQL 查詢語句給 Driver
- Step 2:Driver 為查詢語句創建會話句柄,并將查詢語句發送給 Compiler, 等待其進行語句解析并生成執行計劃
- Step 3 and 4:Compiler 從 metastore 獲取相關的元數據
- Step 5:元數據用于對查詢樹中的表達式進行類型檢查,以及基于查詢謂詞調整分區,生成計劃
- Step 6 (6.1,6.2,6.3):由 Compiler 生成的執行計劃是階段性的 DAG,每個階段都可能會涉及到 Map/Reduce job、元數據的操作、HDFS 文件的操作,Execution Engine 將各個階段的 DAG 提交給對應的組件執行。
- Step 7, 8 and 9:在每個任務(mapper / reducer)中,查詢結果會以臨時文件的方式存儲在 HDFS 中。保存查詢結果的臨時文件由 Execution Engine 直接從 HDFS 讀取,作為從 Driver Fetch API 的返回內容。
Hive on Mapreduce特點
- 關系數據庫里,表的加載模式是在數據加載時候強制確定的(表的加載模式是指數據庫存儲數據的文件格式),如果加載數據時候發現加載的數據不符合模式,關系數據庫則會拒絕加載數據,這個就叫“寫時模式”,寫時模式會在數據加載時候對數據模式進行檢查校驗的操作。Hive在加載數據時候和關系數據庫不同,hive在加載數據時候不會對數據進行檢查,也不會更改被加載的數據文件,而檢查數據格式的操作是在查詢操作時候執行,這種模式叫“讀時模式”。在實際應用中,寫時模式在加載數據時候會對列進行索引,對數據進行壓縮,因此加載數據的速度很慢,但是當數據加載好了,我們去查詢數據的時候,速度很快。但是當我們的數據是非結構化,存儲模式也是未知時候,關系數據操作這種場景就麻煩多了,這時候hive就會發揮它的優勢。
- 關系數據庫一個重要的特點是可以對某一行或某些行的數據進行更新、刪除操作,hive不支持對某個具體行的操作,hive對數據的操作只支持覆蓋原數據和追加數據。Hive也不支持事務和索引。更新、事務和索引都是關系數據庫的特征,這些hive都不支持,也不打算支持,原因是hive的設計是海量數據進行處理,全數據的掃描時常態,針對某些具體數據進行操作的效率是很差的,對于更新操作,hive是通過查詢將原表的數據進行轉化最后存儲在新表里,這和傳統數據庫的更新操作有很大不同。
- Hive也可以在hadoop做實時查詢上做一份自己的貢獻,那就是和hbase集成,hbase可以進行快速查詢,但是hbase不支持類SQL的語句,那么此時hive可以給hbase提供sql語法解析的外殼,可以用類sql語句操作hbase數據庫。
- Hive可以認為是MapReduce的一個封裝、包裝。Hive的意義就是在業務分析中將用戶容易編寫、會寫的Sql語言轉換為復雜難寫的MapReduce程序,從而大大降低了Hadoop學習的門檻,讓更多的用戶可以利用Hadoop進行數據挖掘分析。
與傳統數據庫之間對比—From:Hive和傳統數據庫進行比較
比較項 | SQL | HiveQL |
---|---|---|
ANSI SQL | 支持 | 不完全支持 |
更新 | UPDATE\INSERT\DELETE | insert OVERWRITE\INTO TABLE |
事務 | 支持 | 不支持 |
模式 | 寫模式 | 讀模式 |
數據保存 | 塊設備、本地文件系統 | HDFS |
延時 | 低 | 高 |
多表插入 | 不支持 | 支持 |
子查詢 | 完全支持 | 只能用在From子句中 |
視圖 | Updatable | Read-only |
可擴展性 | 低 | 高 |
數據規模 | 小 | 大 |
.... | ...... | ...... |
SparkSQL
SparkSQL簡介
SparkSQL的前身是Shark,給熟悉RDBMS但又不理解MapReduce的技術人員提供快速上手的工具,hive應運而生,它是當時唯一運行在Hadoop上的SQL-on-hadoop工具。但是MapReduce計算過程中大量的中間磁盤落地過程消耗了大量的I/O,降低的運行效率,為了提高SQL-on-Hadoop的效率,Shark應運而生,但又因為Shark對于Hive的太多依賴(如采用Hive的語法解析器、查詢優化器等等),2014年spark團隊停止對Shark的開發,將所有資源放SparkSQL項目上
? 其中SparkSQL作為Spark生態的一員繼續發展,而不再受限于Hive,只是兼容Hive;而Hive on Spark是一個Hive的發展計劃,該計劃將Spark作為Hive的底層引擎之一,也就是說,Hive將不再受限于一個引擎,可以采用Map-Reduce、Tez、Spark等引擎。
- SparkSQL的兩個組件
- 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表、外部數據庫。
SparkSQL運行架構
類似于關系型數據庫,SparkSQL也是語句也是由Projection(a1,a2,a3)、Data Source(tableA)、Filter(condition)組成,分別對應sql查詢過程中的Result、Data Source、Operation,也就是說SQL語句按Operation–>Data Source–>Result的次序來描述的。
當執行SparkSQL語句的順序
- 對讀入的SQL語句進行解析(Parse),分辨出SQL語句中哪些詞是關鍵詞(如SELECT、FROM、WHERE),哪些是表達式、哪些是Projection、哪些是Data Source等,從而判斷SQL語句是否規范;
- Projection:簡單說就是select選擇的列的集合,參考:SQL Projection
- 將SQL語句和數據庫的數據字典(列、表、視圖等等)進行綁定(Bind),如果相關的Projection、Data Source等都是存在的話,就表示這個SQL語句是可以執行的;
- 一般的數據庫會提供幾個執行計劃,這些計劃一般都有運行統計數據,數據庫會在這些計劃中選擇一個最優計劃(Optimize);
- 計劃執行(Execute),按Operation–>Data Source–>Result的次序來進行的,在執行過程有時候甚至不需要讀取物理表就可以返回結果,比如重新運行剛運行過的SQL語句,可能直接從數據庫的緩沖池中獲取返回結果。
Hive on Spark
? hive on Spark是由Cloudera發起,由Intel、MapR等公司共同參與的開源項目,<font color='red'>其目的是把Spark作為Hive的一個計算引擎,將Hive的查詢作為Spark的任務提交到Spark集群上進行計算。</font>通過該項目,可以提高Hive查詢的性能,同時為已經部署了Hive或者Spark的用戶提供了更加靈活的選擇,從而進一步提高Hive和Spark的普及率。
Hive on Spark與SparkSql的區別
? hive on spark大體與SparkSQL結構類似,<font color='red'>只是SQL引擎不同,但是計算引擎都是spark!</font>敲黑板!這才是重點!
我們來看下,在pyspark中使用Hive on Spark是中怎么樣的體驗
#初始化Spark SQL
#導入Spark SQL
from pyspark.sql import HiveContext,Row
# 當不能引入Hive依賴時
# from pyspark.sql import SQLContext,Row
# 注意,上面那一點才是關鍵的,他兩來自于同一個包,你們區別能有多大
hiveCtx = HiveContext(sc) #創建SQL上下文環境
input = hiveCtx.jsonFile(inputFile) #基本查詢示例
input.registerTempTable("tweets") #注冊輸入的SchemaRDD(SchemaRDD在Spark 1.3版本后已經改為DataFrame)
#依據retweetCount(轉發計數)選出推文
topTweets = hiveCtx.sql("SELECT text,retweetCount FROM tweets ORDER BY retweetCount LIMIT 10")
我們可以看到,sqlcontext和hivecontext都是出自于pyspark.sql包,可以從這里理解的話,其實hive on spark和sparksql并沒有太大差別
結構上Hive On Spark和SparkSQL都是一個翻譯層,把一個SQL翻譯成分布式可執行的Spark程序。而且大家的引擎都是spark
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)。—From SparkSQL與Hive on Spark的比較
Hive on Mapreduce和SparkSQL使用場景
Hive on Mapreduce場景
- Hive的出現可以讓那些精通SQL技能、但是不熟悉MapReduce 、編程能力較弱與不擅長Java語言的用戶能夠在HDFS大規模數據集上很方便地利用SQL 語言查詢、匯總、分析數據,畢竟精通SQL語言的人要比精通Java語言的多得多
- Hive適合處理離線非實時數據
SparkSQL場景
- Spark既可以運行本地local模式,也可以以Standalone、cluster等多種模式運行在Yarn、Mesos上,還可以運行在云端例如EC2。此外,Spark的數據來源非常廣泛,可以處理來自HDFS、HBase、 Hive、Cassandra、Tachyon上的各種類型的數據。
- 實時性要求或者速度要求較高的場所
Hive on Mapreduce和SparkSQL性能對比
結論:sparksql和hive on spark時間差不多,但都比hive on mapreduce快很多,官方數據認為spark會被傳統mapreduce快10-100倍
更新
- 2017.8.4 第一次更新,收集和整理