YARN
でいくつかのpysparkジョブを起動したいと思います。 2つのノードがあり、それぞれ10GBです。私は次のようにpysparkシェルを開くことができます:pyspark
今、私が立ち上げようとしている非常に単純な例があるとき:
import random
NUM_SAMPLES=1000
def inside(p):
x, y = random.random(), random.random()
return x*x + y*y < 1
count = sc.parallelize(xrange(0, NUM_SAMPLES)) \
.filter(inside).count()
print "Pi is roughly %f" % (4.0 * count / NUM_SAMPLES)
その結果、非常に長いsparkログがエラー出力とともに表示されます。最も重要な情報は次のとおりです。
ERROR cluster.YarnScheduler: Lost executor 1 on (ip>: Container marked as failed: <containerID> on Host: <ip>. Exit status 1. Diagnostics: Exception from container-launch. ......
後で私が見るログで...
ERROR scheduler.TaskSetManager: Task 0 in stage 0.0 failed 1 times: aborting job
INFO cluster.YarnClientSchedulerBackend: Asked to remove non-existent executor 1
INFO spark.ExecutorAllocationManager: Existing executor 1 has been removed (new total is 0)
上記のログから収集していることから、これは糸のコンテナサイズの問題のようです。
僕の yarn-site.xml
ファイルには次の設定があります。
yarn.scheduler.maximum-allocation-mb = 10240
yarn.nodemanager.resource.memory-mb = 10240
とspark-defaults.conf
含まれています:
spark.yarn.executor.memoryOverhead=2048
spark.driver.memory=3g
他に知りたい設定がありましたらお知らせください。
糸の容器サイズを適切に設定するにはどうすればよいですか?
(これを手伝ってくれる人への賞金)
最初に、YARNクラスターでsparkアプリケーションを調整するために必要なプロパティの基本セットについて説明します。
注: YARNのコンテナは、SparkのExecutorと同等です。わかりやすくするために、両方が同じであると見なすことができます。
yarn-site.xml:
yarn.nodemanager.resource.memory-mb
は、特定のノードからクラスターが使用できる合計メモリーです。
yarn.nodemanager.resource.cpu-vcores
は、特定のノードからクラスターで使用可能なCPUvcoreの総数です。
yarn.scheduler.maximum-allocation-mb
は、ヤーンコンテナごとに割り当てられるMB単位の最大メモリです。
yarn.scheduler.maximum-allocation-vcores
は、ヤーンコンテナごとに割り当てることができるvcoreの最大数です。
例:ノードに16GBと8vcoreがあり、14GBと6vcoreをクラスター(コンテナー用)に提供する場合は、次のようにプロパティを設定します。
糸.nodemanager.resource.memory-mb:14336(14GB)
糸.nodemanager.resource.cpu-vcores:6
また、それぞれ2GBと1vcoreのコンテナーを作成するには、次のプロパティを設定します。
糸.scheduler.maximum-allocation-mb:2049
糸.scheduler.maximum-allocation-vcores:1
注: 2GBで7つのコンテナーを作成するのに十分なメモリ(14gb)がありますが、上記の構成では2GBで6つのコンテナーのみが作成され、14GBのうち12GBのみがクラスターに使用されます。これは、クラスターで使用できるvcoreが6つしかないためです。
今Spark側、
以下のプロパティは、エグゼキュータ/コンテナごとに要求されるメモリを指定します
spark.driver.memory
spark.executor.memory
以下のプロパティは、エグゼキュータ/コンテナごとに要求されるvcoreを指定します
spark.driver.cores
spark.executor.cores
IMP:すべてのSparkのメモリおよびvcoreプロパティは、YARNの構成以下である必要があります
以下のプロパティは、YARNクラスターからのsparkアプリケーションに使用できるエグゼキューター/コンテナーの総数を指定します。
spark.executor.instances
このプロパティは、YARNクラスターで使用可能なコンテナーの総数よりも少なくする必要があります。
ヤーンの構成が完了すると、sparkはコンテナーを要求する必要がありますYARN構成に基づいて割り当てることができます。つまり、YARNが最大コンテナあたり2GBで、Sparkが3GBのメモリを備えたコンテナを要求すると、YARNがSparkの要求を満たすことができないため、ジョブは停止または停止します。
ここでのユースケース:通常、クラスターの調整はワークロードに基づいています。ただし、以下の構成の方が適しているはずです。
使用可能なメモリ:10GB * 2ノード使用可能なVcores:5 * 2 vcores [仮定]
yarn-site.xml上 [両方のノードで]
yarn.nodemanager.resource.memory-mb
:10240
yarn.nodemanager.resource.cpu-vcores
:5
yarn.scheduler.maximum-allocation-mb
:2049
yarn.scheduler.maximum-allocation-vcores
:1
上記の構成を使用すると、コンテナーごとに2GB、1vcoreを持つ各ノードに最大10個のコンテナーを作成できます。
Spark config
spark.driver.memory
1536mb
spark.yarn.executor.memoryOverhead
512mb
spark.executor.memory
1536mb
spark.yarn.executor.memoryOverhead
512mb
spark.driver.cores
1
spark.executor.cores
1
spark.executor.instances
19
ニーズに合わせて、これらの構成を自由に試してみてください。