Spark 1.6升級(jí)2.x防踩坑指南

原創(chuàng)文章,謝絕轉(zhuǎn)載

Spark 2.x自2.0.0發(fā)布到目前的2.2.0已經(jīng)有一年多的時(shí)間了洽胶,2.x宣稱有諸多的性能改進(jìn),相信不少使用Spark的同學(xué)還停留在1.6.x或者更低的版本上裆馒,沒有升級(jí)到2.x或許是由于1.6相對(duì)而言很穩(wěn)定姊氓,或許是升級(jí)后處處踩坑被迫放棄。

Spark SQL是Spark中最重要的模塊之一喷好,基本上Spark每個(gè)版本發(fā)布SQL模塊都有不少的改動(dòng)翔横,而且官網(wǎng)還會(huì)附帶一個(gè)Migration Guide幫忙大家升級(jí)。問題在于Migration Guide并沒有詳盡的列出所有變動(dòng)梗搅,本文以SQL模塊為主禾唁,扒一扒Spark升級(jí)2.x過程中可能會(huì)踩到的坑。

計(jì)算準(zhǔn)確性

那些升級(jí)后无切,讓你感到心中有千萬(wàn)只草泥馬奔騰而過的問題

  • SELECT '0.1' = 0返回的是true荡短!Spark 2.2中,0.1會(huì)被轉(zhuǎn)換為int哆键,如果你的數(shù)據(jù)類型全部是文本類型掘托,做數(shù)值計(jì)算時(shí),結(jié)果極有可能不正確籍嘹。之前的版本中0.1會(huì)被轉(zhuǎn)換為double類型絕大多數(shù)場(chǎng)景下這樣的處理是正確的闪盔。目前為止弯院,社區(qū)還沒有很好的處理這個(gè)問題,針對(duì)這個(gè)問題泪掀,我給社區(qū)提交過一個(gè)PR听绳,想要自己解決這個(gè)問題的同學(xué),可以手動(dòng)合并下:https://github.com/apache/spark/pull/18986
  • 過于復(fù)雜的SQL語(yǔ)句執(zhí)行可能會(huì)出現(xiàn)64KB字節(jié)碼編譯限制的問題族淮,這算是個(gè)老問題了辫红,Spark自從上了Tungsten基本上一直存在這個(gè)問題,也算是受到了JVM的限制祝辣,遇到此類問題贴妻,建議大家找找PR:https://github.com/apache/spark/search?utf8=%E2%9C%93&q=64KB&type=Issues
  • 數(shù)據(jù)計(jì)算精度有問題,SELECT 1 > 0.0001會(huì)報(bào)錯(cuò)蝙斜,這個(gè)問題已在2.1.2及2.2.0中修復(fù):https://issues.apache.org/jira/browse/SPARK-20211
  • 2.1.0版本中INNER JOIN涉及到常量計(jì)算結(jié)果不正確名惩,后續(xù)版本已修復(fù):https://issues.apache.org/jira/browse/SPARK-19766
  • 2.1.0中,執(zhí)行GROUPING SET(col)孕荠,如果col列數(shù)據(jù)為null娩鹉,會(huì)報(bào)空指針異常,后續(xù)版本已修復(fù):https://issues.apache.org/jira/browse/SPARK-19509
  • 2.1.0中稚伍,嵌套的CASE WHEN語(yǔ)句執(zhí)行有可能出錯(cuò)弯予,后續(xù)版本已修復(fù):https://issues.apache.org/jira/browse/SPARK-19472

行為變化

那些不算太致命,改改代碼或配置就可以兼容的問題个曙。

  • Spark 2.2的UDAF實(shí)現(xiàn)有所變動(dòng)锈嫩,如果你的Hive UDAF沒有嚴(yán)格按照標(biāo)準(zhǔn)實(shí)現(xiàn),有可能會(huì)計(jì)算報(bào)錯(cuò)或數(shù)據(jù)不正確垦搬,建議將邏輯遷移到Spark AF呼寸,同時(shí)也能獲得更好的性能
  • Spark 2.x限制了Hive表中spark.sql.*相關(guān)屬性的操作,明明存在的屬性猴贰,使用SHOW TBLPROPERTIES tb("spark.sql.sources.schema.numParts")無(wú)法獲取到对雪,同理也無(wú)法執(zhí)行ALTER TABLE tb SET TBLPROPERTIES ('spark.sql.test' = 'test')進(jìn)行修改
  • 無(wú)法修改外部表的屬性ALTER TABLE tb SET TBLPROPERTIES ('test' = 'test')這里假設(shè)tb是EXTERNAL類型的表
  • DROP VIEW IF EXISTS tb,如果這里的tb是個(gè)TABLE而非VIEW米绕,執(zhí)行會(huì)報(bào)錯(cuò)AnalysisException: Cannot drop a table with DROP VIEW瑟捣,在2.x以下不會(huì)報(bào)錯(cuò),由于我們指定了IF EXISTS關(guān)鍵字栅干,這里的報(bào)錯(cuò)顯然不合理蝶柿,需要做異常處理。
  • 如果你訪問的表不存在非驮,異常信息在Spark2.x里由之前的Table not found變成了Table or view not found交汤,如果你的代碼里依賴這個(gè)異常信息,就需要注意調(diào)整了。
  • EXPLAIN語(yǔ)句的返回格式變掉了芙扎,在1.6里是多行文本星岗,2.x中是一行,而且內(nèi)容格式也有稍微的變化戒洼,相比Spark1.6俏橘,少了Tungsten關(guān)鍵字;EXPLAIN中顯示的HDFS路徑過長(zhǎng)的話圈浇,在Spark 2.x中會(huì)被省略為...
  • 2.x中默認(rèn)不支持笛卡爾積操作寥掐,需要通過參數(shù)spark.sql.crossJoin.enabled開啟
  • OLAP分析中常用的GROUPING__ID函數(shù)在2.x變成了GROUPING_ID()
  • 如果你有一個(gè)基于Hive的UDF名為abc,有3個(gè)參數(shù)磷蜀,然后又基于Spark的UDF實(shí)現(xiàn)了一個(gè)2個(gè)參數(shù)的abc召耘,在2.x中,2個(gè)參數(shù)的abc會(huì)覆蓋掉Hive中3個(gè)參數(shù)的abc函數(shù)褐隆,1.6則不會(huì)有這個(gè)問題
  • 執(zhí)行類似SELECT 1 FROM tb GROUP BY 1的語(yǔ)句會(huì)報(bào)錯(cuò)污它,需要單獨(dú)設(shè)置spark.sql.groupByOrdinal false類似的參數(shù)還有spark.sql.orderByOrdinal false
  • CREATE DATABASE默認(rèn)路徑發(fā)生了變化,不在從hive-site.xml讀取hive.metastore.warehouse.dir衫贬,需要通過Spark的spark.sql.warehouse.dir配置指定數(shù)據(jù)庫(kù)的默認(rèn)存儲(chǔ)路徑。
  • CAST一個(gè)不存在的日期返回null歇攻,如:year('2015-03-40')固惯,在1.6中返回2015
  • Spark 2.x不允許在VIEW中使用臨時(shí)函數(shù)(temp function)https://issues.apache.org/jira/browse/SPARK-18209
  • Spark 2.1以后,窗口函數(shù)ROW_NUMBER()必須要在OVER內(nèi)添加ORDER BY缴守,以前的ROW_NUMBER() OVER()執(zhí)行會(huì)報(bào)錯(cuò)
  • Spark 2.1以后缝呕,SIZE(null)返回-1,之前的版本返回null
  • Parquet文件的默認(rèn)壓縮算法由gzip變成了snappy斧散,據(jù)官方說法是snappy有更好的查詢性能,大家需要自己驗(yàn)證性能的變化
  • 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ù)格式錯(cuò)誤: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)沒有這個(gè)API了:/api/v1/applicationshttps://issues.apache.org/jira/browse/SPARK-12299https://issues.apache.org/jira/browse/SPARK-18683

版本回退

那些升級(jí)到2.x后煎源,發(fā)現(xiàn)有問題回退后色迂,讓你欲哭無(wú)淚的問題。

  • Spark 2.0開始手销,SQL創(chuàng)建的分區(qū)表兼容Hive了歇僧,Spark會(huì)將分區(qū)信息保存到HiveMetastore中,也就是我們可以通過SHOW PARTITIONS查詢分區(qū),Hive也能正常查詢這些分區(qū)表了诈悍。如果將Spark切換到低版本祸轮,在更新分區(qū)表,HiveMetastore中的分區(qū)信息并不會(huì)更新侥钳,需要執(zhí)行MSCK REPAIR TABLE進(jìn)行修復(fù)适袜,否則再次升級(jí)會(huì)出現(xiàn)缺數(shù)據(jù)的現(xiàn)象。
  • Spark 2.0 ~ 2.1創(chuàng)建的VIEW并不會(huì)把創(chuàng)建VIEW的原始SQL更新到HiveMetastore舷夺,而是解析后的SQL苦酱,如果這個(gè)SQL包含復(fù)雜的子查詢,那么切換到1.6后给猾,就有可能無(wú)法使用這個(gè)VIEW表了(1.6對(duì)SQL的支持不如2.x)

其他

從2.2.0開始疫萤,Spark不在支持Hadoop 2.5及更早的版本,同時(shí)也不支持Java 7 了耙册,所以给僵,如果你用的版本比較老,還是盡快升級(jí)的比較好详拙。

2.x中對(duì)于ThriftServer或JobServer這樣的長(zhǎng)時(shí)間運(yùn)行的服務(wù)帝际,穩(wěn)定性不如1.6,如果您的計(jì)算業(yè)務(wù)復(fù)雜饶辙、SQL計(jì)算任務(wù)繁多蹲诀、頻繁的更新數(shù)據(jù)、處理數(shù)據(jù)量較大弃揽,穩(wěn)定性的問題更加凸顯脯爪。穩(wěn)定性問題主要集中在內(nèi)存方面,Executor經(jīng)常出現(xiàn)堆外內(nèi)存嚴(yán)重超出矿微、OOM導(dǎo)致進(jìn)程異常退出等問題痕慢。Executor進(jìn)程OOM異常退出后相關(guān)的block-mgr目錄(也就是SPARK_LOCAL_DIRS)并不會(huì)被清理,這就導(dǎo)致Spark Application長(zhǎng)時(shí)間運(yùn)行很容易出現(xiàn)磁盤被寫滿的情況涌矢。

總結(jié)

Spark 2.x中為了性能掖举,SQL模塊的改動(dòng)相當(dāng)大,這也導(dǎo)致Bug變多娜庇,穩(wěn)定性變差塔次。當(dāng)然,隨著Spark的不斷改進(jìn)迭代名秀,這些問題也在逐步緩解励负。

對(duì)于一個(gè)計(jì)算服務(wù),相比性能匕得,數(shù)據(jù)計(jì)算的正確性及穩(wěn)定性更加重要继榆。建議尚未升級(jí)到2.x的同學(xué),最好使用最新的Spark版本做升級(jí);升級(jí)前裕照,務(wù)必結(jié)合自己的業(yè)務(wù)場(chǎng)景做好充分的測(cè)試攒发,避免踩坑。

Spark大數(shù)據(jù)技術(shù)

本文同步更新到微信公眾號(hào)晋南,歡迎掃碼關(guān)注惠猿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市负间,隨后出現(xiàn)的幾起案子偶妖,更是在濱河造成了極大的恐慌,老刑警劉巖政溃,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趾访,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡董虱,警方通過查閱死者的電腦和手機(jī)扼鞋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)愤诱,“玉大人云头,你說我怎么就攤上這事∫耄” “怎么了溃槐?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)科吭。 經(jīng)常有香客問我昏滴,道長(zhǎng),這世上最難降的妖魔是什么对人? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任谣殊,我火速辦了婚禮,結(jié)果婚禮上牺弄,老公的妹妹穿的比我還像新娘姻几。我一直安慰自己,他們只是感情好猖闪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肌厨,像睡著了一般培慌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柑爸,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天吵护,我揣著相機(jī)與錄音,去河邊找鬼。 笑死馅而,一個(gè)胖子當(dāng)著我的面吹牛祥诽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瓮恭,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼雄坪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了屯蹦?” 一聲冷哼從身側(cè)響起维哈,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎登澜,沒想到半個(gè)月后阔挠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脑蠕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年购撼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谴仙。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迂求,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狞甚,到底是詐尸還是另有隱情锁摔,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布哼审,位于F島的核電站谐腰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏涩盾。R本人自食惡果不足惜十气,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望春霍。 院中可真熱鬧砸西,春花似錦、人聲如沸址儒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)莲趣。三九已至鸳慈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喧伞,已是汗流浹背走芋。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工绩郎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翁逞。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓肋杖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親挖函。 傳聞我的和親對(duì)象是個(gè)殘疾皇子状植,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容