4

Sparkフレームワークがコアをどのように使っているのかを理解しようとしていますスタンドアロンモード。 Sparkのドキュメントによると、パラメータ "spark.task.cpus"の値は、デフォルトで1に設定されています。これは、各タスクに割り当てるコアの数を意味します。Sparkはマルチコアまたはハイパースレッドマシン上の1つのタスク内でどのように並列性を達成するのですか

質問1: マルチコアマシンの(合計8ハードウェアスレッドで、例えば、4つのコア)、 "spark.task.cpus = 4"、使用スパークます4つのコア(コアあたり1つのスレッド)またはハイパースレッドを持つ2つのコア?

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

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

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

答えて

8

あなたのタイトル質問に答えるために、Sparkだけでは、タスク内で並列性の向上は得られません。 spark.task.cpusパラメータの主な目的は、マルチスレッドのタスクを可能にすることです。あなたは、各タスク内で外部のマルチスレッドルーチンを呼び出すか、タスクレベルの並列性を自分での最高水準をカプセル化したい場合は、それ以上に、このパラメータを設定する以上1

  • spark.task.cpusを設定することもできます1よりもあなたが頻繁にやることではありません。利用可能なコアの数は、タスクで必要とされるコアよりも小さい場合、ので、あなたのエグゼキュータは8つのコアを持っている場合、あなたは3からspark.task.cpusを設定したスケジューラが、わずか2タスクをタスクをします起動しません

    • 開始する。
    • タスクが常にコアの全容量を消費しない場合は、spark.task.cpus=1を使用してタスク内で競合が発生することがあります。
    • spark.task.cpus設定には、GCやI/Oなどのオーバーヘッドは含まれていない可能性があります。これは、静的コストが非常に高く、タスク数に比例しないためです。

質問1:マルチコアマシン(例えば、合計で4個のコア、8つのハードウェアスレッド)、 "spark.task.cpus = 4"、使用4スパークますコア(コアあたり1つのスレッド)またはハイパースレッドを持つ2つのコア?

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

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

上記と同様に、Sparkはspark.task.cpusパラメータに従ってタスクを自動的に並列化しません。 Sparkは主にデータ並列処理エンジンであり、並列処理は主にデータをRDDとして表現することによって実現されます。

関連する問題