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導入済み
まずは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を準備しないと起動に失敗します。
# まずインストールして起動 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プロジェクトが提供するアーカイブをベースに必要なものだけを個別にビルドして,複数ノードで実行するなど,実用的な環境の構築を試みることが課題です。
次世代システム研究室では、データサイエンティスト/機械学習エンジニアを募集しています。ビッグデータの解析業務など次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。