簡體   English   中英

Spark : 多個 spark-submit 並行

[英]Spark : multiple spark-submit in parallel

我有一個關於 Apache Spark 的一般性問題:

我們有一些使用 Kafka 消息的 Spark 流腳本。 問題:他們在沒有特定錯誤的情況下隨機失敗......

當我手動運行它們時,某些腳本在它們工作時什么也不做,一個失敗並顯示以下消息:

錯誤 SparkUI:無法綁定 SparkUI java.net.BindException:地址已在使用中:服務“SparkUI”在 16 次重試后失敗!

所以我想知道是否有一種特定的方法可以並行運行腳本?

它們都在同一個罐子里,我用主管運行它們。 Spark 安裝在 Yarn 上的 Cloudera Manager 5.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://sparkDriver@ns6512097.ip-37-187-69.eu:52748]
15/09/28 16:14:21 INFO Remoting: Remoting now listens on addresses: [akka.tcp://sparkDriver@ns6512097.ip-37-187-69.eu: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會話未關閉屬性,則會出現此問題

有兩種方法可以解決此問題。

  • 在不同的端口上啟動新的spark會話如下

     spark-submit --conf spark.ui.port=5051 <other arguments>`<br>`spark-shell --conf spark.ui.port=5051 
  • 使用從4041到4056的端口查找所有spark會話並使用kill命令kill process,netstat和kill命令可用於查找占用端口的進程並分別終止進程。 這是用法:

     sudo netstat -tunalp | grep LISTEN| grep 4041 

上面的命令將產生如下輸出,最后一列是進程id,在這種情況下PID是32028

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

一旦找到進程ID(PID),就可以使用下面的命令終止spark進程(spark-shell或spark-submit)

sudo kill -9 32028

您還可以提高spark.port.maxRetries的值集。

根據文檔

在放棄之前綁定到端口時的最大重試次數。 當端口被賦予特定值(非0)時,每次后續重試都會在重試之前將先前嘗試中使用的端口增加1。 這實際上允許它嘗試從指定的起始端口到端口+ maxRetries的一系列端口。

以上答案是正確的。

但是,我們不應該嘗試更改spark.port.maxRetries值,因為它會增加同一服務器上的負載,這反過來會降低集群性能並可以將節點推送到死鎖情況。可以使用uptime檢查負載你的會話中的命令。

此問題的根本原因是當您嘗試通過--deploy-mode client運行所有spark應用程序時。

如果群集中具有分布式容量,則最佳方法是使用--deploy-mode cluster運行它。

這樣,每次它將在不同節點中運行spark應用程序,從而減輕同一節點上的端口綁定問題。

希望這可以幫助。 干杯!

-Dspark.ui.port=5051選項: -Dspark.ui.port=5051

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM