私のApache Spark=クラスターは、たくさんのexecutorタイムアウトを与えているアプリケーションを実行しています:
10:23:30,761 ERROR ~ Lost executor 5 on slave2.cluster: Executor heartbeat timed out after 177005 ms
10:23:30,806 ERROR ~ Lost executor 1 on slave4.cluster: Executor heartbeat timed out after 176991 ms
10:23:30,812 ERROR ~ Lost executor 4 on slave6.cluster: Executor heartbeat timed out after 176981 ms
10:23:30,816 ERROR ~ Lost executor 6 on slave3.cluster: Executor heartbeat timed out after 176984 ms
10:23:30,820 ERROR ~ Lost executor 0 on slave5.cluster: Executor heartbeat timed out after 177004 ms
10:23:30,835 ERROR ~ Lost executor 3 on slave7.cluster: Executor heartbeat timed out after 176982 ms
ただし、私の構成では、executorのハートビート間隔を正常に延長したことを確認できます。
EXITED
(つまり、ドライバーがハートビートを取得できなかったときにドライバーを削除した)とマークされたエグゼキューターのログにアクセスすると、エグゼキューターはドライバーからタスクを受け取らなかったために自分自身を殺したようです:
16/05/16 10:11:26 ERROR TransportChannelHandler: Connection to /10.0.0.4:35328 has been quiet for 120000 ms while there are outstanding requests. Assuming connection is dead; please adjust spark.network.timeout if this is wrong.
16/05/16 10:11:26 ERROR CoarseGrainedExecutorBackend: Cannot register with driver: spark://[email protected]:35328
ハートビートをオフにしたり、エグゼキュータのタイムアウトを防ぐにはどうすればよいですか?
答えはかなり簡単でした。 spark-defaults.conf
で、spark.network.timeout
をより高い値に設定しました。ハートビートの間隔は問題とは無関係です(ただし、チューニングは便利です)。
spark-submit
を使用するとき、次のようにタイムアウトを設定することもできました。
$SPARK_HOME/bin/spark-submit --conf spark.network.timeout 10000000 --class myclass.neuralnet.TrainNetSpark --master spark://master.cluster:7077 --driver-memory 30G --executor-memory 14G --num-executors 7 --executor-cores 8 --conf spark.driver.maxResultSize=4g --conf spark.executor.heartbeatInterval=10000000 path/to/my.jar
YARNによって殺されるハートビートとエグゼキューターの欠落は、ほとんど常にOOMが原因です。個々のエグゼキュータのログを調べる必要があります(「物理メモリを超えて実行中」というテキストを探してください)。多数のエグゼキューターがあり、すべてのログを手動で検査するのが面倒な場合は、実行中にSpark UIでジョブを監視することをお勧めします。タスクが失敗するとすぐに、いくつかのタスクは、既に強制終了されたエグゼキューターの欠落による失敗を報告するので、個々の失敗したタスクのそれぞれの原因を確認してください。
また、ほとんどのOOMの問題は、コード内の適切な場所でデータを再パーティションするだけで迅速に解決できることに注意してください(呼び出しの必要性がある場所についてのヒントについては、Spark UIをもう一度見てくださいrepartition
)。それ以外の場合は、メモリの必要性に対応するためにマシンをスケールアップすることができます。