簡體   English   中英

如何從eclipse調試hadoop mapreduce作業?

[英]How to debug hadoop mapreduce jobs from eclipse?

我在單機,僅限本地的設置中運行hadoop,我正在尋找一種在eclipse中調試映射器和減速器的一種不錯的,無痛的方法。 Eclipse運行mapreduce任務沒有問題。 但是,當我去調試時,它給了我這個錯誤:

12/03/28 14:03:23 WARN mapred.JobClient:沒有工作jar文件集。 可能找不到用戶類。 請參閱JobConf(Class)或JobConf#setJar(String)。

好的,我做了一些研究。 顯然,我應該使用eclipse的遠程調試工具,並將其添加到我的hadoop-env.sh

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5000

我這樣做,我可以在eclipse中逐步完成我的代碼。 唯一的問題是,由於“suspend = y”,我無法使用命令行中的“hadoop”命令來執行查看作業隊列等操作; 它掛起,我想象,因為它正在等待調試器附加。 此外,當我處於這種模式時,我無法運行“hbase shell”,可能是出於同樣的原因。

所以基本上,如果我想在“調試模式”和“正常模式”之間來回切換 ,我需要更新hadoop-env.sh並重新啟動我的機器。 主要的痛苦。 所以我有幾個問題:

  1. 有沒有更簡單的方法在eclipse中調試mapreduce作業?

  2. 為什么eclipse可以很好地運行我的mapreduce作業,但是對於調試我需要使用遠程調試?

  3. 有沒有辦法告訴hadoop使用遠程調試mapreduce作業,但是在正常模式下操作所有其他任務? (例如“hadoop queue”“hbase shell” )。

  4. 有沒有更簡單的方法來切換hadoop-env.sh配置而無需重新啟動我的機器? hadoop-env.sh默認情況下不可執行。

  5. 這是一個更普遍的問題:當我在僅本地模式下運行hadoop時究竟發生了什么? 我的機器上是否有任何“始終打開”並執行hadoop作業的進程? 或者,當我從命令行運行“hadoop”命令時,hadoop只執行操作嗎? 當我從eclipse運行mapreduce工作時,eclipse正在做什么? 我必須在我的pom.xml中引用hadoop-core才能使我的項目工作。 eclipse是否將作業提交給我已安裝的hadoop實例,還是以某種方式從我的maven緩存中的hadoop-core-1.0.0.jar運行它?

這是我的主要課程:

public class Main {
      public static void main(String[] args) throws Exception {     
        Job job = new Job();
        job.setJarByClass(Main.class);
        job.setJobName("FirstStage");

        FileInputFormat.addInputPath(job, new Path("/home/sangfroid/project/in"));
        FileOutputFormat.setOutputPath(job, new Path("/home/sangfroid/project/out"));

        job.setMapperClass(FirstStageMapper.class);
        job.setReducerClass(FirstStageReducer.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);

        System.exit(job.waitForCompletion(true) ? 0 : 1);
      }
}

/bin/hadoophadoop-env.sh )腳本中進行更改。 檢查已觸發的命令。 如果命令是jar ,則只添加遠程調試配置。

if [ "$COMMAND" = "jar" ] ; then
  exec "$JAVA" -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8999 $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"
else
  exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "$@"
fi

在eclipse中調試hadoop的唯一方法是在本地模式下運行hadoop。 原因是,每個map reduce任務在ist自己的JVM中運行,當你沒有在本地模式下運行時,eclipse將無法調試。

當您將hadoop設置為本地模式時,而不是使用hdfs API (這是默認值),hadoop文件系統將更改為file:/// 因此,運行hadoop fs -ls將不是hdfs命令,而是更多的hadoop fs -ls file:/// ,這是本地目錄的路徑。 JobTracker或NameNode都不會運行。

這些博文可能會有所幫助:

Jumbune的調試器將以最小的努力完成所有這些工作。

調試器提供MapReduce作業的代碼級控制流統計信息。

用戶可以應用正則表達式驗證或其自己的用戶定義的驗證類。 根據應用的驗證,Flow Debugger分別檢查mapper和reducer的數據流。

它還提供了一個全面的表/圖表視圖,其中輸入記錄流在作業級別,MR級別和實例級別顯示。 不匹配的鍵/值表示作業執行結果中錯誤的鍵/值數據的數量。 調試器深入到代碼中來檢查各種計數器的數據流,如循環和條件if,else-if等。

Jumbune是開源的,可在www.jumbune.org和https://github.com/impetus-opensource/jumbune獲取。

除了推薦的MRUnit,我也喜歡用eclipse進行調試。 我有一個主程序。 它實例化一個Configuration並直接執行MapReduce作業。 我只是使用標准的eclipse Debug配置進行調試。 因為我在我的mvn規范中包含了hadoop jar,所以我在我的類路徑中都有hadoop本身,我沒有必要在我安裝的hadoop上運行它。 我總是使用本地目錄中的小數據集進行測試,以簡化操作。 配置的默認值表現為獨立的hadoop(文件系統可用)

我也喜歡通過MRUnit的單元測試進行調試。 我將結合批准測試使用它,這可以輕松地顯示Map Reduce過程,並且可以輕松傳遞失敗的場景。 它也可以從eclipse無縫運行。

例如:

HadoopApprovals.verifyMapReduce(new WordCountMapper(), 
                         new WordCountReducer(), 0, "cat cat dog");

會產生輸出:

[cat cat dog] 
-> maps via WordCountMapper to ->
(cat, 1) 
(cat, 1) 
(dog, 1)

-> reduces via WordCountReducer to ->
(cat, 2) 
(dog, 1)

這里有一個關於這個過程的視頻: http//t.co/leExFVrf

向hadoop的內部java命令添加args可以通過HADOOP_OPTS env變量完成:

export HADOOP_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=5005,suspend=y"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM