Asakusa Framework Advent Calendar 2014の6日目、昨日の話題の続きです。
AsakusaFWはJavaで動いているので、例として、Javaで例外が起きた際の質問を考えてみます。
回答する側から考えると、最低限必要なのは、例外クラス名、メッセージ内容、発生箇所。つまりスタックトレースです。
例外が発生した箇所のソースや実行に使ったデータも欲しいところですが、場合によりけり。最近だとgistに貼るといった手も使えます。
また、実行環境の情報も重要です。
どのバージョンを使っているのか。AsakusaFWに関係しそうなのは、Javaのバージョン、AsakusaFWのバージョン、Hadoopのバージョン(MapR・CDH・HDP・Apache、hadoop1系かhadoop2系か)等。
テスト実行時の話なのか、Hadoopクラスターで動かしたのか。スモールジョブ実行エンジンを使っているか。
例外が出ていたログはHadoopクライアント(YAESS)なのか、スレーブノードなのか。
コンパイル環境の情報は、Javaの場合はWrite Once, Run Anywhereなので、よほど稀なバグでもない限り、ひとまず不要かなぁ。
こういった情報は、質問する側からすると(長いし面倒だし自分の中では当たり前だしで)省略しがちですが、回答する側からすると分からないとどうしようもないです。
質問者の頭の中を超能力で探らないと回答できないという事から、「超能力者じゃないから分からない」と言われたりします^^;
日本では(?)超能力が使える人間は少ない為、基本的な情報が足りない質問には回答が付かないことが多いです。
(もしくは、「もっと情報を書け」と言うだけの回答になってしまう。回答者としても、わざわざそんな角が立つような回答をしたくないので、結局返答する人は誰も居ない、という状態になってしまいますorz)
また、質問内容に自分の推測を加えることは良いことだと思います。
しかし、推測だけ書いて上記のような基本的な情報を省略してしまうと、超能力が必要になってしまいます。
かと言って、情報が多すぎても全部に目を通すのは大変だし(結局読み飛ばされてしまう)、バランスは難しいですね(苦笑)
ログのどの部分を掲示すべきかにもコツがあります。
AsakusaFWの場合、スレーブノードで例外が発生したら、YAESS(Hadoopクライアント側)のログには、Hadoopが失敗した旨(com.asakusafw.yaess.basic.ExitCodeException: Unexpected exit code from Hadoop job: code=1
(hadoopコマンドの戻り値が0以外である))しか出ないことがあります。それしか出ていないようなら、スレーブノードのログも見たいところです。
また、他のスレーブでの実行を止めるためのキャンセルが発行され、これもスタックトレースとして出力されます(java.util.concurrent.CancellationException: null
やjava.lang.InterruptedException: null
)が、原因究明の役には立ちません。
例外(スタックトレース)が複数出ている場合は、大抵は一番先頭のものが一番重要です。
また、その前後に、(スタックトレースとは別に)原因に関係するログメッセージが出ているかもしれません。
なお、情報の出し方には注意が必要です。
基本的にはログやデータをそのまま掲示すべきですが、そういう訳にもいきません。
スタックトレースにはクラス名がFQCNで出力される為、パッケージ名が出ます。業務で作っているプログラムの場合はパッケージ名に会社名やプロジェクト名が含まれていることが多いでしょう。秘密にしたい場合は要注意です。
また、ログやデータの中に人名やIPアドレス・パスワード(!)といった固有の情報が含まれていないかチェックすべきですね。
メーリングリストや掲示板は関係者以外にも公開されるので、公開するとまずそうな情報はマスクしたり置換したりしましょう。
(たまに、マスク前のデータが障害の原因や手がかりになっている事があって、その場合は回答者には分からない、ということになってしまうのですが…)
そういったことを出来ない場合は、一般のメーリングリストや掲示板を使うのではなく、そのプロダクトに詳しい企業のサポートを受けた方が良いでしょう。
最近はOSSのプロダクトをサポートしている会社も多いので、サポート契約をしたいと言えば 喜んで受けてくれると思います(笑)
その場合でも、超能力を発揮しなければ回答できないような質問の仕方はやめるべきだと思いますが。
(サポートの仕事は問題解決を手伝うことであり、超能力を発揮したり質問の仕方を教育したりすることではないんですよねー)
※コメント投稿者のブログIDはブログ作成者のみに通知されます