スキップしてコンテンツを表示

Amazon EMR の Spark で発生する、ExecutorLostFailure: Slave lost エラーの解決方法を教えてください。

所要時間2分
0

Apache Spark アプリケーションを Amazon EMR クラスターに送信しましたが、アプリケーションで ExecutorLostFailure: Slave lostエラーが発生し、失敗しました。

解決策

ノードが削除されたか使用できなくなったことが原因で Spark タスクが失敗した場合、次のエラーが表示されることがあります。

「Most recent failure: Lost task 1209.0 in stage 4.0 (TID 31219, ip-###-###-##-###.compute.internal, executor 115): ExecutorLostFailure (executor 115 exited caused by one of the running tasks) Reason: Slave lost」

このエラーは、次のような原因で発生する場合があります。

正常ではないノードが原因で、ディスク使用率が増加している

Apache Hadoop では、NodeManager はクラスターのノードに接続されている Amazon Elastic Block Store (Amazon EBS) ボリュームを定期的にチェックします。1 つのボリュームを持つノードでのディスク使用率が YARN のプロパティ yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage を超えると、NodeManager はそのノードを異常と見なします。その後、ResourceManager はそのノード上のすべてのコンテナをシャットダウンし、新しいコンテナをスケジュールしなくなります。詳細については、Apache Hadoop のウェブサイトで「NodeManager」を参照してください。

異常なノードが原因で ResourceManager が複数のエグゼキューターをシャットダウンした後、アプリケーションで ExecutorLostFailure: Slave lost エラーが発生し、失敗します。ノードが異常であることを確認するには、NodeManager ログまたはインスタンスコントローラーのログを確認します。yarn-env.sh 内の YARN_LOG_DIR 変数が NodeManager ログの場所を定義します。インスタンスコントローラーのログは、プライマリノードの /emr/instance-controller/log/instance-controller.log に保存されます。インスタンスコントローラーのログには、クラスターのすべてのノードが集約されて表示されます。

異常なノードには、次のようなログエントリが表示されます。

2019-10-04 11:09:37,163 INFO Poller: InstanceJointStatusMap contains 40 entries (R:40):  i-006ba######  1829s R   1817s ig-3B ip-###-##-##-### I:    7s Y:U    11s c: 0 am:    0 H:R  0.0%Yarn unhealthy Reason : 1/1 local-dirs are bad: /mnt/yarn; 1/1 log-dirs are bad: /var/log/hadoop-yarn/containers
  i-00979######  1828s R   1817s ig-3B ip-###-##-##-### I:    7s Y:R     9s c: 3 am: 2048 H:R  0.0%
  i-016c4######  1834s R   1817s ig-3B ip-###-##-##-### I:   13s Y:R    14s c: 3 am: 2048 H:R  0.0%
  i-01be3######  1832s R   1817s ig-3B ip-###-##-##-### I:   10s Y:U    12s c: 0 am:    0 H:R  0.0%Yarn unhealthy Reason : 1/1 local-dirs are bad: /mnt/yarn; 1/1 log-dirs are bad: /var/log/hadoop-yarn/containers

この問題を解決するには、コアノードとタスクノードにアタッチされた EBS ボリュームのサイズを増やします。または、Hadoop 分散ファイルシステム (HDFS) から使用していないデータを削除します。

スポットインスタンス

Amazon EMR クラスターノードに Amazon Elastic Compute Cloud (EC2) スポットインスタンスを使用していて、いずれかのインスタンスが削除されると、ExecutorLostFailure: Slave lost エラーが発生する場合があります。スポットインスタンスは次の理由で削除される可能性があります。

  • スポットインスタンスの価格が上限価格を超過した。
  • 使用可能な EC2 インスタンスがスポットインスタンスの需要を満たしていない。

詳細については、「スポットインスタンスの中断」を参照してください。

この問題を解決するには、オンデマンドインスタンスを使用してください。または、Amazon EMR リリースバージョン 5.11.0 以前を使用している場合は、最新バージョンにアップグレードしてください。

Amazon EC2 Auto Scaling のポリシー

Auto Scaling イベントが頻繁に発生すると、新しいノードが前のノードが使用していた IP アドレスを取得する可能性があります。スケールインイベント中に Spark アプリケーションが実行された場合、Spark はデコミッションされたノードを拒否リストに追加して、エグゼキューターがそのノードで起動することを防ぎます。別のスケールアウトイベントが発生し、新しいノードがデコミッションされたノードと同じ IP アドレスを取得した場合、YARN は新しいノードを有効と見なします。YARN は新しいノードでエグゼキューターをスケジュールしようとします。ノードが Spark 拒否リストに残っているため、エグゼキューターの起動は失敗します。障害が最大回数に達すると、Spark アプリケーションで ExecutorLostFailure: Slave lost エラーが発生し、失敗します。

この問題を解決するには、次の手順を実行します。

Spark の拒否リストからノードを削除するには、Spark と YARN のタイムアウトプロパティを減らします。次の手順を実行します。

  1. /etc/spark/conf/spark-defaults.conf ファイルに次のパラメータを追加します。
    spark.blacklist.decommissioning.timeout 600s
    注: これにより、decommissioning (デコミッション中) 状態のノードが拒否リストに保持される時間が短縮されます。デフォルトは 1 時間です。詳細については、「ノードのデコミッション動作を設定する」を参照してください。
  2. /etc/hadoop/conf/yarn-site.xml 内の次の YARN プロパティを変更します。
    yarn.resourcemanager.nodemanager-graceful-decommission-timeout-secs 600
    注: このプロパティは、デコミッション中のノードが decommissioned (デコミッション済み) 状態に移行する前に、実行中のコンテナとアプリケーションが完了するまでの待機時間を指定します。デフォルトは 3,600 秒です。

詳細については、「Amazon EMR における伸縮性と耐障害性に向けた Spark の改良」を参照してください。

関連情報

Amazon EMR クラスターのインスタンスタイプの設定および、スポットインスタンスのベストプラクティス

Amazon EMR の Spark ジョブにおけるステージエラーの問題を解決する方法を教えてください

AWS公式更新しました 2年前
コメントはありません

関連するコンテンツ