天天看點

impala v0.3使用和配置

一、Impala介紹

Cloudera Impala提供了快速,互動式的針對存儲在hadoop(hdfs和hbase)上的資料的查詢方案。impala采用了和hive相同的中繼資料、SQL文法(Hive SQL)、ODBC驅動程式和使用者接口(HUE Beeswax),這樣在使用CDH産品時,批處理和實時查詢的平台是統一的。

Cloudera Impala是另外一個支援大資料查詢的工具,但它并不是取代Hive

這種建構在mapreduce上的批量處理架構。hive和其他類似建構在mapreduce上的批處理架構還是非常适用于那種長時間運作的,比如ETL類型的作業。

1、Impala優勢

l  支援大家都非常熟悉的類SQL文法結構

l  提供對存儲在hadoop中(hdfs和hbase)資料互動式的查詢

l  Single system for big data processing and analytics so customers canavoid costly modeling and ETL just for analytics

2、Impala工作原理圖

impala v0.3使用和配置

Impala主要是對存儲在hdfs和hbase中資料進行實時查詢,由于impala采用和Hive一緻的中繼資料結構,是以impala的中繼資料管理沿用了Hive中繼資料管理機制,安裝impala的時候就必須要安裝Hive。

3、Impala元件構成:

l  Impala State Store:運作statestored程序,用于存儲叢集中的impalad程序的狀态資訊,這些資訊用于在分布式環境中快速的查詢資料響應查詢請求。

l  Impalad:運作在DataNode節點上,主要用于協調和執行查詢,每一個impalad執行個體都能接受、并有效的協調來自ODBC或者impala shell的查詢請求。另外,impalad程序還可以以一個worker的角色來執行由其他impalad程序發起的分布式并行查詢。

l Impala-shell:使用Impala-shell可以進行impala查詢或任務管理,例如connectimpalad等。

4、Impala執行查詢的處理步驟如下:

a)      使用者的Applications通過ODBC驅動程式執行查詢時,首先要連接配接到叢集中的某一個impalad程序上,然後由這個impalad程序來協調和發起分布式查詢請求。

b)      Impala接收到這個查詢請求後會對其進行解析,并分析以确定需要由叢集中的一個或者多個imapald程序執行個體來執行查詢請求。查詢的時候會根據執行計劃選擇最優的查詢方式。

c)      由選中的每一個impalad程序提供本地化的通路查詢hdfs和hbase資料服務

d)      每一個選中的impalad程序将查詢到的資料傳回給發起分布式查詢的impalad程序,該impalad程序彙總這些資料後,最後傳回個用戶端。

5、Impala主要特性:

l  支援大部分基于SQL-92标準的Hive QL文法功能,包括select,joins, 和aggregate 函數等。

l  支援查詢以以下存格式儲和壓縮的hdfs和hbase檔案:

Ø  hdfs存儲格式:TextFile, SequenceFile

Ø  壓縮格式:Snappy,GZIP, BZIP

l  統一的Hive查詢接口:

Ø  ODBC驅動程式

Ø  Hue Beeswax

l  Impala指令行接口

l  Kerberos授權方式

二、Impala軟體要求

l  Red Hat Enterprise Linux (RHEL)/CentOS 6.2 (64-bit)

l  CDH 4.1.0 or later

l  Hive 

l  MySQL

注意:Impala不支援在Debian/Ubuntu, SuSE, RHEL/CentOS 5.7系統中安裝。

三、Impala硬體要求

在Join查詢過程中需要将資料集加載記憶體中進行計算,是以對安裝Impalad的記憶體要求較高。

四、Impala運作賬号說明??

Impala不推薦運作在root賬号下,因為impala最優的性能是通過使用直接讀,而root賬号是沒有權限使用直接讀的。是以用root賬号運作impala會限制impala的性能。

五、Impala安裝說明

兩種安裝方式:

1、  僞分布式安裝:隻安裝一個impala節點。

2、  分布式安裝:在叢集中安裝多個impala節點形成一個分布式的impala環境。為了獲得最佳的性能,推薦在所有的DataNode節點上都安裝impala。

Hive安裝說明:

由于impala的metastore依賴于hive的metastore,是以必須安裝hive。

impala完整安裝見我的另外一篇博文:http://blog.csdn.net/hit_hlj_sgy/article/details/8447344

注意:建議不要将impala安裝在NameNode節點,因為執行查詢的時候可能會和NameNode争搶記憶體資源,進而導緻對NameNode造成負面影響。

六、Impala配置說明

目前impala的配置檔案包括hive-site.xml、core-site.xml、hdfs-site.xml,為了獲得impala

最優的性能,需要配置以下幾個參數:

1、  block location tracking(資料塊位置跟蹤):啟用了datablock位置跟蹤,那麼impala就能快速定位data block在磁盤中位置,進而更好地利用底層磁盤。

要啟用資料塊位置跟蹤,需要在hdfs-site.xml增加以下配置:

<property>

  <name>dfs.datanode.hdfs-blocks-metadata.enabled</name>

  <value>true</value>

</property>

2、  short-circuit reads(短路讀):針對本地資料,如果啟用了short-circuit reads,impala就能直接讀取檔案系統的資料,這樣就避免需要與DataNode的通信。此設定也最大限度地減少了額外的資料副本。

要啟用short-circuit reads,需要在core-site.xml檔案中新增以下配置:

<property>

 <name>dfs.client.read.shortcircuit</name>

 <value>true</value>

</property>

在hdfs-site.xml配置檔案中增加:

<property>

 <name>dfs.datanode.data.dir.perm</name>

 <value>750</value>

</property>

         <property>

          <name>dfs.block.local-path-access.user</name>

      <value>hadoop</value>

</property>

3、  native check-summing(本地校驗和):如果啟用native check-summing,那麼impala會使用一個優化的native check-summing庫來提升impala的性能。這個庫檔案在impala安裝路徑的lib目錄下:libhadoop.so。

檢視impalad程序的配置項資訊:

1、  通過http://<hostname>:<port>/varz來檢視impalad的配置項資訊,其中hostname和port是安裝impalad服務的主機名和端口号,端口号預設是25000。

七、Impala啟動參數

Statestored程序啟動參數:

>GLOG_v=1 nohup statestored-state_store_port=24000 &

參數 描述 說明 是否必須
-state_store_port Statestored程序服務端口号 預設值:2400

Impalad程序的啟動參數:

>GLOG_v=1 nohup impalad-state_store_host=mr5 -nn=mr5 -nn_port=9000 -hostname=mr6-ipaddress=10.28.169.113 &

參數 描述 說明 是否必須
-ipaddress 安裝Impalad程序的主機ip 預設值:127.0.0.1
-state_store_host 安裝statestored程序的主機名稱 預設值:127.0.0.1.
-state_store_port statestored程序服務端口号 預設值:2400
-nn HDFS的NN的主機名或者IP位址
-nn_port HDFS的NN的服務端口号
-be_port Impala的内部服務端口号 預設值:22000
-fe_port Impala的前端端口,用于外部連接配接 預設值:21000
-log_filename 指定impala的運作日志路徑和檔案名
-webserver_interface 用于監控調試的web server接口 預設值:0.0.0.0
-webserver_port Impala監控調試的web server端口号 預設值:25000
-web_log_bytes 監控頁面顯示的最大日志資訊資料量 預設值:1048576

Impala各種端口号說明:

程序 服務說明 端口号 通路請求 說明

Impala

守護程序

Impalad程序背景服務端口 22000 内部通路 提供背景處理服務
Impalad程序外部服務端口 21000 外部通路 提供查詢等指令行操作等服務
Impalad程序HTTP服務端口 25000 外部通路 提供impalad調試跟蹤服務

Impala

StateStore

守護程序

StateStore訂閱服務端口号 23000 内部通路 提供StateStore的訂閱服務
StateStore HTTP 服務端口号 25010 外部通路 提供StateStore調試跟蹤服務
StateStore服務端口 24000 内部通路 提供對impalad程序的服務

八、Impala提供的功能

1、指令行功能

指令 描述 備注
connect 連接配接Impala節點 connect mr8:21000
describe 檢視表結構 describe tab1
explain 解析SQL語句 explain select * from tab..
help 幫助指令,檢視指令的說明 help connect
insert 插入資料指令

insert overwrite

insert into

quit 退出指令
refresh 重新整理源資料庫
select 查詢語句指令
set 設定impala查詢選項
shell 執行本地linux指令
show 檢視表和資料庫指令
use 選擇使用資料庫
version 檢視Impala版本

set指令參數說明:

參數 預設值
PARTITION_AGG false
NUM_SCANNER_THREADS
MAX_IO_BUFFERS
MAX_SCAN_RANGE_LENGTH
NUM_NODES
DISABLE_CODEGEN false
MAX_ERRORS
ABORT_ON_ERROR false
BATCH_SIZE
ALLOW_UNSUPPORTED_FORMATS false

2、目前支援的語言元素

Impala的查詢語言是基于Hive的HiveQL,目前impala不支援針對表和分區的DDL,但是支援DML。其實大部分的HiveQL不需要修改就可以在impala上面執行的,包括JOIN, AGGREGATE, DISTINCT, UNION ALL, ORDER BY, LIMIT 和subquery等等。

(1)、select

l  資料類型:boolean, tinyint, smallint, int, bigint, float, double, timestamp, string

l  DISTINCT

l  FROM 子句支援子查詢.

l  WHERE, GROUP BY, HAVING

l  ORDER BY,但是需要和limit一起使用

l  JOINS: Left、 right、 semi、 full and outer

l  UNION ALL

l  LIMIT

l  External tables

l  關系運算符:>、<、=等

l  算術運算符:加法、減法等

l  邏輯boolean操作符:and、or、not,但是impala不支援對應的&&、||、!

l  COUNT, SUM, CAST, LIKE, IN, BETWEEN, 和COALESCE

說明:

l  Join的時候大表一定要放在左邊

l  Join subsequent tables according to which table has the mostselective filter. Joining the

table with the most selective filterresults in the fewest number of rows are being returned.

(2)、insert

目前版本的impala,insert隻支援已經建立好的表和分區。所有表和分區結構的建立和修改隻能通過HIVE來完成。

現在支援的insert包括:

l  INSERT INTO

l  INSERT OVERWRITE

說明:

Insert指令可能會導緻Hive的中繼資料發送改變,是以在使用impala執行查詢時最好先執行一下refresh指令重新整理一下hive中繼資料。

(3)、refresh

為了準确地響應查詢,impala必須要知道目前Hive中資料庫的所有中繼資料,這樣impala的用戶端才能夠直接進行正确查詢。是以,如果使用impala用戶端進行的一些操作修改hive的中繼資料後,最好impala的每一個節點都重新refresh,保證中繼資料是最新的。但是并不是是以的impala操作都需要refresh中繼資料。

在以下幾種情況下impalad執行個體需要refresh中繼資料:

l  目前impalad執行個體修改了中繼資料

l  其他比如hive或者其他的impalad執行個體修改了中繼資料

l  通過impala-shell指令行或者ODBC驅動程式連接配接impala進行的操作導緻資料庫發生改變

Impalad執行個體不需要refresh的情況:

l  當叢集中隻有一個impalad執行個體的時候,即使這個執行個體修改了中繼資料,該impalad執行個體會自動更新自己的資料庫中繼資料資訊。這種情況下是不需要refresh的。

l  如果被修改中繼資料的資料庫是一個背景資料庫,也即impalad執行個體不需要連接配接該資料庫以獲得中繼資料的資料庫,這種情況下也是不需要refresh的。

Hive中繼資料被修改的典型情況包括:

l  通過Hive進行了ALTER,CREATE, DROP 或 INSERT操作

l  通過impalad進行了INSERT操作

l   

(4)、DESCRIBE

l  DESCRIBE tableName:列出表的結構資訊

(5)、SHOW

l  SHOW TABLES :列出所有的表

l  SHOW DATABASES :列出所有的資料庫

l  SHOW SCHEMAS :列出所有的schema

(6)、USE

l  USE DATABASE

3、不支援的語言元素

目前釋出版的impala不支援的HiveQL包括:

l  DDL:CREATE、ALTER、 DROP

l  資料類型:maps,、arrays、structs

l  以LOAD的方式加載資料

l  使用者自定義函數(UDFs),不支援定制檔案格式和SerDes(複合類型??)

l  XML和JSON函數

l  使用者自定義Aggregate函數(UDAFs)

l  使用者自定義TableGenerating函數(UDTFs)

l  Sampling

l  Lateral Views

l  SHOW PARTITIONS

l  SHOW TABLE EXTENDED

l  SHOW TBLPROPERTIES

l  SHOW FUNCTIONS

l  SHOW INDEXES

l  SHOW COLUMNS

l  SHOW CREATE TABLE

l  DESCRIBE DATABASE

l  DESCRIBE COLUMN

l  IMPORT TABLE 和EXPORT TABLE

l  根據角色進行授權

九、Impala監控

1、statestored程序監控:

通過http://<hostname>:<port>來檢視statestored的啟動資訊,其中hostname和port

是安裝statestored程序服務的主機名和端口号,端口号預設是25010。

監控頁面目錄如下:

impala v0.3使用和配置

(1)、http://<hostname>:<port>/jsonmetricsjson格式叢集監控資訊的,如下所示:

impala v0.3使用和配置

(2)、http://<hostname>:<port>/logsstatestored程序運作的日志資訊,如下圖所示:

impala v0.3使用和配置

(3)、http://<hostname>:<port>/metrics中列出了已經啟動的impalad程序的主機ip和端口号

impala v0.3使用和配置

(4)、http://<hostname>:<port>/subscriptions中列出了已經啟動的需要從statestore節點擷取狀态資訊impalad程序的主機ip和服務端口号,如下圖所示:

impala v0.3使用和配置

(5)、http://<hostname>:<port>/varz可以檢視statestored程序的配置項資訊

2、Impalad程序監控:

通過http://<hostname>:<port>來檢視impala的啟動資訊,其中hostname和port

是安裝impalad程序服務的主機名和端口号,端口号預設是25000。

         監控頁面目錄如下:

impala v0.3使用和配置

(1)、http://<hostname>:<port>/backends中列出了已經啟動的impalad程序的主機ip和端口号,如下所示:

impala v0.3使用和配置

(2)、http://<hostname>:<port>/catalog中能列出了目前叢集中所有已經建的表,如下所示:

impala v0.3使用和配置

(3)、http://<hostname>:<port>/logs中能檢視目前主機impalad程序執行查詢的INFO日志資訊

(4)、http://<hostname>:<port>/metrics中能檢視叢集執行查詢的排程情況,如下所示:

impala v0.3使用和配置

(5)、http://<hostname>:<port>/queries中能檢視到叢集目前所有正在執行的查詢的狀态資訊,如下所示:

impala v0.3使用和配置

(6)、http://<hostname>:<port>/sessions中能檢視到叢集目前所有的資料庫資訊,如下所示:

impala v0.3使用和配置

(7)、http://<hostname>:<port>/varz中能檢視目前主機啟動的impalad程序的配置項資訊

十、impala v0.3 beta release版本中存在的問題

1、如果hive的臨時配置檔案被删除了,impala在重新整理metastore的時候會失敗

受Hive的bug HIVE_3596的影響,如果hive的臨時配置檔案被删除掉, impala在重新整理metastore的時候會失敗。但是,impala-shell卻會錯誤的提示本該失敗的資料已經重新整理成功。

嚴重性:中

預計解決:未來版本中解決

規避方法:重新開機impalad服務。檢視impalad日志來檢查中繼資料是否重新整理錯誤。

2、outer join查詢會傳回錯誤結果,一個outerjoin查詢後面帶order by limit可能會導緻impala挂掉。

嚴重性:中

預計解決:未來版本中解決

規避方法:無

3、如果并行查詢太多的話,可能會導緻那種需要很長時間的查詢失敗

每個impala查詢都會從磁盤上打開很多檔案,如果同時有大量的查詢,那麼就可能導緻查詢時要求打開的檔案數超過impala使用者被限制的最大打開的檔案數量。特别那種需要長時間運作的查詢中表現的非常明顯。

嚴重性:中

預計解決:未來版本中解決

規避方法: 手動增加impala使用者能打開的檔案數量:ulimit-n <new value> 

4、目前還不支援的DDL包括CREATE/ALTER/DROP 表

嚴重性:中

預計解決:在下一版本中支援

規避方法:可以通過HIVE去執行這些DDL

5、目前的版本還不支援 RC File, Trevni and Avro

嚴重性:中

預計解決:未來版本中解決

規避方法:無

6、還不支援針對單個查詢的記憶體消耗的限制配置

目前版本還不支援針對單個查詢的記憶體消耗的限制配置。查詢的時候,所有在JOIN子句右邊的table的資料必須都要放到記憶體裡面。如果記憶體不夠,将會報記憶體溢出錯誤。

嚴重性:高

預計解決:未來版本中解決

規避方法:修改JOIN子句中大表的順序,将大表放到JOIN子句的左邊,避免占用大量記憶體。

7、還不能針對FROM子句後面join表的順序進行優化

Impala還不能針對FROM子句後面JOIN表的順序進行優化,如果查詢的JOIN子句右邊存在資料量比較大的表,會導緻查詢變的非常慢,甚至會導緻impala挂掉。

類似:SELECT ... FROM small_table JOIN large_table 

嚴重性:中

預計解決:未來版本中解決

規避方法:修改成:SELECT... FROM large_table JOIN small_table 

8、INSERT INTO TABLE SELECT <constant>操作不能正常插入資料  

INSERT INTO TABLE SELECT <constant>不能插入任何資料而且可能會傳回一個錯誤

嚴重性:中

預計解決:未來版本中解決

規避方法:修改成: 

INSERT INTO TABLE <table-name> SELECT(<list of constants>) FROM some_table LIMIT 1 ,其中some_tabl至少有一條記錄

9、INSERT INTO ... SELECT的select查詢中如果沒有指定目标表的列或者沒有指定全部的列,impala不會提示文法錯誤。

INSERT INTO ... SELECT 的select查詢中如果沒有指定目标表的列或者沒有指定全部的列,impala不會提示文法錯誤。隻會給出一個查詢失敗的錯誤資訊:Invalid query handle

嚴重性:低

預計解決:未來版本中解決

規避方法:這是一個無效的無法錯誤,隻要在SELECT子句後面将目标表所有的列列出來就可以解決這個問題。 

10、在分布式環境中執行INSERT INTO TABLE SELECT <constant> FROM <table> LIMIT 1語句時不能正确執行

在分布式環境(查詢選項 num_nodes > 1)中執行INSERT INTO TABLE SELECT <constant> FROM 

<table> LIMIT 1語句時,将産生錯誤的結果,插入的資料可能會大于1條。

嚴重性:低

預計解決:未來版本中解決

規避方法:要執行類似的SQL,可以先在客服端指令行中先set num_nodes=1,構造一個僞分布式環境來執行,執行完成後,最好重新set num_nodes=0,這樣後續的查詢才能進行優化查詢。

11、在分布式環境中還不支援 UNION ALL

在分布式環境下impala還不支援 UNION ALL。

嚴重性:中

預計解決:未來版本中解決

規避方法:可以先在客服端指令行中先set num_nodes=1,構造一個僞分布式環境來執行 UNION ALL,或者先将每一個 UNION ALL操作的結果插入到臨時表中去。

12、查詢選項PARTITION_AGG還不能用。

如果設定PARTITION_AGG為TRUE,會導緻impala解析查詢語句的時候産生一個錯誤的執行計劃。

嚴重性:低

預計解決:未來版本中解決

規避方法:不要設定PARTITION_AGG為TRUE。

13、Impala does not handle viewfs:// mounts properly

Impala does not properly handle viewfs:// mounts, causing it to fail on a federated environment. 

嚴重性:中

規避方法: Impala core-site.xml and hdfs-site.xml files can be modified to specify the 

target NameNode rather than the viewfs:// mount. 

14、impala是通過指令行來讀取 NameNode主機 ip 和 端口的

Impala 擷取 NameNode ip 和 端口不是從配置檔案core-site.xml擷取到的,而是impalad程序在啟動的時候在指令行指定的 ,這樣的話,修改了 NameNode 的ip 或者 端口,就必須要重新開機impalad程序。

嚴重性:低

規避方法:指令行重新開機impalad程序的時候通過-nn 和-nn_port重新指定NameNode 的ip 和 端口。如果是 Cloudera Manager 安裝的impala,其實是不存在這個問題的。

15、對NULL有限支援。

impala對NULL支援受限,不能用于比較操作,比如NULL=’A’,但是IS NULL / IS NOT NULL是沒問題的。

嚴重性:低

規避方法:請使用IS NULL 或 IS NOT NULL吧

16、 Impala INSERT OVERWRITE ... SELECT behavior differs from Hive in that partitions are only deleted/re‐written if the SELECT statement returns data

Impala INSERT OVERWRITE ... SELECT behavior differs from Hive in that the partitions are only deleted orrewritten if the SELECT statement returns data. Hive always deletes the data. 

嚴重性:低

規避方法:無

17、和hive不一樣的地方: 使用 float/double 越界的時候将傳回這些類型的最大值,而Hive傳回的是NULL。 

嚴重性:低

規避方法:無

18、和hive不一樣的地方:Impala沒有做string 、 numeric 和 boolean 類型之間的隐式轉換。

嚴重性:低

預計解決:無

規避方法:請使用顯式的轉換。

19、查詢的時候按某個string類型的列進行order by,如果該列中的值存在空的情況,那邊該查詢不會傳回正确的結果

嚴重性:低

預計解決:下一版本中解決

規避方法:無

20、如果Hue和Impala安裝在同一台伺服器上,并且如果在CDH4.1裡面配置Hue Beeswax用于執行impala查詢的時候,         Beeswax  不能正确的識别到Hive的表,同時會報一個   

Beeswax  啟動錯誤。

嚴重性:高

預計解決:下一個即将釋出的CDH4版中解決

規避方法:以下解決方案任選其一

(1)、安裝Hue和Impala到不同的伺服器上

(2)、更新到CDH4.1.2,并且在HUE的配置檔案/etc/hue/hue.ini增加配置項

beeswax_meta_server_only=9004 

(3)、或者CDH4.1.1版本又不想更新到CDH4.1.2,又想在一台機器上安裝Hue和Impala,可以将/usr/share/hue/apps/beeswax/src/beeswax/management/commands/bee

swax_server.py 檔案66行的代碼“str(beeswax.conf.BEESWAX_SERVER_PORT.get()),” 替換成“'8004', ”這樣Beeswax就可以使用8004端口号了。

十一、Impala v0.3已解決的問題

1、表中繼資料加載失敗,查詢的時候會提示unknowntable的錯誤

由于某些原因,impala在不能正确加載某些表的metadata時,在後面impala查詢的時候又用到了這些表,則會傳回一個unknown table的錯誤,雖然這個表是存在的。

2、A table that cannot be loaded will disappear from SHOW TABLES 

3、如果hbase表在hive的metastore中記錄為不是以一個外部表的方式建立的,那麼impala就無法讀取該hbase表

4、如果查詢中包括outer join,那麼該查詢不能正确結果

十二、Impala v0.2已解決問題

1、如果子查詢中包含了聚合查詢,那麼最好就别再join其他表了,否則可能會導緻impala挂掉。例如:

2、一個帶limit的insert,如果在多個impalad上面執行insert的時候,insert的記錄數可能會比limit設定的限制數要大。比如:INSERTOVERWRITE TABLE test SELECT * FROM test2 LIMIT 1,插入到test表的記錄數可能會大于1。

3、帶limit的查詢可能會失敗

4、impala不支援從壓縮的純文字檔案中讀取資料。

5、查詢hbase表的時候可能會報空指針異常

impala完整安裝見部落格:http://blog.csdn.net/hit_hlj_sgy/article/details/8447344

更多精彩部落格請通路:http://yuntai.1kapp.com/