私はzeppelinsの分離モードを使用していますsparkインタープリター。このモードでは、sparkクラスター内の各ノートブックに対して新しいジョブを開始します。ジョブを強制終了したいノートブックの実行が完了したときにzeppelinを介して。このためにsc.stop
これにより、sparkContextが停止し、ジョブもsparkクラスターから停止しました。しかし、次回ノートブックを実行しようとすると、sparkContext
が再び開始されません。そのため、方法それを行う?
Scがなぜsparkヤーンクライアントで停止するのかという問題を調査しました。spark自体の問題であることがわかりました(Sparkバージョン> = 1.6) 。sparkクライアントモードでは、AMはRPC接続を介してドライバーに接続します。2つの接続があります。サーバー 'SparkDriver'のドライバーのサービス 'YarnSchedulerBackEnd'に接続するようにNettyRpcEndPointRefを設定します。別の接続はEndPoint 'YarnAM'です。
AMとドライバー間のこれらのRPC接続では、ハートビートはありません。したがって、AMがドライバーが接続されているかどうかを知る唯一の方法は、EndPoint 'YarnAM'のOnDisconnectedメソッドです。 NettyRpcEndPointRefによるドライバーとAM接続の切断メッセージは、RPCHandlerを通じてEndPoint 'YarnAM'に 'postToAll'します。 TCPそれらの間の接続が切断された場合、またはキープアライブメッセージがtcp not alive(Linuxシステムでは2時間)を検出した場合)は、アプリケーションに成功のマークを付けます。
そのため、ドライバーモニタープロセスが糸アプリケーションの状態がSUCCESSに変化したことを検出すると、scを停止します。
したがって、根本的な原因は、Sparkクライアントでは、ドライバへの接続の再試行がなく、ドライバが稼働しているかどうかを確認しないことですが、糸アプリケーションをできるだけ迅速にマークするだけです。多分= Sparkはこの問題を修正できます。
ツェッペリンとSparkで作業しているときにも、同じ問題に遭遇し、いくつかの調査を行いました。しばらくして、私の最初の結論は次のとおりでした。
sc.stop()
を使用します。restart
ボタンをクリック))ただし、UIではSparkインタープリターをボタンを押して再起動できるため、restart
ボタンのAPI呼び出しをリバースエンジニアリングしないでください!結果はrestarting
the Spark=インタプリタは次のHTTPリクエストを送信します:
PUT http://localhost:8080/api/interpreter/setting/restart/spark
幸いなことに、ツェッペリン型飛行船は複数のインタープリターと連携することができ、そのうちの1人はShell
インタープリターでもあります。したがって、2つの段落を作成しました。
最初の段落は、必要に応じてSparkContextを停止するためのものでした:
%spark
// stop SparkContext
sc.stop()
2番目の段落は、SparkContextをプログラムで再起動するためのものでした:
%sh
# restart SparkContext
curl -X PUT http://localhost:8080/api/interpreter/setting/restart/spark
2つの段落でSparkContextを停止して再起動した後、別の段落を実行して、再起動が機能するかどうかを確認しました。したがって、これは公式の解決策ではなく、回避策の詳細ですが、段落内のrestart
ボタンを「押す」以外は何もしないので、それでも正当です。
ツェッペリン版:0.8.1
問題のインタープリターの左側にある再起動アイコンをクリックすると、インタープリターバインディング(右上隅にある歯車)でノートブックのインタープリターを再起動できます(この場合はsparkインタープリターになります) )