impala記錄-安裝kudu和impala


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

安裝完成之后,在/etc/kudu/conf目錄下有兩個文件:master.gflagfile和tserver.gflagfile
 
master.gflagfile的配置修改為(目錄可以根據自己的習慣來制定,但在啟動kudu之前一定要事先創建好,否則master無法正常啟動)
 
--fromenv=rpc_bind_addresses
--fromenv=log_dir
 
--fs_wal_dir=/home/data/kudu/master
--fs_data_dirs=/home/data/kudu/master
 
tserver.gflagfile修改為:
 
--fromenv=rpc_bind_addresses
--fromenv=log_dir
 
--fs_wal_dir=/home/data/kudu/tserver
--fs_data_dirs=/home/data/kudu/tserver
--tserver_master_addrs=hadoop1:7051
 
注意,這里的--tserver_master_addrs指明了集群中master的地址,指向同一個master的tserver形成了一個kudu集群
 
可能遇到的問題:
 
根據官網的介紹,配置完成之后就可以啟動kudu了,啟動master和tserver的命令分別為:
 
sudo service kudu-master start
sudo service kudu-tserver start
sudo service ntpd start
再次啟動kudu,還是報錯,查看日志,發現是對/home/data/kudu沒有操作權限。這個目錄是我用root賬號創建的,但kudu的啟動默認會使用一個叫kudu的用戶。執行下列命令來改變目錄的所有者:
cd /home/data/kudu
chown -R kudu:kudu ./*
 
再次執行啟動master(在hadoop1這台服務器上啟動)和tserver(在hadoop1,hadoop2,hadoop3這三台服務器上都啟動)的命令,終於成功了。
 
在瀏覽器上通過http://<_host_name_>:8051 和 http://<_host_name_>:8050 可以分別查看master和tserver的詳情

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,這一步沒有什么不同

sudo yum install boost-test boost-program-options libevent-devel automake libtool flex bison gcc-c++ openssl-devel make cmake doxygen.x86_64 glib-devel boost-devel python-devel bzip2-devel svn libevent-devel cyrus-sasl-devel wget git unzip

2.安裝LLVM ,按照流程做即可,注意要在多台機器上編譯安裝Impala的話,只用在一台機器上執行下面藍色的部分,再把llvm分發到多台機器上執行后面紅色部分的指令就可以了,沒必要每個機器都通過svn下載一遍源代碼,很費時。

wget http://llvm.org/releases/3.2/llvm-3.2.src.tar.gz 
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
cd .. 
./configure –with-pic 
make -j4 REQUIRES_RTTI=1 
sudo make install

3.安裝Maven ,這個沒什么好說的,按照步驟,設置一下環境變量即可,Maven是為了后面build impala源代碼用的。

wget http://www.fightrice.com/mirrors/apache/maven/maven-3/3.0.4/binaries/apache-maven-3.0.4-bin.tar.gz 
tar xvf apache-maven-3.0.4.tar.gz && sudo mv apache-maven-3.0.4 /usr/local

修改~/.bashrc,增加maven環境變量

export M2_HOME=/usr/local/apache-maven-3.0.4 
export M2=$M2_HOME/bin 
export PATH=$M2:$PATH

更新環境變量,查看mvn版本是否正確

source ~/.bashrc 
mvn -version

4.下載Impala源代碼

git clone https://github.com/cloudera/impala.git

5.設置Impala環境變量,編譯時需要

cd impala 
./bin/impala-config.sh

6.下載impala依賴的第三方package

cd thirdparty 
./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版本。

#刪除已安裝的boost和boost-devel 
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了

cd $IMPALA_HOME 
./build_public.sh -build_thirdparty 
#編譯首先會編譯C++部分,然后再用mvn編譯java部分,整個過程比較慢,我在虛擬機上大概需要1-2個小時。 
#Impala編譯完后的東西在be/build/debug里面

9.啟動impala_shell需要用到的Python

#第一次執行impalad_shell可能會報錯,這里需要安裝python的兩個包:thrift和prettytable,使用easy_install即可 
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

#修改hadoop的core-site.xml,除了這個選項之外,其他配置和問題2中的core-site.xml一致 
<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部分改成

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 version = "1.0" ?> 
<?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 version = "1.0" encoding = "UTF-8" ?> 
<?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 version = "1.0" ?> 
<?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 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包。

#把impala dependency中和hadoop相關的包給弄出來,只保留auth 
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,啟動方法如下:

#啟動statestore 
#方法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_HOME/bin/impala-shell.sh 
#啟動之后可以隨便連接一個impala service 
connect m12 
#連接上之后就可以執行show tables之類的操作了 
#需要注意的是,如果hive創建表或更新了表結構,impala的節點是不知道的 
#必須通過客戶端連接各個impala service並執行refresh來刷新metadata 
#或者重啟所有impala service


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM