今回は実践編
前回の記事 では、Azure HDInsightサービスの概要に関してお伝えしました。
今回は、実際にHDInsightのクラスタを作り、いくつかの方法でジョブを動かす方法をご覧いただこうと思います。ぜひ、お手元のマシンで実際にお試しください。
作業環境の準備
さて、さっそく本題に入りたいのですが、その前に。今回の記事では、クラスタ作成やジョブ投入など、多くの操作で“ Windows Azure PowerShell” を利用します。ということはつまり、Windows環境が必要です。もしあなたが今どこかのカフェで、銀色に輝く素敵なラップトップのトラックパッドをスリスリしているのであれば、そこでPowerShellは動かないかもしれません。が、ご安心ください。そんなときのためのAzureです。
今回は、Azure上に作業環境としてのWindows Server仮想マシンを作成し、そこですべての処理を行う方法をご紹介します。
Windows Azureのアカウント
もし、まだAzureを使える環境をお持ちでない場合、ひとまず1ヵ月間無料評価版 のサブスクリプションを作成してください。この際、マイクロソフトアカウント(旧称:Windows Live ID)が必要です。
Windows Server仮想マシンの作成
次に、先ほどサブスクリプションを作成した際のマイクロソフトアカウントで、Azure管理ポータル へログオンし、仮想マシンを作成します。画面左下の「新規」ボタンから「コンピューティング」 →「 仮想マシン」 →「 簡易作成」をクリックすると、簡単に作成できます。
仮想マシンの作成
仮想マシンイメージはいろいろありますが、お勧めは最新のWindows Server 2012 R2です。できあがったら、管理ポータル下の黒帯にある「接続」をクリックしてリモートデスクトップ接続してください。
Windows Azure PowerShellのインストールと設定
次に、Windows Azure PowerShellをインストールし、Azureの認証情報を追加します。
これは、Microsoft Web Platform Installer (WebPI)を使うと簡単です。WebPIをインストールし起動すると、Windows Azure PowreShellが選択可能になっていますので、“ Add” をクリックしてこれをインストールします。
Azureの認証情報を追加
完了したら、スタート画面からWindows Azure PowerShellを起動し、Add-AzureAccountコマンドレットを実行します。すると、認証画面がポップアップしてきますから、Azure管理ポータルへアクセスするのと同じマイクロソフトアカウントで、認証を行ってください。
ログイン
以上で、Windows Azure PowerShellが利用できるようになりました。
HDInsightクラスタの作成
いよいよHDInsightクラスタを作成することができます。Azure管理ポータルからも作れるのですが、せっかくWindows Azure PowerShellのセットアップをしたところですから、これを使ってみましょう。
Azureストレージアカウントの作成
前回の記事でお伝えしたとおり、HDInsightはAzureのBLOBストレージをデフォルトファイルシステムとして利用します。このストレージは、下図に示すような階層構造を持ち、最上位の要素として「ストレージアカウント」があります。その中に「コンテナ」というフォルダのようなものがあり、コンテナの中に「BLOB(ファイル) 」が格納される形です。
Azure BLOBストレージのイメージ
HDInsightのクラスタを作る際には、「 ストレージアカウント」と「コンテナ」を指定する必要がありますから、あらかじめこれらを作成しておくことが必要です。
まずはストレージアカウントを作りましょう。Windows Azure PowerShellで次のコマンドを実行します。
New-AzureStorageAccount ストレージアカウント名 -Location "Southeast Asia"
「ストレージアカウント名」は英数字のみが使えます。
-Locationは、ストレージアカウントを配置するデータセンターの場所(リージョン)ですが、残念ながらHDInsightはまだ日本リージョンでは使えません。アジア圏では唯一“ Southeast Asia” (シンガポール)にありますので、ストレージアカウントもそこに作ります。
ストレージアカウントが作成できたら、その中にコンテナを1つ作成します。
これも、コマンドで作ってしまいます。複数行に渡りますが、1行ずつコマンドラインに打ち込んでもかまいませんし、スクリプトファイルにしてもOKです。
$storageAccountName = "ストレージアカウント名"
$containerName = "コンテナ名"
$storageAccountKey = (Get-AzureStorageKey $storageAccountName).primary
$context = New-AzureStorageContext $storageAccountName $storageAccountKey
New-AzureStorageContainer $containerName -Context $context
クラスタの作成
ようやく、クラスタの作成ができます。少々長くなりますが、以下のコマンドを実行してください。長いと言っても、実行しているコマンドはNew-AzureHDInsightClusterだけです。
データノードの数は、下記の例では控えめに“ 2” としていますが、コア数クォータの範囲内で、任意の値を指定できます。既定では、HDInsightのコア数クォータは170コアとなっていますから、40ノードまで指定可能です(ネームノードがXLサイズ=8コア、データノードはLサイズ=4コアです) 。
$clusterName = "sasahdi2014" # HDInsightクラスタの名前
$location = "Southeast Asia" # クラスタを配置するリージョン。
$storageAccountName = "kshdi"# 先ほど作ったストレージアカウント名
$containerName = "hdinsight" # 先ほど作ったコンテナ名
$clusterNodes = 2 # データノードの数。
New-AzureHDInsightCluster -Name $clusterName `
-Location $location `
-DefaultStorageAccountName "$storageAccountName.blob.core.windows.net" `
-DefaultStorageAccountKey (Get-AzureStorageKey $storageAccountName).primary `
-DefaultStorageContainerName $containerName `
-ClusterSizeInNodes $clusterNodes
実行すると、ユーザ名とパスワードの入力を促すダイアログがポップアップしてきます。これは、クラスタの管理者となるユーザー名とパスワードを設定するものです。パスワードは最低10文字必要です。
ユーザ名とパスワードの設定
作成完了まで10分程度かかりますので、お待ちください。できあがると、管理ポータルにもこのようにHDInsightクラスタが現れます。
HDInsightクラスタ
ネームノードにログオンしてみる
Azure HDInsightは、PowerShellなどを使ってリモートから操作することが多いのですが、ネームノードに直接ログオンしてhadoopコマンドを実行したりすることも可能です。その設定をしてみましょう。これはAzure管理ポータルから行ってみます。
Azure管理ポータルで、できあがったばかりのHDInsightクラスタをクリックし、「 構成」タブに切り替えてから黒帯の「リモートを有効にする」をクリックします。
リモートを有効にする
すると「リモートデスクトップの構成」ダイアログがでてきます。ユーザー名とパスワード、有効期限を設定します。
各種設定
リモート接続が有効になると「接続」ボタンが出現しますので、クリックするとリモートデスクトップ接続ファイル(.rdpファイル)がダウンロードできます。
リモートデスクトップ接続ファイル
これを開くと、ログオンすることができます。ご覧の通り、HDInsightはWindows Server 2008 R2上で動いているのでした。
HDInsightの実行の様子
ここで、デスクトップにあるショートカットからMapReduceやHDFSの管理画面にアクセスしたり、コマンドプロンプトを開いてhadoopコマンドなどを実行することもできますし。ただし、注意していただきたいのは、HDInsightクラスタを構成するノードは、すべてAzureの「Workerロール」のインスタンスだということです。
Workerロールは、Azureの「仮想マシン」機能で提供されるインスタンス(PersistentVMRole)と違い、永続的なストレージを持ちません。土台になっている物理マシン側のメンテナンスなど、何らかのタイミングでインスタンスが再作成されることがあり、その場合ディスクの内容もすべて初期状態に戻ってしまいます(今はやりのImmutable Infrastructureなのです) 。
また、ネームノードへログオンするユーザーは管理者権限を持っていません。これらのことから、「 ネームノードにログオンして、さまざまなツールを導入しクラスタ管理作業を行う」といった使い方は適切ではありません。
というわけで、ネームノードにログオンせずに、HDInsightクラスタを利用する方法を紹介していきましょう。まずは、ファイルシステム操作からです。
HDInsightのファイルシステムにアクセス
HDInsightがAzureのBLOBストレージをデフォルトのファイルシステムとして利用するということは、つまりBLOBストレージ用の既存ツールを、Hadoopのファイルシステム操作に利用できるということです。
ここでは、広く利用されているCloudXplorer を使って、クラスタ作成直後のファイルシステムを覗いてみましょう。クラスタ作成時に指定したコンテナ(下図では“ hdinsight” )の中に、いくつものフォルダやファイルが作成されていることがわかります。
実は、BLOBストレージには「フォルダ」という概念はなく、コンテナの下にフラットにファイルが並ぶだけなのですが、フォルダ名まで含めた「フルパス形式」のファイル名を付けることで、擬似的に階層ディレクトリ構造を表現しています。CloudXplorerをはじめ、さまざまなツールがこの方式に対応しています。
CloudXplorer
たとえば、上の図で/example/jars配下に“ hadoop-example.jar” ファイルがありますが、実際には“ example/jars/hadoop-examples.jar” という名前のファイルがコンテナ直下に置かれているのです。
MapReduceプログラムの実行
ファイルシステムの扱い方がわかったところで、いよいよMapReduceプログラムを実行してみましょう。ちょうど先ほど、サンプルプログラムがたくさん詰まったhadoop-example.jarを見つけたばかりですから、これに含まれるプログラムを何か実行してみましょう。
となればやはり、「 MapReduce界のHelloWorld」たるWordCountプログラムにしましょうか。これは、指定されたファイルの中のテキストを単語に分割し、個々の単語の出現回数を数え上げる、というシンプルなプログラムです。
HDInsightのファイルシステムには、/example/data/gutenbergにWordCountの練習用テキストファイルが置いてあります。これをカウント対象にして、結果は/out/wordcount に書き出すようにしましょう。
通常のHadoop環境であれば、hadoopコマンドを次のように実行するところです(HDInsightでも、ネームノードにログオンしてこのコマンドを実行することができます) 。
hadoop jar /example/jars/hadoop-examples.jar wordcount \
/example/data/gutenberg /out/wordcount
Windows Azure PowerShellでは次のようになります。
New-AzureHDInsightMapReduceJobDefinition `
-JarFile "/example/jars/hadoop-examples.jar" `
-ClassName "wordcount" `
-Arguments "/example/data/gutenberg", "/out/wordcount" `
| Start-AzureHDInsightJob -Cluster クラスタ名
※PowerShellでは継続行記号は`(バッククォート)です。
New-AzureHDInsightMapReduceJobDefinitionでジョブを定義し、それをStart-AzureHDInsightJobへ流し込むという形になります。クラスタ名のところは適宜置き換えてください。
コマンドラインで上記コマンドを実行し、無事にジョブが投入されると、このように各種情報が出力されます。
Cluster : sasahdi2014
ExitCode :
Name : wordcount
PercentComplete :
Query :
State : Initializing
StatusDirectory : 3987390e-175c-41b9-a1f9-0a8a5e20d122
SubmissionTime : 3/24/2014 3:34:31 PM
JobId : job_201403241248_0001
ジョブの状態を問い合わせるには、クラスタ名とジョブIDを指定して、次のコマンドを実行します。
Get-AzureHDInsightJob -Cluster sasahdi2014 -JobId job_201403241248_0001
どうやら、ジョブはすでに終わっていたようです。
Cluster : sasahdi2014
ExitCode : 0
Name : wordcount
PercentComplete : map 100% reduce 100%
Query :
State : Completed
StatusDirectory : 3987390e-175c-41b9-a1f9-0a8a5e20d122
SubmissionTime : 3/24/2014 3:34:31 PM
JobId : job_201403241248_0001
結果を確認してみましょう。やはり、CloudXplorerなどのツールでBLOBを見るのが便利です。“ part-r-00000” が出力ファイルです。
結果の確認はCloudXplorerで
開いてみると、単語とその出現回数が淡々と記録されていることがわかります。
結果のデータ
Hiveを試してみる
HiveはHadoopのファイルシステム上のファイルに対して「それがデータベースのテーブルであるかのように」アクセスすることを可能にする便利なモジュールです。
HDInsightには、このHiveの機能を簡単に試せるように、サンプルのテーブルが1つ、あらかじめ定義されています。これにAzure PowerShellでアクセスしてみましょう。
まず、接続するHDInsightクラスタを指定します(HDInsightのクラスタは、いくつでも作れます) 。
PS C:\> Use-AzureHDInsightCluster sasahdi2014
Successfully connected to cluster sasahdi2014
あとは、hiveコマンドを叩くだけです。テーブルの存在を確認してみましょう。
PS C:\> hive "show tables"
hivesampletable
hivesampletableというのがあるのがわかります。どんなテーブルなのでしょう?
実はこれ、「 とあるEコマースサイトに対するモバイルデバイスのアクセスを記録した」という設定の、架空のログファイル(/hive/warehouse/hivesampletable/HiveSampleData.txt)をHiveのテーブルにしたものです。
少しフィールドを絞って、時刻でソートし、10件だけ抽出してみます。
PS C:\> hive "select clientid,querytime,devicemake,devicemodel,state from hivesampletable order by querytime limit 10"
132587 00:00:01 Apple iPhone 4.2.1 Texas
62003 00:00:06 LG VS740 California
20701 00:00:06 LG LS670 Pennsylvania
132587 00:00:06 Apple iPhone 4.2.1 Texas
30615 00:00:06 Samsung SCH-i500 Illinois
132587 00:00:07 Apple iPhone 4.2.1 Texas
132587 00:00:07 Apple iPhone 4.2.1 Texas
132587 00:00:07 Apple iPhone 4.2.1 Texas
133562 00:00:10 Apple iPhone 4.1 West Berkshire
62426 00:00:12 LG VS660 Pennsylvania
このように、他のプラットフォームのHadoopと同様に、Hiveを簡単に使うことができます。なお、自然な感じで” hive” コマンドを使っていましたが、これはInvoke-AzureHDInsightHiveJobコマンドレットのエイリアスなのでした。
PS C:\> alias hive
CommandType Name
----------- ----
Alias hive -> Invoke-AzureHDInsightHiveJob
Hive ODBCドライバの活用
先ほどのHiveテーブル、実は6万レコード近くあります。データベースのテーブルとしては特段多いわけではありませんが、しかしPowerShellのコンソールでクエリを繰り返すより、もう少し見やすい方法がほしいところですよね。
そこで、“ Microsoft Hive ODBC Driver” を使ってみましょう。これは、Hiveテーブルに対するODBC接続を可能にするドライバです。こちらからダウンロードできます。
32-bit版と64-bit版がありますが、これはお使いの「Officeのアーキテクチャに」対応した方をダウンロードしてください。たとえば筆者は、64-bit版のWindows 8.1上で32-bit版のOffice 2013を使っています。この場合、必要なHive ODBCドライバは32-bit版です。
インストールはとくに選択肢もありませんので、“Next”->“Next”で完了させます。
Hive ODBCドライバのセットアップ
次に、コントロールパネルからODBCデータソースを作成します。ドライバが32ビットであれば、ここでセットアップするデータソースも32ビットです。
ドライバの選択
ドライバ選択画面になりますから、“ Microsoft Hive ODBC Driver” を選択します。
“Microsoft Hive ODBC Driver” を選択
次に、HDInsightクラスタへの接続情報を入力します。
Host には「クラスタ名.azurehdinsight.net」を、User NameとPasswordには、クラスタ作成時に指定した管理者名とパスワードを入力します。
HDInsightクラスタへの接続情報
では、Excelから接続してみましょう。「 データ」 →「 その他のデータソース」 →「 データ接続ウィザード」とクリックします。
Excelから接続
次に出てくるダイアログでは「ODBC DSN」を選び、先ほど作ったデータソースを選択します。テーブル選択では“ hivesampletable” を選びます。
hivesampletableを選択
「接続のプロパティ」でクエリを指定することもできます。
クエリの指定
最終的に、Excelのシート上にhivesampletableの内容が取り出されました。
Excelへの出力
一旦Excelに取り込んでしまえば、グラフを生成したり、ピボットテーブルで分析したりとさまざまにデータを活用できます。「 Hadoopはよくわからないが、Excelなら慣れている」というユーザーのノウハウが活かせるわけです。
まとめ
今回は、Azure HDInsightサービスのクラスタ構築から、BLOBストレージとのやりとり、MapReduceジョブの実行、Hiveを使ったデータベースライクなクエリなどの具体的な方法をお伝えしました。HDInsightを少しでも身近に感じていただければ幸いです。