在Hadoop上調試HadoopStreaming程式的方法詳解 by 道凡

來源:互聯網
上載者:User

點擊查看原文

Hadoop提供若干種在調試HadoopStreaming的方法,供你使用,方便你快速定位問題。

  • 讓HadoopStreaming程式跑在開發機上。(推薦在開發時使用)
    在jobconf中加上mapred.job.tracker=local。資料的輸入和輸出都是來自HDFS
    此時,HadoopStreaming會在本地運行程式
  •  保留出錯的現場(推薦在跑大資料量時使用)
    通過設定jobconf參數keep.failed.task.files=true,當程式出錯時,可以保留現以供
    Debug。可以通過GUI查到到具體是在哪個節點運行失敗,然後登陸到該節點<local>/taskTracker/<taskid>/work/ ,查看core檔案。
  •  通過script程式收集資訊來偵錯工具(推薦在開發時使用)
    編寫調試指令碼程式,通過指令碼,可以把程式執行過程中任何現場都保留下來,比如
    Core檔案的堆棧資訊,這樣可以確定程式具體是在什麼地方出錯。
    指令碼的調用方式如下:

    $script $stdout $stderr $syslog $jobconf 程式名

    (註:在官方文檔
    http://wiki.apache.org/hadoop/HowToDebugMapReducePrograms 描述中程式名會通過第5個參數返回,但筆者在Hadoop 0.19的測試環境中,得到這個參數是空的。)
    指令碼樣本:

    core=`find . -name 'core*'`;cp $core /home/admin/gdb -quiet ./a.out -c $core -x ./pipes-default-gdb-commands.txt

    pipes-default-gdb-commands.txt註明了執行的gdb命令

    info threadsbacktracequit

    (註明:如果要正確執行以上的指令碼,必須讓程式能輸出core檔案,可以在程式中加入如下程式碼片段)

    struct rlimit limit;limit.rlim_cur = 65535;limit.rlim_max = 65535;if (setrlimit(RLIMIT_CORE, &limit) != 0) {    printf("setrlimit() failed with errno=%s\n", strerror(errno));    exit(1);}

    然後在jobconf中,把要執行的script賦給變數”mapred.map.task.debug.script”或”mapred.reduce.task.debug.script”。 這樣當HadoopStreaming執行過程發生core dump,就可以通過JobTracker的GUI介面看到GDB的資訊了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.