[Big Data] Azure Batch Auto Scaling

上一篇我們介紹了 Azure 提供的雲端運算資源,例如 Databricks, HDInsight, Azure Batch 等等,利用 AZTK 可以快速部署一個運算的群集,用戶可以指定 Dedicated Nodes 的數量和 Low Priority Nodes 的數量,本篇想要介紹 Azure Batch Auto Scaling 的功能以及如何使用,詳細可以參考以下文章:

以下我們展現幾個實用的指令:

AutoScale Disable

用以下的指令就可以取消 AutoScale 的功能,轉成 Fixed Size 的模式。

az batch pool autoscale disable --pool-id [ex-id]

當 pool 是屬於 Fixed Size 的模式的時候就可以利用以下的指令改變群集內部的資源:

az batch pool resize --pool-id [ex-id] --target-dedicated-nodes 0 --target-low-priority-nodes 2
AutoScale Enable

如果要啟動 AutoScale 的功能可以利用以下的指令,指令必須要提供兩個 arguments,包含 –auto-scale-formula 與 –pool-id,這邊 –auto-scale-formula 的內容需要提供一個計算資源的公式,下面舉一個最簡單的例子直接設定 $TargetDedicatedNodes 與 $TargetLowPriorityNodes 的值。

az batch pool autoscale enable --pool-id [ex-id] --auto-scale-formula '$TargetDedicatedNodes=0;$TargetLowPriorityNodes=1'
AutoScale Evaluate

這個指令提供一個機會去檢驗用戶設計的 formula,計算是否最後變數是否是如自己預期的?

az batch pool autoscale evaluate --pool-id [ex-id] --auto-scale-formula 'example-formula'
Formula 如何設計?

Azure 的 tutorial 裡面有提供兩個範例很值得參考,分別是根據兩個不同目標來調整群集的資源 Pending Tasks (根據等待的任務數量) 與 Preempted Nodes (根據被搶奪的數量)。

Pending Tasks
startingNumberOfVMs = 1;
maxNumberofVMs = 25;
pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second);
pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second));
$TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);
$NodeDeallocationOption = taskcompletion;
Preempted Nodes
maxNumberofVMs = 25;
$TargetDedicatedNodes = min(maxNumberofVMs, $PreemptedNodeCount.GetSample(180 * TimeInterval_Second));
$TargetLowPriorityNodes = min(maxNumberofVMs , maxNumberofVMs - $TargetDedicatedNodes);
$NodeDeallocationOption = taskcompletion;

 

Azure AutoScale Variables 變數

在上面的兩個範例裡面用到很多 Azure 提供的變數,這邊稍微解釋一下

  • $PendingTasks.GetSamplePercent(180 * TimeInterval_Second) 過去三分鐘 Pending 任務的比例
  • avg($PendingTasks.GetSample(180 * TimeInterval_Second)) 過去三分鐘 Pending 任務數量的平均
  • $TargetLowPriorityNodes = min(1, pendingTaskSamples)

另外一個情況用到的

  • maxNumberofVMs = 25;
  • $PreemptedNodeCount.GetSample(180 * TimeInterval_Second) 過去三分鐘內被搶走的數量
  • $TargetLowPriorityNodes = min(maxNumberofVMs, maxNumberofVMs – $TargetDedicatedNodes);