1.配置/etc/yum.repos.d
clouder-kudu.repo
[cloudera-kudu]
# Packages for Cloudera's Distribution for kudu, Version 5, on RedHat or CentOS 6 x86_64
name=Cloudera's Distribution for kudu, Version 5
baseurl=http://archive.cloudera.com/kudu/redhat/6/x86_64/kudu/5/
gpgkey = http://archive.cloudera.com/kudu/redhat/6/x86_64/kudu/RPM-GPG-KEY-cloudera
gpgcheck = 1
cloudera-impala.repo
[cloudera-impala]
name=Impala
baseurl= http://archive.cloudera.com/impala/redhat/6/x86_64/impala/2.0.0/
gpgkey = http://archive.cloudera.com/impala/redhat/6/x86_64/impala/2.0.0/RPM-GPG-KEY-cloudera
gpgcheck = 1
2.安裝kudu
yum install kudu #Kudu的基本包
yum install kudu-master # KuduMaster
yum install kudu-tserver # KuduTserver
yum install kudu-client0 #Kudu C ++客戶端共享庫
yum install kudu-client-devel # Kudu C ++客戶端共享庫 SDK
yum install ntpd -y
yum install cyrus-sasl*
3.安裝impala
yum install impala
yum install impala-server
yum install impala-catalog
yum install impala-shell
yum install impala-state-store
yum install impala-udf-devel
配置protobuf2.5:https://github.com/google/protobuf/releases/
4.啟動kudu
5.啟動impala
# service impala-state-store start
# service impala-catalog start
# service impala start
impalad - Impala的守護進程. 計划執行數據查詢在HDFS和HBase上。 在集群中的每個數據節點上運行一個守護進程
statestored - 跟蹤集群中的所有impala實例的狀態,在集群中的一個節點上運行該程序。
catalogd - Metadata協調服務 impala-shell - 命令行接口
配置環境
1.修改/etc/default/bigtop-utils文件
export JAVA_HOME=/usr/java/jdk1.8 //設置java home
2.修改/etc/default/impala文件
IMPALA_CATALOG_SERVICE_HOST=10.1.6.69 //為catalog主機Ip 也可以主機名 注意配置hosts
IMPALA_STATE_STORE_HOST=10.1.6.69 //為state-store主機Ip
IMPALA_LOG_DIR=/data/log/impala //配置日志路徑 默認為/var/log/impala
3.在/etc/impala/conf.dist目錄下 添加core-site.xml和hdfs-site.xml文件(建議從hadoop配置文件中拷貝)
其中core-site.xml添加內容如下:
<!-- 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>
<property>
<name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
<value>true</value>
</property>
hdfs-site.xml添加內容如下:
<!--impala-->
<property>
<name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.block.local-path-access.user</name>
<value>impala</value>
</property>
<property>
<name>dfs.client.file-block-storage-locations.timeout.millis</name>
<value>60000</value>
</property>
5.1.啟動服務
service impala-catalog start
service impala-state-store start
service impala-server start
5.2.驗證
第一種方式:
ps -aux|grep impala-catalog
ps -aux|grep impala-state
ps -aux|grep impalad
第二種方式:
impala-shell(默認連接本機的server)
impala-shell -i 172.16.104.120 //連接指定ip的server impala-shell 如果是no connect狀態 可以輸入connect 172.16.104.120進行連接
第三種方式(webUI):
172.16.104.120:25000
172.16.104.120:25010
172.16.104.120:25020
5.3.其他
Impala Daemon(Impala 守護進程前端端口):21000 >> impala-shell, Beeswax, Cloudera ODBC 1.2 驅動 用於傳遞命令和接收結果
Impala Daemon(Impala 守護進程前端端口):21050 >> 被使用 JDBC 或 Cloudera ODBC 2.0 及以上驅動的諸如 BI 工具之類的應用用來傳遞命令和接收結果
Impala Daemon(Impala 守護進程后端端口):22000 >> Impala 守護進程用該端口互相通訊
Impala Daemon(StateStore訂閱服務端口):23000 >> Impala 守護進程監聽該端口接收來源於 state store 的更新
StateStore Daemon(StateStore 服務端口):24000 >> State store 監聽該端口的 registration/unregistration 請求
Catalog Daemon(StateStore 服務端口):26000 >> 目錄服務使用該端口與Imp
Impala Daemon(HTTP 服務器端口):25000 >> Impala web 接口,管理員用於監控和故障排除
StateStore Daemon(HTTP 服務器端口):25010 >> StateStore web 接口,管理員用於監控和故障排除
Catalog Daemon(HTTP 服務器端口):25020 >> 目錄服務 web 接口,管理員用於監控和故障排除,Impala 1.2 開始使用
6.注意事項
使用二進制包安裝Impala,與Hadoop 2.4.1配合使用。但沒有成功。Hadoop 2.4.1使用的Protobuf庫的版本為2.5,而Impala使用的Profobuf庫的版本為2.4a。二者版本不匹配,impalad啟動失敗
使用Hadoop的protobuf庫替掉impala的lib目錄下的其他版本protobuf,仍然沒有解決問題。
懷疑是Impala版本代碼中,已經基於老版本protobuf的API進行開發。需要基於新版本protobuf,重新編譯impala源代碼。
impala啟動錯誤1:
Failed on local exception:
com.google.protobuf.InvalidProtocolBufferException: Message missing required fields: callId, status; Host Details : local host is: "database32/127.0.1.1"; destination host is: "localhost":9000;
原因:
hadoop2.6的protobuf版本為2.5,為impala用的版本為protobuf2.4
解決:
將hadoop的版本降低時與impala的版本匹配,這里impala采用二進制方式安裝,無法
重新編譯,解決為將hadoop的版本與impala版本一致。我下載的hadoop為hadoop-2.0.0-cdh4.1.0,impala為impala_1.4.0
7.Cloudera Impala 編譯、安裝與配置
mpala是由Cloudera開發的高性能實時計算工具,相比Hive性能提升了幾十、甚至近百倍,基本思想是將計算分發到每個 Datanode所在的節點,依靠內存實現數據的緩存進行快速計算,類似的系統還有Berkeley的Shark。從實際測試來看,Impala效率確實 不錯,由於Impala大量使用C++實現,不使用CDH的Image而自己編譯安裝要費不少功夫,這里記錄一下安裝配置過程和碰到的一些問題。我在測試 時候使用的是CentOS6.4。
一些基本的安裝步驟在這里,但我在安裝的時候碰到一些問題,這里再詳細說明一下過程。
1.安裝所需的依賴lib,這一步沒有什么不同
2.安裝LLVM ,按照流程做即可,注意要在多台機器上編譯安裝Impala的話,只用在一台機器上執行下面藍色的部分,再把llvm分發到多台機器上執行后面紅色部分的指令就可以了,沒必要每個機器都通過svn下載一遍源代碼,很費時。
tar xvzf llvm-3.2.src.tar.gz
cd llvm-3.2.src/tools
svn co http://llvm.org/svn/llvm-project/cfe/tags/RELEASE_32/final/ clang
cd ../projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/tags/RELEASE_32/final/ compiler-rt
./configure –with-pic
make -j4 REQUIRES_RTTI=1
sudo make install
3.安裝Maven ,這個沒什么好說的,按照步驟,設置一下環境變量即可,Maven是為了后面build impala源代碼用的。
tar xvf apache-maven-3.0.4.tar.gz && sudo mv apache-maven-3.0.4 /usr/local
修改~/.bashrc,增加maven環境變量
export M2=$M2_HOME/bin
export PATH=$M2:$PATH
更新環境變量,查看mvn版本是否正確
mvn -version
4.下載Impala源代碼
5.設置Impala環境變量,編譯時需要
./bin/impala-config.sh
6.下載impala依賴的第三方package
./download_thirdparty.sh
注意這里其中一個包cyrus-sasl-2.1.23可能下載失敗,可以自行搜索(CSDN里面就有)下載下來然后解壓縮到thirdparty 文件夾,最好是在執行完download_thirdparty.sh之后做這一步,因為download_thirdparty.sh會把所有目錄下下 載下來的tar.gz給刪除掉。
7.理論上現在可以開始build impala了 ,但是實際build過程中可能會出現問題,我碰到的問題和 Boost相關的(具體錯誤不記得了),最后發現是由於boost版本太低導致的,CentOS 6.2系統默認yum源中的boost和boost-devel版本是1.41,但是impala編譯需要1.44以上的版本,因此需要做的是自己重新編 譯boost,我用的是boost 1.46版本。
yum remove boost
yum remove boost-devel
#下載boost
#可以去(http://www.boost.org/users/history/)下載boost
#下載后解壓縮
tar xvzf boost_1_46_0.tar.gz
mv boost_1_46_0 /usr/local/
cd /usr/include
./bootstrap.sh
./bjam
#執行后若打印以下內容,則表示安裝成功
# The Boost C++ Libraries were successfully built!
# The following directory should be added to compiler include paths:
# /usr/local/boost_1_46_0
# The following directory should be added to linker library paths:
# /usr/local/boost_1_46_0/stage/lib
#現在還需要設置Boost環境變量和Impala環境變量
export BOOST_ROOT=’/usr/local/boost_1_46_0′
export IMPALA_HOME=’/home/extend/impala’
#注意一下,這里雖然安裝了boost,但是我在實際使用的時候,編譯還是會報錯的,報的錯誤是找不到這個包:#libboost_filesystem-mt.so,這個包是由boost-devel提供的,所以我的做法是把boost-devel給重新裝上
#我沒有試過如果之前不刪除boost-devel會不會有問題,能確定的是按這里寫的流程做是沒問題的
yum install boost-devel
8.現在終於可以編譯impala了
./build_public.sh -build_thirdparty
#編譯首先會編譯C++部分,然后再用mvn編譯java部分,整個過程比較慢,我在虛擬機上大概需要1-2個小時。
#Impala編譯完后的東西在be/build/debug里面
9.啟動impala_shell需要用到的Python包
easy_install prettytable
easy_install thrift
10. 如果你以為到這里就萬事大吉就太天真了,在配置、啟動、使用Impala的時候還會有很多奇葩的問題;
問題1:Hive和Hadoop使用的版本
CDH對版本的依賴要求比較高,為了保證Impala正常運行,強烈建議使用Impala里面thirdparty目錄中自帶的Hadoop(native lib已經編譯好的)和Hive版本。
Hadoop的配置文件在$HADOOP_HOME/etc/hadoop中,要注意的是需要啟用native lib
<property >
<name > hadoop.native.lib </name >
<value > true </value >
<description > Should native hadoop libraries, if present, be used. </description >
</property >
問題2:Impala的配置文件位置
Impala默認使用的配置文件路徑是在bin/set-classpath.sh中配置的,建議把CLASSPATH部分改成
$IMPALA_HOME/conf:\
$IMPALA_HOME/fe/target/classes:\
$IMPALA_HOME/fe/target/dependency:\
$IMPALA_HOME/fe/target/test-classes:\
${HIVE_HOME}/lib/datanucleus-core-2.0.3.jar:\
${HIVE_HOME}/lib/datanucleus-enhancer-2.0.3.jar:\
${HIVE_HOME}/lib/datanucleus-rdbms-2.0.3.jar:\
${HIVE_HOME}/lib/datanucleus-connectionpool-2.0.3.jar:
即要求Impala使用其目錄下的Conf文件夾作為配置文件,然后創建一下Conf目錄,把3樣東西拷貝進來:core-site.xml、hdfs-site.xml、hive-site.xml。
core-site.xml的配置,下面幾個選項是必須要配置的,
<?xml-stylesheet type = "text/xsl" href = "configuration.xsl" ?>
<configuration >
<property >
<name > fs.defaultFS </name >
<value > hdfs://10.200.4.11:9000 </value >
</property >
<property >
<name > dfs.client.read.shortcircuit </name >
<value > true </value >
</property >
<property >
<name > dfs.client.use.legacy.blockreader.local </name >
<value > false </value >
</property >
<property >
<name > dfs.client.read.shortcircuit.skip.checksum </name >
<value > false </value >
</property >
</configuration >
hdfs-site.xml的配置
<?xml-stylesheet type = "text/xsl" href = "configuration.xsl" ?>
<configuration >
<property >
<name > dfs.block.local-path-access.user </name >
<value > ${your user} </value >
</property >
<property >
<name > dfs.datanode.hdfs-blocks-metadata.enabled </name >
<value > true </value >
</property >
<property >
<name > dfs.datanode.data.dir </name >
<value > ${yourdatadir} </value >
</property >
<property >
<name > dfs.client.use.legacy.blockreader.local </name >
<value > false </value >
</property >
<property >
<name > dfs.datanode.data.dir.perm </name >
<value > 750 </value >
</property >
<property >
<name > dfs.client.file-block-storage-locations.timeout </name >
<value > 5000 </value >
</property >
<property >
<name > dfs.domain.socket.path </name >
<value > /home/extend/cdhhadoop/dn.8075 </value >
</property >
</configuration >
最后是hive-site.xml,這個比較簡單,指定使用DBMS為元數據存儲即可(impala必須和hive共享元數據,因為impala無 法create table);Hive-site.xml使用MySQL作為metastore的說明在很多地方都可以查到,配置如下:
<?xml-stylesheet type = "text/xsl" href = "configuration.xsl" ?>
<configuration >
<property >
<name > javax.jdo.option.ConnectionURL </name >
<value > jdbc:mysql://10.28.0.190:3306/impala?createDatabaseIfNotExist=true</value >
<description > JDBC connect string for a JDBC metastore </description >
</property >
<property >
<name > javax.jdo.option.ConnectionDriverName </name >
<value > com.mysql.jdbc.Driver </value >
<description > Driver class name for a JDBC metastore </description >
</property >
<property >
<name > javax.jdo.option.ConnectionUserName </name >
<value > root </value >
<description > username to use against metastore database </description >
</property >
<property >
<name > javax.jdo.option.ConnectionPassword </name >
<value > root </value >
<description > password to use against metastore database </description >
</property >
</configuration >
記得把mysql-connector的jar包給拷貝到hive的lib里面去,同樣也要拷貝給impala ( 拷貝至$IMPALA_HOME/fe/target/dependency)
11.啟動Impala 。到此,Impala是可以正常啟動的。這里說明一下,官方文檔沒有說很清楚Impala的Service之間是如何互相協調的,按照官方的步驟,最后通過如下方法來在一台機器上啟動Impala Service:
${IMPALA_HOME}/bin/start-impalad.sh -use_statestore=false
#啟動impala shell
${IMPALA_HOME}/bin/impala-shell.sh
然后impala-shell就可以連接到localhost進行查詢了;注意,這里只是單機查詢,可以用來驗證你的Impala是否正常work 了;如何啟動一個Impala集群,跳到第12步。這里繼續說一下可能遇到的問題,我遇到的一個比較奇葩的問題是show tables和count(1)沒有問題,但是select * from table的時候impala在讀取數據的時候就崩潰了(有時報錯could not find method close from class org/apache/hadoop/fs/FSDataInputStream with signature ()V ),這里修改了兩個地方解決這個問題:
a.修改impala的set-classpath.sh並移除$IMPALA_HOME/fe/target/dependency目錄中除了hadoop-auth-2.0.0-*.jar之外所有hadoop-*開頭的jar包。
mv $IMPALA_HOME/fe/target/dependency/hadoo* $IMPALA_HOME
mv $IMPALA_HOME/hadoop-auth*.jar mv $IMPALA_HOME/fe/target/dependency
#修改bin/set-classpath.sh,將$HADOOP_HOME中的lib給加入,在set-classpath.sh最后一行export CLASSPATH之前#添加
for jar in `ls $HADOOP_HOME/share/hadoop/common/*.jar`; do
CLASSPATH=${CLASSPATH}:$jar
done
for jar in `ls $HADOOP_HOME/share/hadoop/yarn/*.jar`; do
CLASSPATH=${CLASSPATH}:$jar
done
for jar in `ls $HADOOP_HOME/share/hadoop/hdfs/*.jar`; do
CLASSPATH=${CLASSPATH}:$jar
done
for jar in `ls $HADOOP_HOME/share/hadoop/mapreduce/*.jar`; do
CLASSPATH=${CLASSPATH}:$jar
done
for jar in `ls $HADOOP_HOME/share/hadoop/tools/lib/*.jar`; do
CLASSPATH=${CLASSPATH}:$jar
done
b.注意到Impala對待table的時候只能夠使用hive的默認列分隔符,如果在hive里面create table的時候使用了自定義的分隔符,Impala servive就會在讀數據的時候莫名其妙的崩潰。
12.啟動Impala 集群
Impala實際上由兩部分組成,一個是StateStore,用來協調各個機器計算,相當於Master,然后就是Impalad,相當於Slave,啟動方法如下:
#方法1,直接利用impala/bin下面的這個python腳本
#這個腳本會啟動一個StateStore,同時啟動-s個數量的Impala Service在本機
$IMPALA_HOME/bin/start-impala-cluster.py -s 1 –log_dir /home/extend/impala/impalaLogs
#方法2,手動啟動StateStore
$IMPALA_HOME/be/build/debug/statestore/statestored -state_store_port=24000
#啟動impala service
#在每個編譯安裝了impala的節點上執行命令
#參數-state_store_host指定啟動了stateStore的機器名
#-nn即namenode,指定hadoop的namenode
#-nn_port是namenode的HDFS入口端口號
$IMPALA_HOME/bin/start-impalad.sh -state_store_host=m11 -nn=m11 -nn_port=9000
正常啟動之后,訪問http://${stateStore_Server}:25010/ 可以看到StateStore的狀態,其中的subscribers頁面可以看到已經連接上的impala service node;
13.使用Impala客戶端
這一步最簡單,隨便找一個機器啟動
#啟動之后可以隨便連接一個impala service
connect m12
#連接上之后就可以執行show tables之類的操作了
#需要注意的是,如果hive創建表或更新了表結構,impala的節點是不知道的
#必須通過客戶端連接各個impala service並執行refresh來刷新metadata
#或者重啟所有impala service