程序員必備的分析解決問題能力:案例分享
- 2019 年 11 月 15 日
- 筆記
導讀:
無論工作還是面試,都要求有解決問題的能力,這裡給大家分享下,幫助咱們成員解決生產實踐中,遇到的實際問題。通過此小案例的分享,希望大家能夠面對問題的時候,更容易找到一些思路。
咱們VIP成員找到工作後,首先遇到的第一個難題。 有如下錯誤:
錯誤1:
java.io.FileNotFoundException: File does not exist: /user/admin/.staging/job_1571397171638_0001/job_1571397171638_0001_1.jhist
錯誤2:
org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.net.BindException: Problem binding to [0.0.0.0:0] java.net.BindException: Address already in use;
這兩個錯誤看上去差別很大,但是隨着我們一步步分析,其實找到了他們之間的關聯。
【同時額外補充的是,很多老鐵在遇到異常的時候,不是去看日誌,而是直接貼出提交任務的時候,所產生的錯誤,一般來說,這個錯誤參考價值是非常小的,一定要綜合分析。我們上面的兩個錯誤,其實是多處找到的,這個是分析錯誤的基石】
還是需要從源頭說起:
當我們提交任務的時候,通過cloudera mananger
看到了錯誤:
java.io.FileNotFoundException: File does not exist: /user/admin/.staging/job_1571397171638_0001/job_1571397171638_0001_1.jhist
它是什麼原因?為什麼會產生這個問題。
初步判斷: 1.Linux權限 2.文件到底是否存在 所以我們就從最表面的問題來開始。先看看是否有jhist文件 /user/admin/.staging/job_1571397171638_0001/job_1571397171638_0001_1.jhist 通過路徑查看,確實是沒有,可是為什麼會沒有這個文件。
這時候,我們就需要補充知識了:
每個job有兩個文件:job.jhist和job.xml,job.jhist是作業運行過程的詳細記錄,格式為json。job.xml是作業的配置文件
在排查的過程中,我們看到了job.xml文件,可是為什麼沒有jhist,由於它是作業運行過程的詳細記錄,所以既然沒有這個詳細記錄,有哪些原因? 1.沒生成job 2.生成受阻,導致不能文件文件。也就是權限問題
如何解決:
首先檢測了權限,這個是沒有問題的。因此可以排除。 接着我們就要看為什麼沒有生成job. 既然沒有生成job,那麼resourcemanger和nodemanager日誌又是怎麼表現的那? 所以又提交了一個job,通過命令
tail -f *.log
監控日誌。可是這裏面發現了神奇的事情 ResourceManager是有日誌的,NodeManager竟然沒有日誌運行。 這時候,我們就判斷,是任務沒有下發 既然沒有下發,怎麼可能生成jhist那,所以對於找不到jhist,文件這個就可以理解了。 /user/admin/.staging/job_1571397171638_0001/job_1571397171638_0001_1.jhist 所以為什麼沒有下發,這裏面jhist,只是被引發的錯誤,它還不是根本的錯誤。 /user/admin/.staging/job_1571397171638_0001/job_1571397171638_0001_1.jhist 因此我們這裡又定位到了,第二個錯誤,那麼有可能它就是根本的錯誤,也就是因為它導致任務不能下發。 org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.net.BindException: Problem binding to [0.0.0.0:0] java.net.BindException: Address already in use; 看到上面錯誤,我們就可以判斷,這是網絡問題,然而網絡無非是ip地址,防火牆,端口,hosts等。ip地址、防火牆和端口這是非常容易排查的,而且我們這個發生問題的集群是可以正常運行的,所以這個防火牆,端口等問題排除。 那隻能看看hosts了,對於hosts我們打開後,發現一個奇怪的問題。 我們正常的hosts是這樣的

然而我們待解決問題的集群,確實類似這樣的,也就是多了127.0.0.1 master

我們注釋掉127.0.0.1 master,然後嘗試運行job。結果就是這個問題。至此問題解決。
總結
在回頭復盤想想,我們找不到jhist,跟我們的網絡問題二者是很難找到關聯的,所以大家在遇到問題的時候,一定多排查和思考,而不是看到一個錯誤,就以為是它的問題。要追根溯源,找到真正問題的原因所在。