web-dev-qa-db-ja.com

Spark + Amazonの "maximizeResourceAllocation"設定を使用したEMRは、すべてのコア/ vcoresを使用するわけではありません

EMRクラスター(バージョンemr-4.2.0)を実行していますSpark Amazon固有のmaximizeResourceAllocationフラグを使用して here に記載されています)。これらのドキュメントでは、「このオプションは、コアノードグループ内のノードのエグゼキューターが利用できる最大のコンピューティングリソースとメモリリソースを計算し、この情報を使用して対応するspark-defaults設定を設定します」。

ワーカーノードのm3.2xlargeインスタンスを使用してクラスターを実行しています。私はYARNマスターに単一のm3.xlargeを使用しています-あまり機能しないため、実行できる最小のm3インスタンスです。

状況は次のとおりです。Sparkジョブを実行すると、各エグゼキュータに要求されたコアの数は8です(これは、"yarn.scheduler.capacity.resource-calculator": "org.Apache.hadoop.yarn.util.resource.DominantResourceCalculator"これは実際にはドキュメントにはありませんが、余談です)。 これらのドキュメント によると、m3.2xlargeには8つの「vCPU」があるため、これは理にかなっているようです。ただし、実際のインスタンス自体では、/etc/hadoop/conf/yarn-site.xml、各ノードはyarn.nodemanager.resource.cpu-vcores に設定 16。私は(推測では)ハイパースレッディングまたはおそらく他のハードウェアの空想によるものだと思います。

だから問題はこれです:maximizeResourceAllocationを使用すると、Amazonインスタンスタイプが持つ「vCPU」の数を取得します。これは、YARNが実行している構成済み「VCore」の数の半分にすぎないようですノード;その結果、エグゼキューターはインスタンスの実際のコンピューティングリソースの半分のみを使用しています。

これはAmazon EMRのバグですか?他の人も同じ問題を経験していますか?文書化されていない他の魔法の文書化されていない構成はありますか?

16
retnuH

さて、多くの実験の後、問題を追跡することができました。私はここで私の発見を報告して、将来人々が欲求不満を避けるのを助けるつもりです。

  • 要求された8つのコアとYARNが認識している16のVCoreの間には不一致がありますが、これは違いをもたらさないようです。 YARNは、エグゼキューターが実際に使用できるCPUの数を実際に制限するためにcgroupsや空想的なものを使用していません。
  • エグゼキューターの「コア」は、実際には少し誤った名称です。実際には、executorが同時に喜んで実行するタスクの数です。基本的に、各エグゼキューターで「作業」を実行しているスレッドの数に要約されます。
  • maximizeResourceAllocationが設定されている場合、Sparkプログラムを実行すると、プロパティspark.default.parallelismがすべてのインスタンスコア(または「vCPU」)の数になるように設定されますクラスターにあった非マスターインスタンス作成時これは通常の場合でもおそらく小さすぎます;コア数の4倍に設定することをお勧めしますジョブを実行する必要があります。これは、すべてのエグゼキューターでCPUをビジー状態に保つのに十分なタスクが特定のステージで利用できることを確認するのに役立ちます。
  • 異なるsparkプログラムの異なる実行から得られるデータがある場合、データ(RDDまたはParquet形式など)は、さまざまな数のパーティションで保存される可能性が非常に高いです。 Sparkプログラムを使用する場合は、ロード時または特にCPUを集中的に使用するタスクの前にデータを再分割してください。実行時にspark.default.parallelism設定にアクセスできるため、これはへの再分割。

TL; DR

  1. maximizeResourceAllocationはあなたのためにほとんどすべてを正しく行います...
  2. おそらく、spark.default.parallelismに、ジョブを実行するインスタンスコアの4倍の数(EMRの場合)/ "アプリケーション"(YARNの場合)ごとに明示的に設定する必要があります。つまり、毎回設定そして...
  3. =プログラム内データが適切にパーティション化されている(つまり、多くのパーティションが必要である)ことを確認して、Sparkで適切に並列化できるようにする
41
retnuH

この設定では、各インスタンス(マスターを除く)に1つのエグゼキューターを取得し、それぞれに8つのコアと約30GBのRAMが必要です。

Spark UI at http://:8088 /にその割り当てが表示されていませんか?

その設定が、そのページで説明されている他の「エグゼキューターの動的割り当てを有効にする」と比較して、本当に多くの値があるかどうかはわかりません。 Sparkは、ジョブのインスタンスの独自の数を管理します。2つのCPUコアと3Gのタスクを起動すると、エグゼキュータごとにRAM EMRのインスタンスサイズについては、CPUとメモリの比率がかなり高くなります。

2
Ewan Leith

eMRバージョン3.xでは、このMaximizeResourceAllocationは参照テーブルを使用して実装されていました: https://github.com/awslabs/emr-bootstrap-actions/blob/master/spark/vcorereference.tsv

シェルスクリプトで使用:maximize-spark-default-config、同じリポジトリで、彼らがこれをどのように実装したかを見ることができます。

多分新しいEMRバージョン4で、この参照テーブルはどういうわけか間違っていました... EMRのEC2インスタンスでこのすべてのAWSスクリプトを見つけることができると思います、/ usr/lib/sparkにあるはずですまたは/ opt/awsまたはこのようなもの。

とにかく、少なくとも、独自のbootstrap action EMR 3.xでの実装と同様に、EMR 4でのこのためのスクリプトと正しい参照テーブル

さらに、[〜#〜] stups [〜#〜]インフラストラクチャを使用するので、一見の価値がありますSTUPSアプライアンスfor Sparkhttps ://github.com/zalando/spark-appliance

sparkクラスターをデプロイするときにsenzaパラメーターDefaultCoresを設定することで、コアの数を明示的に指定できます

eMRと比較したこのアプライアンスのハイライトの一部は次のとおりです。

t2インスタンスタイプでも使用でき、他のSTUPSアプライアンスなどの役割に基づいて自動スケーリングできます。

また、クラスターを簡単にzookeeperを使用したHAモードでデプロイできるため、マスターノードにSPOFがないため、現在のところEMRのHAモードはまだ不可能であり、EMRは主に一時的に「大規模クラスター「アドホック分析ジョブ」ではなく、「永続的にオンになっている専用クラスター」ではありません。したがって、EMRを使用する場合、HAモードはほぼ不可能です。

0
chutium