私はYARNのSparkに不慣れで、YARNContainers
とSpark Executors
の関係を理解していません。ベースで次の構成を試しました。 yarn-utils.py
スクリプトの結果で、最適なクラスター構成を見つけるために使用できます。
私が取り組んでいるHadoopクラスター(HDP 2.4):
そこで、python yarn-utils.py -c 12 -m 64 -d 4 -k True
(c = cores、m = memory、d = hdds、k = hbase-installed)を実行すると、次の結果が得られました。
Using cores=12 memory=64GB disks=4 hbase=True
Profile: cores=12 memory=49152MB reserved=16GB usableMem=48GB disks=4
Num Container=8
Container Ram=6144MB
Used Ram=48GB
Unused Ram=16GB
yarn.scheduler.minimum-allocation-mb=6144
yarn.scheduler.maximum-allocation-mb=49152
yarn.nodemanager.resource.memory-mb=49152
mapreduce.map.memory.mb=6144
mapreduce.map.Java.opts=-Xmx4915m
mapreduce.reduce.memory.mb=6144
mapreduce.reduce.Java.opts=-Xmx4915m
yarn.app.mapreduce.am.resource.mb=6144
yarn.app.mapreduce.am.command-opts=-Xmx4915m
mapreduce.task.io.sort.mb=2457
これらの設定は、Ambariインターフェイスを介して行い、クラスターを再起動しました。値も、以前に手動で計算した値とほぼ一致します。
私は今問題を抱えています
spark-submit
スクリプトの最適な設定を見つける--num-executors
、--executor-cores
&--executor-memory
。vcores
の概念を理解するために、ここではまだ有用な例を見つけることができませんでしたしかし、私はこの投稿を見つけました YARNのコンテナとは何ですか? 、しかし、エグゼキュータとの関係を説明していないため、これは実際には役に立ちませんでした。
誰かが1つ以上の質問を解決するのを手伝ってもらえますか?
私はここで私の洞察を段階的に報告します:
最初に重要なことはこの事実です(出典: このClouderaドキュメント ):
YARNでSparkを実行すると、各SparkエグゼキューターはYARNコンテナーとして実行されます。[...]
これは、コンテナーの数が常にSparkアプリケーションによって作成されたエグゼキューターと同じになることを意味します(例:spark-submitの--num-executors
パラメーターを介して)。
yarn.scheduler.minimum-allocation-mb
によって設定され、すべてのコンテナは常に少なくともこの量のメモリを割り当てます。これは、パラメータ--executor-memory
がたとえばに設定されている場合を意味します。 1g
のみですが、yarn.scheduler.minimum-allocation-mb
は例です。 6g
、コンテナはSparkアプリケーションで必要とされるよりもはるかに大きいです。
逆に、パラメータ--executor-memory
がyarn.scheduler.minimum-allocation-mb
値よりも高い値に設定されている場合。 12g
、コンテナはより多くのメモリを動的に割り当てますが、のみ要求されたメモリ量がyarn.scheduler.maximum-allocation-mb
値以下の場合。
yarn.nodemanager.resource.memory-mb
の値は、合計でどれだけのメモリを割り当てることができるかを決定します1つのホストのすべてのコンテナ!
=>したがって、yarn.scheduler.minimum-allocation-mb
を設定すると、より小さなコンテナを実行できます。小規模なエグゼキュータの場合(そうでなければメモリの浪費になります)。
=>yarn.scheduler.maximum-allocation-mb
を最大値(たとえば、yarn.nodemanager.resource.memory-mb
に等しい)に設定すると、より大きなエグゼキュータを定義できます(必要に応じて、たとえば--executor-memory
によってより多くのメモリが割り当てられます)。パラメータ)。