Windows Azure Page Blob の活用 ~ クラウドカバー Episode 57

 

57回目を迎えた WadeSteve による Channle 9 の人気番組クラウドカバー。

今回は MVP の Brent Stineman をゲストに迎え、Windows Azure の Page Blob に関するお話です。

Windows Azure の Page Blob は Azure Drive の基盤テクノロジーとして使用されているため、多くの方が知らずとつかっている場合も多いかと思いますが、今回は Azure Drive だけじゃもったいない、の精神で Page Blob の活用方法を議論していきます。

 

まずはいつものようにニュースから。

Accessing a Service on the Windows Azure Service Bus from Windows Phone 7

最初の話題は Windows Phone 7 から、Windows Azure の Service Bus に接続するためのコーディング紹介のブログ。

通常、Windows Azure の Service Bus を利用する際には Microsoft.ServiceBus な名前空間のライブラリを活用することで、簡単にサービス接続を実現できるわけですが、Microsoft.ServiceBus.dll を利用できない環境などで、どのように Service Bus への接続を行うかが今回の記事でのポイント。

 

主に ACS につないで認証トークンを受け取る方法と、そのトークンを使って実際に Service Bus に接続するための方法が解説されています。

 

Autoscaling Windows Azure Applications

現在 PAG(発音は「パグ」。正式名称は Patterns And Practices Group)チームでは Enterprise Library の一環として Windows Azure 用のアプリケーションブロックの開発を進めています。

今回紹介するブログエントリでは、Windows Azure のオートスケールに関する実際のアプリケーションブロックや、 コーディングサンプルを紹介しているのではありませんが、現在開発中(※)のオートスケールのためのアプリケーションブロックの概要を紹介しています。

 

※その後、Windows Azure Autoscaling Application Block (WASABi) としてプレビュー版が公開されています。是非お試しください!

 

Building and Deploying Windows Azure Projects Using MSBuild and TFS 2010

MSBuild を使った Windows Azure プロジェクトのビルドとデプロイに関するウォークスルーなドキュメントです。Azure SDK 1.4 から登場したコンフィギュレーションファイルの分割(デバッグ用とリリース用で設定を変える etc)への対応や、Windows Azure 環境へのアプリケーションのデプロイ、またその際のこまごまとした設定や、Blob ストレージにビルド成果物を保存する方法など、詳細な手法が紹介されています。

 

ビルド環境にデプロイを組み込んでおきたい!というときに是非。

 

 

Sogeti Creates the Windows Azure Privilege Club

本日のゲスト Brent が所属する Sogeti 社がホストする Windows Azure Privilege Club の紹介です。クライアント企業同士のナレッジ交換を目的としたソーシャルな会のようです。

 

 

ということで、いよいよ本日の本題 Page Blob のお話。

きっかけは、Brent が Azure のトレーニング講師をした際に、「Page Blob デモが見たい」というリクエスト。

それを元に解説を書いたのがこちらのエントリ「A Page at a Time (Page Blobs - Year of Azure Week 7)」と、「Page, After Page, After Page (Year of Azure Week 8) 」。

画像ファイルの受け渡し(アップロードと、ダウンロード)に Page Blob を用いたサンプルです。「数百メガバイトのファイルを受け渡しする際に、アップロードに5、10分、ダウンロードにも5、10分と待つのはちょっと、、、」、ということで、Page Blob の特性であるランダムアクセスに強いところを生かしつつ、並列性を持たせたサンプルになっています。

 

ということで、早速 Brent のデモへ。

2つの Viusal Studio が立ち上がっていますが、左がファイルを送る Transmitter (アップロードを行う側)で、右がファイルを受け取る Reciver (ダウンロードを行う側)です。

image

 

まず、Transmitter 側では、Page Blob を作成し、保存領域を確保します。

今回は 23552 バイトを確保しています。これは今回必要な領域の倍程度の領域。

 

// create our page blob CloudPageBlob pageBlob = container.GetPageBlobReference(uniqueBlobName); pageBlob.Properties.ContentType = "image\\jpeg"; pageBlob.Metadata.Add("size", streams.Length.ToString()); pageBlob.Create(23552); // now its visible to other processes, but empty

デモではブレークポイントを仕掛けて、ここまでの実行で一旦ストップ。

実際に Blob 領域を見ると、23KB のファイルが作られていますが、中身を確認しても何も表示されません(領域確保だけされている状態)。

 

引き続きアップロードを行うためのコードを確認しつつ、部分的にアップロードを行った(繰り返し分を数回実行した)後に、Azure の Storage 領域にアップロードされた先ほどのファイルの中身を確認すると、以下のように、、、

image

 ここまでにアップロードされた情報のみが表示されます。

 

このデータを受け取る Reciver 側のコードもほぼ同様のコードになっています。

 

ここで、ひとつ Tips.

 

foreach (CloudPageBlob pageBlob in container.ListBlobs().OfType<CloudPageBlob>())

 

Brent の友人で MVP の Neil Mackenzie が Azure Development Cookbook で書いていた Tips で、コンテナから Blob データを受け取る際に、OfType で CloudPageBlob のインスタンスのみを取り出すことができるというもの。

 

さて、Reciver 側も Page Blob を使いながら、分割したファイルをダウンロードするようにできています。

実際に Page Blob からデータを読み取る際に、最初に行っているのが PageRange で、Page Blob のうちで有効なデータが含まれている範囲を確認しています。下記は 512B のページを4ページ分送信したのちに、Receiver 側でデータを取りに行った際の状況(PageRange のバイト範囲が 2048 バイト分を指し示している)です。

image

 

これで Transmitter 側がデータを途中までしかアップロードしていないような場合でも、そこまでのデータを読みこむことが可能になっています。

 

具体的には、今回のデモではデータは 25ページの領域を使用して、一つの画像ファイルを保存していますが、Transmitter 側も、Reciver 側も、この25個のデータを一括でまとめて受け渡し、という形ではなく、一つ一つ順次受け渡しているイメージになります(これにより、受け渡しのパフォーマンスが向上するというわけです)。

image

 

今回の Cloud Cover で利用したサンプルコードは以下の Brent のブログから入手できますので、さくっと試してみたい方はぜひ(Azure のアカウント設定等なしに、ローカル実行で試せます)。

A Page at a Time (Page Blobs - Year of Azure Week 7)

Page, After Page, After Page (Year of Azure Week 8)

 

 

ということで、ポーカー好きな Smarx による、Tips of the Week。

image

 

今回は Counting にまつわるお話し、ということで、「テーブルの行数のカウント」に関して。

この話題はマイクロソフト社内の Distribution List(DL。メーリングリスト)でもよく話題に上がるトピックです。

 

テーブルにおける行数のカウントは、たとえば ODATA で .Count を使ったり $Count オペレーター等により実行できる、とお思いかもしれませんが、Windows Azure Table Storage ではそういった操作はありません。Table Storge に行数に関する問い合わせはできないのです。

 

そこで、これを実現するための手法として 2 つほど思いつきます。

一つ目は自分で数える方法です。

具体的には Table Service Query として .Execute を行うことです。.Execute により、クエリがクラウドに発行されクエリ処理が行われます。実際に行数を数える際には .Count を使用します。

この手法を用いる場合、.toList でもできますがお勧めしません。 .toList では一番最初にすべてのデータをローカルにダウンロードしたうえで、カウントを実行するためです。

.Execute であればレイジーロードでの実行になります。処理の実行に必要なページのみダウンロードを行い、次に処理を行う必要がある領域に達すれば次のページをダウンロードする、といった動作になります。

ただいずれにせよすべてのテーブルデータをローカルにダウンロードすることになります。

(※ OfType のところでも出てきた MVP な Neil Mackenzie  が書いたブログ「Queries in Azure Tables」もご参考にどうぞ)

 

そこで取り得るもう一つの方法として、他のテーブルで行数を数えておくという方法が出てきます。

この場合、そのデータはアトミックに操作する必要があるので、SQL Azure やキューを使う、あるいは Scalable Counter(以前のクラウドカバーで Apathy Button として実装を紹介したことがあります) のような実装を必要とすることに注意してください。

 

ということで、今回のクラウドカバー Episode 57、Windos Azure の Page Blob の活用は終了です。

 

Enjoy Cloud Development!