Mapreduceスクリプトをデバッグしたいのですが、多くのトラブルを起こすことなく、プログラムにprintステートメントを入れようとしました。しかし、私はログのいずれかでそれらを見つけることができないようです。
実際には、stdoutはnon-map reduceクラスのSystem.out.println()
のみを表示します。
MapフェーズとreduceフェーズのSystem.out.println()
は、ログで確認できます。ログにアクセスする簡単な方法は
http:// localhost:50030/jobtracker.jsp- >完了したジョブをクリックします->マップをクリックするかタスクを減らします->タスク番号をクリックします->タスクログ- > stdoutログ。
お役に立てれば
別の方法は、ターミナルを使用することです。
1) Hadoop_Installtionディレクトリに移動し、次に"logs/userlogs"に移動します。
2) job_idディレクトリを開きます。
3) マッパー出力が必要な場合は_ m_でディレクトリを確認し、レデューサーを探している場合は_ r _でディレクトリを確認します。
例:Hadoop-20.2.0の場合:
> ls〜/ hadoop-0.20.2/logs/userlogs/attempt_201209031127_0002_m_000000_0 / log.index stderr stdout syslog
上記の意味:
Hadoop_Installation:〜/ hadoop-0.20.2
job_id:job_201209031127_0002
_ m_:マップタスク、「マップ番号」:_000000_
4) open stdout "system.out.println"を使用した場合、またはstderr "system.err.append"を使用した場合。
PS。他のhadoopバージョンは、視覚的に異なる階層を持つかもしれませんが、それらはすべて$ Hadoop_Installtion/logs/userlogsの下にある必要があります。
yarn
を含むHadoopクラスターでは、stdoutを含むログを次のように取得できます。
_yarn logs -applicationId application_1383601692319_0008
_
何らかの理由で、これがWebインターフェイスで表示されるものよりも完全であることがわかりました。 Webインターフェースは、System.out.println()
の出力をリストしませんでした。
コンソールでstdoutとログメッセージを取得するには、Apache commonsのロギングフレームワークをマッパーとリデューサーに使用できます。
public class MyMapper extends Mapper<..,...,..,...> {
public static final Log log = LogFactory.getLog(MyMapper.class)
public void map() throws Exception{
// Log to stdout file
System.out.println("Map key "+ key);
//log to the syslog file
log.info("Map key "+ key);
if(log.isDebugEanbled()){
log.debug("Map key "+ key);
}
context.write(key,value);
}
}