掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
Spark 2.x自2.0.0發(fā)布到目前的2.2.0已經(jīng)有一年多的時間了,2.x宣稱有諸多的性能改進,相信不少使用Spark的同學還停留在1.6.x或者更低的版本上,沒有升級到2.x或許是由于1.6相對而言很穩(wěn)定,或許是升級后處處踩坑被迫放棄。

“專業(yè)、務(wù)實、高效、創(chuàng)新、把客戶的事當成自己的事”是我們每一個人一直以來堅持追求的企業(yè)文化。 創(chuàng)新互聯(lián)是您可以信賴的網(wǎng)站建設(shè)服務(wù)商、專業(yè)的互聯(lián)網(wǎng)服務(wù)提供商! 專注于網(wǎng)站制作、成都網(wǎng)站制作、軟件開發(fā)、設(shè)計服務(wù)業(yè)務(wù)。我們始終堅持以客戶需求為導(dǎo)向,結(jié)合用戶體驗與視覺傳達,提供有針對性的項目解決方案,提供專業(yè)性的建議,創(chuàng)新互聯(lián)建站將不斷地超越自我,追逐市場,引領(lǐng)市場!
Spark SQL是Spark中最重要的模塊之一,基本上Spark每個版本發(fā)布SQL模塊都有不少的改動,而且官網(wǎng)還會附帶一個Migration Guide幫忙大家升級。問題在于Migration Guide并沒有詳盡的列出所有變動,本文以SQL模塊為主,扒一扒Spark升級2.x過程中可能會踩到的坑。
[[207387]]
計算準確性
那些升級后,讓你感到心中有千萬只草泥馬奔騰而過的問題
行為變化
那些不算太致命,改改代碼或配置就可以兼容的問題。
2.x中默認不支持笛卡爾積操作,需要通過參數(shù)spark.sql.crossJoin.enabled開啟
OLAP分析中常用的GROUPING__ID函數(shù)在2.x變成了GROUPING_ID()
如果你有一個基于Hive的UDF名為abc,有3個參數(shù),然后又基于Spark的UDF實現(xiàn)了一個2個參數(shù)的abc,在2.x中,2個參數(shù)的abc會覆蓋掉Hive中3個參數(shù)的abc函數(shù),1.6則不會有這個問題
執(zhí)行類似SELECT 1 FROM tb GROUP BY 1的語句會報錯,需要單獨設(shè)置spark.sql.groupByOrdinal false類似的參數(shù)還有spark.sql.orderByOrdinal false
CREATE DATABASE默認路徑發(fā)生了變化,不在從hive-site.xml讀取hive.metastore.warehouse.dir,需要通過Spark的spark.sql.warehouse.dir配置指定數(shù)據(jù)庫的默認存儲路徑。
CAST一個不存在的日期返回null,如:year('2015-03-40'),在1.6中返回2015
Parquet文件的默認壓縮算法由gzip變成了snappy,據(jù)官方說法是snappy有更好的查詢性能,大家需要自己驗證性能的變化
DESC FORMATTED tb返回的內(nèi)容有所變化,1.6的格式和Hive比較貼近,2.x中分兩列顯示
異常信息的變化,未定義的函數(shù),Spark 2.x: org.apache.spark.sql.AnalysisException: Undefined function: 'xxx’., Spark 1.6: AnalysisException: undefined function xxx,參數(shù)格式錯誤:Spark 2.x:Invalid number of arguments, Spark 1.6: No handler for Hive udf class org.apache.hadoop.hive.ql.udf.generic.GenericUDAFXXX because: Exactly one argument is expected..
Spark Standalone的WebUI中已經(jīng)沒有這個API了:/api/v1/applications:https://issues.apache.org/jira/browse/SPARK-12299,https://issues.apache.org/jira/browse/SPARK-18683
版本回退
那些升級到2.x后,發(fā)現(xiàn)有問題回退后,讓你欲哭無淚的問題。
Spark 2.0開始,SQL創(chuàng)建的分區(qū)表兼容Hive了,Spark會將分區(qū)信息保存到HiveMetastore中,也就是我們可以通過SHOW PARTITIONS查詢分區(qū),Hive也能正常查詢這些分區(qū)表了。如果將Spark切換到低版本,在更新分區(qū)表,HiveMetastore中的分區(qū)信息并不會更新,需要執(zhí)行MSCK REPAIR TABLE進行修復(fù),否則再次升級會出現(xiàn)缺數(shù)據(jù)的現(xiàn)象。
Spark 2.0 ~ 2.1創(chuàng)建的VIEW并不會把創(chuàng)建VIEW的原始SQL更新到HiveMetastore,而是解析后的SQL,如果這個SQL包含復(fù)雜的子查詢,那么切換到1.6后,就有可能無法使用這個VIEW表了(1.6對SQL的支持不如2.x)
其他
從2.2.0開始,Spark不在支持Hadoop 2.5及更早的版本,同時也不支持Java 7 了,所以,如果你用的版本比較老,還是盡快升級的比較好。
2.x中對于ThriftServer或JobServer這樣的長時間運行的服務(wù),穩(wěn)定性不如1.6,如果您的計算業(yè)務(wù)復(fù)雜、SQL計算任務(wù)繁多、頻繁的更新數(shù)據(jù)、處理數(shù)據(jù)量較大,穩(wěn)定性的問題更加凸顯。穩(wěn)定性問題主要集中在內(nèi)存方面,Executor經(jīng)常出現(xiàn)堆外內(nèi)存嚴重超出、OOM導(dǎo)致進程異常退出等問題。Executor進程OOM異常退出后相關(guān)的block-mgr目錄(也就是SPARK_LOCAL_DIRS)并不會被清理,這就導(dǎo)致Spark Application長時間運行很容易出現(xiàn)磁盤被寫滿的情況。
總結(jié)
Spark 2.x中為了性能,SQL模塊的改動相當大,這也導(dǎo)致Bug變多,穩(wěn)定性變差。當然,隨著Spark的不斷改進迭代,這些問題也在逐步緩解。
對于一個計算服務(wù),相比性能,數(shù)據(jù)計算的正確性及穩(wěn)定性更加重要。建議尚未升級到2.x的同學,最好使用最新的Spark版本做升級;升級前,務(wù)必結(jié)合自己的業(yè)務(wù)場景做好充分的測試,避免踩坑。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流