2017-01-12 7 views
0

私はより多くのコアの恩恵を受けることができるタスクを持っていますが、スタンドアロンスケジューラーはサブセットのみが使用可能な場合に起動します。むしろ、このタスクではすべてのクラスタコアを使用したいと思います。Sparkはすべてのコアをタスクに割り当てます

リソースをタスクに割り当てる前にスケジューラにすべてを完了させる方法はありますか?言い換えれば、タスクを実行する前にすべてのパスを終了した場合、またはより多くのコアが使用可能になるまで待っていた場合、DAGはこのジョブに適しています。タスクが太っていることを示唆する方法でしょうか?私はそうではなく、糸を動かさないことを望んでいます。

簡潔に:それ以外のアイドル状態のクラスタでこのマップタスクを実行して、すべてのリソース/コアを持つようにする必要があります。これを行う方法はありますか?ハッキーな答えでさえ評価されるでしょう。

アイデア?

+0

sparkの「タスク」は、あなたが使用しているものとは非常に異なる特定の意味を持っています。 "アプリケーション"はおそらくより良い言葉だろう。 – puhlen

答えて

-1

実行中のアプリケーションがない場合は、REST APIを使用してYARNを手動でチェックする必要があります。

GET http://<rm http address:port>/ws/v1/cluster/metrics 
{ 
    "clusterMetrics": 
    { 
    "appsSubmitted":0, 
    "appsCompleted":0, 
    "appsPending":0, 
    "appsRunning":0, 
    "appsFailed":0, 
    "appsKilled":0, 
    "reservedMB":0, 
    "availableMB":17408, 
    "allocatedMB":0, 
    "reservedVirtualCores":0, 
    "availableVirtualCores":7, 
    "allocatedVirtualCores":1, 
    "containersAllocated":0, 
    "containersReserved":0, 
    "containersPending":0, 
    "totalMB":17408, 
    "totalVirtualCores":8, 
    "totalNodes":1, 
    "lostNodes":0, 
    "unhealthyNodes":0, 
    "decommissionedNodes":0, 
    "rebootedNodes":0, 
    "activeNodes":1 
    } 
} 

保留中または実行中のアプリがない場合は、スクリプトを実行できます。 whileループ+スリープ状態にあって、両方が0になるのを待つシェルスクリプトを作成するだけです。

また、使用可能なメモリ/コアも検索できます。実際、私はあなたがいつも待っているというだけでなく、十分なリソースを保証するように、そのルートに行くでしょう。

+0

1)むしろ糸を使用しない、2)これは仕事の中の仕事です。専門用語についてはわかりませんが、GUI上の2番目の層です。これは実際には1つのRDD.map操作の終了であり、現在のDAGでは専用クラスタに500を超えるコアが存在するため、永久に必要です。 – pferrel

+0

私はその質問を誤解しました。だからあなたは、スパークは400個程度のコアのうち10個だけを使用していると言っていますか?その場合、コアと同じ数のパーティションがあることを確認する必要があります。ジョブを開始する前にすべてのコアを要求していれば、マップタスクの前にrddでパーティション分割(num_cores)を実行することができます。 –

0

動的リソース割り当てが、あなたが探しているものかもしれません。ワークロードに基づいてこのアプリケーションに登録されているエグゼキュータの数を増減します。

設定パラメータをSparkSessionに渡すことで有効にすることができます。以下のように:詳細はhttp://spark.apache.org/docs/latest/job-scheduling.html#dynamic-resource-allocation

val spark = SparkSession 
    .builder() 
    .appName("MyApp") 
    .config("spark.dynamicAllocation.enabled","true") 
    .config("spark.shuffle.service.enabled","true") 
    .getOrCreate() 

はこれを参照してください。

+0

多分、私はそれを考慮します、ありがとう。しかし、実際には私は384のコアを持っていて、うまくいけばスケジューラはこのRDD.mapを起動しますが、10個しか利用できないので、他のすべてのタスクを完了するのにはずっと時間がかかります。スーパータスクの中で他のものが終わった後は、10個のコアだけが空いている状態で回転していました。 – pferrel

+0

RDDにはいくつのパーティションがありますか?スタンドアロンスケジューラ(またはYARN)はリソースの割り当てのみを行いますが、実行フローは制御しません。実行は 'DAGScheduler'による制御であり、並列化は大部分のパーティション化に依存します –

関連する問題