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のバグですか?他の人も同じ問題を経験していますか?文書化されていない他の魔法の文書化されていない構成はありますか?
さて、多くの実験の後、問題を追跡することができました。私はここで私の発見を報告して、将来人々が欲求不満を避けるのを助けるつもりです。
maximizeResourceAllocation
が設定されている場合、Sparkプログラムを実行すると、プロパティspark.default.parallelism
がすべてのインスタンスコア(または「vCPU」)の数になるように設定されますクラスターにあった非マスターインスタンス作成時これは通常の場合でもおそらく小さすぎます;コア数の4倍に設定することをお勧めしますジョブを実行する必要があります。これは、すべてのエグゼキューターでCPUをビジー状態に保つのに十分なタスクが特定のステージで利用できることを確認するのに役立ちます。spark.default.parallelism
設定にアクセスできるため、これはへの再分割。TL; DR
maximizeResourceAllocation
はあなたのためにほとんどすべてを正しく行います...spark.default.parallelism
に、ジョブを実行するインスタンスコアの4倍の数(EMRの場合)/ "アプリケーション"(YARNの場合)ごとに明示的に設定する必要があります。つまり、毎回設定そして...この設定では、各インスタンス(マスターを除く)に1つのエグゼキューターを取得し、それぞれに8つのコアと約30GBのRAMが必要です。
Spark UI at http://:8088 /にその割り当てが表示されていませんか?
その設定が、そのページで説明されている他の「エグゼキューターの動的割り当てを有効にする」と比較して、本当に多くの値があるかどうかはわかりません。 Sparkは、ジョブのインスタンスの独自の数を管理します。2つのCPUコアと3Gのタスクを起動すると、エグゼキュータごとにRAM EMRのインスタンスサイズについては、CPUとメモリの比率がかなり高くなります。
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 Spark: https ://github.com/zalando/spark-appliance
sparkクラスターをデプロイするときにsenzaパラメーターDefaultCores
を設定することで、コアの数を明示的に指定できます
eMRと比較したこのアプライアンスのハイライトの一部は次のとおりです。
t2インスタンスタイプでも使用でき、他のSTUPSアプライアンスなどの役割に基づいて自動スケーリングできます。
また、クラスターを簡単にzookeeperを使用したHAモードでデプロイできるため、マスターノードにSPOFがないため、現在のところEMRのHAモードはまだ不可能であり、EMRは主に一時的に「大規模クラスター「アドホック分析ジョブ」ではなく、「永続的にオンになっている専用クラスター」ではありません。したがって、EMRを使用する場合、HAモードはほぼ不可能です。