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]
この問題は、複数のユーザーが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
spark.port.maxRetries
に設定された値を増やすこともできます。
docs によると:
諦める前にポートにバインドするときの最大再試行回数。ポートに特定の値(0以外)が指定されると、その後の再試行ごとに、再試行する前に、前の試行で使用されたポートが1ずつインクリメントされます。これにより、基本的に、指定された開始ポートからポート+ maxRetriesまでの範囲のポートを試すことができます。
上記の答えは正しいです。
ただし、spark.port.maxRetries
値を変更しようとしないでください。同じサーバーの負荷が増加し、クラスターのパフォーマンスが低下し、ノードがデッドロック状態になる可能性があります。負荷はuptime
で確認できます。セッションのコマンド。
この問題の根本的な原因は、--deploy-mode client
を介してすべてのsparkアプリケーションを実行しようとしたときです。
クラスタに分散容量がある場合、最善のアプローチは--deploy-mode cluster
で実行することです。
このようにして、異なるノードでsparkアプリケーションを実行するたびに、同じノードでのポートバインディングの問題が軽減されます。
お役に立てれば。乾杯!