- Spark大數(shù)據(jù)商業(yè)實(shí)戰(zhàn)三部曲:內(nèi)核解密|商業(yè)案例|性能調(diào)優(yōu)
- 王家林
- 1337字
- 2019-12-12 17:29:52
2.3 Spark 2.2 SQL
Spark 2.0通過(guò)對(duì)SQL 2003的支持增強(qiáng)了SQL功能,Catalyst新引擎提升了Spark查詢(xún)優(yōu)化的速度;本節(jié)對(duì)DataFrame和Dataset API、時(shí)間窗口進(jìn)行了講解。
Apache Spark 2.2.0版本中核心和Spark SQL的更新如下。
1.API更新
SPARK-19107:支持使用DataFrameWriter和Catalog創(chuàng)建hive表。
SPARK-13721:增加支持LATERAL VIEW OUTER explode()。
SPARK-18885:統(tǒng)一數(shù)據(jù)源和hive serde表的CREATE TABLE語(yǔ)法。
SPARK-16475:增加廣播提示BROADCAST、BROADCASTJOIN和MAPJOIN,用于SQL查詢(xún)。
SPARK-18350:支持會(huì)話本地時(shí)區(qū)。
SPARK-19261:支持ALTER TABLE table_name和COLUMNS。
SPARK-20420:將事件增加到外部目錄。
SPARK-18127:向Spark增加鉤子和擴(kuò)展點(diǎn)。
SPARK-20576:在Dataset/DataFrame中支持通用提示功能。
SPARK-17203:數(shù)據(jù)源選項(xiàng)應(yīng)始終不區(qū)分大小寫(xiě)。
SPARK-19139:基于AES的Spark認(rèn)證機(jī)制。
2.性能優(yōu)化和系統(tǒng)穩(wěn)定性
基于成本的優(yōu)化:
SPARK-17075 SPARK-17076 SPARK-19020 SPARK-17077 SPARK-19350:過(guò)濾filter,關(guān)聯(lián)join,聚合aggregate,投影project和限制limit/樣本運(yùn)算符sample的基數(shù)估計(jì)。
SPARK-17080:基于成本的關(guān)聯(lián)重新排序。
SPARK-17626:使用星形模式啟發(fā)的TPC-DS性能提升。
SPARK-17949:引入基于JVM對(duì)象的聚合運(yùn)算符。
SPARK-18186:HiveUDAFFunction的部分聚合支持。
SPARK-18362 SPARK-19918:CSV和JSON的文件列表/I/O改進(jìn)。
SPARK-18775:限制每個(gè)文件寫(xiě)入的最大記錄數(shù)。
SPARK-18761:不可取消/不能被殺掉的任務(wù)不應(yīng)該資源短缺。
SPARK-15352:拓?fù)渥R(shí)別塊復(fù)制。
3.其他變化
SPARK-18352:支持解析多行JSON文件。
SPARK-19610:支持解析多行CSV文件。
SPARK-21079:分析分區(qū)表上的表命令。
SPARK-18703:對(duì)Hive-serde表插入/CTAS完成后,刪除暫存目錄和數(shù)據(jù)文件。
SPARK-18209:更強(qiáng)大的視圖規(guī)范化,無(wú)須完全SQL擴(kuò)展。
SPARK-13446:[SPARK-18112]支持從Hive metastore 2.0/2.1讀取數(shù)據(jù)。
SPARK-18191:使用提交協(xié)議的RDD API端口。
SPARK-8425:增加黑名單機(jī)制進(jìn)行任務(wù)調(diào)度。
SPARK-19464:刪除對(duì)Hadoop 2.5及更早版本的支持。
SPARK-19493:刪除Java 7支持。
2.3.1 Spark SQL
Spark 2.0通過(guò)對(duì)SQL 2003的支持大幅增強(qiáng)了SQL功能,現(xiàn)在可以運(yùn)行所有99個(gè)TPC-DS查詢(xún)。這個(gè)版本中的SparkSQL主要有以下幾點(diǎn)改進(jìn):
(1)引入了支持ANSISQL和HiveSQL的本地解析器。
(2)本地實(shí)現(xiàn)DDL命令。
(3)支持非相關(guān)標(biāo)量子查詢(xún)。
(4)在Where與having條件中,支持(not)in和(not)exists。
(5)即使Spark沒(méi)有和Hive集成搭建,SparkSQL也支持它們一起搭建時(shí)的除了Hive連接、Hive UDF(User Defined Function用戶(hù)自定義函數(shù))和腳本轉(zhuǎn)換之外的大部分功能。
(6)Hive式的分桶方式的支持。
另外,Catalyst查詢(xún)優(yōu)化器對(duì)于常見(jiàn)的工作負(fù)載也有了很多提升,對(duì)如nullability propagation之類(lèi)的查詢(xún)做了更好的優(yōu)化。Catalyst查詢(xún)優(yōu)化器從最早的應(yīng)用于SparkSQL到現(xiàn)在應(yīng)用于DataSetAPI,對(duì)Spark程序的高效率運(yùn)行起到了非常重要的作用,并且隨著DataSetAPI的流行,以及優(yōu)化器自身的不斷演進(jìn),未來(lái)肯定會(huì)對(duì)Spark的所有框架帶來(lái)更高的執(zhí)行效率。
2.3.2 DataFrame和Dataset API
在Spark 1.X版本中,DataFrame的API存在很多問(wèn)題,如DataFrame不是類(lèi)型安全的(not type-safe)、不是面向?qū)ο蟮模╪ot object-oriented),為了克服這些問(wèn)題,Spark在1.6版本引入了Dataset,并在2.0版本的Scala和Java中將二者進(jìn)行了統(tǒng)一(在Python和R中,由于缺少類(lèi)型安全性,DataFrame仍是主要的編程接口),DataFrame成為DataSet[Row]的別名,而且Spark 2.0版本為DataSet的類(lèi)型化聚合加入了一個(gè)新的聚合器,讓基于DataSet的聚合更加高效。
在Spark 2.1版本中,DataFrame和Dataset API晉升為穩(wěn)定的API。也就是說(shuō),可以在生產(chǎn)實(shí)踐中使用它們,且后續(xù)會(huì)基于向后兼容的前提不斷強(qiáng)化。
DataSetAPI是High-LevelAPI,有更高的抽象級(jí)別,與RDDAPI這樣的Low-LevelAPI相比更加易用,它對(duì)于提升用戶(hù)的工作效率,以及提高程序的可讀性而言意義非凡。由于WholeStageCodeGeneration的引入,SparkSQL和DataSetAPI中的常見(jiàn)算子的性能提升了2~10倍。加上Catalyst查詢(xún)優(yōu)化器和Tungsten的幫助,用戶(hù)不用過(guò)多地關(guān)注對(duì)程序的優(yōu)化,也能獲得很好的執(zhí)行效率。
所以,毋庸置疑地,這樣一種簡(jiǎn)單高效的API將成為Spark未來(lái)主流的編程接口。
2.3.3 Timed Window
對(duì)于經(jīng)常用到復(fù)雜SQL的用戶(hù)而言,窗口函數(shù)一直以來(lái)都是不可或缺的,在Spark 2.X版本中,通過(guò)對(duì)Hive中的窗口函數(shù)的本地化實(shí)現(xiàn),使用Spark的內(nèi)存管理機(jī)制,從而提升了窗口函數(shù)的性能。
- Unreal Engine:Game Development from A to Z
- 大學(xué)計(jì)算機(jī)基礎(chǔ):基礎(chǔ)理論篇
- 電力自動(dòng)化實(shí)用技術(shù)問(wèn)答
- 21小時(shí)學(xué)通AutoCAD
- 輕松學(xué)Java Web開(kāi)發(fā)
- 返璞歸真:UNIX技術(shù)內(nèi)幕
- 大數(shù)據(jù)技術(shù)入門(mén)(第2版)
- 機(jī)器學(xué)習(xí)流水線實(shí)戰(zhàn)
- 聊天機(jī)器人:入門(mén)、進(jìn)階與實(shí)戰(zhàn)
- Troubleshooting OpenVPN
- Lightning Fast Animation in Element 3D
- Hadoop應(yīng)用開(kāi)發(fā)基礎(chǔ)
- Hadoop Beginner's Guide
- 電氣控制及Micro800 PLC程序設(shè)計(jì)
- 漢字錄入技能訓(xùn)練