Azure Data Lake Store にローカルマシンから Hive クエリーを投げる

はじめに

Azure Data Lake Store(ADLS) は Azure 上にファイルを蓄積する際に利用できるサービスの 1 つです。 Azure Blob Storage(WASB) の容量 500 テラバイトという上限に対して、 無制限の容量を提供します。 Azure Active Directory の ID でファイルごとの権限設定も可能なので、 マルチユーザーでの利用も安心できます。

ADLS も WASB も HDFS と互換があり、それぞれのサービスに保存されているデータに対して分析処理を行うことができます。データを一元的に蓄積して分析するという流れを考えると、 ADLS は最適なサービスであり、実際にそれをサポートするような Azure のサービスもあります。例えば HDInsight はマネージド Hadoop クラスターであり、 Azure Data Lake Analytics は ADLS 上のデータに対してクエリーを実行できるサービスです。これらは ADLS の分析を行うのに適したソリューションです。

しかし、 HDInsight はミニマムで月 7 万円程度のコストが必要かつ停止できないため(2017 年 12 月現在)、常に巨大データに対する分析を回し続ける事業を行うような企業であればよいのですが、当社のように受託分析を中心に行う企業では自社向けの利用のための投資としては過剰です。また、 Data Lake Analytics は、バッチベースのクエリー処理であり、インタラクティブに何度も繰り返しクエリーを試行したいような場合には不向きです。

そこで、 ADLS にデータを蓄積しつつ、ローカルマシンからアドホック分析を実施するということを考えます。具体的には、 Hive を用いて ADLS 上のファイルに対して外部テーブルの定義とクエリー(HiveQL)の実行ができるようにします。 なお、以下ではローカルマシンの環境として CentOS 7.4 を想定していますので、他の環境の場合は適宜読み替えてください。

必要なもの

最終的に利用するソフトウェア・サービスの一覧を示します。

  • Azure Data Lake Store
  • Azure Active Directory: アプリケーションの登録
  • Azure SQL Server: Hive メタストア(MySQL や PostgreSQL でも代用可)
  • Hadoop 3.0.0
  • Hive 2.3.2
  • OpenJDK 1.8.0
  • Maven 3.0

Hadoop のインストール

Hadoop 付属の hdfs コマンドを用いて ADLS 上のファイルを操作できることを目的とします。

ダウンロードとインストール

Hadoop 3.0.0 がついに GA になりましたね。せっかくなので最新版を利用しましょう。

<your_favorite_apache_mirror> は任意のミラーサイトを選択します。ミラーサイトは https://www.apache.org/dyn/closer.cgi から取得できます。

次に ADLS にアクセスするための依存パッケージを導入します。 Maven を利用すると簡単です。 Maven をインストールします。ちなみに Hadoop を動かすのに Java が必要になりますが、 Maven をインストールする際に同時に Java もインストールされます。

./pom.xml を以下のように作成します。 jar を取得したいだけなので、 groupId や artifactId は任意の値で良いです。必須なので省略はできません。

hdfs のクラスパス($HADOOP_HOME/share/hadoop/hdfs/lib/)に jar ファイルをインストールします。

hdfs の設定ファイル($HADOOP_HOME/etc/hadoop/hdfs-site.xml)の configuration 要素以下に下記のプロパティーを追加します。

ここで TENANT は Azure Active Directory のテナント(ドメイン名、デフォルトでは XXX.onmicrosoft.com の形式)、 CLIENT_ID と CLIENT_SECRET は「 アプリケーション ID と認証キーを取得する」の手順で取得できるアプリケーション ID とシークレットです。

ADLS の設定

Azure Active Directory で設定したアプリケーションから ADLS にアクセスできるようにパーミッションを設定します。

  1. Azure ポータルで ADLS を開き、 “Data Explorer” からアプリケーションにアクセスさせるディレクトリーに移動します。
  2. Access → Add と選択します。
  3. “Select User or Group” でアプリケーションを設定し、 “Select Permissions” で必要なパーミッション(Read/Write/Execute)を指定します。

動作確認

必要な環境変数を設定します。

ちなみに Hadoop で最新版を使うと言っておきながら Java が最新の 9 ではないのですが、次でインストールする Hive で ClassLoader のキャスト例外が発生するためです。

hdfs コマンドでエラーが起こらないことを確認します。 Read/Execute 権限は dfs -catdfs -ls で、 Write 権限は dfs -touchzdfs -mkdir あたりで確認できます。

ここでデフォルトでは owner と group は GUID で出力されますが、もし Azure Active Directory 上の表示名で出力したい場合は hdfs-site.xml に下記プロパティーを追記します。

Hive のインストール

Hive をインストールして Hive メタストアをセットアップします。

ダウンロードとインストール

Hadoop と同じ流れで Hive をインストールします。

Hive メタストアのセットアップ

Hive メタストアを準備します。ここでは Azure SQL Server をメタストアデータベースとして利用します。 Azure SQL Server のセットアップは割愛します。

SQL Server のドライバーをインストールします。 ./pom.xml に以下の依存関係を追加し、 mvn コマンドでインストールします。

設定ファイル($HIVE_HOME/conf/hivemetastore-site.xml または $HIVE_HOME/conf/hive-site.xml)にデータベースサーバーへの接続情報を設定します。

JDBC の接続文字列(CONNECTION_STRING)は、ポータルで SQL Databases を選択して “Connection strings” から取得できます。 user, password は別のプロパティで指定しているため、接続文字列から除きます。

メタストアの初期化を行います。

Hive の実行

テストデータの準備

フィッシャーのアヤメのデータを利用します。 UCI Machine Learning Repository からダウンロードして ADLS に配置します。

HiveQL の実行

hive コマンドを実行します。

外部テーブルを作成します。

テーブルの確認をします。

クエリーを実行します。

おわりに

本稿では、 Hive を用いて ADLS 上のテキストファイルに対して外部テーブルを定義し、データの集計処理を行いました。環境を一から構築しているため長くなりましたが、普通の Hadoop/Hive のセットアップに比べて、 ADLS 用の jar ファイルのインストールと設定ファイルの追記が少しあるくらいで、特に複雑なことを行う必要はありません。

実際の分析環境では Hive を直接使うよりも、メタストア経由で Spark や Presto を使うことの方が多いでしょう。これらの環境も今回と同様にすれば ADLS を利用することができます。

参考文献

このページをシェアする: