java大資料開發訓練營--Impala

Laozizuiku發表於2020-11-30

1 部分 Impala概述

1.1 Impala是什麼

ImpalaCloudera提供的⼀款開源的針對HDFSHBASE中的PB級別資料進⾏互動式實時查詢(Impala 速度快)Impala是參照⾕歌的新三篇論⽂當中的Dremel實現⽽來,其中舊三篇論⽂分別是 (BigTableGFSMapReduce)分別對應我們即將學的HBase和已經學過的HDFS以及MapReduce

Impala最⼤賣點和最⼤特點就是快速Impala中⽂翻譯是⾼⻆羚⽺。

1.2 Impala優勢

回顧前⾯⼤資料課程路線其實就是⼀個⼤資料從業者⾯對的⼤資料相關技術發展的過程,

  • 技術發展以及更新換代的原因就是⽼的技術架構遇到新的問題,有些問題可以通過不斷優化程式碼優化設計得以解決,有⼀些問題就不再是簡簡單單修改程式碼就能解決,需要從框架本身架構設計上改 變,以⾄於需要推到重建。
  • 在⼤資料領域主要解決的問題是資料的儲存和分析,但是其實⼀個完整的⼤資料分析任務如果細分 會有⾮常多具體的場景,⾮常多的環節;並沒有⼀個類似Java WebSpring框架實現⼤⼀統的局⾯。

⽐如我們按照階段劃分⼀個⼤資料開發任務,會有:資料採集(⽇志⽂件,關係型資料庫中),資料清洗 (資料格式整理,髒資料過濾等),資料預處理(為了後續分析所做的⼯作),資料分析:離線處理(T+1分析),實時處理(資料到來即分析),資料視覺化,機器學習,深度學習等

⾯對如此眾多的階段再加上⼤資料天⽣的⼤資料量問題沒有任何⼀個框架可以完美cover以上每個階 段。所以⼤資料領域有⾮常多框架,每個框架都有最適合⾃⼰的具體場景。⽐如:HDFS負責⼤資料量儲存,MapReduceHive)負責⼤資料量的分析計算,

Impala 拋棄了 MapReduce 使⽤了類似於傳統的 MPP 資料庫技術 ,⼤⼤提⾼了查詢的速度。
 
MPP 是什麼?

MPP (Massively Parallel Processing),就是⼤規模並⾏處理,在MPP叢集中,每個節點資源都是獨⽴享有也就是有獨⽴的磁碟和記憶體,每個節點通過⽹絡互相連線,彼此協同計算,作為整體提供資料服務。

簡單來說,MPP是將任務並⾏的分散到多個伺服器和節點上,在每個節點上計算完成後,將各⾃部分的結果彙總在⼀起得到最終的結果

對於MPP架構的軟體來說聚合操作⽐如計算某張表的總條數,則先進⾏區域性聚合(每個節點並⾏計算),然後把區域性彙總結果進⾏全域性聚合(Hadoop相似)。 

 1.2.1ImpalaHive對⽐

Impala的技術優勢
  • Impala沒有采取MapReduce作為計算引擎,MR是⾮常好的分散式並⾏計算框架,但MR引擎更多 的是⾯向批處理模式,⽽不是⾯向互動式的SQL執⾏。與 Hive相⽐:Impala把整個查詢任務轉為 ⼀棵執⾏計劃樹,⽽不是⼀連串的MR任務,在分發執⾏計劃後,Impala使⽤拉取的⽅式獲取上個 階段的執⾏結果,把結果資料、按執⾏樹流式傳遞彙集,減少的了把中間結果寫⼊磁碟的步驟,再從磁碟讀取資料的開銷。Impala使⽤服務的⽅式避免 每次執⾏查詢都需要啟動的開銷,即相⽐Hive沒了MR啟動時間。
  • 使⽤LLVM(C++編寫的編譯器)產⽣運⾏程式碼,針對特定查詢⽣成特定程式碼。
  • 優秀的IO排程,Impala⽀持直接資料塊讀取和原生程式碼計算。
  • 選擇適合的資料儲存格式可以得到最好的效能(Impala⽀持多種儲存格式)。
  • 儘可能使⽤記憶體,中間結果不寫磁碟,及時通過⽹絡以stream的⽅式傳遞。

ImpalaHive對⽐分析

查詢過程

Hive:在Hive中,每個查詢都有⼀個冷啟動的常⻅問題。(map,reduce每次都要啟動關閉,申請資源,釋放資源。。。)

ImpalaImpala避免了任何可能的啟動開銷,這是⼀種本地查詢語⾔。 因為要始終處理查詢,則 Impala守護程式程式總是在叢集啟動之後就準備就緒。守護程式在叢集啟動之後可以接收查詢任務並執⾏查詢任務。

中間結果

HiveHive通過MR引擎實現所有中間結果,中間結果需要落盤,這對降低資料處理速度有不利影響。

Impala:在執⾏程式之間使⽤流的⽅式傳輸中間結果,避免資料落盤。儘可能使⽤記憶體避免磁碟開銷

互動查詢

Hive:對於互動式計算,Hive不是理想的選擇。

Impala:對於互動式計算,Impala⾮常適合。(資料量級PB)

計算引擎

Hive:是基於批處理的Hadoop MapReduce

Impala:更像是MPP資料庫

容錯

HiveHive是容錯的(通過MR&Yarn實現)

ImpalaImpala沒有容錯,由於良好的查詢效能,Impala遇到錯誤會重新執⾏⼀次查詢

查詢速度

ImpalaImpalaHive3-90倍。

Impala優勢總結

1. Impala最⼤優點就是查詢速度快,在⼀定資料量下;

2. 速度快的原因:避免了MR引擎的弊端,採⽤了MPP資料庫技術,

1.3 Impala的缺點

1. Impala屬於MPP架構,只能做到百節點級,⼀般併發查詢個數達到20左右時,整個系統的吞吐已經達到滿負荷狀態,在擴容節點也提升不了吞吐量,處理資料量在PB級別最佳。

2. 資源不能通過YARN統⼀資源管理排程,所以Hadoop叢集⽆法實現ImpalaSparkHive等元件的動態資源共享。

1.4 適⽤場景

Hive: 複雜的批處理查詢任務,資料轉換任務,對實時性要求不⾼同時資料量⼜很⼤的場景。

Impala:實時資料分析,與Hive配合使⽤,Hive的結果資料集進⾏實時分析。impala不能完全取代hiveimpala可以直接處理hive表中的資料。

2 部分 Impala 安裝與⼊⻔案例

2.1 叢集準備

2.1.1 安裝Hadoop,Hive

  • Impala的安裝需要提前裝好HadoopHive這兩個框架(Impala資料儲存在hdfs,Impala直接使用hive後設資料管理資料
  • hive需要在所有的Impala安裝的節點上⾯都要有,因為Impala需要引⽤Hive的依賴包,
  • hadoop的框架需要⽀持C程式訪問接⼝,檢視下圖,ll $HADOOP_HOME/lib/native 如果有.so結尾⽂件,就證明⽀持C 接⼝。

2.1.2 準備Impala的所有依賴包,製作yum本地源

Cloudera公司對於Impala的安裝只提供了rpm包沒有提供tar包;所以我們選擇使⽤Clouderarpm包 進⾏Impala的安裝,但是另外⼀個問題,Impalarpm包依賴⾮常多的其他的rpm包,我們可以⼀個個 的將依賴找出來,但是這種⽅式實在是浪費時間。

 

rpm⽅式安裝:需要⾃⼰管理rpm包的依賴關係;⾮常麻煩;解決依賴關係使⽤yum;預設Yum源是沒有 Impalarpm安裝包,所以我們⾃⼰準備好所有的Impala安裝所需的rpm包,製作Yum本地源,配置 Yum命令去到我們準備的Yun源中下載Impalarpm包進⾏安裝

本地Yum源⽅式

具體制作步驟

1. Linux121安裝Httpd伺服器

#yum ⽅式安裝 httpd 伺服器

yum install httpd -y

# 啟動 httpd 伺服器

systemctl start httpd

# 驗證 httpd ⼯作是否正常 , 預設端⼝是 80 ,可以省略

http://linux121

2.httpd預設存放⻚⾯路徑

/var/www/html/

注:後續可以把下載的rpm包解壓放置到此處便可以供⼤家訪問。

3. 下載Impala安裝所需rpm

Impala所需安裝包需要到Cloudera提供地址下載

http://archive.cloudera.com/cdh5/repo-as-tarball/5.7.6/cdh5.7.6- centos7.tar.gz

移動該安裝包到/opt/lagou/software

解壓縮
tar -zxvf cdh5.7.6-centos7.tar.gz
 

4. 使⽤Httpd盛放依賴包

建立軟連結到 /var/www/html
 

ln -s /opt/lagou/software/cdh/5.7.6 /var/www/html/cdh57

驗證

http://linux121/cdh57/

如果提示403 forbidden
vim /etc/selinux/config

5. 修改Yum源配置⽂件

cd /etc/yum.repos.d
# 建立⼀個新的配置⽂件
vim local.repo

 

# 新增如下內容
[local]
name = local
baseurl = http://linux121/cdh57/
gpgcheck = 0
enabled = 1
  • name:對於當前源的描述

  • baseurl:訪問當前源的地址資訊

  • gpgcheck: 1 0,gpg校驗

  • enabled:1/0,是否使⽤當前源

6. 分發local.repo⽂件到其它節點

rsync-script local.repo

rsync-script是自定義的分發函式

1.yum install -y rsync

2.cd /usr/local/bin

3.vi rsync-script

寫入,注意迴圈使用自己的hostname

#!/bin/bash

paramnum=$#
if((paramnum==0)); then
echo no params;
exit;
fi

p1=$1
file_name=`basename $p1`
echo fname=$file_name

pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir

user=`whoami`
for((host=1; host<4; host++)); do
echo ------------------- linux12$host--------------
 rsync -rvl $pdir/$file_name $user@linux12$host:$pdir
done

4.chmod 777 rsync-script

2.2 安裝Impala

2.2.1 叢集規劃

服務名稱
linux121linux122linux123
impala-catalogd
不安裝
不安裝
安裝
impala-statestored
不安裝
不安裝
安裝
impala-server
安裝
安裝安裝
Impala⻆⾊

impala-server:這個程式是Impala真正⼯作的程式,官⽅建議把impala-server安裝在datanode節點, 更靠近資料(短路讀取),程式名impalad

impala-statestored:健康監控⻆⾊,主要監控impala-server,impala-server出現異常時告知給其它 impala-server;程式名叫做statestored

impala-catalogd :管理和維護後設資料(Hive),impala更新操作;把impala-server更新的後設資料通知給其 它impala-server,程式名catalogd

官⽅建議statestorecatalog安裝在同⼀節點上!!

2.2.2 具體安裝步驟

Linux123

yum install impala -y
yum install impala-server -y
yum install impala-state-store -y
yum install impala-catalog -y
yum install impala-shell -y

Linux121Linux122

yum install impala-server -y
yum install impala-shell -y

配置Impala

1. 修改hive-site.xml

vim hive-site.xml
<!-- 指定 metastore 地址,之前新增過可以不⽤新增 -- >
<property>
<name>hive.metastore.uris</name>
<value>thrift://linux121:9083,thrift://linux123:9083</value>
</property>
<property>
<name>hive.metastore.client.socket.timeout</name>
<value>3600</value>  
</property>

2. 分發Hive安裝包到叢集節點

rsync-script hive-site.xml

3. Linux123啟動metastore服務

nohup hive --service metastore &

啟動hiveserver2服務 

nohup hive --service hiveserver2 &

4. 修改HDFS叢集hdfs-site.xml

配置 HDFS 叢集的短路讀取
 
什麼是短路讀取?

HDFS中通過DataNode來讀取資料。但是,當客戶端向DataNode請求讀取⽂件時,DataNode 就會從磁碟讀取該⽂件並通過TCP socket將資料傳送到客戶端。所謂短路是指Client客戶端直接讀取⽂件。很明顯,這種情況只在客戶端與資料放在同⼀地點(譯者注:同⼀主機)時才有可能發 ⽣。短路讀對於許多應⽤程式會帶來重⼤的效能提升。

短路讀取:就是ClientDataNode屬於同⼀節點,⽆需再經過⽹絡傳輸資料,直接本地讀取。

要配置短路本地讀,需要驗證本機Hadoop是否有libhadoop.so;

進⼊⼀下⽬錄:
  • cd $HADOOP_HOME/lib/native 

短路讀取配置步驟

1. 建立短路讀取本地中轉站

# 所有節點建立⼀下⽬錄
mkdir -p /var/lib/hadoop-hdfs
#如果已經存在,更換使用者許可權,不然datanode可能不能正常啟動
chown -R root:root /var/lib/hadoop-hdfs/
 

 2. 修改hdfs-site.xml

<!-- 新增如下內容 -->
<!-- 開啟短路讀取開關 -->
<!-- 開啟短路讀取配置 -->
<property>
<name> dfs.client.read.shortcircuit </name>
<value> true </value>
</property>
<!-- 這是⼀個 UNIX 域套接字的路徑,將⽤於 DataNode 和本地 HDFS 客戶機之間的通訊 -->
<property>
<name> dfs.domain.socket.path </name>
<value> /var/lib/hadoop-hdfs/dn_socket </value>
</property>
<!--block 儲存後設資料資訊開發開關 -->
<property>
<name> dfs.datanode.hdfs-blocks-metadata.enabled </name>
<value> true </value>
</property>
<property>
<name> dfs.client.file-block-storage-locations.timeout </name>
<value> 30000 </value>
</property>

注:分發到叢集其它節點。重啟Hadoop叢集。

# 停⽌叢集
stop-dfs.sh
start-dfs.sh
# 啟動叢集
start-dfs.sh
start-yarn.sh

3. Impala具體配置

引⽤HDFSHive配置,使⽤Yum⽅式安裝impala預設的Impala配置⽂件⽬錄為 /etc/impala/confImpala的使⽤要依賴 HadoopHive框架,所以需要把Hdfs,Hive的配置⽂件告知Impala

執⾏以下命令把HdfsHive的配置⽂件軟連結到/etc/impala/conf

ln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/core-site.xml /etc/impala/conf/core-site.xml
ln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml /etc/impala/conf/hdfs-site.xml
ln -s /opt/lagou/servers/hive-2.3.7/conf/hive-site.xml /etc/impala/conf/hive-site.xml
注:所有節點都要執⾏此命令!
4.Impala ⾃身配置

所有節點更改Impala預設配置⽂件以及新增mysql的驅動包

vim /etc/default/impala

<!-- 更新如下內容 -->
IMPALA_CATALOG_SERVICE_HOST=linux123
IMPALA_STATE_STORE_HOST=linux123

所有節點建立mysql的驅動包的軟連結

# 建立節點
mkdir -p /usr/share/java
ln -s /opt/lagou/servers/hive-2.3.7/lib/mysql-connector-java-5.1.49.jar   /usr/share/java/mysql-connector-java.jar

所有節點修改bigtopjava_home路徑

vim /etc/default/bigtop-utils
export JAVA_HOME = /opt/lagou/servers/jdk1.8.0_231

啟動Impala

#linux123 啟動如下⻆⾊
service impala-state-store start
service impala-catalog start
service impala-server start
# 其餘節點啟動如下⻆⾊
service impala-server start

驗證Impala啟動結果

ps -ef | grep impala

注意:啟動之後所有關於 Impala 的⽇志預設都在 /var/log/impala 這個路徑下, Linux123機器上⾯應該有三個程式, Linux121 Linux122機器上⾯只有⼀個程式,如果程式個數不對,去對應⽬錄 下檢視報錯⽇志 .

瀏覽器Web界⾯驗證

訪問 impalad 的管理界⾯
http://linux123:25000/
訪問 statestored 的管理界⾯
http://linux123:25010/

消除Impala影響

由於使⽤Yum命令安裝Impala,我們選擇使⽤yum⾃動進⾏Impala依賴的安裝和處理,所以本次安裝 預設會把Impala依賴的所有框架都會安裝,⽐如Hadoop,Hive,Mysql等,為了保證我們⾃⼰安裝的 Hadoop等使⽤正常我們需要刪除掉Impala預設安裝的其它框架

[root@linux122 conf] # which hadoop
/usr/bin/hadoop
[root@linux122 conf] # which hive
/usr/bin/hive
# 使⽤ which 命令 查詢 hadoop,hive 等會發現,命令⽂件是 /usr/bin/hadoop ⽽⾮我們⾃⼰安裝的路
徑,需要把這些刪除掉 , 所有節點都要執⾏
rm -rf /usr/bin/hadoop
rm -rf /usr/bin/hdfs
rm -rf /usr/bin/hive
rm -rf /usr/bin/beeline
rm -rf /usr/bin/hiveserver2
# 重新⽣效環境變數
source /etc/profile

jps 時出現沒有名字的程式 或者process information unavailable

rm -rf /tmp/hsperfdata_impala/ 

2.3 Impala⼊⻔案例

使⽤Yum⽅式安裝Impala後,impala-shell可以全域性使⽤;進⼊impala-shell命令⾏

impala-shell進⼊到impala的互動窗⼝

 

如果想要使⽤Impala ,需要將資料載入到Impala中,如何載入資料到Impala中呢?
  • 使⽤Impala的外部表,這種適⽤於已經有資料⽂件,只需將資料⽂件拷⻉到HDFS上,建立⼀張Impala外部表,將外部表的儲存位置指向資料⽂件的位置即可。(類似Hive
  • 通過Insert⽅式插⼊資料,適⽤於我們沒有資料⽂件的場景。

1. 準備資料⽂件 user.csv

392456197008193000, 張三 ,20,0
267456198006210000, 李四 ,25,1
892456199007203000, 王五 ,24,1
492456198712198000, 趙六 ,26,2
392456197008193000, 張三 ,20,0
392456197008193000, 張三 ,20,0
2. 建立 HDFS 存放資料的路徑
hadoop fs -mkdir -p /user/impala/t1
# 上傳本地 user.csv hdfs /user/impala/table1
hadoop fs -put user.csv /user/impala/t1
3. 建立表
# 進⼊ impala-shell
impala-shell
# 表如果存在則刪除
drop table if exists t1;
# 執⾏建立
create external table t1(id string,name string,age int,gender int)
row format delimited fields terminated by ','
location '/user/impala/t1' ;
4. 查詢資料
5. 建立 t2
# 建立⼀個內部表
create table t2(id string,name string,age int,gender int)
row format delimited fields terminated by ',' ;
# 檢視錶結構
desc t1;
desc formatted t2;
 
6. 插⼊資料到 t2
insert overwrite table t2 select * from t1 where gender = 0 ;
# 驗證資料
select * from t2;
更新後設資料
使⽤ Beeline 連線 Hive 檢視 Hive 中的資料,發現通過 Impala 建立的表,導⼊的資料都可以被 Hive感知到。
⼩結:
1. 上⾯案例中 Impala 的資料⽂件我們準備的是以逗號分隔的⽂本⽂件,實際上, Impala可以⽀持 RCFile,SequenceFile,Parquet 等多種⽂件格式。
2. Impala Hive 後設資料的關係?
  • Hive對於後設資料的更新操作不能被Impala感知到;
  • Impala對後設資料的更新操作可以被Hive感知到。
Impala 同步 Hive 後設資料命令:

⼿動執⾏invalidate metadata ,Impala是通過Hivemetastore服務來訪問和操作Hive的後設資料,但是Hive對錶進⾏建立刪除修改等操作,Impala是⽆法⾃動識別到Hive中後設資料的變更情況的,如果想讓Impala識別 到Hive後設資料的變化,所以需要進⼊impala-shell之後⾸先要做的操作就是執⾏invalidate metadata,該命令會將所有的Impala的後設資料失效並重新從後設資料庫同步後設資料資訊。後⾯ 詳細講解後設資料更新命令。

3. Impala 操作 HDFS 使⽤的是 Impala⽤戶,所以為了避免許可權問題,我們可以選擇關閉許可權校驗

hdfs-site.xml中新增如下配置

<!--關閉hdfs許可權校驗 -->
 <property>
     <name>dfs.permissions.enabled</name>
     <value>false</value>
 </property>

3 部分 Imapla的架構原理

1 Impala的元件

Impala是⼀個分散式,⼤規模並⾏處理(MPP)資料庫引擎,它包括多個程式。ImpalaHive類似不是資料庫⽽是資料分析⼯具;

 

impalad

⻆⾊名稱為Impala Daemon,是在每個節點上運⾏的程式,是Impala的核⼼元件,程式名是 Impalad;

作⽤,負責讀寫資料⽂件,接收來⾃Impala-shellJDBC,ODBC等的查詢請求,與叢集其它 Impalad分散式並⾏完成查詢任務,並將查詢結果返回給中⼼協調者。

為了保證Impalad程式瞭解其它Impalad的健康狀況,Impalad程式會⼀直與statestore保持通訊。

Impalad服務由三個模組組成:Query PlannerQuery CoordinatorQuery Executor,前兩個 模組組成前端,負責接收SQL查詢請求,解析SQL並轉換成執⾏計劃,交由後端執⾏,

statestored

statestore監控叢集中Impalad的健康狀況,並將叢集健康資訊同步給Impalad,

statestore程式名為statestored

catalogd

Impala執⾏的SQL語句引發後設資料發⽣變化時,catalog服務負責把這些後設資料的變化同步給其它 Impalad程式(⽇志驗證,監控statestore程式⽇志)

catalog服務對應程式名稱是catalogd

由於⼀個叢集需要⼀個catalogd以及⼀個statestored程式,⽽且catalogd程式所有請求都是經過statestored程式傳送,所以官⽅建議讓statestored程式與catalogd程式安排同個節點。

2 Impala的查詢

 
1. Client 提交任務

Client傳送⼀個SQL查詢請求到任意⼀個Impalad節點,會返回⼀個queryId⽤於之後的客戶端操作。

2. ⽣成單機和分散式執⾏計劃

SQL提交到Impalad節點之後,Analyser依次執⾏SQL的詞法分析、語法分析、語義分析等操作;

MySQL後設資料庫中獲取後設資料,從HDFS的名稱節點中獲取資料地址,以得到儲存這個查詢相關資料的所有資料節點

單機執⾏計劃: 根據上⼀步對SQL語句的分析,由Planner先⽣成單機的執⾏計劃,該執⾏計劃是有PlanNode組成的⼀棵樹,這個過程中也會執⾏⼀些SQL優化,例如Join順序改變、謂詞下推等。

分散式並⾏物理計劃:將單機執⾏計劃轉換成分散式並⾏物理執⾏計劃,物理執⾏計劃由⼀個個的Fragment組成,Fragment之間有資料依賴關係,處理過程中需要在原有的執⾏計劃之上加⼊⼀些ExchangeNodeDataStreamSink資訊等。

Fragment sql⽣成的分散式執⾏計劃的⼀個⼦任務;

DataStreamSink:傳輸當前的Fragment輸出資料到不同的節點

3. 任務排程和分發

CoordinatorFragment(⼦任務)根據資料分割槽資訊發配到不同的Impalad節點上執⾏。Impalad節點接收到執⾏Fragment請求交由Executor執⾏。

4. Fragment 之間的資料依賴

每⼀個Fragment的執⾏輸出通過DataStreamSink傳送到下⼀個FragmentFragment運⾏過程中不斷向coordinator節點彙報當前運⾏狀態。

5. 結果彙總

查詢的SQL通常情況下需要有⼀個單獨的Fragment⽤於結果的彙總,它只在Coordinator節點運⾏,將多個節點的最終執⾏結果彙總,轉換成ResultSet資訊。

6. 獲取結果

客戶端調⽤獲取ResultSet的接⼝,讀取查詢結果。

4 部分 Impala的使⽤

Impala 的核⼼開發語⾔是 sql 語句, Impala shell 命令⾏窗⼝,以及 JDBC 等⽅式來接收 sql語句執⾏, 對於複雜型別分析可以使⽤ C++ 或者 Java 來編寫 UDF 函式。
Impala sql 語法是⾼度整合了 Apache Hive sql 語法, Impala ⽀持 Hive ⽀持的資料型別以及部分Hive 的內建函式。
需要注意的⼏點:

1. ImpalaHive類似它們的重點都是在與查詢,所以像Update,delete等具有更新性質的操作最好不要使⽤這種⼯具,對於刪除資料的操作可以通過Drop Table,Alter Table Drop Partition來實現,更新可以嘗試使⽤Insert overwrite⽅式

2. 通常使⽤Impala的⽅式是資料⽂件儲存在Hdfs⽂件系統,藉助於Impala的表定義來查詢和管理 Hdfs上的資料⽂件;

3. Impala的使⽤⼤多數與Hive相同,⽐如Impala同樣⽀持內外部表,以及分割槽等,可以借鑑參考 Hive的使⽤。

1 Impala-shell命令引數

1.1 impala-shell外部命令

所謂的外部命令指的是不需要進⼊到impala-shell互動命令⾏當中即可執⾏的命令引數。impala-shell⾯執⾏的時候可以帶很多引數。你可以在啟動 impala-shell 時設定,⽤於修改命令執⾏環境。

impala-shell –h可以幫助我們檢視幫助⼿冊。也可以參考課程附件資料。

⽐如⼏個常⻅的:
impala-shell –r 重新整理 impala 後設資料,與建⽴連線後執⾏ REFRESH 語句效果相同 ( 後設資料發⽣變化的時候 )
impala-shell –f ⽂件路徑 執⾏指的的 sql 查詢⽂件。
impala-shell –i 指定連線運⾏ impalad 守護程式的主機。預設端⼝是 21000 。你可以連線到叢集中運⾏
impalad 的任意主機。
impala-shell –o 儲存執⾏結果到⽂件當中去。
展示 Impala 預設⽀持的內建函式需要進⼊ Impala 預設系統資料庫中執⾏
use _impala_builtins;
 show functions;
 

1.2 impala-shell內部命令

所謂內部命令是指,進⼊impala-shell命令⾏之後可以執⾏的語法。

connect hostname 連線到指定的機器 impalad 上去執⾏。
refresh dbname.tablename 增量重新整理,重新整理某⼀張表的後設資料,主要⽤於重新整理 hive當中資料表⾥⾯的資料改變的情況。
invalidate metadata 全量重新整理,效能消耗較⼤,主要⽤於 hive當中新建資料庫或者資料庫表的時候來進⾏重新整理。
quit/exit 命令 從 Impala shell 中退出
explain 命令 ⽤於檢視sql語句的執⾏計劃。
explain 的值可以設定成 0,1,2,3 等⼏個值,其中 3級別是最⾼的,可以列印出最全的資訊 set explain_level = 3 ;
profifile 命令執⾏ sql語句之後執⾏,可以列印出更加詳細的執⾏步驟,主要⽤於查詢結果的檢視,叢集的調優等。
 
  • expalin:可以不真正執⾏任務,只是展示任務的執⾏計劃;
  • profifile:需要任務執⾏完成後調⽤,可以從更底層以及更詳細的層⾯來觀察我們運⾏impala的任務,進⾏調優。

2 Impala sql語法

2.1 資料庫特定語句

1. 建立資料庫

CREATE DATABASE語句⽤於在Impala中建立新資料庫。

CREATE DATABASE IF NOT EXISTS database_name;

這⾥, IF NOT EXISTS是⼀個可選的⼦句。如果我們使⽤此⼦句,則只有在沒有具有相同名稱的現有資料庫時,才會建立具有給定名稱的資料庫。
預設就會在hive的數倉路徑下建立新的資料庫名⽂件夾
/user/hive/warehouse/lagoutest.db

 

2. 刪除資料庫
Impala DROP DATABASE 語句⽤於從 Impala中刪除資料庫。 在刪除資料庫之前,建議從中刪除所有表。
如果使⽤級聯刪除, Impala 會在刪除指定資料庫中的表之前刪除它。
drop database sample cascade;
2.2 表特定語句
1. create table 語句
CREATE TABLE 語句⽤於在 Impala中的所需資料庫中建立新表。 需要指定表名字並定義其列和每列的資料型別。
impala ⽀持的資料型別和 hive 類似 .
create table IF NOT EXISTS database_name.table_name ( column1 data_type,
column2 data_type, column3 data_type, ……… columnN data_type);
CREATE TABLE IF NOT EXISTS my_db.student(name STRING, age INT, contact INT );
預設建表的資料儲存路徑跟 hive ⼀致。也可以在建表的時候通過 location指定具體路徑。
2. insert 語句
Impala INSERT 語句有兩個⼦句 : into overwrite into ⽤於插⼊新記錄資料, overwrite⽤於覆蓋已有的記錄。
這⾥, column1 column2 ... columnN是要插⼊資料的表中的列的名稱。還可以新增值⽽不指定列名,但是,需要確保值的順序與表中的列的順序相同。
insert into table_name (column1, column2, column3,.. .columnN ) values (value1,
value2, value3,.. .valueN );
Insert into table_name values (value1, value2, value2);
例⼦
 
create table employee (Id INT , name STRING, age INT ,address STRING, salary BIGINT );
insert into employee VALUES ( 1 , 'Ramesh' , 32 , 'Ahmedabad' , 20000 );
insert into employee values ( 2 , 'Khilan' , 25 , 'Delhi' , 15000 );
Insert into employee values ( 3 , 'kaushik' , 23 , 'Kota' , 30000 );
Insert into employee values ( 4 , 'Chaitali' , 25 , 'Mumbai' , 35000 );
Insert into employee values ( 5 , 'Hardik' , 27 , 'Bhopal' , 40000 );
Insert into employee values ( 6 , 'Komal' , 22 , 'MP' , 32000 );

overwrite覆蓋⼦句覆蓋表當中全部記錄。 覆蓋的記錄將從表中永久刪除。

Insert overwrite employee values (1, 'Ram', 26, 'Vishakhapatnam', 37000 );

 3. select語句

Impala SELECT 語句⽤於從資料庫查詢資料, 此查詢以表的形式返回資料。
4. describe 語句
Impala 中的 describe語句⽤於提供表的描述。 此語句的結果包含有關表的資訊,例如列名稱及其資料型別。
describe table_name;
簡寫
desc table_name;
5. alter table
Impala 中的Alter table語句⽤於對給定表執⾏更改。使⽤此語句,我們可以新增,刪除或修改現有表中的列,也可以重新命名它們。參考 Hive 實現。
6. delete truncate table
Impala drop table 語句⽤於刪除 Impala 中的現有表。此語句還會刪除內部表的底層 HDFS ⽂件。
drop table database_name .table_name ;
注意:使⽤此命令時必須⼩⼼,因為刪除表後,表中可⽤的所有資訊也將永遠丟失。
Impala Truncate Table 語句⽤於從現有表中刪除所有記錄。保留表結構。
您也可以使⽤ DROP TABLE命令刪除⼀個完整的表,但它會從資料庫中刪除完整的表結構,如果您希望儲存⼀些資料,您將需要重新建立此表。
truncate table_name;
Impala對複雜資料型別的⽀持:對於 Text 儲存格式中的複雜型別不⽀持,複雜型別要使⽤ parquet 格式。
7. view 檢視
檢視僅僅是儲存在資料庫中具有關聯名稱的 Impala 查詢語⾔的語句。 它是以預定義的 SQL查詢形式的表 的組合。
檢視可以包含表的所有⾏或選定的⾏。
create view if not exists view_name as select statement
建立檢視 view 、查詢檢視 view
create view if not exists employee_view AS select name, age from employee;
修改檢視
alter view database_name .view_name as Select 語句
刪除檢視
drop view database_name .view_name ;
8. order by ⼦句
Impala ORDER BY⼦句⽤於根據⼀個或多個列以升序或降序對資料進⾏排序。 預設情況下,⼀些資料庫按升序對查詢結果進⾏排序。
select * from table_name ORDER BY col_name
[ ASC |DESC] [NULLS FIRST|NULLS LAST]
可以使⽤關鍵字 ASC DESC 分別按升序或降序排列表中的資料。
如果我們使⽤ NULLS FIRST ,表中的所有空值都排列在頂⾏ ; 如果我們使⽤ NULLS LAST,包含空值的⾏ 將最後排列。
9. group by ⼦句
Impala GROUP BY ⼦句與 SELECT 語句協作使⽤,以將相同的資料排列到組中。
10. having ⼦句
容易與 where 過濾進⾏混淆,
如何區分:

where:過濾的資料是原始資料,表中本來就存在的資料;

having:過濾的是查詢結果資料;

按年齡對錶進⾏分組,並選擇每個組的最⼤⼯資,並顯示⼤於 20000 的⼯資
select max(salary) from employee group by age having max(salary) > 20000;
11. limit offffset
Impala 中的 limit⼦句⽤於將結果集的⾏數限制為所需的數,即查詢的結果集不包含超過指定限制的記 錄。
⼀般來說, select 查詢的 resultset 中的⾏從 0 開始。使⽤ offffset ⼦句,我們可以決定從哪⾥考慮輸出。
select * from employee order by salary limit 2 offset 2 ;
使⽤offffset關鍵字要求結果資料必須是排序之後的!!
3 Impala 導⼊資料
1. insert into values

這種⽅式⾮常類似於RDBMS的資料插⼊⽅式。

create table t_test2(id int ,name string);
insert into table t_test2 values ( 1 ,”zhangsan”);
2. insert into select
插⼊⼀張表的資料來⾃於後⾯的 select 查詢語句返回的結果。
3. create table as select
建表的欄位個數、型別、資料來⾃於後續的 select 查詢語句。
load data ⽅式,這種⽅式不建議在 Impala 中使⽤,先使⽤ load data ⽅式把資料載入到 Hive表中,然後使⽤以上⽅式插⼊ Impala 表中。

5 部分 ImpalaJDBC⽅式查詢

在實際⼯作當中,因為impala的查詢⽐較快,所以可能有會使⽤到impala來做資料庫查詢的情況,我們可以通過java程式碼來進⾏操作impala的查詢

1. 導⼊ jar
<dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.9.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-common -->
    <dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-common</artifactId>
    <version>2.3.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-metastore-->
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-metastore</artifactId>
        <version>2.3.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-service -->
    <dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-service</artifactId>
    <version>2.3.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc -->
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-jdbc</artifactId>
        <version>2.3.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>2.3.7</version>
    </dependency>
</dependencies>
2. java 程式碼開發
 
import java.sql.*;

public class ImpalaTest {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        //定義連線impala的驅動和連線url
        String driver = "org.apache.hive.jdbc.HiveDriver";
        String driverUrl = "jdbc:hive2://test3.bigload.com:21050/impala;auth=noSasl";
        //查詢的sql語句
        String querySql = "select * from t1";
        //獲取連線
        Class.forName(driver);
        //通過Drivermanager獲取連線
        final Connection connection = DriverManager.getConnection(driverUrl);
        final PreparedStatement ps = connection.prepareStatement(querySql);
        //執⾏查詢
        final ResultSet resultSet = ps.executeQuery();
        //解析返回結果
        //獲取到每條資料的列數
        final int columnCount = resultSet.getMetaData().getColumnCount();
        //遍歷結果集
        while (resultSet.next()) {
            for (int i = 1; i <= columnCount; i++) {
                final String string = resultSet.getString(i);
                System.out.print(string + "\t");
            }
            System.out.println();
        }
        //關閉資源
        ps.close();
        connection.close();
    }

}

6 部分 Impala進階

1 Impala的負載均衡

Impala 主要有三個元件,分別是 statestore catalog impalad ,對於 Impalad節點,每⼀個節點都可以接收客戶端的查詢請求,並且對於連線到該 Impalad 的查詢還要作為 Coordinator節點(需要消耗⼀定的記憶體和 CPU )存在,為了保證每⼀個節點的資源開銷的平衡需要對於叢集中的 Impalad節點做⼀下負載均衡 .
Cloudera 官⽅推薦的代理⽅案 :HAProxy
DNS 做負載均衡
DNS 做負載均衡⽅案是最簡單的,但是效能⼀般,所以這⾥我們按照官⽅的建議使⽤ HAProxy實現負載均衡
⽣產中應該選擇⼀個⾮ Impalad 節點作為 HAProxy 的安裝節點

1.1 HAProxy⽅案

安裝 haproxy
yum install haproxy -y
配置⽂件
vim /etc/haproxy/haproxy.cfg
具體配置內容  在main frontend which proxys to the backends上面新增
listen impalashell
    bind 0.0.0.0:25003#ha作為 proxy 所繫結的 IP 和埠
    mode tcp#以 4 層⽅式代理,重要
    option tcplog
    balance roundrobin#排程演算法 'leastconn' 最少連線數分配,或者 'roundrobin',輪詢
    server impalashell_1 linux121:21000 check
    server impalashell_2 linux122:21000 check
    server impalashell_3 linux123:21000 check
 
listen impalajdbc
    bind 0.0.0.0:25004#ha作為 proxy 所繫結的 IP 和端⼝
    mode tcp#以 4 層⽅式代理,重要
    option tcplog
    balance roundrobin #排程演算法 'leastconn' 最少連線數分配,或者 'roundrobin',輪詢分
    server impalajdbc_1 linux121:21050 check
    server impalajdbc_2 linux122:21050 check
    server impalajdbc_3 linux122:21050 check
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
啟動
開啟: service haproxy start
關閉: service haproxy stop
重啟: service haproxy restart
使⽤
Impala-shell 訪問⽅式
impala-shell -i linux123:25003
使⽤起來⼗分⽅便,區別僅僅相當於是修改了⼀個 ip 地址和端⼝⽽已,其餘不變。
jdbc:hive2://linux123:25004/default;auth=noSasl
Impala 叢集在操作過程中儘量多給記憶體,如果記憶體不能滿⾜使⽤要求, Impala 的執⾏很可能會報錯!!

2 Impala優化

cloudera 官⽹上的 Impala ⽂檔,原名為《 Impala Performance Guidelines and Best Practices 》。主要介紹了為了提升 impala 效能應該考慮的⼀些事情,結合實際考慮:
1. 基本優化策略
  • ⽂件格式

對於⼤資料量來說,Parquet⽂件格式是最佳的

  • 避免⼩⽂件

insert ... values 會產⽣⼤量⼩⽂件,避免使⽤

  • 合理分割槽粒度

利⽤分割槽可以在查詢的時候忽略掉⽆⽤資料,提⾼查詢效率,通常建議分割槽數量在3萬以下 (太多的分割槽也會造成後設資料管理的效能下降)

  • 分割槽列資料型別最好是整數型別
  • 分割槽列可以使⽤string型別,因為分割槽列的值最後都是作為HDFS⽬錄使⽤,如果分割槽列使⽤ 整數型別可以降低記憶體消耗
  • 獲取表的統計指標:在追求效能或者⼤資料量查詢的時候,要先獲取所需要的表的統計指標 (:執⾏ compute stats )
  • 減少傳輸客戶端資料量

聚合(countsummax )

過濾(WHERE )

limit限制返回條數

返回結果不要使⽤美化格式進⾏展示(在通過impala-shell展示結果時,新增這些可選引數: - B --output_delimiter )

  • 在執⾏之前使⽤EXPLAIN來檢視邏輯規劃,分析執⾏邏輯
  • Impala join⾃動的優化⼿段就是通過使⽤COMPUTE STATS來收集參與Join的每張表的統計信 息,然後由Impala根據表的⼤⼩、列的唯⼀值數⽬等來⾃動優化查詢。為了更加精確地獲取每張表的統計資訊,每次表的資料變更時(如執⾏Insert,add partition,drop partition)最好 都要執⾏⼀遍COMPUTE STATS獲取到準確的表統計資訊。
 
 
 

相關文章