Azure Data Lake Store にローカルマシンから Hive クエリーを投げる
目次
Azure Data Lake Storeとは
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 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 になりましたね。せっかくなので最新版を利用しましょう。
$ export HADOOP_HOME=/opt/hadoop
$ sudo mkdir $HADOOP_HOME
$ curl -O <your_favorite_apache_mirror>/hadoop/common/hadoop-3.0.0/hadoop-3.0.0.tar.gz
$ sudo tar xvfz hadoop-3.0.0.tar.gz --strip-component=1 -C $HADOOP_HOME
<your_favorite_apache_mirror>
は任意のミラーサイトを選択します。ミラーサイトは https://www.apache.org/dyn/closer.cgi から取得できます。
次に ADLS にアクセスするための依存パッケージを導入します。 Maven を利用すると簡単です。 Maven をインストールします。ちなみに Hadoop を動かすのに Java が必要になりますが、 Maven をインストールする際に同時に Java もインストールされます。
$ sudo yum install maven
./pom.xml
を以下のように作成します。 jar を取得したいだけなので、 groupId や artifactId は任意の値で良いです。必須なので省略はできません。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>jp.datumstudio.hadoop</groupId>
<artifactId>hadoop-adls</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-azure</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-azure-datalake</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
</project>
hdfs のクラスパス($HADOOP_HOME/share/hadoop/hdfs/lib/
)に jar ファイルをインストールします。
$ sudo mvn dependency:copy-dependencies \
> -DoutputDirectory=$HADOOP_HOME/share/hadoop/hdfs/lib/ \
> -DincludeArtifactIds=hadoop-azure,hadoop-azure-datalake,azure-data-lake-store-sdk
hdfs の設定ファイル($HADOOP_HOME/etc/hadoop/hdfs-site.xml
)の configuration 要素以下に下記のプロパティーを追加します。
<property>
<name>fs.adl.impl</name>
<value>org.apache.hadoop.fs.adl.AdlFileSystem</value>
</property>
<property>
<name>fs.AbstractFileSystem.adl.impl</name>
<value>org.apache.hadoop.fs.adl.Adl</value>
</property>
<property>
<name>fs.adls.oauth2.access.token.provider.type</name>
<value>ClientCredential</value>
</property>
<property>
<name>dfs.adls.oauth2.refresh.url</name>
<value>https://login.microsoftonline.com/**TENANT**/oauth2/token</value>
</property>
<property>
<name>dfs.adls.oauth2.client.id</name>
<value>**CLIENT_ID**</value>
</property>
<property>
<name>dfs.adls.oauth2.credential</name>
<value>**CLIENT_SECRET**</value>
</property>
ここで TENANT は Azure Active Directory のテナント(ドメイン名、デフォルトでは XXX.onmicrosoft.com の形式)、 CLIENT_ID と CLIENT_SECRET は「 アプリケーション ID と認証キーを取得する」の手順で取得できるアプリケーション ID とシークレットです。
ADLS の設定
Azure Active Directory で設定したアプリケーションから ADLS にアクセスできるようにパーミッションを設定します。
- Azure ポータルで ADLS を開き、 “Data Explorer” からアプリケーションにアクセスさせるディレクトリーに移動します。
- Access → Add と選択します。
- “Select User or Group” でアプリケーションを設定し、 “Select Permissions” で必要なパーミッション(Read/Write/Execute)を指定します。
動作確認
必要な環境変数を設定します。
$ export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk/jre
$ export PATH=$HADOOP_HOME/bin:$PATH
ちなみに Hadoop で最新版を使うと言っておきながら Java が最新の 9 ではないのですが、次でインストールする Hive で ClassLoader のキャスト例外が発生するためです。
hdfs コマンドでエラーが起こらないことを確認します。 Read/Execute 権限は dfs -cat
や dfs -ls
で、 Write 権限は dfs -touchz
や dfs -mkdir
あたりで確認できます。
$ hdfs dfs -touchz adl://<adls_name>.azuredatalakestore.net/test.txt
$ hdfs dfs -ls adl://<adls_name>.azuredatalakestore.net/
-rw-r-----+ 1 owner group 0 YYYY-MM-DD hh:mm adl://<adls_name>.azuredatalakestore.net/test.txt
ここでデフォルトでは owner と group は GUID で出力されますが、もし Azure Active Directory 上の表示名で出力したい場合は hdfs-site.xml
に下記プロパティーを追記します。
<property>
<name>adl.feature.ownerandgroup.enableupn</name>
<value>true</value>
</property>
Hive のインストール
Hive をインストールして Hive メタストアをセットアップします。
ダウンロードとインストール
Hadoop と同じ流れで Hive をインストールします。
$ export HIVE_HOME=/opt/hive
$ sudo mkdir $HIVE_HOME
$ curl -O <your_favorite_apache_mirror>/hive/hive-2.3.2/apache-hive-2.3.2-bin.tar.gz
$ sudo tar xvfz apache-hive-2.3.2-bin.tar.gz --strip-component=1 -C $HIVE_HOME
$ sudo mvn dependency:copy-dependencies \
> -DoutputDirectory=$HIVE_HOME/lib/ \
> -DincludeArtifactIds=hadoop-azure,hadoop-azure-datalake,azure-data-lake-store-sdk
$ export PATH=$HIVE_HOME/bin:$PATH
Hive メタストアのセットアップ
Hive メタストアを準備します。ここでは Azure SQL Server をメタストアデータベースとして利用します。 Azure SQL Server のセットアップは割愛します。
SQL Server のドライバーをインストールします。 ./pom.xml
に以下の依存関係を追加し、 mvn コマンドでインストールします。
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>6.2.2.jre8</version>
</dependency>
$ sudo mvn dependency:copy-dependencies \
> -DoutputDirectory=$HIVE_HOME/lib/ \
> -DincludeArtifactIds=mssql-jdbc
設定ファイル($HIVE_HOME/conf/hivemetastore-site.xml
または $HIVE_HOME/conf/hive-site.xml
)にデータベースサーバーへの接続情報を設定します。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>**CONNECTION_STRING**;</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.microsoft.sqlserver.jdbc.SQLServerDriver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>**USERNAME**</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>**PASSWORD**</value>
</property>
</configuration>
JDBC の接続文字列(CONNECTION_STRING)は、ポータルで SQL Databases を選択して “Connection strings” から取得できます。 user, password は別のプロパティで指定しているため、接続文字列から除きます。
メタストアの初期化を行います。
$ schematool -dbType mssql -initSchema
Hive の実行
テストデータの準備
フィッシャーのアヤメのデータを利用します。 UCI Machine Learning Repository からダウンロードして ADLS に配置します。
$ curl -O https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data
$ hdfs dfs -mkdir adl://<adls_name>.azuredatalakestore.net/iris
$ hdfs dfs -put iris.data adl://<adls_name>.azuredatalakestore.net/iris/
HiveQL の実行
hive コマンドを実行します。
$ hive
外部テーブルを作成します。
hive> CREATE EXTERNAL TABLE iris (
> sepal_length DOUBLE,
> sepal_width DOUBLE,
> petal_length DOUBLE,
> petal_width DOUBLE,
> class STRING
> )
> ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
> STORED AS TEXTFILE
> LOCATION 'adl://<adls_name>.azuredatalakestore.net/iris/'
> TBLPROPERTIES (
> 'immutable'='true'
> )
> ;
OK
テーブルの確認をします。
hive> show tables;
OK
iris
クエリーを実行します。
hive> SELECT
> class,
> round(avg(sepal_length), 2) AS sepal_length,
> round(avg(sepal_width), 2) AS sepal_width_avg,
> round(avg(petal_length), 2) AS petal_length_avg,
> round(avg(petal_width), 2) AS petal_width_avg
> FROM
> iris
> WHERE
> class IS NOT NULL
> GROUP BY
> class
> ;
OK
Iris-setosa 5.01 3.42 1.46 0.24
Iris-versicolor 5.94 2.77 4.26 1.33
Iris-virginica 6.59 2.97 5.55 2.03
おわりに
本稿では、 Hive を用いて ADLS 上のテキストファイルに対して外部テーブルを定義し、データの集計処理を行いました。環境を一から構築しているため長くなりましたが、普通の Hadoop/Hive のセットアップに比べて、 ADLS 用の jar ファイルのインストールと設定ファイルの追記が少しあるくらいで、特に複雑なことを行う必要はありません。
実際の分析環境では Hive を直接使うよりも、メタストア経由で Spark や Presto を使うことの方が多いでしょう。これらの環境も今回と同様にすれば ADLS を利用することができます。
参考文献
- Hadoop Azure Data Lake Support
- Azure Data Lake Store と Azure BLOB ストレージの比較
- リソースにアクセスできる Azure Active Directory アプリケーションとサービス プリンシパルをポータルで作成する
- Hive Schema Tool
- AdminManual MetastoreAdmin
DATUM STUDIOでは様々なAI/データ分析のプロジェクトを行っております。
詳細につきましてはこちら
詳細/サービスについてのお問い合わせはこちら
DATUM STUDIOは、クライアントの事業成長と経営課題解決を最適な形でサポートする、データ・ビジネスパートナーです。
データ分析の分野でお客様に最適なソリューションをご提供します。まずはご相談ください。
Contact
Explore Jobs
関連記事