2017-03-06 37 views
0

我目前正在部署兩個Spark應用程序,我想限制每個應用程序的內核和執行程序。我的配置如下:Spark應用程序不能只用一個內核工作

spark.executor.cores=1 
spark.driver.cores=1 
spark.cores.max=1 
spark.executor.instances=1 

現在的問題是,有了這個確切的配置,一個流應用程序工作,而另一個沒有。不工作的應用保持狀態:運行和連續打印在日誌中顯示以下信息:

17/03/06 10:31:50 INFO JobScheduler: Added jobs for time 1488814310000 ms 
17/03/06 10:31:55 INFO JobScheduler: Added jobs for time 1488814315000 ms 

出人意料的是,如果我改變配置以下,這是不是現在的工作進行沒有問題的同一個應用程序。

spark.executor.cores=3 
spark.driver.cores=1 
spark.cores.max=3 
spark.executor.instances=3 

注:應用程序不會用值2工作這就是爲什麼我用一個最低的3

這樣看來,一些流媒體應用需要比別人更多的內核。我的問題是什麼決定了應用程序需要多少資源?爲什麼一個應用程序無法使用一個單核運行,同時它可以運行3個內核?

回答

1

您使用了多少個接收器?您必須確保有足夠的內核來運行接收器和Spark作業:

DStream與單個接收器關聯。爲了獲得讀取並行性,需要創建多個接收器,即多個DS流。接收器在執行器內運行。它佔據了一個核心。確保在預訂接收機時隙後有足夠的內核進行處理,即spark.cores.max應考慮接收機時隙。接收器以循環方式分配給執行者。

http://spark.apache.org/docs/latest/streaming-programming-guide.html#important-points-to-remember

+0

我只用一個接收器。事實上,我創建直接流與使用此指令MQTT: 'JavaReceiverInputDStream 結果= MQTTUtils.createStream(JSSC,brokerUrl,mqttTopic,clientID的, \t \t \t \t用戶名,密碼,FALSE);' 基本上,後我使用下面的行來獲取流數據,並做進一步的分析: 'JavaDStream 線= results.flatMap(新FlatMapFunction <字符串,字符串>(){ \t \t \t公共迭代呼叫(串x){ \t \t \t \t return Arrays.asList(x).iterator(); \t \t \t} \t \t});' –

+0

你可以看看星火UI,並檢查執行頁上的免費代碼。如果沒有空閒核心,請檢查正在運行的任務並在此處發帖。 – zsxwing

+0

我一共有50個核心和13個使用。 –

相關問題