最近寒いですねえー🤧
さて、今日はスポットをうまく活用できるフリートインスタンスについて説明していこうと思います
フリートインスタンスって何?
フリートインスタンスというのは、Databricks on AWSで使用できる、よりスポットをうまく活用するための機構です。
スポットインスタンスというのはクラウドにおいて、余剰のインスタンスを安価に使える機能です。クラウドは大量のインスタンスを使用できるようになっていますが、常にすべてのインスタンスが使われているわけではありません、リクエストがあればいつでもインスタンスが使えるように余剰のインスタンスが大量に確保してあるわけです。その余剰インスタンスを安価に使うことができるのがスポットインスタンスというわけです。
ただ、単に安く使えるわけではなくデメリットもあります。それはオンデマンドなどで使用されるとスポットインスタンスは途中で停止するというリスクを抱えています。その代わり安く使えるというわけですね。
でも安く使える、というのはとても魅力的です。うまく使えば美味しいスポットインスタンスをもっとうまく使うための機構がフリートインスタンスです。
スポットインスタンスのベストプラクティス
次にこちらにありますが、スポットインスタンスをうまく使うためのベストプラクティスがあります。
かいつまんで説明すると以下のとおりです。
- 多様なインスタンスタイプを混ぜる
- 複数のアベイラビリティゾーンを使う
- スポットインスタンスの中断に備える
- Auto Scaling グループやフリート機能を使う
- price-capacity-optimized 配分戦略を使う
- キャパシティリバランシングを使う
要するに、多数のインスタンスタイプを多数のAZで併用することでスポットインスタンスの停止確率を最小化しようというのが基本戦略なわけです。
そこでフリートインスタンスですよ!
そこでDatabricksのフリートインスタンスが登場するわけです。
フリートインスタンスはあらかじめプリセットされた複数のインスタンスタイプを複数AZから使用することができます。

このように、 rd-fleet.xlarge であれば r{hoge}d.xlarge のインスタンスを対象にしてインスタンスを取得しますし、 cg-fleet.xlarge ならc{hoge}g.xlarge (Graviton搭載のc系インスタンスタイプ)を対象にインスタンスを取得するわけです。
これで、c7g.xlargeというように個別に選択するよりもより広いインスタンスタイプを対象にスポットインスタンス取得を行うことができます。
じゃあ中身をちょっと見てみよう
どんな感じでスポットインスタンスを取得しているのか、みてみたいですか?ではちょっと見てみましょう!
こういうときはCloudTrailちゃん!”eventName”: “CreateFleet” で見えますね!
長いので大事な部分を抜粋すると、こんな感じです。これは “cg-fleet.8xlarge”で取得した場合です。
"requestParameters": {
"CreateFleetRequest": {
"TargetCapacitySpecification": {
"DefaultTargetCapacityType": "spot",
"TotalTargetCapacity": 12
},
"Type": "instant",
"OnDemandOptions": {
"AllocationStrategy": "prioritized"
},
"SpotOptions": {
"AllocationStrategy": "price-capacity-optimized"
},
"LaunchTemplateConfigs": {
"LaunchTemplateSpecification": {
"Version": "$Latest",
"LaunchTemplateId": "lt-<hoge>"
},
"Overrides": [
{
"Priority": "0.0",
"tag": 1,
"SubnetId": "<hoge>",
"InstanceType": "c7g.8xlarge"
},
{
"Priority": "1.0",
"tag": 2,
"SubnetId": "<hoge>",
"InstanceType": "c6g.8xlarge"
}
],
"tag": 1
},
"TagSpecification": {
"ResourceType": "fleet",
"tag": 1,
"Tag": [
{
"Value": "<hoge>",
"tag": 1,
"Key": "ClusterId"
},
{
"Value": "workerenv-<hoge>-<hoge>-worker",
"tag": 2,
"Key": "Name"
},
{
"Value": "instance_manager_service",
"tag": 3,
"Key": "management_service"
},
{
"Value": "job-<hoge>-run-<hoge>-workflow-test-cluster",
"tag": 4,
"Key": "ClusterName"
},
{
"Value": "<hoge>",
"tag": 5,
"Key": "JobId"
},
{
"Value": "kuwano_test_workflow",
"tag": 6,
"Key": "RunName"
},
{
"Value": "akihiro.kuwano@example.com",
"tag": 7,
"Key": "Creator"
},
{
"Value": "Databricks",
"tag": 8,
"Key": "Vendor"
}
]
}
}
},
このように、”AllocationStrategy”: “price-capacity-optimized”で、c7g.8xlargeとc6g.8xlargeを取得して、12インスタンスのクラスターを構築するためにスポットインスタンスを要求しているのがわかります。
レスポンスの結果も抜粋して貼ると、
"responseElements": {
"CreateFleetResponse": {
"fleetInstanceSet": {
"item": [
{
"lifecycle": "spot",
"instanceIds": {
"item": [
"i-<hoge>",
"i-<hoge>",
"i-<hoge>",
"i-<hoge>",
"i-<hoge>",
"i-<hoge>"
]
},
"instanceType": "c7g.8xlarge",
"launchTemplateAndOverrides": {
"overrides": {
"subnetId": "subnet-<hoge>",
"instanceType": "c7g.8xlarge",
"priority": "0.0"
},
"launchTemplateSpecification": {
"launchTemplateId": "lt-<hoge>",
"version": 1
}
}
},
{
"lifecycle": "spot",
"instanceIds": {
"item": [
"i-<hoge>",
"i-<hoge>",
"i-<hoge>",
"i-<hoge>",
"i-<hoge>",
"i-<hoge>"
]
},
"instanceType": "c6g.8xlarge",
"launchTemplateAndOverrides": {
"overrides": {
"subnetId": "subnet-<hoge>",
"instanceType": "c6g.8xlarge",
"priority": "1.0"
},
"launchTemplateSpecification": {
"launchTemplateId": "lt-<hoge>",
"version": 1
}
}
}
]
},
このように複数インスタンスタイプが混在しつつ、スポットインスタンスを活用してクラスタを構築する事ができるのがわかりますね。
お安く、高速に!クラスタを建てよう!
フリートインスタンスを活用することで、より安く、より高速にジョブを実行することができます!
サーバレスもいいけれど、機械学習などでクラスタを立てることもあると思います、そういうときには是非フリートインスタンスのことも思い出してあげてください!
もちろん、落ちることもあるので落ちたら困るよ、というクラスタには使わないようにしてくださいね。
ではでは!今日はこのへんで。





コメントを残す