HDInsight Hadoop #1 Hive クエリ実行 (CUI編)

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【5/21開催】Azure OpenAI ServiceによるRAG実装ガイドを公開しました
生成AIを活用したユースケースで最も一番熱いと言われているRAGの実装ガイドを公開しました。そのガイドの紹介をおこなうイベントです!!
https://tech-lab.connpass.com/event/315703/

はじめに

こんにちは、サイオステクノロジーの水倉です。

Azure のデータ分析系サービスというと正直ピンと来ていなかったのですが、近年急速に機能が拡充され、新サービスが多く誕生しています。しばらく触っていなかったら浦島太郎状態。。。。今ひとつ違いがわからず、どこから手をつけたらよいかわからないという方もきっと多いのではないでしょうか。

Azure データ分析系サービス

※MS 謹製公式アイコンで Power BI Embedded だけなぜ黒いのでしょう ・・・

そんな方(と自分)のために複数回に渡って、Azure のデータ分析系サービスを実際に動かしてみて機能を整理していきたいと思います。今回は手始めに HDInsight を使って簡単な分析をしてみます。

HDInsight とは?

一言で言えば、Azure が提供するフルマネージドなクラスターサービスです。
利用可能なクラスターは Hadoop だけでなく、列指向ストレージや R 言語の実行環境までと幅広く提供されていて、大量データ分析に必要な構成一式が数 10 分で利用可能となっています。

hdinsight

ここで各コンポーネントの概要をおさらいしておきましょう。

利用可能なクラスター種別概要
HadoopMapReduceを実装した分散処理基盤。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」を選択します。

HDInsight 新規作成

 

screenshot.25-01-2017 11.54.20

それぞれ下記のように設定をしていきます。

「クラスター名」
クラスター名

ドメインでユニークな任意名称を指定します。

 

「クラスターの構成」

クラスターの構成クラスターの種類: 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設定

クラスターが完成したら、サイドメニューの「> (その他のサービス) > インテリジェンス + 分析 > HDInsight クラスター」の一覧から作成したクラスター名を選択して、概要が表示されることを確認しておきましょう。
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 ストレージに保持されているため、データは失われないので心置きなく削除できます。

screenshot.24-01-2017 18.03.55 screenshot.24-01-2017 18.05.46

まとめ

今回は、HDInsight の機能を紹介し、Hadoop クラスターの作成からヘッダノード上で hive コマンドを使って簡単なクエリを実行するところまで動かしてみました。Hadoop コンポーネントが導入済みで、大規模な分散処理基盤が手軽に利用できることがわかりました。

次回は、Apache Ambari を使った GUI での Hive クエリの実行や、実行結果の可視化、Hadoop 運用管理のための機能を見ていきたいと思います。

最後までご覧いただき、ありがとうございました!

アバター画像
About 水倉良明 17 Articles
biochemistryの世界からIT業界へ飛び込む。サイオステクノロジーには2014年に入社し、Hadoopベースの大規模データ処理基盤構築や、AWS、Azure基盤のWebシステム開発に従事。近年はクラウドネイティブな開発を推進中。「◯◯パターン」に目のないアーキテクト。
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる