您好,登錄后才能下訂單哦!
本節(jié)介紹兩種調(diào)試Hadoop源代碼的方法:利用Eclipse遠(yuǎn)程調(diào)試工具和打印調(diào)試日志。這兩種方法均可以調(diào)試偽分布式工作模式和完全分布式工作模式下的Hadoop。本節(jié)主要介紹偽分布式工作模式下的Hadoop調(diào)試方法。
(1)利用Eclipse進(jìn)行遠(yuǎn)程調(diào)試
下面以調(diào)試ResourceManager為例,介紹利用Eclipse遠(yuǎn)程調(diào)試的基本方法,這可分兩步進(jìn)行。
步驟1 調(diào)試模式下啟動Hadoop。
在Hadoop安裝目錄下運(yùn)行如下的Shell腳本:
export YARN_NODEMANAGER_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8788, server=y,suspend=y"
sbin/start-all.sh
運(yùn)行了腳本后會看到Shell命令行終端顯示如下信息:
Listening for transport dt_socket at address: 8788
此時表明ResourceManager處于監(jiān)聽狀態(tài),直到收到debug確認(rèn)信息。
步驟2 設(shè)置斷點(diǎn)。
在前面新建的Java工程“hadoop-2.0”中,找到ResourceManager相關(guān)代碼,并在感興趣的地方設(shè)置一些斷點(diǎn)。
步驟3 在Eclipse中調(diào)試Hadoop程序。
在Eclipse的菜單欄中,依次選擇 “Run”→“Debug Configurations”→“Remote Java Applications”,并按照要求填寫遠(yuǎn)程調(diào)試器名稱(自己定義一個即可),ResourceManager所在host以及監(jiān)聽端口號等信息,并選擇Hadoop源代碼工程,便可進(jìn)入調(diào)試模式。
調(diào)試過程中,ResourceManager輸出的信息被存儲到日志文件夾下的yarn-XXX-resourcemanager-localhost.log文件(XXX為當(dāng)前用戶名)中,可通過以下命令查看調(diào)試過程中打印的日志:
tail -f logs/yarn-XXX-resourcemanager-localhost.log
(2)打印Hadoop調(diào)試日志
Hadoop使用了Apache log4j作為基本日志庫,該日志庫將日志分別5個級別,分別為DEBUG、INFO、WARN、ERROR和FATAL。這5個級別是有順序的,即DEBUG < INFO < WARN < ERROR < FATAL,分別用來指定日志信息的重要程度。日志輸出規(guī)則為:只輸出級別不低于設(shè)定級別的日志信息,比如若級別設(shè)定為INFO,則INFO、WARN、ERROR和FATAL級別的日志信息都會輸出,但級別比INFO低的DEBUG則不會輸出。
在Hadoop源代碼中,大部分Java文件中存在調(diào)試日志(DEBUG級別日志),但默認(rèn)情況下,日志級別是INFO,為了查看更詳細(xì)的運(yùn)行狀態(tài),可采用以下幾種方法打開DEBUG日志。
方法1 使用Hadoop Shell命令。
可使用Hadoop腳本中的daemonlog命令查看和修改某個類的日志級別,比如,可通過以下命令查看NodeManager類的日志級別:
bin/hadoop daemonlog -getlevel ${nodemanager-host}:8042 \
org.apache.hadoop.yarn.server.nodemanager.NodeManager
可通過以下命令將NodeManager類的日志級別修改為DEBUG:
bin/hadoop daemonlog -setlevel ${nodemanager-host}:8042 \
org.apache.hadoop.yarn.server.nodemanager.NodeManager DEBUG
其中,nodemanager-host為NodeManager服務(wù)所在的host,8042是NodeManager的HTTP端口號。
方法2 通過Web界面。
用戶可以通過Web界面查看和修改某個類的日志級別,比如,可通過以下URL修改NodeManager類的日志級別:
http://${nodemanager-host}:8042/logLevel
方法3 修改log4j.properties文件。
以上兩種方式只能暫時修改日志級別,當(dāng)Hadoop重啟后會被重置,如果要永久性改變?nèi)罩炯墑e,可在目標(biāo)節(jié)點(diǎn)配置目錄下的log4j.properties文件中添加以下配置選項(xiàng):
log4j.logger.org.apache.hadoop.yarn.server.nodemanager.NodeManager=DEBUG
此外,有時為了專門調(diào)試某個Java文件,需要把該文件的相關(guān)日志輸出到一個單獨(dú)文件中,可在log4j.properties中添加以下內(nèi)容:
#定義輸出方式為自定義的TTOUT
log4j.logger. org.apache.hadoop.yarn.server.nodemanager.NodeManager=DEBUG,TTOUT
#設(shè)置TTOUT的輸出方式為輸出到文件
log4j.appender.TTOUT =org.apache.log4j.FileAppender
#設(shè)置文件路徑
log4j.appender.TTOUT.File=${hadoop.log.dir}/NodeManager.log
#設(shè)置文件的布局
log4j.appender.TTOUT.layout=org.apache.log4j.PatternLayout
#設(shè)置文件的格式
log4j.appender.TTOUT.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
這些配置選項(xiàng)會把NodeManager.java中的DEBUG日志寫到日志目錄下的NodeManager.log文件中。
在閱讀源代碼的過程中,為了跟蹤某個變量值的變化,讀者可能需要自己添加一些DEBUG日志。在Hadoop源代碼中,大部分類會定義一個日志打印對象,通過該對象可打印各個級別的日志。比如,在NodeManager中用以下代碼定義對象LOG:
public static final Log LOG = LogFactory.getLog(NodeManager.class);
用戶可使用LOG對象打印調(diào)試日志。比如,可在NodeManager的main函數(shù)首行添加以下代碼:
LOG.debug("Start to lauch NodeManager...");
然后重新編譯Hadoop源代碼,并將org.apache.hadoop.yarn.server.nodemanager.NodeManager的調(diào)試級別修改為DEBUG,重新啟動Hadoop后便可以看到該調(diào)試信息。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。