web-dev-qa-db-ja.com

スパークのヤーンコンテナのサイズの問題を解決するにはどうすればよいですか?

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

他に知りたい設定がありましたらお知らせください。

糸の容器サイズを適切に設定するにはどうすればよいですか?
(これを手伝ってくれる人への賞金)

12
simple

最初に、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

ニーズに合わせて、これらの構成を自由に試してみてください。

16
code