原創文章,謝絕轉載html
Spark 2.x自2.0.0發佈到目前的2.2.0已經有一年多的時間了,2.x宣稱有諸多的性能改進,相信很多使用Spark的同窗還停留在1.6.x或者更低的版本上,沒有升級到2.x或許是因爲1.6相對而言很穩定,或許是升級後到處踩坑被迫放棄。git
Spark SQL是Spark中最重要的模塊之一,基本上Spark每一個版本發佈SQL模塊都有很多的改動,並且官網還會附帶一個Migration Guide幫忙你們升級。問題在於Migration Guide並無詳盡的列出全部變更,本文以SQL模塊爲主,扒一扒Spark升級2.x過程當中可能會踩到的坑。github
那些升級後,讓你感到心中有千萬只草泥馬奔騰而過的問題算法
SELECT '0.1' = 0
返回的是true!Spark 2.2中,0.1會被轉換爲int,若是你的數據類型所有是文本類型,作數值計算時,結果極有可能不正確。以前的版本中0.1會被轉換爲double類型絕大多數場景下這樣的處理是正確的。目前爲止,社區尚未很好的處理這個問題,針對這個問題,我給社區提交過一個PR,想要本身解決這個問題的同窗,能夠手動合併下:https://github.com/apache/spark/pull/18986SELECT 1 > 0.0001
會報錯,這個問題已在2.1.2及2.2.0中修復:https://issues.apache.org/jira/browse/SPARK-20211INNER JOIN
涉及到常量計算結果不正確,後續版本已修復:https://issues.apache.org/jira/browse/SPARK-19766GROUPING SET(col)
,若是col列數據爲null,會報空指針異常,後續版本已修復:https://issues.apache.org/jira/browse/SPARK-19509那些不算太致命,改改代碼或配置就能夠兼容的問題。sql
spark.sql.*
相關屬性的操做,明明存在的屬性,使用SHOW TBLPROPERTIES tb("spark.sql.sources.schema.numParts")
沒法獲取到,同理也沒法執行ALTER TABLE tb SET TBLPROPERTIES ('spark.sql.test' = 'test')
進行修改ALTER TABLE tb SET TBLPROPERTIES ('test' = 'test')
這裏假設tb是EXTERNAL類型的表AnalysisException: Cannot drop a table with DROP VIEW
,在2.x如下不會報錯,因爲咱們指定了IF EXISTS關鍵字,這裏的報錯顯然不合理,須要作異常處理。Table not found
變成了Table or view not found
,若是你的代碼裏依賴這個異常信息,就須要注意調整了。spark.sql.crossJoin.enabled
開啓GROUPING__ID
函數在2.x變成了GROUPING_ID()
SELECT 1 FROM tb GROUP BY 1
的語句會報錯,須要單獨設置spark.sql.groupByOrdinal false
相似的參數還有spark.sql.orderByOrdinal false
hive.metastore.warehouse.dir
,須要經過Spark的spark.sql.warehouse.dir
配置指定數據庫的默認存儲路徑。ROW_NUMBER() OVER()
執行會報錯SIZE(null)
返回-1,以前的版本返回nullorg.apache.spark.sql.AnalysisException: Undefined function: 'xxx’.
, Spark 1.6: AnalysisException: undefined function xxx
,參數格式錯誤: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..
/api/v1/applications
:https://issues.apache.org/jira/browse/SPARK-12299,https://issues.apache.org/jira/browse/SPARK-18683那些升級到2.x後,發現有問題回退後,讓你欲哭無淚的問題。數據庫
MSCK REPAIR TABLE
進行修復,不然再次升級會出現缺數據的現象。從2.2.0開始,Spark不在支持Hadoop 2.5及更早的版本,同時也不支持Java 7 了,因此,若是你用的版本比較老,仍是儘快升級的比較好。apache
2.x中對於ThriftServer或JobServer這樣的長時間運行的服務,穩定性不如1.6,若是您的計算業務複雜、SQL計算任務繁多、頻繁的更新數據、處理數據量較大,穩定性的問題更加凸顯。穩定性問題主要集中在內存方面,Executor常常出現堆外內存嚴重超出、OOM致使進程異常退出等問題。Executor進程OOM異常退出後相關的block-mgr目錄(也就是SPARK_LOCAL_DIRS)並不會被清理,這就致使Spark Application長時間運行很容易出現磁盤被寫滿的狀況。api
Spark 2.x中爲了性能,SQL模塊的改動至關大,這也致使Bug變多,穩定性變差。固然,隨着Spark的不斷改進迭代,這些問題也在逐步緩解。微信
對於一個計算服務,相比性能,數據計算的正確性及穩定性更加劇要。建議還沒有升級到2.x的同窗,最好使用最新的Spark版本作升級;升級前,務必結合本身的業務場景作好充分的測試,避免踩坑。app
本文同步更新到微信公衆號,歡迎掃碼關注。