【AWS】【EMR】スポットインスタンスでの安定稼働を目指して(1/3):スポットインスタンスとは

こちらはフロムスクラッチ Advent Calendar 2017の3日目の記事です。

EEEEEEEEEEEEEEEEEEEE MMMMMMMM         MMMMMMMM RRRRRRRRRRRRRR
E::::::::::::::::::E M:::::::M       M:::::::M R::::::::::::::R
EE:::::EEEEEEEEE:::E M::::::::M     M::::::::M R:::::RRRRRR:::::R
  E::::E       EEEEE M:::::::::M   M:::::::::M RR::::R      R::::R
  E::::E             M::::::M:::M M:::M::::::M   R:::R      R::::R
  E:::::EEEEEEEEEE   M:::::M M:::M:::M M:::::M   R:::RRRRRR:::::R
  E::::::::::::::E   M:::::M  M:::::M  M:::::M   R:::::::::::RR
  E:::::EEEEEEEEEE   M:::::M   M:::M   M:::::M   R:::RRRRRR::::R
  E::::E             M:::::M    MMM    M:::::M   R:::R      R::::R
  E::::E       EEEEE M:::::M           M:::::M   R:::R      R::::R
EE:::::EEEEEEEE::::E M:::::M           M:::::M   R:::R      R::::R
E::::::::::::::::::E M:::::M           M:::::M RR::::R      R::::R
EEEEEEEEEEEEEEEEEEEE MMMMMMM           MMMMMMM RRRRRRR      RRRRRR

当記事に興味を持っていただきありがとうございます。

この記事では、AWS EMR利用者向けにスポットインスタンスを使いつつも、それら安定的に稼働させることを目指して私が取り組んでいることを紹介する記事です。
AWS EMRが何モノで、何をすることできるのか、ということは知っていることを前提として記載していますので、ご了承ください。(その辺を知りたい方は、記事末尾にリンクくっつけときますのでどうぞ。)

そもそもスポットインスタンスとは何なのか

この辺りの紹介記事は星の数ほどありますが、改めて紹介しておきます。

AWS EMRを特に何も考えずに採用すると、オンデマンドと呼ばれる課金形態で構築され、インスタンスサイズごとに定義されている固定額(以下、オンデマンド価格)が利用時間に応じて課金されていきます。
価格表を見ると、1時間単位での課金額が記載されていますが、実際には秒単位での課金となるようです。(最近変わったそうです:AWSの方からの情報)

一方でスポットインスタンスは、AWS EMRに限らずAmazon EC2などのサービスででも使用できる利用形態のオプションの1つで、AWSの余剰インスタンスを入札制で安価に利用できるというものです。
その値引率は・・・オンデマンド比で最大で90%にもなります。

ものすごい割引率ですが、Amazonからすると、余剰リソースを腐らせておくぐらいだったら、安くてもいいから使ってもらったほうがいい、ということなのでしょう。

スポットインスタンスの設定方法

ここではAWSコンソール上から設定する方法について述べます。

  1. スポットインスタンスはEMRクラスター作成時に、クイックオプションでは選択することができないため、作成フォーム上部の「詳細オプション」を選択します。
    quick.png

  2. 「ステップ2:ハードウェア」の項目で、EMRクラスターの各ノードに対して「スポット」を選択します。
    detail.png

  3. あとはよしなに作ります。

  4. 作成した後に確認する場合はスポットの詳細画面を開き、「ハードウェア」タブを選択することで確認できます。
    confirm.png

スポットインスタンスのデメリット

メリットは前述の通り安価であることです。が、しかしデメリットもあります。それは安定性です。

スポットインスタンスは前述の通り、余剰リソースに対する入札制であるため、需給のバランスによって課金額(以下、スポット価格)が増減します。
価格決定のロジックは以下のようになっているようです。(公式ドキュメント、及びAWSの方からの情報)

  1. AWS全体で抱えているリソースの中から、オンデマンドに割り当てられていないものを、入札額が高い人から順に割り当てる。
  2. 実際に割り当てられた人の中でもっとも入札額が低い人の入札額が、その時点での価格となる。(図の例では\$2.50を入札額に設定していた人であっても、実際には\$0.03が課金される。)

[価格決定のロジック例]
Untitled (4).png

なお、上図でも表現しているのですが、オンデマンドとスポットは同じリソースプールを共有するため、スポット価格はオンデマンドを使っているユーザーが増加した場合でもスポット価格は上昇します。

この価格決定のロジックによって、このスポット価格がオンデマンド価格を超えてしまう(最大でオンデマンド価格の10倍程度まで上昇する)こともあるのです。(キャプチャ参照)

[スポットインスタンス価格変動状況例]
スクリーンショット 2017-12-03 15.59.39.png

しかし、キャプチャから見てみたいただいても分かる通り、一時的に高騰することもあるものの、総じて言えば安価で稼働させていくことができます。

スポット価格高騰時の振る舞い

では、このスポット価格が入札額を超えるとどうなるか、ですが、

【起動時に、スポット価格が設定されている入札額を超えている】
EMRインスタンスは起動中の状態となり、各ノード(マスター・コア・タスク)はスポット価格が入札額以下になるまでプロビジョニング状態で待機する。
 
【起動後に、スポット価格が設定されている入札額を超えた】
入札額を超えてから、2分後にEMRインスタンスは強制的に停止する。

という振る舞いになります。

どちらも使いたい時に使えないという意味ではかなり手痛いのですが、特に後者はせっかく時間かけて処理をさせていたものが無駄になってしまいます。

成功するまでリトライすれば良いものであれば良いのですが・・・、ある日時までにできていなければならないなど、一定安定性をもって使うことが求められる場合にはスポットインスタンスは諦めるしかないのだろうか?

いやいや、諦めたら試合終了だよ?ということで、次回から本格的に対策を説いていきます。
(応援してくれたら、きっと書き上げるの早くなると思いますので、よろしくお願いします!!)

明日のフロムスクラッチ Advent Calendar 2017の4日目は@nrk_babyさんです。

参考文献

EMR

・EMR: AWS上のマネージド型のHadoopフレームワークhttps://qiita.com/uenohara/items/36aadaa8884359b8674b
・AWS EMR(公式)
https://aws.amazon.com/jp/emr/details/
・Amazon EMR 料金(公式)
https://aws.amazon.com/jp/emr/pricing/
・AWS CLI Command Reference - create-cluster (公式:英語)
http://docs.aws.amazon.com/cli/latest/reference/emr/create-cluster.html

EC2スポットインスタンス

・Amazon EC2 スポットインスタンス(公式)
https://aws.amazon.com/jp/ec2/spot/
・スポットインスタンスを安定して利用するための取り組みhttps://qiita.com/megadreams14/items/766ce04ca6cb418e95ca