ivaneeo's blog

          自由的力量,自由的生活。

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks

          Impala是由Cloudera開發的高性能實時計算工具,相比Hive性能提升了幾十、甚至近百倍,基本思想是將計算分發到每個 Datanode所在的節點,依靠內存實現數據的緩存進行快速計算,類似的系統還有Berkeley的Shark。從實際測試來看,Impala效率確實 不錯,由于Impala大量使用C++實現,不使用CDH的Image而自己編譯安裝要費不少功夫,這里記錄一下安裝配置過程和碰到的一些問題。我在測試 時候使用的是CentOS6.2。
          一些基本的安裝步驟在這里,但我在安裝的時候碰到一些問題,這里再詳細說明一下過程。

          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
          posted on 2013-06-29 17:12 ivaneeo 閱讀(1731) 評論(1)  編輯  收藏 所屬分類:

          Feedback

          # re: Cloudera Impala TarBall 編譯、安裝與配置 2013-07-14 22:19 laoyang
          我按照您說的步驟運行,也安裝了boost_1_46_0,但是編譯后還是報了錯誤,如下:
          make[2]: *** [be/build/debug/exprs/expr-test] 錯誤 1
          make[1]: *** [be/src/exprs/CMakeFiles/expr-test.dir/all] 錯誤 2
          make: *** [all] 錯誤 2
          您遇到過嗎?求解釋!!!  回復  更多評論
            

          主站蜘蛛池模板: 永吉县| 吉林市| 墨江| 商水县| 都匀市| 巨野县| 略阳县| 四子王旗| 日土县| 靖宇县| 苍南县| 武穴市| 苍溪县| 崇信县| 伊春市| 阿拉善盟| 永康市| 辽阳市| 扶余县| 克山县| 积石山| 洛浦县| 屏东市| 汕尾市| 新泰市| 屏边| 蒲江县| 安丘市| 襄汾县| 普定县| 宝山区| 连平县| 股票| 柘城县| 贡觉县| 伊吾县| 青田县| 枣庄市| 德格县| 黔西县| 海口市|