(著者: 陳 玉嵩データマスター)
Spark-SQL タスクが実行中にバグが発生しました。
Container on host: was preempted
また新たなバグが!!
情報を確認した後、私は暫定的な結論に達しました。私のタスクの一部はメモリを占有しすぎており、私たちの糸は公平なスケジューリングメカニズムを使用しているため、新しいタスクが来ると、私のタスクに対応するコンテナは他のタスクによってプリエンプトされます。 。
それでは、yarn の公平なスケジューリングのメカニズムを簡単に理解しましょう。Yarn には、先入れ先出しスケジューラ、キャパシティ スケジューラ、およびフェア スケジューラの 3 つのスケジューラがあります。
先入れ先出しスケジューラ。先着タスクが最初に実行されます。タスクが多いか、一部のタスクが非常に大きいと、他のタスクが影響を受けます。
キャパシティ スケジューラーには、小さなタスク用に特別に作成されたキューがあり、コンテナーをプリエンプトしないため、タスクが大量にある場合でも、先入れ先出しになります。
コンテナーのプリエンプションを許可する公平なスケジューラー。リソースが比較的十分な場合、新しいタスクが開始されると、前のタスクで使用されていたリソースが段階的に解放されるのを待ってから、古いタスクのリソースが割り当てられます。ただし、リソースが不足した場合、公平なシェアより多くのリソースを占有するコンテナは強制的に中断され、コンテナは公平なシェアより少ないリソースを占有するコンテナに割り当てられます。この公平なシェアと使用シェアは、Spark Web UI で確認できます。
解決策としては、
1) リソースが不足している場合は、タスクをハングしないでください。または、タスクをハングして、Spark タスクをハングせず、Hive をハングします。遅すぎる場合は、たとえ Hive の速度が高くても、より多くの同時実行を開きます。同時実行は行われません。Spark のように、相互にリソースを取得します。
2) または、独自のコードをよく見て、不要なデータを削減するためにコードを最適化する方法、またはタスク内のデータが多すぎるのを避けるために不要な関連付け/操作を削減する方法があるかどうかを確認します。
3) それ以外の場合は、yarn のパラメータを変更して、リソースのプリエンプションのしきい値を高くすることしかできません。
このエラーは必ずしもタスクの失敗を引き起こすわけではありません。場合によっては単なる警告であり、失敗したタスクを実行するために他のコンテナが再起動されます。
参考文献:
- ヤーンのスケジューリングに関与: https://blog.csdn.net/zhanyuanlin/article/details/71516286;
- スケジューリングにおけるプリエンプション メカニズム、https://blog.csdn.net/bujiujie8/article/details/86713115 (この記事の方が適切に書かれています)
- https://www.mail-archive.com/[email protected]/msg101196.html
- https://blog.csdn.net/m0_37885286/article/details/106674721