1

私はSpark 1.5.1をPysparkを使用してスタンドアロン(クライアント)モードで実行しています。私はメモリが重いように見える仕事を始めようとしています(つまり、Pythonではexecutor-memory設定の一部ではないはずです)。 96コアと128 GBのRAMを搭載したマシンでテストしています。指定されたエグゼキュータよりも多くのエグゼキュータを起動します

マスターとワーカーを実行していて、/ sbinのstart-all.shスクリプトを使用して起動しています。

これは/ confで使用する設定ファイルです。

火花-defaults.confに:

spark.eventLog.enabled   true 
spark.eventLog.dir    /home/kv/Spark/spark-1.5.1-bin-hadoop2.6/logs 
spark.serializer     org.apache.spark.serializer.KryoSerializer 
spark.dynamicAllocation.enabled false 
spark.deploy. 
defaultCores  40 

spark-env.sh:私は、次のコマンドを使用して私のスクリプトを始めている

PARK_MASTER_IP='5.153.14.30' # Will become deprecated 
SPARK_MASTER_HOST='5.153.14.30' 
SPARK_MASTER_PORT=7079 
SPARK_MASTER_WEBUI_PORT=8080 
SPARK_WORKER_WEBUI_PORT=8081 

export SPARK_MASTER=spark://5.153.14.30:7079 #"local[*]" 
spark-submit \ 
    --master ${SPARK_MASTER} \ 
    --num-executors 1 \ 
    --driver-memory 20g \ 
    --executor-memory 30g \ 
    --executor-cores 40 \ 
    --py-files code.zip \ 
<script> 

今、私は理解できない行動に気付いています:

  • 上記の設定でアプリケーションを起動すると、実行者が1人いることが予想されます。しかし、それぞれが30gのメモリと40のコアを持つ2人のエグゼキュータが起動します。なぜ火花がこれをするのですか?私はコアごとにより多くのメモリを持つようにコアの数を制限しようとしていますが、どのようにこれを強制できますか?あまりにも多くのメモリを使用するため、アプリケーションが強制終了されるようになりました。
  • executor-coresを40以上にすると、十分なリソースがないためにジョブが開始されません。これは私のspark-defaultsのdefaultCores 40設定のためです。しかし、アプリケーションが最大数のコアを提供していないときのバックアップと同じではありませんか?私はその権利を上書きすることができるはずですか?私が取得エラーメッセージから

エキス:

Lost task 1532.0 in stage 2.0 (TID 5252, 5.153.14.30): org.apache.spark.SparkException: Python worker exited unexpectedly (crashed) 
    at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:203) 
    at org.apache.spark.api.python.PythonRunner$$anon$1.<init>(PythonRDD.scala:207) 
    at org.apache.spark.api.python.PythonRunner.compute(PythonRDD.scala:125) 
    at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:70) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297) 
    at org.apache.spark.CacheManager.getOrCompute(CacheManager.scala:69) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:262) 
    at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:70) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:264) 
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66) 
    at org.apache.spark.scheduler.Task.run(Task.scala:88) 
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.io.EOFException 
    at java.io.DataInputStream.readInt(DataInputStream.java:392) 
    at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:139) 
    ... 15 more 

[...] 

py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe. 
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 111 in stage 2.0 failed 4 times, most recent failure: Lost task 111.3 in stage 2.0 (TID 5673, 5.153.14.30): org.apache.spark.SparkException: Python worker exited unexpectedly (crashed) 
+0

あなたには2つの答えがあります。 :) – gsamaras

答えて

1

チェックやspark.executor.instancesの値を設定します。デフォルトは2で、2人のエグゼキュータを得る理由を説明しています。

サーバーには96コアがあり、defaultcoresを40に設定すると、2 * 40 = 80以降、2人のエグゼキュータのためのスペースしかありません。残りの16コアは別のエグゼキュータには不十分で、ドライバにはCPUコアも必要です。

0

私は実行者が1人いると予想しています。しかし、2つの執行は、私はあなたが見る1つのexecutorが、それは実際にドライバーだと思う

を開始しています。

したがって、1つのマスター、1つのスレーブ(合計で2つのノード)。

あなたのスクリプトにこれらの設定フラグを追加することができます。

--conf spark.executor.cores=8  <-- will set it 8, you probably want less 
--conf spark.driver.cores=8   <-- same, but for driver only 

私の仕事があるため十分でないリソースを開始しません。

私は容器が殺されると信じています。すべてのコンテナ/タスク/コアができるだけ多くのメモリを占有しようとしているので、システムは単純に多くのリソースを提供できません。

コンテナがメモリの制限を超えている可能性があります(ただし、確実に確認するにはログの詳細を確認する必要があります)。

関連する問題