2012-08-15 17 views
6

通常は正常に動作するEMRストリーミングジョブ(Python)があります(たとえば、10台のマシンで200個の入力を処理するなど)。私が読んでいた場合Amazon Elastic MapReduce - SIGTERM

java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 143 
at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:372) 
at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:586) 
at org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:135) 
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:57) 
at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:36) 
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:441) 
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:377) 
at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:396) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1132) 
at org.apache.hadoop.mapred.Child.main(Child.java:249) 

:しかし、私は大規模なデータセットに対してそれを実行します(入力あたり約20秒で6000個の入力の合計を処理する12機、)、クランチの2.5時間後、私は次のエラーを取得しますこれは正しく、誰かがストリーミングジョブにSIGTERMシグナルを送信したため、サブプロセスはコード143で失敗しました。

私の理解は正しいですか?もしそうなら、いつEMRインフラストラクチャーがSIGTERMを送るのですか?

+0

CloudWatchのメトリックをチェックして、ある種のIO制限が発生しているかどうかを確認しましたか?私の経験から、IO制限を打つと、奇妙なことが起こり始める。あなたのデータノードにどのインスタンスタイプを使用しているのかわかりませんが、より大きなジョブを実行するとIOパフォーマンスが向上するものにアップグレードすることをお勧めします。 – Edenbauer

+0

問題は、各タスクがCPUバインドされ、まれで散発的なI/Oがあることです。それは、S3からファイルをロードしてから約20秒間、CPUの処理が大量になります。 5秒ごとに別の(中間の)ファイルがS3に保存されます。それはいくつかの外部ライブラリ(lxml、scikit-learn)を使用していて、おそらくそのうちの1つが(メモリ消費の急増によって)私に失敗していると思っていました、そしてEMRインフラストラクチャがSIGTERMを送信していました。それを確認するために、私はEMRがプロセスを提案するケース/シナリオを理解しようとしています。 – slavi

答えて

10

私は何が起こっていたのか把握しました。他の誰かが同様の問題を経験した場合、ここにいくつかの情報があります。

私にとって重要なことは、「ジョブトラッカー」ログを見ることでした。それ(

2012-08-21 08:07:13,830 INFO org.apache.hadoop.mapred.TaskInProgress 
    (IPC Server handler 29 on 9001): Error from attempt_201208210612_0001_m_000015_0: 
    Task attempt_201208210612_0001_m_000015_0 failed to report status 
    for 601 seconds. Killing! 

だから私のコードがタイムアウトし、それが殺された次のような複数行があった

<logs folder>/daemons/<id of node running jobtracker>/hadoop-hadoop-jobtracker-XXX.log. 

:これらは下、S3上のタスクのログ/フォルダに住んでいます10分のタスクタイムアウトを超えていた)。 10分私はI/Oをやっていませんでしたが、それは確かに期待できませんでした(通常、20秒ごとにI/Oを実行します)。

この記事を発見し、私はそれから:。私たちの科学プロジェクトの一つで

http://devblog.factual.com/practical-hadoop-streaming-dealing-with-brittle-code

」を、我々はルビー上で実行して、文書を解析するためのlibxmlに依存しているいくつかのHadoopストリーミングジョブを持っている。これは、完璧を作成します悪い嵐 - ウェブは本当に悪いhtmlでいっぱいですし、libxmlは時々無限ループや完全なsegfaultsに入ります。いくつかの文書では、それは常にsegfaultsです。

それを釘付けにしました。私はこれらの "libxmlが無限ループになる"状況を経験しているに違いない(私はlibxmlをひどく使う - PythonではRubyではない)。

私にとって最後のステップは、スキップモードを起動することでした(ここでは手順:Setting hadoop parameters with boto?)。

+0

あなた自身の問題への回答を投稿していただきありがとうございます。これは、私が持っているのと同じものをデバッグするのに役立ちました。 –

+0

私はmrjob hadoopジョブを実行していましたが、元の質問に投稿されたもの以外の出力はありませんでした。これは根本的な原因(hadoop2マッパーコンテナのメモリが不足していた)を見つけるのに役立つ唯一の有用なログでした。 – jonson

1

Amazon EMRからのこの出力(「サブプロセスはコード143で失敗しました」)を実行しました。私のストリーミングジョブはPHP curlを使用して、セキュリティグループのMapReduceジョブサーバーの一部を持たないサーバーにデータを送信していました。したがって、減速機はタイムアウトして殺されました。理想的には、同じセキュリティグループに自分のジョブを追加したいのですが、私のAPIの前にURLセキュリティトークンのパラメータを追加するだけです。

関連する問題