一、Impala概述(Impala是什什么,優(yōu)勢,劣勢,與Hive對?)
Impala是什什么
Impala是Cloudera提供的?一款開源的針對HDFS和HBASE中的PB級別數據進?行行交互式實時查詢(Impala速度快),Impala是參照?谷歌的新三篇論?文當中的Dremel實現?而來,其中舊三篇論?文分別是(BigTable,GFS,MapReduce)分別對應我們即將學的HBase和已經學過的HDFS以及MapReduce。
Impala最?大賣點和最?大特點就是快速,Impala中?文翻譯是?高?角羚?羊。
Impala優(yōu)勢
回顧前?面?大數據課程路路線其實就是?一個?大數據從業(yè)者?面對的?大數據相關技術發(fā)展的過程,技術發(fā)展以及更更新?lián)Q代的原因就是?老老的技術架構遇到新的問題,有些問題可以通過不不斷優(yōu)化代碼優(yōu)化設計得以解決,有?一些問題就不不再是簡簡單單修改代碼就能解決,需要從框架本身架構設計上改變,以?至于需要推到重建。
在?大數據領域主要解決的問題是數據的存儲和分析,但是其實?一個完整的?大數據分析任務如果細分會有?非常多具體的場景,?非常多的環(huán)節(jié);并沒有?一個類似Java Web的Spring框架實現?大?一統(tǒng)的局?面。
?比如我們按照階段劃分?一個?大數據開發(fā)任務,會有:數據采集(?日志?文件,關系型數據庫中),數據清洗(數據格式整理理,臟數據過濾等),數據預處理理(為了了后續(xù)分析所做的?工作),數據分析:離線處理理(T+1分析),實時處理理(數據到來即分析),數據可視化,機器?學習,深度學習等?面對如此眾多的階段再加上?大數據天?生的?大數據量量問題沒有任何?一個框架可以完美cover以上每個階段。所以?大數據領域有?非常多框架,每個框架都有最適合?自?己的具體場景。?比如:HDFS負責?大數據量量存儲,MapReduce(Hive)負責?大數據量量的分析計算
Impala的誕?
之前學習的Hive以及MR適合離線批處理理,但是對交互式查詢的場景?無能為?力力(要求快速響應),所以為了了解決查詢速度的問題,Cloudera公司依據Google的Dremel開發(fā)了了Impala,Impala拋棄了了MapReduce使?用了了類似于傳統(tǒng)的MPP數據庫技術,?大?大提?高了了查詢的速度。
MPP是什什么?
MPP (Massively Parallel Processing),就是?大規(guī)模并?行行處理理,在MPP集群中,每個節(jié)點資源都是獨?享有也就是有獨?立的磁盤和內存,每個節(jié)點通過?網絡互相連接,彼此協(xié)同計算,作為整體提供數據服務。
簡單來說,MPP是將任務并?行行的分散到多個服務器?和節(jié)點上,在每個節(jié)點上計算完成后,將各?自部分的結果匯總在?一起得到最終的結果
對于MPP架構的軟件來說聚合操作?比如計算某張表的總條數,則先進?行行局部聚合(每個節(jié)點并?行行計算),然后把局部匯總結果進?行行全局聚合(與Hadoop相似)。
Impala的技術優(yōu)勢
Impala沒有采取MapReduce作為計算引擎,MR是?非常好的分布式并?行行計算框架,但MR引擎更更多的是?面向批處理理模式,?而不不是?面向交互式的SQL執(zhí)?行行。與 Hive相?比:Impala把整個查詢任務轉為?棵執(zhí)?行行計劃樹,?而不不是?一連串串的MR任務,在分發(fā)執(zhí)?行行計劃后,Impala使?用拉取的?方式獲取上個階段的執(zhí)?行行結果,把結果數據、按執(zhí)?行行樹流式傳遞匯集,減少的了了把中間結果寫?入磁盤的步驟,再從磁盤讀取數據的開銷。Impala使?用服務的?方式避免 每次執(zhí)?行行查詢都需要啟動的開銷,即相?Hive沒了MR啟動時間。
使?用LLVM(C++編寫的編譯器?)產?生運?行行代碼,針對特定查詢?生成特定代碼。
優(yōu)秀的IO調度,Impala?支持直接數據塊讀取和本地代碼計算。
選擇適合的數據存儲格式可以得到最好的性能(Impala?支持多種存儲格式)。
盡可能使?用內存,中間結果不不寫磁盤,及時通過?網絡以stream的?方式傳遞。
Impala與Hive對?
- 查詢過程
Hive:在Hive中,每個查詢都有?一個“冷啟動”的常?見問題。(map,reduce每次都要啟動關閉,申請資源,釋放資源。。。)
Impala:Impala避免了了任何可能的啟動開銷,這是?一種本地查詢語?言。 因為要始終處理理查詢,則Impala守護程序進程總是在集群啟動之后就準備就緒。守護進程在集群啟動之后可以接收查詢任務并執(zhí)?行行查詢任務。 - 中間結果
Hive:Hive通過MR引擎實現所有中間結果,中間結果需要落盤,這對降低數據處理理速度有不不利利影響。
Impala:在執(zhí)?行行程序之間使?用流的?方式傳輸中間結果,避免數據落盤。盡可能使?用內存避免磁盤開銷 - 交互查詢
Hive:對于交互式計算,Hive不不是理理想的選擇。
Impala:對于交互式計算,Impala?非常適合。(數據量量級PB級) - 計算引擎
Hive:是基于批處理理的Hadoop MapReduce
Impala:更更像是MPP數據庫 - 容錯
Hive:Hive是容錯的(通過MR&Yarn實現)
Impala:Impala沒有容錯,由于良好的查詢性能,Impala遇到錯誤會重新執(zhí)?行行?一次查詢
查詢速度
Impala:Impala?比Hive快3-90倍。
Impala優(yōu)勢總結
- Impala最?大優(yōu)點就是查詢速度快,在?一定數據量量下;
- 速度快的原因:避免了了MR引擎的弊端,采?用了了MPP數據庫技術,
Impala的缺點
- Impala屬于MPP架構,只能做到百節(jié)點級,?一般并發(fā)查詢個數達到20左右時,整個系統(tǒng)的吞吐已經達到滿負荷狀態(tài),在擴容節(jié)點也提升不不了了吞吐量量,處理理數據量量在PB級別最佳。
- 資源不不能通過YARN統(tǒng)?一資源管理理調度,所以Hadoop集群?無法實現Impala、Spark、Hive等組件的動態(tài)資源共享。
適?用場景
Hive: 復雜的批處理理查詢任務,數據轉換任務,對實時性要求不不?高同時數據量量?又很?大的場景。
Impala:實時數據分析,與Hive配合使?用,對Hive的結果數據集進?行行實時分析。impala不能完全取代hive,impala可以直接處理理hive表中的數據。
二、Impala的安裝(制作本地Yum源?方式安裝)
集群準備
-
安裝Hadoop,Hive
Impala的安裝需要提前裝好Hadoop,Hive這兩個框架,
hive需要在所有的Impala安裝的節(jié)點上?面都要有,因為Impala需要引?用Hive的依賴包,
hadoop的框架需要?支持C程序訪問接?口,查看下圖,如果有該路路徑有.so結尾?文件,就證明?支持C接口。
準備Impala的所有依賴包
Cloudera公司對于Impala的安裝只提供了了rpm包沒有提供tar包;所以我們選擇使?用Cloudera的rpm包進?行行Impala的安裝,但是另外?一個問題,Impala的rpm包依賴?非常多的其他的rpm包,我們可以?一個個的將依賴找出來,但是這種?方式實在是浪費時間。
Linux系統(tǒng)中對于rpm包的依賴管理理提供了了?一個?非常好的管理理?工具叫做Yum,類似于Java?工程中的包管理理?工具Maven,Maven可以?自動搜尋指定Jar所需的其它依賴并?自動下載來。Yum同理理可以?非常?方便便的讓我們進?行行rpm包的安裝?無需關系當前rpm所需的依賴。但是與Maven下載其它依賴需要到中央倉庫?一樣
Yum下載依賴所需的源也是在放置在國外服務器?并且其中沒有安裝Impala所需要的rpm包,所以默認的這種Yum源可能下載依賴失敗。所以我們可以?自?己指定Yum去哪?里里下載所需依賴。
rpm?方式安裝:需要?自?己管理理rpm包的依賴關系;?非常麻煩;解決依賴關系使?用yum;默認Yum源是沒有Impala的rpm安裝包,所以我們?自?己準備好所有的Impala安裝所需的rpm包,制作Yum本地源,配置Yum命令去到我們準備的Yun源中下載Impala的rpm包進?行行安裝。
Yum命令默認源
本地Yum源?式
具體制作步驟
Yum源是Centos當中下載軟件rpm包的地址,因此通過制作本地Yum源并指定Yum命令使?用本地Yum源,為了了使Yum命令(本機,跨?網絡節(jié)點)可以通過?網絡訪問到本地源,我們使?用Httpd這種靜態(tài)資源服務?來開放我們下載所有的rpm包。
- Linux121安裝Httpd服務器
#yum?方式安裝httpd服務器?
yum install httpd -y
#啟動httpd服務器?
systemctl start httpd
#驗證httpd?工作是否正常,默認端?口是80,可以省略略
http://linux121
- 新建?一個測試?頁?面
httpd默認存放?頁?面路路徑
/var/www/html/
新建?一個?頁?面test.html
<html>
<div style="font-size:100px">
this is a new page!!
</div>
</html>
訪問
http://linux121/test.html
注:后續(xù)可以把下載的rpm包解壓放置到此處便便可以供?大家訪問。
- 下載Impala安裝所需rpm包
Impala所需安裝包需要到Cloudera提供地址下載
http://archive.cloudera.com/cdh5/repo-as-tarball/5.7.6/cdh5.7.6-
centos7.tar.gz
注意:該tar.gz包是包含了了Cloudera所提供的?幾乎所有rpm包,但是為了了?方便便我們不不再去梳理理其中依賴關系,全部下載來,整個?文件?比較?大,有3.8G。選擇?一個磁盤空間夠的節(jié)點,后續(xù)還要把壓縮包解壓所以磁盤空間要剩余10G以上。該包在資料料中提供給?大家。
移動該安裝包到/opt/lagou/software
解壓縮
tar -zxvf cdh5.7.6-centos7.tar.gz
- 使?用Httpd盛放依賴包
創(chuàng)建軟鏈接到/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
將SELINUX=enforcing改為SELINUX=disabled
修改之后要記得重啟機器?!!之前修改過可以不不?用修改!!
- 修改Yum源配置?文件
cd /etc/yum.repos.d
#創(chuàng)建?一個新的配置?文件
vim local.repo
#添加如下內容
[local]
name=local
baseurl=http://linux121/cdh57/
gpgcheck=0
enabled=1
name:對于當前源的描述
baseurl:訪問當前源的地址信息
gpgcheck: 1 0,gpg校驗
enabled:1/0,是否使?用當前源
- 分發(fā)local.repo?文件到其它節(jié)點
rsync-script local.repo
安裝Impala
-
集群規(guī)劃
Impala?角?色
impala-server:這個進程是Impala真正?工作的進程,官?方建議把impala-server安裝在datanode節(jié)點,
更更靠近數據(短路路讀取),進程名impalad
impala-statestored:健康監(jiān)控?角?色,主要監(jiān)控impala-server,impala-server出現異常時告知給其它impala-server;進程名叫做statestored
impala-catalogd :管理理和維護元數據(Hive),impala更更新操作;把impala-server更更新的元數據通知給其它impala-server,進程名catalogd
官?方建議statestore與catalog安裝在同?一節(jié)點上!!
具體安裝步驟
- 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
- Linux121與Linux122
yum install impala-server -y
yum install impala-shell -y
配置Impala
- 修改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>
- 分發(fā)Hive安裝包到集群節(jié)點
rsync -r /opt/lagou/servers/hive-2.3.7/ linux122:/opt/lagou/servers/
rsync -r /opt/lagou/servers/hive-2.3.7/ linux121:/opt/lagou/servers/
- Linux123啟動metastore服務
nohup hive --service metastore &
啟動hiveserver2服務
nohup hive --service hiveserver2 &
- 修改HDFS集群hdfs-site.xml
配置HDFS集群的短路路讀取
什什么是短路路讀取?
在HDFS中通過DataNode來讀取數據。但是,當客戶端向DataNode請求讀取?文件時,DataNode就會從磁盤讀取該?文件并通過TCP socket將數據發(fā)送到客戶端。所謂“短路路”是指Client客戶端直接讀取?文件。很明顯,這種情況只在客戶端與數據放在同?一地點(譯者注:同?一主機)時才有可能發(fā)?生。短路路讀對于許多應?用程序會帶來重?大的性能提升。
短路路讀取:就是Client與DataNode屬于同?一節(jié)點,?無需再經過?網絡傳輸數據,直接本地讀取。
要配置短路路本地讀,需要驗證本機Hadoop是否有l(wèi)ibhadoop.so;
進?入?一下?目錄:
/opt/lagou/servers/hadoop-2.9.2/lib/native
短路路讀取配置步驟
- 創(chuàng)建短路路讀取本地中轉站
#所有節(jié)點創(chuàng)建?一下?目錄
mkdir -p /var/lib/hadoop-hdfs
- 修改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存儲元數據信息開發(fā)開關 -->
<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>
注:分發(fā)到集群其它節(jié)點。重啟Hadoop集群。
#停?止集群
stop-dfs.sh
start-dfs.sh
#啟動集群
start-dfs.sh
start-yarn.sh
- Impala具體配置
引?用HDFS,Hive配置
使?用Yum?方式安裝impala默認的Impala配置?文件?目錄為 /etc/impala/conf,Impala的使?用要依賴Hadoop,Hive框架,所以需要把Hdfs,Hive的配置?文件告知Impala。
執(zhí)?行行以下命令把Hdfs,Hive的配置?文件軟鏈接到/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
注:所有節(jié)點都要執(zhí)?行行此命令!
Impala?自身配置
所有節(jié)點更更改Impala默認配置?文件以及添加mysql的驅動包
vim /etc/default/impala
<!--更更新如下內容 -->
IMPALA_CATALOG_SERVICE_HOST=linux123
IMPALA_STATE_STORE_HOST=linux123
所有節(jié)點創(chuàng)建mysql的驅動包的軟鏈接
#創(chuàng)建節(jié)點
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
修改bigtop的java_home路路徑
vim /etc/default/bigtop-utils
export JAVA_HOME=/opt/lagou/servers/jdk1.8.0_231
注意:Apache Bigtop 是?一個針對基礎設施?工程師和數據科學家的開源項?目,旨在全?面打包、測試和配置領先的開源?大數據組件/項?目。Impala項?目中使?用到了了此軟件。
啟動Impala
#linux123啟動如下?角?色
service impala-state-store start
service impala-catalog start
service impala-server start
#其余節(jié)點啟動如下?角?色
service impala-server start
驗證Impala啟動結果
ps -ef | grep impala
[root@linux123 conf]# ps -ef | grep impala
impala 29212 1 1 23:42 ? 00:00:00
/usr/lib/impala/sbin/statestored -log_dir=/var/log/impala -
state_store_port=24000
impala 29249 1 21 23:42 ? 00:00:04
/usr/lib/impala/sbin/catalogd -log_dir=/var/log/impala
impala 29341 1 30 23:42 ? 00:00:06
/usr/lib/impala/sbin/impalad -log_dir=/var/log/impala -
catalog_service_host=linux123 -state_store_port=24000 -use_statestore -
state_store_host=linux123 -be_port=22000
[root@linux122 conf]# ps -ef | grep impala
impala 25233 1 41 23:43 ? 00:00:04
/usr/lib/impala/sbin/impalad -log_dir=/var/log/impala -
catalog_service_host=linux123 -state_store_port=24000 -use_statestore -
state_store_host=linux123 -be_port=22000
[root@linux121 conf]# ps -ef | grep impala
impala 21992 1 59 23:43 ? 00:00:04
/usr/lib/impala/sbin/impalad -log_dir=/var/log/impala -
catalog_service_host=linux123 -state_store_port=24000 -use_statestore -
state_store_host=linux123 -be_port=22000
瀏覽器?Web界?面驗證
訪問impalad的管理理界?面
http://linux123:25000/
訪問statestored的管理理界?面
http://linux123:25010/
Impalad管理理界?面
Statestore管理理界?面
注意:啟動之后所有關于Impala的?日志默認都在/var/log/impala 這個路路徑下,Linux123機器?上?面應該有三個進程,Linux121與Linux122機器?上?面只有?一個進程,如果進程個數不不對,去對應?目錄下查看報錯?日志.
消除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等會發(fā)現,命令?文件是/usr/bin/hadoop ?而?非我們?自?己安裝的路路
徑,需要把這些刪除掉,所有節(jié)點都要執(zhí)?行行
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
#重新?生效環(huán)境變量量
source /etc/profile
jps 時出現沒有名字的進程 或者process information unavailable
解決?方式
rm -rf /tmp/hsperfdata_*
Impala?入?門案例例
使?用Yum?方式安裝Impala后,impala-shell可以全局使?用;進?入impala-shell命令?行行
impala-shell進?入到impala的交互窗?
[root@linux123 conf]# impala-shell
Connected to linux123:21000
Server version: impalad version 2.3.0-cdh5.5.0 RELEASE (build
0c891d79aa38f297d244855a32f1e17280e2129b)
******************************************************************************
*****
Welcome to the Impala shell. Copyright (c) 2015 Cloudera, Inc. All rights
reserved.
(Impala Shell v2.3.0-cdh5.5.0 (0c891d7) built on Mon Nov 9 12:18:12 PST 2015)
The SET command shows the current value of all shell and query options.
******************************************************************************
*****
[linux123:21000] >
查看所有數據庫
show databases;
Fetched 0 row(s) in 4.74s
[linux123:21000] > show databases;
Query: show databases
+------------------+
| name |
+------------------+
| _impala_builtins |
| default |
| |
+------------------+
如果想要使?用Impala ,需要將數據加載到Impala中,如何加載數據到Impala中呢?
使?用Impala的外部表,這種適?用于已經有數據?文件,只需將數據?文件拷?貝到HDFS上,創(chuàng)建?一張
Impala外部表,將外部表的存儲位置指向數據?文件的位置即可。(類似Hive)
通過Insert?方式插?入數據,適?用于我們沒有數據?文件的場景。
- 準備數據?文件
user.csv
392456197008193000,張三,20,0
267456198006210000,李李四,25,1
892456199007203000,王五,24,1
492456198712198000,趙六,26,2
392456197008193000,張三,20,0
392456197008193000,張三,20,0
- 創(chuàng)建HDFS 存放數據的路路徑
hadoop fs -mkdir -p /user/impala/t1
#上傳本地user.csv到hdfs /user/impala/table1
hadoop fs -put user.csv /user/impala/t1
- 創(chuàng)建表
#進?入impala-shell
impala-shell
#表如果存在則刪除
drop table if exists t1;
#執(zhí)?行行創(chuàng)建
create external table t1(id string,name string,age int,gender int)
row format delimited fields terminated by ','
location '/user/impala/t1';
- 查詢數據
[linux122:21000] > select * from t1;
Query: select * from t1
+--------------------+------+-----+--------+
| id | name | age | gender |
+--------------------+------+-----+--------+
| 392456197008193000 | 張三 | 20 | 0 |
| 267456198006210000 | 李李四 | 25 | 1 |
| 892456199007203000 | 王五 | 24 | 1 |
| 492456198712198000 | 趙六 | 26 | 2 |
| 392456197008193000 | 張三 | 20 | 0 |
| 392456197008193000 | 張三 | 20 | 0 |
+--------------------+------+-----+--------+
- 創(chuàng)建t2表
#創(chuàng)建?一個內部表
create table t2(id string,name string,age int,gender int)
row format delimited fields terminated by ',';
#查看表結構
desc t1;
desc formatted t2;
- 插?入數據到t2
insert overwrite table t2 select * from t1 where gender =0;
#驗證數據
select * from t2;
[linux122:21000] > select * from t2;
Query: select * from t2
+--------------------+------+-----+--------+
| id | name | age | gender |
+--------------------+------+-----+--------+
| 392456197008193000 | 張三 | 20 | 0 |
| 392456197008193000 | 張三 | 20 | 0 |
| 392456197008193000 | 張三 | 20 | 0 |
+--------------------+------+-----+--------+
更更新元數據
使?用Beeline連接Hive查看Hive中的數據,發(fā)現通過Impala創(chuàng)建的表,導?入的數據都可以被Hive感知到。
0: jdbc:hive2://linux123:10000> show tables;
+-----------+
| tab_name |
+-----------+
| t1 |
| t2 |
+-----------+
select * from t1;
0: jdbc:hive2://linux123:10000> select * from t1;
+---------------------+----------+---------+------------+
| t1.id | t1.name | t1.age | t1.gender |
+---------------------+----------+---------+------------+
| 392456197008193000 | 張三 | 20 | 0 |
| 267456198006210000 | 李李四 | 25 | 1 |
| 892456199007203000 | 王五 | 24 | 1 |
| 492456198712198000 | 趙六 | 26 | 2 |
| 392456197008193000 | 張三 | 20 | 0 |
| 392456197008193000 | 張三 | 20 | 0 |
+---------------------+----------+---------+------------+
?小結:
- 上?面案例例中Impala的數據?文件我們準備的是以逗號分隔的?文本?文件,實際上,Impala可以?持RCFile,SequenceFile,Parquet等多種?文件格式。
- Impala與Hive元數據的關系?
Hive對于元數據的更更新操作不不能被Impala感知到;
Impala對元數據的更更新操作可以被Hive感知到。
Impala同步Hive元數據命令:
?手動執(zhí)?行行invalidate metadata ,(后續(xù)詳細講解)
Impala是通過Hive的metastore服務來訪問和操作Hive的元數據,但是Hive對表進?行行創(chuàng)建刪
除修改等操作,Impala是?無法?自動識別到Hive中元數據的變更更情況的,如果想讓Impala識別到Hive元數據的變化,所以需要進?入impala-shell之后?首先要做的操作就是執(zhí)?行行invalidate metadata,該命令會將所有的Impala的元數據失效并重新從元數據庫同步元數據信息。后?詳細講解元數據更更新命令。 - Impala操作HDFS使?用的是Impala?用戶,所以為了了避免權限問題,我們可以選擇關閉權限校驗
在hdfs-site.xml中添加如下配置:
<!--關閉hdfs權限校驗 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
三、Impala的架構原理理(有哪些組件,組件的作?用,查詢流程,查詢計劃)
Impala的組件
Impala是?一個分布式,?大規(guī)模并?行行處理理(MPP)數據庫引擎,它包括多個進程。Impala與Hive類似不不是數據庫?而是數據分析?工具;
#在linux123執(zhí)?行行ps -ef | grep impala
#結果
impala 29212 1 0 Jul02 ? 00:01:06
/usr/lib/impala/sbin/statestored -log_dir=/var/log/impala -
state_store_port=24000
impala 29249 1 0 Jul02 ? 00:00:49
/usr/lib/impala/sbin/catalogd -log_dir=/var/log/impala
impala 29341 1 0 Jul02 ? 00:00:49 /usr/lib/impala/sbin/impalad
-log_dir=/var/log/impala -catalog_service_host=linux123 -
state_store_port=24000 -use_statestore -state_store_host=linux123 -
be_port=22000
- impalad
?角?色名稱為Impala Daemon,是在每個節(jié)點上運?行行的進程,是Impala的核?心組件,進程名是Impalad;
作?用,負責讀寫數據?文件,接收來?自Impala-shell,JDBC,ODBC等的查詢請求,與集群其它Impalad分布式并?行行完成查詢任務,并將查詢結果返回給中?心協(xié)調者。
為了了保證Impalad進程了了解其它Impalad的健康狀況,Impalad進程會?一直與statestore保持通信。
Impalad服務由三個模塊組成:Query Planner、Query Coordinator和Query Executor,前兩個
模塊組成前端,負責接收SQL查詢請求,解析SQL并轉換成執(zhí)?行行計劃,交由后端執(zhí)?行行, - statestored
statestore監(jiān)控集群中Impalad的健康狀況,并將集群健康信息同步給Impalad,
statestore進程名為statestored - catalogd
Impala執(zhí)?行行的SQL語句句引發(fā)元數據發(fā)?生變化時,catalog服務負責把這些元數據的變化同步給其它Impalad進程(?日志驗證,監(jiān)控statestore進程?日志)
catalog服務對應進程名稱是catalogd
由于?一個集群需要?一個catalogd以及?一個statestored進程,?而且catalogd進程所有請求都是經過statestored進程發(fā)送,所以官?方建議讓statestored進程與catalogd進程安排同個節(jié)點。
Impala的查詢
- Client提交任務
Client發(fā)送?一個SQL查詢請求到任意?一個Impalad節(jié)點,會返回?一個queryId?用于之后的客戶端操作。 - ?生成單機和分布式執(zhí)?行行計劃
SQL提交到Impalad節(jié)點之后,Analyser依次執(zhí)?行行SQL的詞法分析、語法分析、語義分析等操作;
從MySQL元數據庫中獲取元數據,從HDFS的名稱節(jié)點中獲取數據地址,以得到存儲這個查詢相關數據的所有數據節(jié)點
單機執(zhí)?行行計劃: 根據上?一步對SQL語句句的分析,由Planner先?生成單機的執(zhí)?行行計劃,該執(zhí)?行行計劃是有PlanNode組成的?一棵樹,這個過程中也會執(zhí)?行行?一些SQL優(yōu)化,例例如Join順序改變、謂詞下推等。
分布式并?行行物理理計劃:將單機執(zhí)?行行計劃轉換成分布式并?行行物理理執(zhí)?行行計劃,物理理執(zhí)?行行計劃由?一個個的Fragment組成,Fragment之間有數據依賴關系,處理理過程中需要在原有的執(zhí)?行行計劃之上加?入?一些ExchangeNode和DataStreamSink信息等。
Fragment : sql?生成的分布式執(zhí)?行行計劃的?一個?子任務;
DataStreamSink:傳輸當前的Fragment輸出數據到不不同的節(jié)點 - 任務調度和分發(fā)
Coordinator將Fragment(?子任務)根據數據分區(qū)信息發(fā)配到不不同的Impalad節(jié)點上執(zhí)?行行。Impalad節(jié)點接收到執(zhí)?行行Fragment請求交由Executor執(zhí)?行行。 - Fragment之間的數據依賴
每?一個Fragment的執(zhí)?行行輸出通過DataStreamSink發(fā)送到下?一個Fragment,Fragment運?行行過程中不不斷向coordinator節(jié)點匯報當前運?行行狀態(tài)。 - 結果匯總
查詢的SQL通常情況下需要有?一個單獨的Fragment?用于結果的匯總,它只在Coordinator節(jié)點運?行行,將多個節(jié)點的最終執(zhí)?行行結果匯總,轉換成ResultSet信息。 - 獲取結果客戶端調?用獲取ResultSet的接?口,讀取查詢結果。
查詢計劃示例例
以?一個SQL例例?子來展示查詢計劃
SQL語句句
select
t1.n1,
t2.n2,
count(1) as c
from t1 join t2 on t1.id = t2.id
join t3 on t1.id = t3.id
where t3.n3 between ‘a’ and ‘f’
group by t1.n1, t2.n2
order by c desc
limit 100;
QueryPlanner?生成單機的執(zhí)?行行計劃
分析上?面的單機執(zhí)?行行計劃,第?一步先去掃描t1表中需要的數據,如果數據?文件存儲是列列式存儲我們可以便便利利的掃描到所需的列列id,n1;接著需要與t2表進?行行Join操作,掃描t2表與t1表類似獲取到所需數據列列id,n2;t1與t2表進?行行關聯(lián),關聯(lián)之后再與t3表進?行行關聯(lián),這?里里Impala會使?用謂詞下推掃描t3表只取join所需數據;對group by進?行行相應的aggregation操作,最終是排序取出指定數量量的數據返回。
分布式并?行行執(zhí)?行行計劃所謂的分布式并?行行化執(zhí)?行行計劃就是在單機執(zhí)?行行計劃基礎之上結合數據分布式存儲的特點,按照任務的計算要求把單機執(zhí)?行行計劃拆分為多段?子任務,每個?子任務都是可以并?行行執(zhí)?行行的。上?面的單機執(zhí)?行行計劃轉為分布式并?行行執(zhí)?行行計劃如下圖所示:
分布式并?行行執(zhí)?行行計劃流程圖
分布式執(zhí)?行行計劃中涉及到多表的Join,Impala會根據表的?大?小來決定Join的?方式,主要有兩種分別是Hash
Join與Broadcast Join
上?面分布式執(zhí)?行行計劃中可以看出T1,T2表?大?一些,?而T3表?小?一些,所以對于T1與T2的Join Impala選擇使?用Hash Join,對于T3表選擇使?用Broadcast ?方式,直接把T3表?廣播到需要Join的節(jié)點上。
分布式并?行行計劃流程
- T1和T2使?用Hash join,此時需要按照id的值分別將T1和T2分散到不不同的Impalad進程,但是相同的id會散列列到相同的Impalad進程,這樣每?一個Join之后是全部數據的?一部分
- T1與T2Join之后的結果數據再與T3表進?行行Join,此時T3表采?用Broadcast?方式把?自?己全部數據(id列列)?廣播到需要的Impala節(jié)點上
- T1,T2,T3Join之后再根據Group by執(zhí)?行行本地的預聚合,每?一個節(jié)點的預聚合結果只是最終結果的?一部分(不不同的節(jié)點可能存在相同的group by的值),需要再進?行行?一次全局的聚合。
- 全局的聚合同樣需要并?行行,則根據聚合列列進?行行Hash分散到不不同的節(jié)點執(zhí)?行行Merge運算(其實仍然是?一次聚合運算),?一般情況下為了了較少數據的?網絡傳輸, Impala會選擇之前本地聚合節(jié)點做全局聚合?工作。
- 通過全局聚合之后,相同的key只存在于?一個節(jié)點,然后對于每?一個節(jié)點進?行行排序和TopN計算,最終將每?一個全局聚合節(jié)點的結果返回給Coordinator進?行行合并、排序、limit計算,返回結果給?用戶.