2020.04.01

Apache Impala 3.3をビルドして新機能を試す – S3のファイルハンドルキャッシュ

はじめに

こんにちは。次世代システム研究室のS.T.です。

昨今の世の中の事情もあり,データを集めること,それを適切に処理することの重要性が再認識されているのではないでしょうか。また,CDHやHDPといったHadoopディストリビューションにまつわる事情も変化しており,今後「特定コンポーネントの最新バージョンをサクっと検証したい」といった場合に新たな選択肢を考える必要が出てきそうです。

そこで,今回は少し触ってみたかったImpala 3.3を,特にディストリビューションには頼らず,公式のtarボール<fn>Installing Impala</fn>からビルドして実行してみます。ビルドスクリプトがCDH 6系の関連コンポーネントをテスト用にダウンロードしてくれるので,かんたんな検証であれば十分な気がします。

……が,依存パッケージの導入などでちょくちょくつまづいたので,実行コマンドとログを詳細に記載して,実際に動かすまでの記録を紹介します。それだけではつまらないので,新機能であるAmazon S3上のファイルハンドルのキャッシュが実際に効いているかチェックしてみましょう。

導入

今回前提とする環境は以下のとおりです。
  • Local x86_64(SSE 4.2拡張命令対応CPU)上のVirtualBox VM
  • 4Core 8GB
  • CentOS 7
  • Oracle JDK 8導入済み
関連コンポーネントとしてKuduも一緒にビルドされますが,KuduはCRC 32の計算をするためにSSE 4.2の拡張命令を使用するため,古いCPU(第一世代Core iシリーズより前)やVM(大抵ハイパーバイザの設定で対応可)の場合は注意してください。

まずはyumで必要なパッケージをインストールします。
yum group install 'Development Tools'
yum install epel-release
yum install \
python-devel\
python-pip\
python-crypto\
libstdc++-devel\
glibc-devel\
libtomcrypt-devel\
libtommath-devel\
libevent-devel\
openssl-devel\
cyrus-sasl-devel\
cyrus-sasl-plain\
maven
アーカイブをダウンロードして展開・ビルド。とても時間がかかります。コーヒーを入れておやつを食べながら待つのが良いでしょう。
wget -o impala-3.3.0.tar.gz http://www.apache.org/dyn/closer.cgi?action=download&filename=impala/3.3.0/apache-impala-3.3.0.tar.gz
tar xvfz impala-3.3.0.tar.gz
cd apache-impala-3.3.0
source ./bin/impala-config.sh
./buildall.sh -so -notests
ビルドが終わったら,関連コンポーネント→Impalaの順に起動します。関連コンポーネントの起動スクリプトではHiveも起動するので,metastoreを準備しないと起動に失敗します。Hiveが動いていなくてもImpala自体は動くと思いますが,起動スクリプトが失敗するのは気持ちが悪いので,PostgreSQLをインストールしてmetastoreの準備をしておきます。と思いましたが,Impalaはテーブル定義をメタストアに配置するので,準備が必要です。

# まずインストールして起動
yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum -y install postgresql12 postgresql12-server
PGSETUP_INITDB_OPTIONS="-E UTF8 --locale=C" /usr/pgsql-12/bin/postgresql-12-setup initdb
systemctl start postgresql-12
# Peer認証を解除しないとhiveuserが接続できないので,その設定をする
su - postgres
postgres$ psql
> ALTER USER postgres with encrypted password 'postgresユーザの新しいパスワード';
> exit
postgres$ exit
vim /var/lib/pgsql/12/data/pg_hba.conf # LOCALのPeer認証を無効化(hostの認証方法をmd5にする)
systemctl restart postgresql-12

# DBを作成
su - postgres
postgres$ createuser -P hiveuser #passwordはpassword
postgres$ createdb -O hiveuser  HMS_home_vagrant_apache_impala_3_3_0 # 名前は apache-impala-3.3.0/fe/src/test/resource/hive-site.xml を確認
postgres$ createdb -O hiveuser  SP_home_vagrant_apache_impala_3_3_0 # 名前は apache-impala-3.3.0/fe/src/test/resource/sentry-site.xml を確認
postgres$ psql -U hiveuser -dHMS_home_vagrant_apache_impala_3_3_0 -h localhost -p 5432 -W #接続チェック
postgres$ exit
exit
# スキーマを初期化する
./toolchain/cdh_components-1173663/hive-2.1.1-cdh6.x-SNAPSHOT/bin/schematool -dbType postgres -initSchema
さて,準備ができたら起動してみます。
# ディレクトリを準備しておく
mkdir /var/lib/hadoop-hdfs
# 関連コンポーネント起動スクリプト(結構時間がかかる)
./testdata/bin/run-all.sh
# Impalaクラスタ起動スクリプト
./bin/start-impala-cluster.sh
# エラーが出なければシェルを起動してみる
./bin/impala-shell.sh 
Starting Impala Shell without Kerberos authentication
Opened TCP connection to localhost.localdomain:21000
Connected to localhost.localdomain:21000
Server version: impalad version 3.3.0-RELEASE DEBUG (build 0f840c5a0f5e673c67cbd482e62065fd47b98e1a)
***********************************************************************************
Welcome to the Impala shell.
(Impala Shell v3.3.0-RELEASE (0f840c5) built on Sun Mar 29 09:30:47 UTC 2020)

After running a query, type SUMMARY to see a summary of where time was spent.
***********************************************************************************
[localhost.localdomain:21000] default> 
[localhost.localdomain:21000] default> select version();
Query: select version()
Query submitted at: 2020-03-29 23:13:11 (Coordinator: http://local.impala33:25000)
Query progress can be monitored at: http://local.impala33:25000/query_plan?query_id=3e49758c6cdf819a:d6ae2f2a00000000
+--------------------------------------------------------------------------------------+
| version()                                                                            |
+--------------------------------------------------------------------------------------+
| impalad version 3.3.0-RELEASE DEBUG (build 0f840c5a0f5e673c67cbd482e62065fd47b98e1a) |
| Built on Sun Mar 29 09:30:47 UTC 2020                                                |
+--------------------------------------------------------------------------------------+
Fetched 1 row(s) in 0.85s
動きましたね。

S3のファイルハンドルキャッシュ

Impala 3.3は新機能として,S3のファイルハンドルキャッシュに対応<fn>New Features in Apache Impala</fn>しました。この機能はデフォルトで有効になっており,S3へのメタデータ要求の頻度を減らすことができます。今回はS3上にデータを置いたテーブルを作成して,実際にファイルハンドルキャッシュが行われているか見てみたいと思います。

オフィシャルドキュメント<fn>Using Impala with the Amazon S3 Filesystem</fn>に従い,まずはAWSのアクセスキーを設定に記載します。設定ファイルは apache-impala-3.3.0/fe/src/test/resources/core-site.xml にあります。
  <property>
    <name>fs.s3a.access.key</name>
    <value>KEY</value>
  </property>
  <property>
    <name>fs.s3a.secret.key</name>
    <value>KEY</value>
  </property>
準備ができたらテーブルを作成します。今回はIrisデータをサンプルとして使うことを想定しています。CSVをそのまま使いたいので,デリミタは”,”にしておきます。
[localhost.localdomain:21000] default> create database test_db;
Query: create database test_db
+----------------------------+
| summary                    |
+----------------------------+
| Database has been created. |
+----------------------------+
Fetched 1 row(s) in 2.07s
[localhost.localdomain:21000] default> use test_db;
Query: use test_db
[localhost.localdomain:21000] test_db> CREATE TABLE iris(
                                     >   sepal_length FLOAT,
                                     >   sepal_width FLOAT,
                                     >   petal_length FLOAT,
                                     >   petal_width FLOAT,
                                     >   name string)
                                     > ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
                                     > LOCATION 's3a://your-impala-test-bucket/iris_data';
Query: CREATE TABLE iris(
  sepal_length FLOAT,
  sepal_width FLOAT,
  petal_length FLOAT,
  petal_width FLOAT,
  name string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
LOCATION 's3a://your-impala-test-bucket/iris_data'
+-------------------------+
| summary                 |
+-------------------------+
| Table has been created. |
+-------------------------+
Fetched 1 row(s) in 4.29s
テーブルができたら,S3の該当フォルダにデータをアップロードして,クエリを発行してみます。
# 適当にSELECTしてみる
[localhost.localdomain:21000] test_db> select * from iris limit 10;
Query: select * from iris limit 10
Query submitted at: 2020-03-30 22:09:37 (Coordinator: http://local.impala33:25000)
Query progress can be monitored at: http://local.impala33:25000/query_plan?query_id=194980353c682c67:6175116a00000000
+-------------------+-------------------+-------------------+--------------------+-------------+
| sepal_length      | sepal_width       | petal_length      | petal_width        | name        |
+-------------------+-------------------+-------------------+--------------------+-------------+
| 5.099999904632568 | 3.5               | 1.399999976158142 | 0.2000000029802322 | Iris-setosa |
| 4.900000095367432 | 3                 | 1.399999976158142 | 0.2000000029802322 | Iris-setosa |
| 4.699999809265137 | 3.200000047683716 | 1.299999952316284 | 0.2000000029802322 | Iris-setosa |
| 4.599999904632568 | 3.099999904632568 | 1.5               | 0.2000000029802322 | Iris-setosa |
| 5                 | 3.599999904632568 | 1.399999976158142 | 0.2000000029802322 | Iris-setosa |
| 5.400000095367432 | 3.900000095367432 | 1.700000047683716 | 0.4000000059604645 | Iris-setosa |
| 4.599999904632568 | 3.400000095367432 | 1.399999976158142 | 0.300000011920929  | Iris-setosa |
| 5                 | 3.400000095367432 | 1.5               | 0.2000000029802322 | Iris-setosa |
| 4.400000095367432 | 2.900000095367432 | 1.399999976158142 | 0.2000000029802322 | Iris-setosa |
| 4.900000095367432 | 3.099999904632568 | 1.5               | 0.1000000014901161 | Iris-setosa |
+-------------------+-------------------+-------------------+--------------------+-------------+
Fetched 10 row(s) in 1.69s

# 適当にGROUP BYしてみる
[localhost.localdomain:21000] test_db> select name, count(*) from iris group by name;
Query: select name, count(*) from iris group by name
Query submitted at: 2020-03-30 22:11:13 (Coordinator: http://local.impala33:25000)
Query progress can be monitored at: http://local.impala33:25000/query_plan?query_id=8045f24697f171b5:8d04321a00000000
+-----------------+----------+
| name            | count(*) |
+-----------------+----------+
| Iris-virginica  | 50       |
| Iris-versicolor | 50       |
| Iris-setosa     | 50       |
+-----------------+----------+
Fetched 3 row(s) in 6.27s
このテーブルはS3上のデータを参照しているので,既にキャッシュは効いているはずです。しかし,ローカルVM 1ノードでデータ量も大したことないので,実行時間での体感は感じられませんね。ログに出ているURLからImpala Web UIでクエリプロファイルを確認してみます。
           - CachedFileHandlesHitCount: 1 (1)
           - CachedFileHandlesMissCount: 0 (0)
1テーブルを参照していて1テーブルがキャッシュにヒットしているので,しっかりS3のファイルハンドルがキャッシュされていることが確認できました。

今回は検証環境がローカルかつテスト用コンポーネントなので,詳細なパフォーマンス検証は省略しています(派手にやるとS3の料金も不安になりますし)。

まとめ

今回はImpala 3.3をビルドして実際に動かしてみました。そして,新機能の1つであるS3のファイルハンドルキャッシュが効いていることを確認しました。高頻度でアクセスするデータはHDFSなどに配置することが多いかと思うので,劇的に運用が変わるということはないと思いますが,忘れたころに効いてくる機能かもしれません。実用的なサイズのデータを扱う場合はキャッシュにまつわるパラメータを調整する必要も出てきそうです。

今回は付属のテスト用のコンポーネントを使用しましたが,Apachプロジェクトが提供するアーカイブをベースに必要なものだけを個別にビルドして,複数ノードで実行するなど,実用的な環境の構築を試みることが課題です。

 

次世代システム研究室では、データサイエンティスト/機械学習エンジニアを募集しています。ビッグデータの解析業務など次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。

Pocket

関連記事