web-dev-qa-db-ja.com

Spark:複数のspark-並行して送信

Apacheについての一般的な質問Spark:

spark Kafkaメッセージを消費するストリーミングスクリプトがあります。問題:特定のエラーなしでランダムに失敗しています...

一部のスクリプトは、手動で実行すると動作中に何も実行されません。次のメッセージで失敗します。

エラーSparkUI:SparkUI Java.net.BindExceptionのバインドに失敗しました:アドレスはすでに使用されています:サービス 'SparkUI'は16回の再試行後に失敗しました!

それで、スクリプトを並行して実行する特定の方法があるのだろうか?

それらはすべて同じjarに入っており、スーパーバイザで実行します。 SparkはYarnのClouderaManager5.4にインストールされます。

これがスクリプトの起動方法です。

Sudo -u spark spark-submit --class org.soprism.kafka.connector.reader.TwitterPostsMessageWriter /home/soprism/sparkmigration/data-migration-Assembly-1.0.jar --master yarn-cluster --deploy-mode client

ご協力いただきありがとうございます !

更新:コマンドを変更してこれを実行します(特定のメッセージで停止します):

root@ns6512097:~# Sudo -u spark spark-submit --class org.soprism.kafka.connector.reader.TwitterPostsMessageWriter --master yarn --deploy-mode client /home/soprism/sparkmigration/data-migration-Assembly-1.0.jar
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/jars/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/jars/avro-tools-1.7.6-cdh5.4.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
15/09/28 16:14:21 INFO Remoting: Starting remoting
15/09/28 16:14:21 INFO Remoting: Remoting started; listening on addresses :[akka.tcp://[email protected]:52748]
15/09/28 16:14:21 INFO Remoting: Remoting now listens on addresses: [akka.tcp://[email protected]:52748]
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/jars/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/jars/avro-tools-1.7.6-cdh5.4.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
14
Taoma_k

この問題は、複数のユーザーがsparkセッションを同時に開始しようとした場合、または既存のsparkセッションがプロパティで閉じられていない場合)に発生します

この問題を解決するには2つの方法があります。

  • 次のように、別のポートで新しいsparkセッションを開始します

    spark-submit --conf spark.ui.port=5051 <other arguments>`<br>`spark-Shell --conf spark.ui.port=5051
    
  • すべてのsparkセッションを4041から4056までのポートを使用して検索し、killコマンドを使用してプロセスを強制終了します。netstatおよびkillコマンドを使用して、ポートを占有しているプロセスを検索し、プロセスを強制終了できます。使用法は次のとおりです。 :

    Sudo netstat -tunalp | grep LISTEN| grep 4041
    

上記のコマンドは、次のような出力を生成します。最後の列はプロセスIDです。この場合、PIDは32028です。

tcp        0      0 :::4040    :::*         LISTEN      32028/Java

プロセスID(PID)を見つけたら、以下のコマンドを使用してspark process(spark-Shell or spark-submit))を強制終了できます。

Sudo kill -9 32028
9
SachinJ

spark.port.maxRetriesに設定された値を増やすこともできます。

docs によると:

諦める前にポートにバインドするときの最大再試行回数。ポートに特定の値(0以外)が指定されると、その後の再試行ごとに、再試行する前に、前の試行で使用されたポートが1ずつインクリメントされます。これにより、基本的に、指定された開始ポートからポート+ maxRetriesまでの範囲のポートを試すことができます。

4
been

上記の答えは正しいです。

ただし、spark.port.maxRetries値を変更しようとしないでください。同じサーバーの負荷が増加し、クラスターのパフォーマンスが低下し、ノードがデッドロック状態になる可能性があります。負荷はuptimeで確認できます。セッションのコマンド。

この問題の根本的な原因は、--deploy-mode clientを介してすべてのsparkアプリケーションを実行しようとしたときです。

クラスタに分散容量がある場合、最善のアプローチは--deploy-mode clusterで実行することです。

このようにして、異なるノードでsparkアプリケーションを実行するたびに、同じノードでのポートバインディングの問題が軽減されます。

お役に立てれば。乾杯!

2
Deepesh Rehi