入力エラーと出力エラー - Amazon EMR

入力エラーと出力エラー

次は、クラスターの入力および出力オペレーションに共通するエラーです。

Amazon Simple Storage Service (Amazon S3) へのパスに少なくとも 3 つのスラッシュがありますか?

Simple Storage Service (Amazon S3) バケットを指定するときは、終了スラッシュを URL の末尾に付ける必要があります。例えば、バケットを「s3n://DOC-EXAMPLE-BUCKET1」として参照するのではなく、「s3n://DOC-EXAMPLE-BUCKET1/」を使用する必要があります。スラッシュを付けないと、Hadoop では、ほとんどの場合、クラスターが失敗します。

入力ディレクトリを再帰的に走査しようとしていませんか?

Hadoop では、入力ディレクトリでファイルが再帰的に検索されることはありません。/corpus/01/01.txt、/corpus/01/02.txt、/corpus/02/01.txt のようなディレクトリ構造で、入力パラメータとして /corpus/ をクラスターに指定しても、Hadoop は入力ファイルを検出しません。/corpus/ ディレクトリが空で、Hadoop はサブディレクトリのコンテンツをチェックしないからです。同様に、Simple Storage Service (Amazon S3) バケットのサブディレクトリも Hadoop が再帰的に確認することはありません。

入力ファイルは、サブディレクトリではなく、指定する入力ディレクトリまたは Simple Storage Service (Amazon S3) バケットに直接配置されている必要があります。

出力ディレクトリが存在していませんか?

既に存在する出力パスを指定すると、Hadoop では、ほとんどの場合、クラスターが失敗します。つまり、クラスターを一度実行してから、まったく同じパラメータを指定して再度実行すると、おそらく最初は動作しますが、その後は動作しなくなります。最初の実行後、出力パスが存在するようになり、これにより以降の実行がすべて失敗するからです。

HTTP URL を使用してリソースを指定しようとしていませんか?

Hadoop では、http:// プレフィックスを使用して指定されたリソースの場所は認識されません。したがって、HTTP URL を使用したリソースを参照することはできません。たとえば、http://mysite/myjar.jar を JAR パラメータとして渡すと、クラスターは失敗します。

Simple Storage Service (Amazon S3) バケットの参照に使用している名前のフォーマットが無効ではありませんか?

Amazon EMR で「DOC-EXAMPLE-BUCKET1.1」のようなバケット名を使用しようとすると、クラスターが失敗します。Amazon EMR では、バケット名を有効な RFC 2396 ホスト名にする必要があるためです。名前の末尾に数値を使用することはできません。さらに、Hadoop の要件により、Amazon EMR で使用する Simple Storage Service (Amazon S3) バケット名に含めることができるのは、小文字、数値、ピリオド (.)、およびハイフン (-) に限られます。Simple Storage Service (Amazon S3) バケット名の形式を設定する方法の詳細については、「Amazon Simple Storage Service ユーザーガイド」の「バケットの制約と制限」を参照してください。

Simple Storage Service (Amazon S3) との間でのデータの読み込みで問題が発生しますか?

Simple Storage Service (Amazon S3) は、Amazon EMR の最も一般的な入力と出力のソースです。よくある間違いは、一般的なファイルシステムと同様に Simple Storage Service (Amazon S3) を扱うことです。Simple Storage Service (Amazon S3) とファイルシステムの間には、クラスターの実行時に考慮する必要がある差異があります。

  • Simple Storage Service (Amazon S3) で内部エラーが発生した場合、アプリケーションでそのエラーを正しく処理し、オペレーションを再試行する必要があります。

  • Simple Storage Service (Amazon S3) への呼び出しからの応答に時間がかかりすぎる場合、アプリケーションが Simple Storage Service (Amazon S3) を呼び出す頻度を減らすことが必要な場合があります。

  • Simple Storage Service (Amazon S3) バケット内のすべてのオブジェクトの一覧表示は、負荷の高い呼び出しです。呼び出しを行う回数を最小限に抑えることがアプリケーションに要求されます。

クラスターと Simple Storage Service (Amazon S3) の対話を改善できる方法はいくつかあります。

  • 最新のリリースバージョンの Amazon EMR を使用してクラスターを起動します。

  • Simple Storage Service (Amazon S3) との間でのオブジェクトの移動に S3DistCp を使用します。S3DistCp は、Simple Storage Service (Amazon S3) の要件に適合するエラー処理、再試行、およびバックオフを実装します。詳細については、「S3DistCp を使用した分散コピー」を参照してください。

  • 結果整合性を念頭に置いてアプリケーションを設計します。クラスターの実行中の中間データストレージには HDFS を使用し、初期データの入力と最終結果の出力にのみ Simple Storage Service (Amazon S3) を使用します。

  • クラスターが 1 秒あたり 200 以上のトランザクションを Simple Storage Service (Amazon S3) にコミットする場合は、サポートに問い合わせて、1 秒あたりのトランザクション数の増大に対応するようにバケットを用意し、「Amazon S3 performance tips & tricks」で説明されているキーパーティション方式を使用することを検討してください。

  • Hadoop 設定の io.file.buffer.size を 65536 に設定します。この設定により、Hadoop で Simple Storage Service (Amazon S3) オブジェクトの検索にかかる時間が短縮されます。

  • クラスターで Simple Storage Service (Amazon S3) の並行処理問題が発生する場合、Hadoop の投機的実行機能の無効化を検討してください。この無効化は遅いクラスターのトラブルシューティングにも役立ちます。そのためには、mapreduce.map.speculative および mapreduce.reduce.speculative プロパティを false に設定します。クラスターを起動するときに、mapred-env 設定分類を使用してこれらの値を設定できます。詳細については、「Amazon EMR リリースガイド」の「アプリケーションの設定」を参照してください。

  • Hive クラスターを実行している場合、「Simple Storage Service (Amazon S3) と Hive の間でのデータの読み込みで問題が発生しますか?」を参照してください。

詳細については、「Amazon Simple Storage Service ユーザーガイド」の「Amazon S3 のエラーに関するベストプラクティス」を参照してください。