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 のタイムアウトプロパティを減らします。次の手順を実行します。
- /etc/spark/conf/spark-defaults.conf ファイルに次のパラメータを追加します。
spark.blacklist.decommissioning.timeout 600s
注: これにより、decommissioning (デコミッション中) 状態のノードが拒否リストに保持される時間が短縮されます。デフォルトは 1 時間です。詳細については、「ノードのデコミッション動作を設定する」を参照してください。
- /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 ジョブにおけるステージエラーの問題を解決する方法を教えてください