Hiveより数倍、数十倍速いとの触れ込みに触発され、Cloudera Impalaに挑戦してみました。『Debianには入らないよ』と明記されているだけあって、一度は挫折記事を書き始めたりしつつ、忍耐と閃きで乗り切ったインストール記録になります。
とても良いネタなのでCDH3ユーザは早くコッチにおいでと手招きしておきたいと思います。
リンク集
お師匠さんの記事に綺麗にまとまっています。環境
Debian Squeezeで、CDH4.1.0 を利用しています。HiveのmetadataはMySQLで動いている前提です。
失敗した手順
様々な手順を試しましたが、結局、王道で成功しました。失敗した方法は詳細抜きで箇条書きしておきます。
成功した方法は、使うソフトウェアのバージョンを確実に合わせ、どうしてもSqueezeにないパッケージだけ単体でdebなどを持ってきて利用しました。ひたすらbash, cmake, c++ のソースを見ては修正していく作業でした。
各種バージョンについて
READMEに書かれているソフトウェア+各種ソースが必要になります。Impala
github の最新を利用したので、0.1.1 とかじゃなくて 79bb70ef15 になります。自前で入れるモノ
Thrift 0.7.0
Thriftはパッケージに存在しないのでソースから入れる必要があります。LLVM + CLANG 3.0
Squeezeだと 2.7 しかないので 3.0 を用意する必要があります。Wheezyのを利用したりソースからも入れてみましたがcmakeが通らないので、とある場所からdebを拝借しました。パッケージで入れるモノ
README記載のものだけでは全然足りません。下記手順の apt-get install のところを参照してください。
各種ソース
hadoop-cdh や glog といったソースそのものが必要になります。今回はSRPMを解凍したら中に入ってたのでそのまま利用しましたが、せっかく探したので各URLを書いておきます。
ただ、python-thrift だけはソースは存在しなかったので、thriftの方からコピることになります。
それではここからインストール手順になります。
基本パッケージ
まずはThriftやImpalaに必要なパッケージをインストールします。あとで libstdc++6 だけWheezy用のdebを入れる場合、競合が起きるのでその前に実行します。
1 2 3 4 5 6 7 8 |
apt-get update apt-get install libboost-all-dev libboost-mpi-python1.42.0 \ libmono-system-web2.0-cil libevent-dev libgoogle-glog-dev \ libsasl2-2 libssl-dev libbz2-dev \ automake libtool flex bison pkg-config g++ maven2 \ bzip2 zlib1g cmake doxygen alien \ python-bzutils python-dev python-twisted \ ruby1.9.1-dev |
Thriftのインストール
リンク
インストール
パッケージが無いのでソースから入れます。バージョンは古めですが0.7.0必須のようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# ソース取得 cd /usr/local/src wget https://dist.apache.org/repos/dist/release/thrift/0.7.0/thrift-0.7.0.tar.gz tar xzf thrift-0.7.0.tar.gz cd thrift-0.7.0 # 実行権限がないのでつける chmod +x configure install-sh lib/erl/rebar # fastbinaryに関する記述をコメントアウト vim lib/py/setup.py ===== diff ==== --- lib/py/setup.py~orig 2012-11-06 11:02:24.558249106 +0900 +++ lib/py/setup.py 2012-11-06 11:02:43.362277606 +0900 @@ -21,10 +21,6 @@ from distutils.core import setup, Extension -fastbinarymod = Extension('thrift.protocol.fastbinary', - sources = ['src/protocol/fastbinary.c'], - ) - setup(name = 'Thrift', version = '0.7.0', description = 'Python bindings for the Apache Thrift RPC system', @@ -39,6 +35,5 @@ 'thrift.server', ], package_dir = {'thrift' : 'src'}, - ext_modules = [fastbinarymod], ) =============== # staticを削除 vim lib/rb/ext/struct.c ===== diff ==== --- lib/rb/ext/struct.c~orig 2012-11-06 11:05:13.010249885 +0900 +++ lib/rb/ext/struct.c 2012-11-06 11:05:18.682250125 +0900 @@ -23,7 +23,6 @@ #ifndef HAVE_STRLCPY -static size_t strlcpy (char *dst, const char *src, size_t dst_sz) { =============== # コンパイル # - make で -j2 とかつけたらエラーになるのでつけない # - オプション --with-pic がないとImpalaコンパイルでエラーになる export JAVA_HOME=/usr/lib/jvm/java-6-sun/ ./configure --with-pic make make install # 確認 thrift -version |
LLVM + CLANGのインストール
リンク
インストール
パッケージではなく、アーカイブで公開されていたので利用させてもらいました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# ソースを取得&実行環境へコピー cd /usr/local/src wget http://llvm.org/releases/3.0/clang+llvm-3.0-x86_64-linux-debian.tar.gz tar xzf clang+llvm-3.0-x86_64-linux-debian.tar.gz cp -R clang+llvm-3.0-x86_64-linux-debian/* /usr/local/ # libstdc++6 のアップグレード # - clang実行時のエラー # /usr/local/bin/clang++: /usr/lib/libstdc++.so.6: # version `GLIBCXX_3.4.15' not found (required by /usr/local/bin/clang++) # - libstdc++.so.6.0.14 じゃ動かないので libstdc++.so.6.0.15 が入っている deb を使う # - dpkg -i で入れると競合エラーが出るけどファイルは入るのでいったん気にしない # (※ただし、実際の運用時はdebではなくファイルとシンボリックリンクだけを更新すべき) # - 元バージョンへの戻し方:apt-get install libstdc++6=4.4.5-8 wget http://snapshot.debian.org/archive/debian/20110228T035811Z/pool/main/g/gcc-4.6/libstdc%2B%2B6_4.6-20110227-1_amd64.deb dpkg -i libstdc++6_4.6-20110227-1_amd64.deb ls -l /usr/lib/libstdc++.so.6* ===== lrwxrwxrwx 1 root root 19 2012-11-02 11:45 /usr/lib/libstdc++.so.6 -> libstdc++.so.6.0.15 -rw-r--r-- 1 root root 995248 2011-02-28 09:29 /usr/lib/libstdc++.so.6.0.15 ===== # 確認 clang --version |
Impalaのインストール
リンク
インストール
ソースの準備から。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# バージョン情報の変更に対応して変数にしとく cd /usr/local/src export IMPALA_VERSION=79bb70e # Impalaソース取得 wget https://github.com/cloudera/impala/tarball/master -O cloudera-impala-${IMPALA_VERSION}.tar.gz tar xzf cloudera-impala-${IMPALA_VERSION}.tar.gz # thridparty一式をSRPMから取得し、配置する wget http://beta.cloudera.com/impala/redhat/6/x86_64/impala/0.1/SRPMS/impala-0.1-1.p0.316.src.rpm alien --to-tgz impala-0.1-1.p0.316.src.rpm mkdir impala-0.1 cd impala-0.1 tar xzf ../impala-0.1.tgz tar xzf impala-0.1-SNAPSHOT.tar.gz \ impala-0.1-SNAPSHOT/thirdparty \ impala-0.1-SNAPSHOT/be/.impala.doxy mv impala-0.1-SNAPSHOT/thirdparty ../cloudera-impala-${IMPALA_VERSION}/ mv impala-0.1-SNAPSHOT/be/.impala.doxy ../cloudera-impala-${IMPALA_VERSION}/be/ cd ../cloudera-impala-${IMPALA_VERSION} # 文字コードWARN対策 vim ./fe/pom.xml ===== diff ===== --- fe/pom.xml~orig 2012-11-06 11:37:03.754251646 +0900 +++ fe/pom.xml 2012-11-06 11:37:16.274249903 +0900 @@ -41,6 +41,7 @@ <hadoop.version>2.0.0-cdh4.1.0</hadoop.version> <hive.version>0.9.0-cdh4.1.0</hive.version> <hbase.version>0.92.1-cdh4.1.0</hbase.version> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> =============== # gitエラー回避 vim bin/build_thirdparty.sh ===== diff ===== --- bin/build_thirdparty.sh~orig 2012-11-06 11:38:06.210263196 +0900 +++ bin/build_thirdparty.sh 2012-11-06 11:38:54.482249627 +0900 @@ -42,7 +42,6 @@ # clean thirdparty cd $IMPALA_HOME/thirdparty # remove everything that is not checked in - git clean -dfx fi # build gflags =============== # Impala ver 79bb70e ~ experimentsディレクトリが削除されたため(gitコメント参照) vim be/CMakeLists.txt ===== diff ===== --- be/CMakeLists.txt~orig 2012-11-06 11:39:42.514251780 +0900 +++ be/CMakeLists.txt 2012-11-06 11:39:50.642253421 +0900 @@ -229,7 +229,6 @@ add_subdirectory(src/transport) add_subdirectory(src/benchmarks) -add_subdirectory(src/experiments) add_subdirectory(generated-sources/gen-cpp) add_subdirectory(generated-sources/opcode) =============== # fb303.thriftを取得 mkdir -p /usr/local/share/fb303/if wget http://svn.apache.org/repos/asf/thrift/trunk/contrib/fb303/if/fb303.thrift mv fb303.thrift /usr/local/share/fb303/if/ |
コンパイルを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# 環境変数設定 export JAVA_HOME=/usr/lib/jvm/java-6-sun/ export IMPALA_HOME=/usr/local/src/cloudera-impala-${IMPALA_VERSION} export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib export CLASSPATH=/usr/share/java export IMPALA_BE_DIR=${IMPALA_HOME}/be # 各種ソースのコンパイル ./bin/build_thirdparty.sh # Impalaコンパイル # - メモリ2GBは必要 (512MB~1GBだと失敗した) # - cmake 100%のところでbenchmarkエラーが出るけど気にしない ./buildall.sh # さらにreleaseにコンパイル # - hive_metastore.thrift がないと怒られるのでリンクしとく ln -s /usr/local/src/cloudera-impala-${IMPALA_VERSION}/thirdparty/hive-0.9.0-cdh4.1.0/src/metastore/if/hive_metastore.thrift common/thrift/ ./bin/make_release.sh |
SRPMにしか入ってないスクリプトを使って、実行環境に配置します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 本番は --prefix=/ , 最初に確認したい場合は /usr/local/impala など cp ../impala-0.1/install_impala.sh ./ ./install_impala.sh --prefix=/ --build-dir=/usr/local/impala-build # initスクリプト cp ../impala-0.1/impala.init /etc/init.d/impala-server chmod 744 /etc/init.d/impala-server # ディレクトリ作成 # - 後で chown impala:impala する mkdir /var/run/impala /var/log/impala # 足りないところをリンクで補う ln -s /usr/lib/impala/sbin-retail /usr/lib/impala/sbin ln -s /usr/share/java/mysql-connector-java-5.1.10.jar /usr/lib/impala/lib/ |
Impala用の設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# ユーザ/グループ作成 addgroup --system --quiet impala adduser --quiet --system --no-create-home --home /usr/lib/impala --ingroup impala impala # ディレクトリ権限変更 chown impala:impala /var/run/impala /var/log/impala # Hadoop設定変更 cd /etc/hadoop/conf vim core-site.xml ===== 追記 ===== <!-- Cloudera Impala --> <property> <name>dfs.client.read.shortcircuit</name> <value>true</value> </property> <property> <name>dfs.client.read.shortcircuit.skip.checksum</name> <value>false</value> </property> =============== vim hdfs-site.xml ===== 追記 ===== <!-- Cloudera Impala --> <property> <name>dfs.datanode.data.dir.perm</name> <value>755</value> </property> <property> <name>dfs.block.local-path-access.user</name> <value>impala</value> </property> <property> <name>dfs.datanode.hdfs-blocks-metadata.enabled</name> <value>true</value> </property> =============== # Impala設定ディレクトリにリンク mkdir -p /usr/lib/impala/conf ln -s /etc/hadoop/conf/core-site.xml /usr/lib/impala/conf/ ln -s /etc/hadoop/conf/hdfs-site.xml /usr/lib/impala/conf/ ln -s /etc/hadoop/conf/log4j.properties /usr/lib/impala/conf/ ln -s /etc/hive/conf/hive-site.xml /usr/lib/impala/conf/ |
パッケージ用にアーカイブ
Impala ClientやHadoop SLAVEサーバ群へのコピーや、あとでdebパッケージ作るようにアーカイブしておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
rm /var/log/impala/* rm /var/run/impala/* cd /usr/local/src tar -C / -czf impala-0.1_for-debian.tar.gz \ /etc/init.d/impala-server \ /etc/default/impala \ /usr/lib/impala \ /usr/lib/impala-shell \ /usr/bin/impalad \ /usr/bin/impala-shell \ /usr/bin/impala-state-store \ /var/log/impala \ /var/run/impala \ /usr/lib/libstdc++.so.6 \ /usr/lib/libstdc++.so.6.0.15 |
運用
SLAVEサーバへ設置
Hadoop SLAVEサーバ全台に設置します。impala-shellを実行するクライアントサーバを別にする場合は、アーカイブ解凍だけでOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# ユーザ/グループ作成 addgroup --system --quiet impala adduser --quiet --system --no-create-home --home /usr/lib/impala --ingroup impala impala # アーカイブを持ってきて解凍 cd /usr/local/src tar -C / -xzf impala-0.1_for-debian.tar.gz chown impala:impala /var/run/impala /var/log/impala # SLAVEサーバのHDFSディレクトリの権限を変更 # - impalaユーザが直接読み込むため # - 全データディレクトリに適用する(今回は /data[1-4] にしてあった) chmod 755 /data*/hadoop/cache/hdfs/dfs chmod 755 /data*/hadoop/cache/hdfs chmod 755 /data*/hadoop/cache chmod 755 /data*/hadoop # 必須パッケージのインストール apt-get install libboost-thread1.42.0 libboost-regex1.42.0 \ libboost-date-time1.42.0 # アーカイブに libstdc++.so.6.0.15 を含めた場合は、ここは不要 cd /usr/local/src wget http://snapshot.debian.org/archive/debian/20110228T035811Z/pool/main/g/gcc-4.6/libstdc%2B%2B6_4.6-20110227-1_amd64.deb dpkg -i libstdc++6_4.6-20110227-1_amd64.deb # impaladを起動 # - 環境変数はdebパッケージにする時に整理する # - GLOG_v=1 はログをたくさん記録してくれる(最初は必須) # - impala-server 起動前に impala-state-store を起動する必要がある(あとでinitにまとめる) IMPALA_SERVER_ARGS="-nn=host-of-namenode -nn_port=8020" export IMPALA_SERVER_ARGS export GLOG_v=1 /usr/bin/impala-state-store & /etc/init.d/impala-server start # いっぱいエラー出ても気にしない ls -l /var/log/impala/impala.log /tmp/impala* # 停止する場合 # - pkillのプロセス名が切れてこんなんなってる pkill impala-state-st /etc/init.d/impala-server stop |
テストデータ作成
hiveで作成します。
1 2 3 4 5 6 7 8 |
hive \ -hiveconf hive.default.fileformat=TextFile \ -hiveconf hive.exec.compress.output=false hive> CREATE EXTERNAL TABLE impala_test (`num` int, `str` string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/impala/impala_test'; INSERT OVERWRITE TABLE impala_test SELECT 123, 'ABC' FROM test_table LIMIT 2; SELECT * FROM impala_test ; quit; |
Impalaでクエリを実行
Metadata MySQLやimpaladに接続できるサーバで実行します。めんどければ適当なSLAVEサーバで。
1 2 3 4 5 6 7 8 |
impala-shell [Not connected] > connect host-of-impalad:21000 impala> refresh describe impala_test select * from impala_test select count(*) from impala_test |
成功すると、MapReduceが一切走らずにレスポンスが返り、とても速いのがわかります。
失敗する場合、/var/log/impala や /tmp/impala* を確認したり、impalad をforegroundで動かして修正していきます。
次回は実際に利用した感触について触れていきたいと思います。