web-dev-qa-db-ja.com

Sparkは、マルチコアまたはハイパースレッドマシンで1つのタスク内で並列処理を実現する方法

Sparkフレームワークがコアをスタンドアロンモードでどのように使用するかを読んで理解しようとしています。Sparkドキュメントによると、パラメータ "spark.task.cpus"の値はデフォルトで1に設定されています。これは、各タスクに割り当てるコアの数を意味します。

質問1:マルチコアマシン(たとえば、合計4コア、8ハードウェアスレッド)の場合、「spark.task.cpus = 4」の場合、Spark = 4コア(コアごとに1スレッド)またはハイパースレッドで2コアを使用しますか?

このマシンで使用可能なハードウェアスレッドの数よりも多い「spark.task.cpus = 16」を設定するとどうなりますか?

質問2:このタイプのハードウェア並列処理はどのように達成されますか?コードを調べようとしましたが、コアレベルの並列処理のためにハードウェアまたはJVMと通信するものが見つかりませんでした。たとえば、タスクが「フィルター」機能である場合、単一のフィルタータスクを複数のコアまたはスレッドにどのように分割しますか?

多分私は何かが欠けています。これはScala言語に関連していますか?

10
Nodame

タイトルの質問に答えるために、Sparkだけでは、タスク内で並列処理を向上させることはできません。_spark.task.cpus_パラメーターの主な目的は、マルチスレッド型のタスクを可能にすることです。各タスク内で外部マルチスレッドルーチンを呼び出すか、タスクレベルで自分で最高レベルの並列処理をカプセル化する場合は、_spark.task.cpus_を1より大きく設定することをお勧めします。

  • ただし、このパラメーターを1以上に設定することは、頻繁に行うことではありません。

    • 使用可能なコアの数がタスクに必要なコアより少ない場合、スケジューラーはタスクを起動しません。したがって、エグゼキューターに8つのコアがあり、_spark.task.cpus_を3に設定した場合、2つのタスクのみが起動されます。 。
    • タスクが常にコアの全容量を消費しない場合は、_spark.task.cpus=1_を使用し、タスク内で競合が発生すると、パフォーマンスが向上することがあります。
    • GCやI/Oなどのオーバーヘッドは、おそらく_spark.task.cpus_設定に含めるべきではありません。これは、おそらくはるかに静的なコストであり、タスク数に比例しないためです。

質問1:マルチコアマシン(たとえば、合計4コア、8ハードウェアスレッド)の場合、「spark.task.cpus = 4」の場合、Spark = 4コア(コアごとに1スレッド)またはハイパースレッドで2コアを使用しますか?

JVMは、ほとんどの場合、CPUと連携するための情報とメカニズムを提供するためにOSに依存し、AFAIK Sparkはここでは特別なことは何もしません。Runtime.getRuntime().availableProcessors()またはManagementFactory.getOperatingSystemMXBean().getAvailableProcessors()デュアルコアHT対応Intel®プロセッサの場合は4を返し、Sparkも4コアを表示します。

質問2:このタイプのハードウェア並列処理はどのように達成されますか?コードを調べようとしましたが、コアレベルの並列処理のためにハードウェアまたはJVMと通信するものが見つかりませんでした。たとえば、タスクが「フィルター」機能である場合、単一のフィルタータスクを複数のコアまたはスレッドにどのように分割しますか?

上記のように、Sparkは、_spark.task.cpus_パラメーターに従ってタスクを自動的に並列化しません。Sparkは、ほとんどの場合、データ並列処理エンジンとその並列処理です。これは主に、データをRDDとして表すことで実現されます。

12