Impala入门笔记
From:http://tech.uc.cn/?p=817
問題背景:
寫作目的:
適合閱讀對象:
不涉及的內容:
關于Hadoop和Hive的安裝,可參考我們公司一位Hadoop牛人寫的Hadoop一鍵安裝(里面包含了Hive的安裝) https://github.com/hadoop-deployer/hadoop-deployer
正文:
1. Impala介紹
Impala 號稱在性能上比Hive高出3~30倍,甚至預言說在將來的某一天可能會超過Hive的使用率而成為Hadoop上最流行的實時計算平臺(也許我這里有點曲解Impala專家的意思,但其誘惑的言辭足以令Hadoop迷不禁有蠢蠢欲試的激動)。畢竟Impala也是人寫出來的,是否真的如想象中的快,還得靠客觀數據來驗證。下面就這兩個星期對Impala的認識小記一下,供日后翻閱。(請原諒我沒有告訴你Hadoop是個啥東東,因為我這里假設你已經聽過這頭在海量數據的世界馳騁幾個歲月的大象,但不一定要求你是大牛)
以下內容是對Cloudera官網中關于Impala文檔(主要是《Installing and Using Cloudera Impala》)一些內容的個人理解,欠妥之處還請不吝賜教:
Impala的目的不在于替換現有的MapReduce工具,如Hive,而是提供一個統一的平臺用于實時查詢。事實上Impala的運行也是依賴Hive的元數據。Impala與其它組件之間的關系如下:
與Hive類似,Impala也可以直接與HDFS和HBase庫直接交互。只不過Hive和其它建立在MapReduce上的框架適合需要長時間運行的批處理任務。例如那些批量提取,轉化,加載(ETL)類型的Job。而Impala主要用于實時查詢。
?
1.1 Impala組成
1.1.1 State Store
-
對應進程為 statestored (筆者這里使用的Impala版本為0.4,有些版本的statestore進程名可能不是這樣叫的)
-
用于協調各個運行impalad的實例之間的信息關系,Impala正是通過這些信息去定位查詢請求所要的數據。換句話說,state store的作用主要為跟蹤各個impalad實例的位置和狀態,讓各個impalad實例以集群的方式運行起來。
-
與 HDFS的NameNode不一樣,雖然State Store一般只安裝一份,但一旦State Store掛掉了,各個impalad實例卻仍然會保持集群的方式處理查詢請求,只是無法將各自的狀態更新到State Store中,如果這個時候新加入一個impalad實例,則新加入的impalad實例不為現有集群中的其他impalad實例所識別(事實上,經筆者測試,如果impalad啟動在statestored之后,根本無法正常啟動,因為impalad啟動時是需要指定statestored的主機信息的)。然而,State Store一旦重啟,則所有State Store所服務的各個impalad實例(包括state store掛掉期間新加入的impalad實例)的信息(由impalad實例發給state store)都會進行重建。
1.1.2 Impalad
-
對應進程為 impalad(核心進程,數據的計算就靠這個進程來執行)
-
該進程應運行在DataNode機器上(建議每個DataNode機器運行一個impalad,官方的意思似乎這種建議是必須的),每個impalad實例會接收、規劃并調節來自ODBC或Impala Shell等客戶端的查詢。每個impalad實例會充當一個Worker,處理由其它impalad實例分發出來的查詢片段(query fragments)。客戶端可以隨便連接到任意一個impalad實例,被連接的impalad實例將充當本次查詢的協調者(Ordinator),將查詢分發給集群內的其它impalad實例進行并行計算。當所有計算完畢時,其它各個impalad實例將會把各自的計算結果發送給充當 Ordinator的impalad實例,由這個Ordinator實例把結果返回給客戶端。每個impalad進程可以處理多個并發請求。
1.1.3 Impala shell
- 這是一個客戶端工具
- 該客戶端工具提供一個交互接口,供使用者發起數據查詢或管理任務,比如連接到impalad。這些查詢請求會傳給ODBC這個標準查詢接口。說白了,就是一個命令行客戶端。日后你便是通過它來查詢數據的。
1.2 安裝impala
這里介紹使用rpm包安裝的方式(需有root或sudo權限),基于源碼包安裝的方式待后續折騰。
1.2.1 安裝前需知
-
impala能使用的內存無法超過系統的硬件可用內存(GA版,查詢需要的內存如果超出硬件內存,則查詢將失敗),對內存要求高,典型的硬件內存為:32~48G
-
impala(版本0.4)只支持redhat 5.7/centos 5.7或redhat 6.2/centos 6.2以上(好像還要求是64位的,所以建議安裝在64位系統上),不支持ubuntu
-
假設你已經安裝了CDH4(即Hadoop 2.0)
-
假設你已經安裝了Hive,并配置一個外部數據庫(如MySQL)供Hive存儲元數據。可通過執行下面的命令來判斷Hive是否安裝正常 $ hive hive> show tables; OK Time taken: 2.809 seconds
-
這里請原諒我沒有提到Hadoop和Hive的安裝過程,還請尊駕自行搜索。
-
Impala不支持的特性:
- 查詢流數據
- 刪除數據
- 索引(至少當前版本不支持)
- YARN集成(至少當前版本不支持)
- 全文搜索
- 不具有像Hive SerDe的可擴展機制
- 不支持線上查詢容錯,如果查詢出錯,如機器宕機,Impala將會丟棄本次查詢。
- 不支持表和列級別的授權
- impalad實例之間的傳輸沒有加密
- 不支持Hive UFS
- beta版尚不支持JDBC,計劃GA版支持
1.2.2 安裝步驟
1.2.2.1 軟件包安裝
下載Impala的yum repository (考慮到內存和性能問題,如果機器數允許,建議Impalad實例不要跟NameNode運行在同一臺機,但卻需與DataNode安裝在同一臺機,以免影響Impala整體性能)。因Impala的rpm包比較大(v0.4版約90M),且需要在多部機器上安裝,故建議直接下載rpm包,然后通過rpm -ivh的方式安裝。這里給出rpm包的地址:http://beta.cloudera.com/impala/redhat/6/x86_64/impala/0/RPMS/x86_64/。
rpm包如下(發現Impala的版本已經更新到v0.5了,但本文的測試結果還是還是基于Impala v0.4的):
| impala-0.5-1.p0.491.el6.x86_64.rpm | 01-Feb-2013 20:10 | 97M |
| impala-debuginfo-0.5-1.p0.491.el6.x86_64.rpm | 01-Feb-2013 20:10 | 75M |
| impala-server-0.5-1.p0.491.el6.x86_64.rpm | 01-Feb-2013 20:10 | 4.2K |
| impala-shell-0.5-1.p0.491.el6.x86_64.rpm | 01-Feb-2013 20:10 | 450K |
| impala-state-store-0.5-1.p0.491.el6.x86_64.rpm | 01-Feb-2013 20:10 | 4.3K |
其中,除了 impala-debuginfo-0.5-1.p0.491.el6.x86_64.rpm 可以不下載之外,其它幾個包都是必須的,尤其是 impala-0.5-1.p0.491.el6.x86_64.rpm ,這里對各個包的作用稍微說明一下:
- impala-state-store-0.5-1.p0.491.el6.x86_64.rpm 是運行statestored實例所需要的包,該包依賴 impala-0.5-1.p0.491.el6.x86_64.rpm (核心包)
- impala-0.5-1.p0.491.el6.x86_64.rpm(核心包)和 impala-server-0.5-1.p0.491.el6.x86_64.rpm(擴展包,需首先安裝核心包) 是運行impalad實例所需要的包。
- impala-shell-0.5-1.p0.491.el6.x86_64.rpm 是運行impala-shell客戶端所需要的包
如果你選擇用yum的方式來安裝,則請將下面的repo文件拷貝到/etc/yum.repos.d/ 目錄下 文件:cloudera-impala.repo [cloudera-impala] name=Impala baseurl=http://beta.cloudera.com/impala/redhat/6/x86_64/impala/0/ gpgkey = http://beta.cloudera.com/impala/redhat/6/x86_64/impala/RPM-GPG-KEY-cloudera gpgcheck = 1
如果你非要選擇yum的方式安裝,請執行以下相關命令(這里假設你有sudo權限,不建議用該方式,除非你的repo庫是在內網。當然這種方式也有個好處,它會自動安裝一些依賴包):
- 在DataNode節點安裝impalad后臺實例:sudo yum install -y impala-server(會自動安裝impala核心包)
- 安裝statestored實例:sudo yum install -y impala-state-store(會自動安裝impala核心包)
- 安裝impala-shell客戶端:sudo yum install -y impala-shell
進入Impala安裝目錄,默認為/usr/lib/impala(可通過rpm -ql impala查看),創建目錄conf如果不存在的話。這里創建conf目錄是為了存放impalad的配置文件,impalad的配置文件路徑由環境變量IMPALA_CONF_DIR指定,默認為/usr/lib/impala/conf。
拷貝hive-site.xml、core-site.xml、hdfs-site.xml(只需從Hadoop和Hive配置文件目錄中拷貝過來)至/usr/lib/impala/conf目錄下(假設 impalad的配置文件路徑為/usr/lib/impala/conf),并作下面修改(這些修改據官方文檔,說是為了優化Impala性能,但具體效果如何,筆者目前尚未測出):
1.2.2.2 core-site.xml
在core-site.xml文件中添加如下內容(如果不存在的話):
1 <property> 2 <name>dfs.client.read.shortcircuit</name> 3 <value>true</value> 4 </property> 5 6 <property> 7 <name>dfs.client.read.shortcircuit.skip.checksum</name> 8 <value>false</value> 9 </property>?
1.2.2.3 hdfs-site.xml
在hdfs-site.xml文件中添加如下內容(如果不存在的話):
1 <property> 2 <name>dfs.datanode.data.dir.perm</name> 3 <value>755</value> 4 </property> 5 6 <property> 7 <name>dfs.block.local-path-access.user</name> 8 <value>hadoop</value> 9 </property> 10 11 <property> 12 <name>dfs.datanode.hdfs-blocks-metadata.enabled</name> 13 <value>true</value> 14 </property>?
1.2.2.4 又是core-site.xml
這里需要提一點的是,如果你用的是hadoop 2.0(即CDH4,雖然官方也稱Impala必須得CDH4以上)的HA方式配置NameNode,則Impala的core-site.xml(注意,只有Impala的core-site.xml才需作修改,Hadoop的core-site.xml配置文件不用改)還需作以下修改:
將原來(以NameNode的HA方式配置,其中mycluster代表某個NameService)
1 <property> 2 <name>fs.defaultFS</name> 3 <value>hdfs://mycluster</value> 4 </property>改為(以NameNode非HA方式配置,即指定某個具體的NameNode主機信息)
?
1 <property> 2 <name>fs.defaultFS</name> 3 <value>hdfs://192.168.22.30:12900</value> 4 </property>這里配置的NameNode主機信息要求與impalad實例啟動時指定的-nn=namenode_host -nn_port=namenode_port參數的信息一致。從這里也初步懷疑Impala目前可能尚不支持NameNode的HA配置(到底是不是如此,還請高人賜教)。
1.3 相關服務進程
下面為筆者安裝后的機器(共5臺,節點越多,也許越能測出更有價值的性能數字)及服務(安裝中發現impalad的啟動似乎需要依賴Hive,所以每臺啟動impalad實例的機器都需安裝Hive,這關系有點詭異):
| 192.168.22.30 | JournalNode QuorumPeerMain NodeManager NameNode ResourceManager DataNode DFSZKFailoverController | Hive statestored impalad |
| 192.168.22.31 | NameNode QuorumPeerMain NodeManager DFSZKFailoverController JournalNode DataNode | Hive impalad |
| 192.168.22.32 | NodeManager JournalNode DataNode QuorumPeerMain | Hive impalad |
| 192.168.22.33 | DataNode JournalNode QuorumPeerMain NodeManager | Hive impalad |
| 192.168.22.34 | QuorumPeerMain JournalNode DataNode NodeManager | Hive impalad |
?
從上面可見,筆者在5臺機器中都啟動了impalad實例,而只有192.168.22.30那臺機器啟動了statestored。你可能會問,為何沒看到啟動impala-shell客戶端的機器,那是因為筆者決定impala-shell隨便裝在那臺機器都可以,只要能連接到上面啟動impalad實例的機器便可,故這里沒列出。
1.3.1 啟動命令
以下為impala服務啟動命令:
先啟動statestored(默認端口為24000): statestored -state_store_port=24000
再啟動impalad實例: HADOOP_CONF_DIR=”/usr/lib/impala/conf” impalad -state_store_host=192.168.22.30 -nn=192.168.22.30 -nn_port=12900 -hosame=192.168.22.34 -ipaddress=192.168.22.34
注意:
-
這里需要加上HADOOP_CONF_DIR,否則在impala查詢數據,可能會報類似 Wrong FS 。。。expect 。。。的錯誤
-
其中的-nn和-nn_port,表示NameNode的主機和端口,因Hadoop 2以上的版本對NameNode采用HA的方式,對外提供NameService而不是某個具體的NameNode,然而這里impalad啟動時卻依然需要知道某個具體的NameNode的主機和端口,懷疑Impala目前尚不支持Hadoop的NameNode的HA方式。
-
在第一次啟動impalad的時候,你可能會遇到impalad報類似找不到JDBC數據庫驅動(假設為MYSQL)的問題,其實是因為impalad默認使用的數據庫驅動包的位置為:/usr/share/java/mysql-connector-java.jar,該配置默認由/etc/default/impala文件中的MYSQL_CONNECTOR_JAR項指定,讀者可在~/.bash_profile文件中修改為自己的驅動文件路徑,如下為筆者在~/.bash_profile中添加的項:
export MYSQL_CONNECTOR_JAR=$HOME/hive/lib/mysql-connector-java-5.1.16-bin.jar:$MYSQL_CONNECTOR_JAR
- 別忘了修改后執行一下source ~/.bash_profile來是修改生效。
1.4 啟動參數
關于impala服務的啟動參數,請參見下表:
| -ipaddress | The IP address for the machine that will host Impalad. While there is a default for this argument, it is important to provide a value other than 127.0.0.1 for good performance. To use the local host, provide the local host’s actual IP address. | Default: 127.0.0.1. | Yes |
| -state_store_host | The Impala state store host name. | Default: 127.0.0.1. | Yes |
| -state_store_port | The Impala state store port. | Default: 24000. | No |
| -nn | The HDFS NameNode hostname or IP address. | For example, MyNameNode. Default: 127.0.0.1. | Yes |
| -nn_port | The NameNode port. | Default: 20500. | Yes |
| -be_port | Impala’s internal service port. | Default: 22000. | No |
| -fe_port | Impala’s front end port for external connections. | Default: 21000. | No |
| -log_filename | The path to and name of the file that impala will use to store logging information. | ? | Yes |
| -webserver_interface | The network interface the debugging web server uses. | Default: 0.0.0.0. | No |
| -webserver_port | The port the debugging web server uses. | Default: 25000. | No |
| -web_log_bytes | The maximum number of bytes to display on a debug web server’s log page. | Default: 1048576 | No |
?
2. hive和impala測試性能比較
本次測試中,hdfs中存有文件大小為20G,并已裝載到了表mytest_impala中,可通過Hive來裝載。
2.1 impala-shell的使用
在進入性能測試比較前,先簡要介紹一下impala-shell的使用。首先確保你已經有一臺機器安裝了impala-shell客戶端。
2.1.1 啟動impala-shell
$?impala-shell
得到下面的Welcome信息:
Welcome to the Impala shell. Press TAB twice to see a list of available commands. Copyright (c) 2012 Cloudera, Inc. All rights reserved. (Build version: Impala v0.1 (cf57fd9) built on Thu Sep 27 10:32:13 PDT 2012) [Not connected] >
2.1.2 查看支持的命令
正如上面提示,可通過敲擊兩次的TAB鍵來查看impala-shell目前支持的命令:
connect explain history quit select shell use describe help insert refresh set show version [Not connected] >
從中可見,Impala目前尚不支持表的創建(即CREATE TABLE)
2.1.3 連接impalad服務端
[Not connected] >?connect 192.168.22.30:21000 Connected to 192.168.22.30:21000 [192.168.22.30:21000] >
2.1.4 查詢數據
[192.168.22.30:21000] >?show tables; Query: show tables Query finished, fetching results … mytest mytest_2 mytest_impala Returned 3 row(s) in 0.17s
[192.168.22.30:21000] >?select * from mytest_impala limit 1; Query: select * from mytest_impala limit 1 Query finished, fetching results … 1 2012-06-19 21:18:09 http://book1.sina.cn/prog/wapsite/books/vipchl.php?bid=39922&PHPSESSID=9743b7325413117a25d1efa7975daea7&vt=4&wm=4002 Returned 1 row(s) in 1.57s [192.168.22.30:21000] >
因Impala支持的SQL語句是Hive的HQL語句的一個子集,也就說Hive中的一些HQL語句在這里同樣適用,具體請參考相關文檔,這里不再詳述。
2.2 性能測試1
測試show tables。
2.2.1 使用Impala的執行情況
[192.168.22.31:21000] >?show tables; Query: show tables Query finished, fetching results … mytest mytest_2 mytest_impala Returned 3 row(s) in?0.01s
2.2.2 使用Hive的執行情況
2.2.2.1 第一次執行
剛開始還以為Hive每次show tables都那么慢,當執行第二次時才發現其實不然。
hive>?show tables; OK mytest mytest_2 mytest_impala Time taken:?2.785?seconds
2.2.2.2 第二次執行
hive>?show tables; OK mytest mytest_2 mytest_impala Time taken:?0.103?seconds
2.3 性能測試2
測試select count(*) from mytest_impala
2.3.1 使用Impala的執行情況
[192.168.22.31:21000] >?select count(*) from mytest_impala; Query: select count(*) from mytest_impala Query finished, fetching results … 69007188 Returned 1 row(s) in?106.58s
2.3.2 使用Hive的執行情況
hive>?select count(*) from mytest_impala; Total MapReduce jobs = 1 Launching Job 1 out of 1 Number of reduce tasks determined at compile time: 1 In order to change the average load for a reducer (in bytes): set hive.exec.reducers.bytes.per.reducer= In order to limit the maximum number of reducers: set hive.exec.reducers.max= In order to set a constant number of reducers: set mapred.reduce.tasks= Starting Job = job_1361238384421_0001, Tracking URL = http://192.168.22.30:12088/proxy/application_1361238384421_0001/ Kill Command = /home/zhengzn/hadoop/bin/hadoop job -Dmapred.job.tracker=ignorethis -kill job_1361238384421_0001 Hadoop job information for Stage-1: number of mappers: 44; number of reducers: 1 2013-02-20 12:11:33,026 Stage-1 map = 0%, reduce = 0% … 2013-02-20 12:13:45,502 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 256.1 sec MapReduce Total cumulative CPU time: 4 minutes 16 seconds 100 msec Ended Job = job_1361238384421_0001 MapReduce Jobs Launched: Job 0: Map: 44 Reduce: 1 Cumulative CPU: 256.1 sec HDFS Read: 11393427897 HDFS Write: 9 SUCCESS Total MapReduce CPU Time Spent: 4 minutes 16 seconds 100 msec OK 69007188 Time taken:?148.285?seconds
2.4 性能測試3
測試select count(*) from mytest_impala where id = ’1205-4721599131-fa2451a7′。
2.4.1 使用Impala的執行情況
[192.168.22.31:21000] >?select count(*) from mytest_impala where id = ’1205-4721599131-fa2451a7′; Query: select count(*) from mytest_impala where id = ’1205-4721599131-fa2451a7′ Query finished, fetching results … 9 Returned 1 row(s) in?96.54s
2.4.2 使用Hive的執行情況
hive>?select count(*) from mytest_impala where id = ’1205-4721599131-fa2451a7′; Total MapReduce jobs = 1 Launching Job 1 out of 1 Number of reduce tasks determined at compile time: 1 In order to change the average load for a reducer (in bytes): set hive.exec.reducers.bytes.per.reducer= In order to limit the maximum number of reducers: set hive.exec.reducers.max= In order to set a constant number of reducers: set mapred.reduce.tasks= Starting Job = job_1361238384421_0002, Tracking URL = http://192.168.22.30:12088/proxy/application_1361238384421_0002/ Kill Command = /home/zhengzn/hadoop/bin/hadoop job -Dmapred.job.tracker=ignorethis -kill job_1361238384421_0002 Hadoop job information for Stage-1: number of mappers: 44; number of reducers: 1 2013-02-20 12:46:19,786 Stage-1 map = 0%, reduce = 0% … 2013-02-20 12:48:00,077 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 295.09 sec MapReduce Total cumulative CPU time: 4 minutes 55 seconds 90 msec Ended Job = job_1361238384421_0002 MapReduce Jobs Launched: Job 0: Map: 44 Reduce: 1 Cumulative CPU: 295.09 sec HDFS Read: 11393427897 HDFS Write: 2 SUCCESS Total MapReduce CPU Time Spent: 4 minutes 55 seconds 90 msec OK 9 Time taken:?107.81?seconds
2.5 性能測試4
測試select count(*) from mytest_impala group by id;。
2.5.1 使用Impala的執行情況
[192.168.22.31:21000] >?select count(*) from mytest_impala group by id; Returned 2587674 row(s) in?146.32s
2.5.2 使用Hive的執行情況
hive>?select count(*) from mytest_impala group by id; Total MapReduce jobs = 1 Launching Job 1 out of 1 Number of reduce tasks not specified. Estimated from input data size: 12 In order to change the average load for a reducer (in bytes): set hive.exec.reducers.bytes.per.reducer= In order to limit the maximum number of reducers: set hive.exec.reducers.max= In order to set a constant number of reducers: set mapred.reduce.tasks= Starting Job = job_1361238384421_0005, Tracking URL = http://192.168.22.30:12088/proxy/application_1361238384421_0005/ Kill Command = /home/zhengzn/hadoop/bin/hadoop job -Dmapred.job.tracker=ignorethis -kill job_1361238384421_0005 Hadoop job information for Stage-1: number of mappers: 44; number of reducers: 12 2013-02-20 17:39:48,627 Stage-1 map = 0%, reduce = 0% … 2013-02-20 17:41:36,799 Stage-1 map = 100%, reduce = 92%, Cumulative CPU 469.77 sec
Time taken:?155.724?seconds
2.6 測試總結
對于上面的測試結果我們也覺得有些困惑,為何跟Impala專家號稱的比Hive快3~30倍差那么遠呢,雖然是快了點,但并沒有傳說中的神速。到底是我們的測試節點不夠呢,還是我們的測試方法欠妥,本文就以該問題做結束,留給你我來共同思考驗證,期待高手不吝賜教。。。。。。
?
轉載于:https://www.cnblogs.com/wq920/p/3439967.html
總結
以上是生活随笔為你收集整理的Impala入门笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解jQuery中$.get、$.p
- 下一篇: Oracle索引扫描四大类的分析