如何優(yōu)雅的關(guān)閉Spark Streaming作業(yè)

關(guān)注公眾號:“程序員成長軟技能” 酪术,日拱一卒,功不唐捐跃巡!????????Spark Streaming 應(yīng)用定位是長期執(zhí)行的。但如何優(yōu)雅的關(guān)閉它牧愁,使正在被處理的消息在作業(yè)停止前被妥善處理素邪?很多博文建議我們必須通過JVM關(guān)閉的鉤子,可在此 查看相關(guān)代碼递宅。但是娘香,這個方法在新的Spark版本(1.4版本之后)中不能正常工作,并且會引起死鎖情況办龄。
????????目前有兩種方式去優(yōu)雅的關(guān)閉Spark Streaming作業(yè)。第一種方法是設(shè)置spark.streaming.stopGracefullyOnShutdown參數(shù)值為true(默認是false)淋昭。這個參數(shù)在解決Spark優(yōu)雅關(guān)閉的issue中引入俐填。開發(fā)者不再需要去調(diào)用ssc.stop()函數(shù),只需要向Driver發(fā)送SIGTERM信號翔忽。在實踐中英融,我們需要如下操作:

  1. 在Spark UI上找到Driver進程運行在哪個節(jié)點。在Yarn Cluster部署模式下歇式,Driver進程和AM運行在同一個Container驶悟。
  2. 登陸運行Driver的節(jié)點,并且執(zhí)行ps -ef |grep java |grep ApplicationMaster 去找到進程ID材失。請注意痕鳍,你搜索的字符串可能會因為作業(yè)或者環(huán)境等原因不同。
  3. 執(zhí)行kill -SIGTERM <AM-PID> 命令,發(fā)送SIGTERM信號給進程笼呆。
    在Spark Driver接收到SIGTERM信號后熊响,你會在日志中看到類似如下的消息:

17/02/02 01:31:35 ERROR yarn.ApplicationMaster: RECEIVED SIGNAL 15: SIGTERM*
17/02/02 01:31:35 INFO streaming.StreamingContext: Invoking stop(stopGracefully=true) from shutdown hook...
17/02/02 01:31:45 INFO streaming.StreamingContext: StreamingContext stopped successfully**
17/02/02 01:31:45 INFO spark.SparkContext: Invoking stop() from shutdown hook...
17/02/02 01:31:45 INFO spark.SparkContext: Successfully stopped SparkContext...
17/02/02 01:31:45 INFO util.ShutdownHookManager: Shutdown hook called*

????????需要注意,默 spark.yarn.maxAppAttempts默認使用Yarn的yarn.resourcemanager.am.max-attempts的值诗赌。而yarn.resourcemanager.am.max-attempts值默認為2汗茄。因此,在執(zhí)行kill命令A(yù)M第一次停止后铭若,Yarn將會自動啟動另一個AM/Driver洪碳。你需要第二次kill掉它。你可以在spark-submit設(shè)置--conf spark.yarn.maxAppAttempts=1 叼屠,但是你必須考慮清楚偶宫,因為如此配置后Driver失敗后將沒機會重試。
????????你不能使用yarn application -kill <applicationid>去kill作業(yè)环鲤。這個命令不會發(fā)送SIGTERM信號給container纯趋,而是幾乎同時發(fā)送SIGKILL信號。SIGTERM和SIGKILL之間的時間間隔可以使用yarn.nodemanager.sleep-delay-before-sigkill.ms (默認 250)去配置冷离。當(dāng)然吵冒,你可以增大該值,但是西剥, 在一定程度上痹栖,即使我調(diào)整到60000(1分鐘),它仍然不起作用瞭空。作業(yè)的containers幾乎是立即被kill掉揪阿,并且日志中僅包含如下內(nèi)容:

17/02/02 12:12:27 ERROR yarn.ApplicationMaster: RECEIVED SIGNAL 15: SIGTERM*
17/02/02 12:12:27 INFO streaming.StreamingContext: Invoking stop(stopGracefully=true) from shutdown hook*

????????所以,我不建議使用yarn application -kill <applicationid> 命令去發(fā)送SIGTERM信號咆畏。
????????第二個解決方案是以某種方式通知Spark Streaming應(yīng)用它需要優(yōu)雅的關(guān)閉南捂,而不是使用SIGTERM信號。一種方式是在HDFS上放一個標(biāo)識文件旧找,Spark Streaming應(yīng)用周期性的去檢測它溺健。如果標(biāo)識文件存在了,就調(diào)用scc.stop(true, true) 钮蛛。第一個true意思是Spark context需要被停止鞭缭。第二個true意思是需要優(yōu)雅的關(guān)閉,允許正在處理的消息完成魏颓。
????????至關(guān)重要的是岭辣,不要在micro-batch的代碼中調(diào)用ssc.stop(true, true),試想一下甸饱,如果你在微批代碼中調(diào)用ssc.stop(true, true)沦童,它將等待所有正在被處理的消息完成,包括當(dāng)前正在執(zhí)行的微批。但是搞动,當(dāng)前的微批不會結(jié)束躏精,直到ssc.stop(true, true)結(jié)束返回。這是一種死鎖的情況鹦肿。所以矗烛,你必須在另一個線程中執(zhí)行標(biāo)識文件檢測和調(diào)用ssc.stop(true, true)。我在github上放了一個簡單的樣例箩溃,此樣例里我在mian線程中在ssc.start()后執(zhí)行檢測和調(diào)用ssc.stop() 瞭吃。你可以在這里找到源碼。當(dāng)然涣旨,使用HDFS標(biāo)識文件僅僅是一種方法歪架,其他可選擇的方法有使用一個單獨的線程監(jiān)聽一個socket,啟動一個RESTful服務(wù)等等霹陡。
????????期待在將來的release中和蚪,Spark會考慮更優(yōu)雅的方案。比如烹棉,在Spark UI中可以增加一個按鈕攒霹,去優(yōu)雅的停止Spark Streaming作業(yè),這樣浆洗,我們就不需要憑借定制化的編碼或者使用PID和SIGTERM信號了催束。

翻譯:http://blog.parseconsulting.com/2017/02/how-to-shutdown-spark-streaming-job.html

關(guān)注公眾號:“程序員成長軟技能” ,日拱一卒伏社,功不唐捐抠刺!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市摘昌,隨后出現(xiàn)的幾起案子速妖,更是在濱河造成了極大的恐慌,老刑警劉巖第焰,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件买优,死亡現(xiàn)場離奇詭異,居然都是意外死亡挺举,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門烘跺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來湘纵,“玉大人,你說我怎么就攤上這事滤淳∥嗯纾” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铺敌。 經(jīng)常有香客問我汇歹,道長,這世上最難降的妖魔是什么偿凭? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任产弹,我火速辦了婚禮,結(jié)果婚禮上弯囊,老公的妹妹穿的比我還像新娘痰哨。我一直安慰自己,他們只是感情好匾嘱,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布斤斧。 她就那樣靜靜地躺著,像睡著了一般霎烙。 火紅的嫁衣襯著肌膚如雪撬讽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天悬垃,我揣著相機與錄音游昼,去河邊找鬼。 笑死盗忱,一個胖子當(dāng)著我的面吹牛酱床,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趟佃,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼扇谣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闲昭?” 一聲冷哼從身側(cè)響起罐寨,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎序矩,沒想到半個月后鸯绿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡簸淀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年瓶蝴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片租幕。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡舷手,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出劲绪,到底是詐尸還是另有隱情男窟,我是刑警寧澤盆赤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站歉眷,受9級特大地震影響牺六,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜汗捡,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一淑际、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凉唐,春花似錦庸追、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至簿训,卻和暖如春咱娶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背强品。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工膘侮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人的榛。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓琼了,卻偏偏與公主長得像,于是被迫代替她去往敵國和親夫晌。 傳聞我的和親對象是個殘疾皇子雕薪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359