はじめに
こんにちは、サイオステクノロジーの水倉です。
Azure のデータ分析系サービスというと正直ピンと来ていなかったのですが、近年急速に機能が拡充され、新サービスが多く誕生しています。しばらく触っていなかったら浦島太郎状態。。。。今ひとつ違いがわからず、どこから手をつけたらよいかわからないという方もきっと多いのではないでしょうか。
※MS 謹製公式アイコンで Power BI Embedded だけなぜ黒いのでしょう ・・・
そんな方(と自分)のために複数回に渡って、Azure のデータ分析系サービスを実際に動かしてみて機能を整理していきたいと思います。今回は手始めに HDInsight を使って簡単な分析をしてみます。
HDInsight とは?
一言で言えば、Azure が提供するフルマネージドなクラスターサービスです。
利用可能なクラスターは Hadoop だけでなく、列指向ストレージや R 言語の実行環境までと幅広く提供されていて、大量データ分析に必要な構成一式が数 10 分で利用可能となっています。
ここで各コンポーネントの概要をおさらいしておきましょう。
利用可能なクラスター種別 | 概要 |
---|---|
Hadoop | MapReduceを実装した分散処理基盤。Hive、Pig、Oozie等を利用可能 |
Spark | インメモリな高速分散処理基盤 |
Strom | ストリームデータのリアルタイム分散処理基盤 |
HBase | スケーラブルな列指向 DB。Google Bigtable の OSS クローン |
Microsoft R Server | R をクラスター並列処理実行可能な分析基盤 |
Kafka ※2017/01/24 時点プレビュー |
リアルタイムストリーム処理、メッセージング機能を持った高耐久性、スケーラブルな分散ストリーム処理基盤 |
インタラクティブ Hive ※2017/01/24 時点プレビュー |
インメモリキャッシュによりインタラクティブ性が向上した Hive クラスター |
HDInsight は Azure ストレージサービスとシームレスに統合されています。
例えば、
Hadoop、Spark、R Server で処理対象データをデータノードに保持せず、外部ストレージサービスに保持できるため、処理が完了したら HDInsight クラスターを削除する運用が可能です。
利用可能な外部ストレージサービスは、BLOB ストレージ、または Data Lake Store (ビッグデータ分析に最適化されたストレージ。階層型のファイルシステム) です。
Immutable Infrastructure な運用メリットに加えて、コスト面でのメリットも嬉しいですね。
また、HDInsight はサービス開始当初は Windows クラスターのみの提供でしたが、2015年9月に Ubuntu ベースの Linux が利用可能となったことで、Hadoop エコシステムとの統合が進み、選択可能なツール、機能が増えてきています。
HDInsightを動かしてみる
今回は Linux ベースの Hadoop クラスターを作成し、簡単な Hive クエリを実行してみます。
HDInsight Hadoop クラスターを作成する
Azure ポータルから「+(新規) > Intelligence + analytics > HDInsight」を選択します。
それぞれ下記のように設定をしていきます。
「クラスター名」
ドメインでユニークな任意名称を指定します。
「クラスターの構成」
クラスターの種類: Hadoop
オペレーティングシステム: Linux
Hadoop バージョン: 2.7.3
クラスターレベル: Standard
Premium は Active Directory ドメイン参加済みクラスタを利用可能で、マルチユーザ認証、ロールベースのアクセス制御、監査機能が利用可能です。現在プレビューで Hadoop 2.7.3 (HDI 3.5) でのみ利用可能 となっています。
「資格情報」
クラスターログインユーザ名: admin
クラスターログインパスワード: xxxxxxx
SSH ユーザー名: floyd
SSH 認証の種類: 公開キー ※パスワード認証も利用可能
※ssh接続用の公開鍵認証キーペアはMS公式のOpenSSHモジュールを使用してWindowsデスクトップOSでssh公開鍵の作成 を参考にして作成してください。
「データソース」
Primary storage type: Azure Storage
ストレージアカウント: ※任意の Standard ストレージアカウントを指定します。
既定のコンテナー: ※今回はクラスター名(デフォルト値)を使用します。
場所:東日本
Data Lake Store アクセス: ※今回は BLOB ストレージを利用するため何も設定しません。
「クラスターサイズ」
ワーカーノードの数: 2
※ヘッドノードは 2 ノード必須なため、ワーカーノードの数 + 2 ノード分の費用がかかります(このケースでは 4 ノード分の費用で、1 時間で 139.13 円)
ワーカーノードサイズ: D3 v2
ヘッドノードサイズ: D3 v2
(参考) クラスター種別毎のノード構成の詳細
「リソースグループ」
リソースグル―プ: hdinsight-test(新規作成)
※既存リソースグループから選択しても構いません。
以上の設定後、「作成」ボタンを押します。
クラスターの作成には最大 20 分程度かかるため、作成完了を待ちます。
※今回は 8 分弱で完成しました。驚くほど手軽ですね。
クラスターが完成したら、サイドメニューの「> (その他のサービス) > インテリジェンス + 分析 > HDInsight クラスター」の一覧から作成したクラスター名を選択して、概要が表示されることを確認しておきましょう。
分析対象データを Azure BLOB ストレージへ配置する
BLOB ストレージへファイルを配置するにはいくつか方法がありますが、ここでは Azure CLI を使用します。
Azure CLI はこちらを参照してインストールしておきます。Azure CLI は マルチ OS 対応していますので、たまには(?) Windows で使ってみます。
> set AZURE_STORAGE_ACCOUNT=ymizukurastandard ※クラスター作成時に指定したストレージアカウント名 > set AZURE_STORAGE_ACCESS_KEY=bIbwcpfxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ※ストレージアカウントのアクセスキー
HDInsight クラスターを作成時に指定したストレージを覗いてみましょう。
azure storage blob list <コンテナー名> <BLOB 名 (オブジェクトパス)>
ここではクラスター作成時に配置されるサンプルデータを確認してみます。
> azure storage blob list crazy-diamond HdiSamples/HdiSamples*\.csv info: Executing command storage blob list + Getting blobs in container crazy-diamond data: Name Blob Type Length Content Type Last Modified Snapshot Time data: -------------------------------------------------------------- --------- -------- ------------------------ ----------------------------- ------------- data: HdiSamples/HdiSamples/FoodInspectionData/Food_Inspections1.csv BlockBlob 19085284 application/octet-stream Tue, 24 Jan 2017 05:01:15 GMT data: HdiSamples/HdiSamples/FoodInspectionData/Food_Inspections2.csv BlockBlob 14329875 application/octet-stream Tue, 24 Jan 2017 05:01:16 GMT data: HdiSamples/HdiSamples/SensorSampleData/building/building.csv BlockBlob 544 application/octet-stream Tue, 24 Jan 2017 05:01:17 GMT data: HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv BlockBlob 240591 application/octet-stream Tue, 24 Jan 2017 05:01:18 GMT info: storage blob list command OK
アクセスできることが確認できたところで、分析対象のテストデータを配置していきます。
今回は Tableau Public のサンプルデータセットから「アメリカで人気の新生児名 TopBabyNamesbyState.csv 」を利用したいと思います。これは1910 ~ 2012 年で最も多く誕生した男児名と女児名の州別データです。
ローカルカレントディレクトリに TopBabyNamesbyState.csv を配置し、Azure CLI で BLOB ストレージへアップロードします。
> azure storage blob upload <アップロード対象ファイルパス> <コンテナー名> <BLOB 名>
> azure storage blob upload TopBabyNamesbyState.csv crazy-diamond mydata/top_baby_names_by_state.csv info: Executing command storage blob upload + Checking blob mydata/top_baby_names_by_state.csv in container crazy-diamond + Uploading TopBabyNamesbyState.csv to blob mydata/top_baby_names_by_state.csv in container crazy-diamond Percentage: 100.0% (225.36KB/225.36KB) Average Speed: 225.36KB/S Elapsed Time: 00:00:00 + Getting storage blob information data: Property Value data: ------------- ---------------------------------- data: container crazy-diamond data: name mydata/top_baby_names_by_state.csv data: blobType BlockBlob data: contentLength 230766 data: contentType text/csv data: contentMD5 ffmw6jPmiX0AtfQCPKm91g== info: storage blob upload command OK
アップロードされたことを確認します。
> azure storage blob list crazy-diamond mydata/ info: Executing command storage blob list + Getting blobs in container crazy-diamond data: Name Blob Type Length Content Type Last Modified Snapshot Time data: ---------------------------------- --------- ------ ------------ ----------------------------- ------------- data: mydata/top_baby_names_by_state.csv BlockBlob 230766 text/csv Tue, 24 Jan 2017 05:58:00 GMT info: storage blob list command OK
HDInsigth ヘッドノードへ SSH 接続する
クラスター作成時に指定した SSH ユーザー名、秘密鍵を使用して 任意のターミナルからSSH 接続します。
“Welcome to HDInsight.” と表示されていますね。
Using username "floyd". Authorized uses only. All activity may be monitored and reported. Authenticating with public key "imported-openssh-key" Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-59-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage Get cloud support with Ubuntu Advantage Cloud Guest: https://www.ubuntu.com/business/services/cloud 45 packages can be updated. 11 updates are security updates. Welcome to HDInsight. Last login: Tue Jan 24 05:25:03 2017 from xxx.xxx.xxx.xxx To run a command as administrator (user "root"), use "sudo ". See "man sudo_root" for details. floyd@hn0-crazy:~$
Hive クエリを実行する
Hive を起動します。
$ hive Logging initialized using configuration in file:/etc/hive/2.5.2.1-6/0/hive-log4j.properties hive>
テーブルを作成します。
テストデータがヘッダ付 CSV のため、テーブルプロパティで skip.header.line.count’=’1′ を指定してヘッダを読み込まないようにします。
CREATE EXTERNAL TABLE top_baby_names_by_state ( state string, gender string, year int, first_name string, occurrences int) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION 'wasbs:///mydata/' -- テストデータを配置した BLOB パスを指定 tblproperties ('skip.header.line.count'='1');
テーブルが作成されたことを確認します。
hive> show tables; OK hivesampletable top_baby_names_by_state Time taken: 0.04 seconds, Fetched: 2 row(s)
データ件数を確認してみると、10,506 件。件数が少ないのはさておき、csv ファイルの行数と一致していて問題なさそうです。
hive> select count(1) from top_baby_names_by_state; Query ID = floyd_20170124074115_272281be-7538-41a8-bb28-30920946d182 Total jobs = 1 Launching Job 1 out of 1 Status: Running (Executing on YARN cluster with App id application_1485233940874_0014) -------------------------------------------------------------------------------- VERTICES STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED -------------------------------------------------------------------------------- Map 1 .......... SUCCEEDED 1 1 0 0 0 0 Reducer 2 ...... SUCCEEDED 1 1 0 0 0 0 -------------------------------------------------------------------------------- VERTICES: 02/02 [==========================>>] 100% ELAPSED TIME: 5.38 s -------------------------------------------------------------------------------- Status: DAG finished successfully in 5.38 seconds METHOD DURATION(ms) parse 10 semanticAnalyze 699 TezBuildDag 388 TezSubmitToRunningDag 66 TotalPrepTime 2,283 VERTICES TOTAL_TASKS FAILED_ATTEMPTS KILLED_TASKS DURATION_SECONDS CPU_TIME_MILLIS GC_TIME_MILLIS INPUT_RECORDS OUTPUT_RECORDS Map 1 1 0 0 1.62 2,730 64 10,506 1 Reducer 2 1 0 0 1.09 2,040 87 1 0 OK 10506 Time taken: 7.918 seconds, Fetched: 1 row(s)
ちなみに、上記の実行ログを見るとHive 実行エンジンは MapReduce ではなく高速な Apache Tez が利用されていることがわかります。
※デフォルトの Hive 実行エンジンはクラスター OS によって異なり、Linux は Tez、Windows は MapReduce のため、Windows で Tez を利用したい場合は明示的に設定する必要があります。詳しくはこちら。
それでは、次のクエリを実行してアメリカの州で最も人気の名前男女別ベスト 3 を見てみます。
select state, gender, rank, first_name, occurrences from ( select state, gender, first_name, rank() over ( partition by state, gender order by state, gender, sum(occurrences) desc ) rank, sum(occurrences) occurrences from top_baby_names_by_state group by state, gender, first_name ) a where rank < 4 order by state, gender, rank
AK F 1 Mary 2140 AK F 2 Jennifer 1622 AK F 3 Jessica 1479 AK M 1 Michael 4056 AK M 2 John 2154 AK M 3 David 909 AL F 1 Mary 99436 AL F 2 Jennifer 11456 AL F 3 Ashley 7387 ....
それでは、アメリカ全体で最も人気の名前・男女別ベスト10を見てみます。
select gender, rank, first_name, occurrences from ( select gender, first_name, rank() over ( partition by gender order by gender, sum(occurrences) desc ) rank, sum(occurrences) occurrences from top_baby_names_by_state group by gender, first_name ) a where rank < 6 order by gender, rank
女性は Mary、男性は Michael が突出していますね。
F 1 Mary 2510913 F 2 Jennifer 811054 F 3 Linda 465969 F 4 Lisa 396100 F 5 Ashley 287670 M 1 Michael 2274105 M 2 James 1566897 M 3 Robert 1213750 M 4 John 756249 M 5 David 291260
HDInsight クラスタ-を削除する
HDInsight のクラスターは処理の実行有無に関わらず、起動しているだけで課金されるため、使い終わったら忘れずにクラスターを削除しておきます。
分析対象データは BLOB ストレージに保持されているため、データは失われないので心置きなく削除できます。
まとめ
今回は、HDInsight の機能を紹介し、Hadoop クラスターの作成からヘッダノード上で hive コマンドを使って簡単なクエリを実行するところまで動かしてみました。Hadoop コンポーネントが導入済みで、大規模な分散処理基盤が手軽に利用できることがわかりました。
次回は、Apache Ambari を使った GUI での Hive クエリの実行や、実行結果の可視化、Hadoop 運用管理のための機能を見ていきたいと思います。
最後までご覧いただき、ありがとうございました!