在CDH6.3中單獨升級Impala到Apache Impala 3.4

1. 實驗環境

  • 一個CDH6.3.3集羣,部署在三臺Ubuntu16.04機器上
  • 一臺同樣環境的Ubuntu16.04機器用來編譯Apache Impala 3.4

CDH6.3.3對應的Impala基礎版本是Apache Impala 3.2,當然還打了不少補丁。從Impala網頁上能看到版本號是3.2.0-cdh6.3.3
CDH6.3.3 Impalad WebUI

2. 編譯Apache Impala 3.4

Apache Impala是以源碼的形式release的,因此需要自行在對應的平臺上編譯。找一個跟集羣環境一致的機器,我這裏是64位的ubuntu16.04。

根據文檔中的“Building Impala without Test Data (for testing Impala)”章節來編譯Impala:
https://cwiki.apache.org/confluence/display/IMPALA/Building+Impala
所不同的是我們要編譯的是3.4版本,不是最新的master分支,所以clone時要選好版本:

git clone --single-branch --branch 3.4.0 https://github.com/apache/impala.git impala-3.4
cd impala-3.4

然後用 bin/bootstrap_system.sh 腳本來安裝編譯依賴:

export IMPALA_HOME=`pwd`
$IMPALA_HOME/bin/bootstrap_system.sh

如果之前在這臺機器上編譯過Impala,也可以跳過上面這一步。
接下來是 source 一下 impala-config.sh 設置環境變量

source $IMPALA_HOME/bin/impala-config.sh

然後開始編譯:

$IMPALA_HOME/buildall.sh -noclean -notests

編譯過程還要下載很多依賴,配好VPN速度會快很多。我這邊編譯大概花了一個小時,編譯完後可以找到impalad可執行文件和impala-frontend的jar包:

$ ll -h be/build/latest/service/impalad fe/target/impala-frontend-0.1-SNAPSHOT.jar
-rwxrwxr-x 1 quanlong quanlong 460M 6月  20 11:30 be/build/latest/service/impalad*
-rw-rw-r-- 1 quanlong quanlong 7.5M 6月  20 11:33 fe/target/impala-frontend-0.1-SNAPSHOT.jar
$ strings be/build/latest/service/impalad | grep 3.4.0
3.4.0-RELEASE

上面最後一條指令,應該可以在impalad可執行文件中找到 3.4.0-RELEASE 這樣的字符串。impala默認使用靜態編譯,但還是有一些動態依賴,用 ldd 指令查看:

$ ldd be/build/latest/service/impalad 
	linux-vdso.so.1 =>  (0x00007ffce6354000)
	/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjsig.so (0x00007f95f07f2000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f95f05d5000)
	libsasl2.so.2 => /usr/lib/x86_64-linux-gnu/libsasl2.so.2 (0x00007f95f03ba000)
	libjvm.so => /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so (0x00007f95ef465000)
	libkudu_client.so.0 => /home/quanlong/workspace/impala-3.4/toolchain/kudu-4ed0dbbd1/debug/lib/libkudu_client.so.0 (0x00007f95eecf8000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f95eeaf0000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f95ee8ec000)
	libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f95ee683000)
	libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f95ee23e000)
	libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007f95edf6c000)
	libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007f95edd22000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f95ed9a0000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f95ed697000)
	libgcc_s.so.1 => /home/quanlong/workspace/impala-3.4/toolchain/snappy-1.1.4/lib/libgcc_s.so.1 (0x00007f95ed481000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f95ed0b7000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f95f09f6000)
	libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007f95ece88000)
	libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007f95ecc84000)
	libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007f95eca79000)
	libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007f95ec875000)
	libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f95ec65a000)

這些 so 文件大部分是系統自帶的或者已安裝的,我們只要複製跟Impala版本相關的就好,比如說 libkudu_client.so.0,其它的不需要一併複製。

注:Impala 3.4沒法用Impala 3.2依賴的kudu client,因爲在Impala 3.3開始支持kudu表的列註釋,升級了依賴的Kudu client版本,具體見IMPALA-5351.

3. 部署研究

登到集羣機器上,查看impalad、statestored、catalogd這些進程用的是哪些可執行文件,用類似 “ps aux | grep catalogd” 的指令可以找到它們的啓動命令分別是:

/opt/cloudera/parcels/CDH-6.3.3-1.cdh6.3.3.p0.1796617/lib/impala/sbin-retail/catalogd --flagfile=/var/run/cloudera-scm-agent/process/39-impala-CATALOGSERVER/impala-conf/catalogserver_flags
/opt/cloudera/parcels/CDH-6.3.3-1.cdh6.3.3.p0.1796617/lib/impala/sbin-retail/statestored --flagfile=/var/run/cloudera-scm-agent/process/38-impala-STATESTORE/impala-conf/state_store_flags
/opt/cloudera/parcels/CDH-6.3.3-1.cdh6.3.3.p0.1796617/lib/impala/sbin-retail/impalad --flagfile=/var/run/cloudera-scm-agent/process/37-impala-IMPALAD/impala-conf/impalad_flags

這裏用的 flagfile 是CM生成的,我們不需要管,只需要讓CM使用新的可執行文件就行了。我們來生成一個和 /opt/cloudera/parcels/CDH-6.3.3-1.cdh6.3.3.p0.1796617/lib/impala 目錄結構一樣的目錄,然後通過在 CM 裏設置 IMPALA_HOME 環境變量來使用它。目錄結果如下:

# ll /opt/cloudera/parcels/CDH-6.3.3-1.cdh6.3.3.p0.1796617/lib/impala
total 52
drwxr-xr-x  9 root root  4096 Jan 20 05:42 ./
drwxr-xr-x 31 root root  4096 Jan 20 05:42 ../
drwxr-xr-x  2 root root  4096 Jan 20 05:20 bin/
drwxr-xr-x  2 root root  4096 Jan 20 05:21 cloudera/
drwxr-xr-x  2 root root 20480 Jan 20 05:42 lib/
lrwxrwxrwx  1 root root    11 Jan 20 05:42 sbin -> sbin-retail/
drwxr-xr-x  2 root root  4096 Jan 20 05:42 sbin-debug/
drwxr-xr-x  2 root root  4096 Jan 20 05:42 sbin-retail/
drwxr-xr-x  7 root root  4096 Jan 20 05:21 toolchain/
drwxr-xr-x  7 root root  4096 Jan 20 05:20 www/

逐個看一下,bin目錄主要是一些診斷用的腳本,不用管:

# ls bin
collect_diagnostics.py  collect_minidumps.py  collect_shared_libs.sh  __init__.py

cloudera目錄是版本信息,不用管。lib裏是一些jar包的軟鏈,以及依賴的so文件,這個要複製好。
sbin目錄指向sbin-retail,裏面主要是impalad可執行文件,catalogd和statestored都是軟鏈,不用複製:

# ll /opt/cloudera/parcels/CDH-6.3.3-1.cdh6.3.3.p0.1796617/lib/impala/sbin-retail/
total 64336
drwxr-xr-x 2 root root     4096 Jan 20 05:42 ./
drwxr-xr-x 9 root root     4096 Jan 20 05:42 ../
lrwxrwxrwx 1 root root        7 Jan 20 05:21 catalogd -> impalad*
-rwxr-xr-x 1 root root 65870296 Jan 20 05:42 impalad*
lrwxrwxrwx 1 root root        7 Jan 20 05:21 statestored -> impalad*

toolchain目錄裏都是已經被靜態鏈接進impalad可執行文件的,不知道怎麼還帶着,不用管:

# ls toolchain/
breakpad-97a98836768f8f0154f8f86e5e14c2bb7e74132e-p2  cmake-3.14.3  llvm-5.0.1-asserts-p1  llvm-5.0.1-p1  orc-1.5.5-p1

www目錄是網頁要用的,也需要更新。

最後再用ldd指令確認一下依賴的動態鏈接庫

# ldd /opt/cloudera/parcels/CDH-6.3.3-1.cdh6.3.3.p0.1796617/lib/impala/sbin-retail/impalad
        linux-vdso.so.1 =>  (0x00007ffe9af90000)
        libjsig.so => not found
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa646f00000)
        libsasl2.so.2 => /usr/lib/x86_64-linux-gnu/libsasl2.so.2 (0x00007fa646ce4000)
        libjvm.so => not found
        libkudu_client.so.0 => not found
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fa646adb000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa6468d7000)
        libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007fa64668d000)
        libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007fa646423000)
        libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fa645fde000)
        libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007fa645d0c000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa645989000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa645680000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa64546a000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa64509f000)
        /lib64/ld-linux-x86-64.so.2 (0x000055d437435000)
        libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007fa644e70000)
        libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007fa644c6c000)
        libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007fa644a60000)
        libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007fa64485c000)
        libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007fa644641000)

這裏面有三個找不到,因爲有些環境變量沒有配,比如說 libjsig.so 和 libjvm.so 是java提供的,CM配置了java相關環境變量就能找到。我們能看到大部分so文件在系統裏都有了,只需要複製新版本依賴的libkudu_client.so.0就行了。

4. 生成新Impala目錄

先複製一份原目錄,然後在它的基礎上改。

# cd /opt/cloudera/parcels/CDH-6.3.3-1.cdh6.3.3.p0.1796617/lib/
# cp -r impala apache-impala-3.4
# cd apache-impala-3.4

4.1 lib目錄

把lib目錄裏的jar包都刪了,剩下so文件

# rm lib/*.jar
# ll lib
total 15040
drwxr-xr-x 2 root root   20480 Jun 20 00:42 ./
drwxr-xr-x 9 root root    4096 Jun 19 22:37 ../
-rw-r--r-- 1 root root   89864 Jun 19 22:37 libgcc_s.so.1
lrwxrwxrwx 1 root root      36 Jun 19 22:37 libhadoop.so -> ../../hadoop/lib/native/libhadoop.so
lrwxrwxrwx 1 root root      42 Jun 19 22:37 libhadoop.so.1.0.0 -> ../../hadoop/lib/native/libhadoop.so.1.0.0
-rw-r--r-- 1 root root 6638528 Jun 19 22:37 libkudu_client.so.0
-rw-r--r-- 1 root root 6638528 Jun 19 22:37 libkudu_client.so.0.1.0
-rw-r--r-- 1 root root 1003416 Jun 19 22:37 libstdc++.so.6
-rw-r--r-- 1 root root 1003424 Jun 19 22:37 libstdc++.so.6.0.20

把 libkudu_client.so.0 替換爲我們編譯Impala 3.4時用的,從前面ldd的輸出可以看到在 $IMPALA_HOME/toolchain/kudu-4ed0dbbd1/debug/lib/libkudu_client.so.0
其它so文件不用管
把 impala-3.4依賴的jar包也都複製進這個lib目錄,它們在編譯目錄裏能找到,具體路徑是 $IMPALA_HOME/fe/target/dependency/
把 impala-3.4編譯出來的 impala-frontend-0.1-SNAPSHOT.jar 放進lib目錄,在編譯目錄裏的路徑是 fe/target/impala-frontend-0.1-SNAPSHOT.jar
把 impala-3.4編譯出來的 impala-data-source-api-1.0-SNAPSHOT.jar 放進lib目錄,在編譯目錄裏的路徑是 ext-data-source/api/target/impala-data-source-api-1.0-SNAPSHOT.jar。這個其實也可以複製CDH6.3.3原有的,因爲external-data-source這塊已經幾年沒更新了……

4.2 sbin-retail目錄

把裏面的impalad換成apache impala 3.4編譯後的impalad,在編譯目錄裏的路徑是 be/build/latest/service/impalad
檢查catalogd和statestored兩個軟鏈是否指向了impalad:

ll sbin-retail
total 470152
drwxr-xr-x 2 root root      4096 Jun 20 00:35 ./
drwxr-xr-x 9 root root      4096 Jun 20 00:57 ../
lrwxrwxrwx 1 root root         7 Jun 19 22:37 catalogd -> impalad*
-rwxr-xr-x 1 root root 481420800 Jun 20 00:06 impalad*
lrwxrwxrwx 1 root root         7 Jun 19 22:37 statestored -> impalad*

4.3 www目錄

這個目錄是WebUI用的,把舊版的刪了,複製新版的過來。

5. 更改CM配置並重啓

把新的Impala目錄放到所有機器上,確保它們一致。然後在CM中去到Impala -> Configuration -> Impala Service Environment Advanced Configuration Snippet (Safety Valve),加一個環境變量 IMPALA_HOME=/opt/cloudera/parcels/CDH-6.3.3-1.cdh6.3.3.p0.1796617/lib/apache-impala-3.4
在CM配置里加上IMPALA_HOME環境變量
然後重啓整個Impala集羣。重啓成功後,可以看到catalogd、statestored、impalad啓用了新頁面,並且版本號是3.4
Impala-3.4 Impalad WebUI

6. 驗證和回滾

最後要驗證一下集羣是否工作正常,包括Impala 3.4的一些新功能。如果有任何不兼容的地方,回滾CM的配置再重啓Impala集羣就回來了,因爲我們並沒有動老版本的任何東西。

7. 總結

在CDH中單獨升級Impala,可以通過以下步驟:

  • 在 /opt/cloudera/parcels/CDH/lib 目錄下生成一個新的impala目錄
  • 複製新版本的以下內容到目錄對應位置:impalad、impala-frontend-0.1-SNAPSHOT.jar、所有新版FE依賴的jar包、www目錄、新版本依賴的 libkudu_client.so.0
  • 在CM的Impala Service Environment Advanced Configuration Snippet (Safety Valve)配置中,設置IMPALA_HOME環境變量指向新目錄
  • 重啓集羣

單獨升級Impala需要對Impala有一定的技術儲備,Cloudera官方並不建議這樣做,因爲與已有CDH組件的兼容性問題並沒有得到測試。以上只是我個人的升級實驗,有任何不兼容的問題,歡迎大家前往Impala技術交流羣進行討論(加微信China_Impala獲取進羣方式)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章