java大資料開發訓練營--Impala
第 1 部分 Impala概述
1.1 Impala是什麼
Impala是Cloudera提供的⼀款開源的針對HDFS和HBASE中的PB級別資料進⾏互動式實時查詢(Impala 速度快),Impala是參照⾕歌的新三篇論⽂當中的Dremel實現⽽來,其中舊三篇論⽂分別是 (BigTable,GFS,MapReduce)分別對應我們即將學的HBase和已經學過的HDFS以及MapReduce。
Impala最⼤賣點和最⼤特點就是快速,Impala中⽂翻譯是⾼⻆羚⽺。
1.2 Impala優勢
回顧前⾯⼤資料課程路線其實就是⼀個⼤資料從業者⾯對的⼤資料相關技術發展的過程,
- 技術發展以及更新換代的原因就是⽼的技術架構遇到新的問題,有些問題可以通過不斷優化程式碼優化設計得以解決,有⼀些問題就不再是簡簡單單修改程式碼就能解決,需要從框架本身架構設計上改 變,以⾄於需要推到重建。
- 在⼤資料領域主要解決的問題是資料的儲存和分析,但是其實⼀個完整的⼤資料分析任務如果細分 會有⾮常多具體的場景,⾮常多的環節;並沒有⼀個類似Java Web的Spring框架實現⼤⼀統的局⾯。
⽐如我們按照階段劃分⼀個⼤資料開發任務,會有:資料採集(⽇志⽂件,關係型資料庫中),資料清洗 (資料格式整理,髒資料過濾等),資料預處理(為了後續分析所做的⼯作),資料分析:離線處理(T+1分析),實時處理(資料到來即分析),資料視覺化,機器學習,深度學習等
⾯對如此眾多的階段再加上⼤資料天⽣的⼤資料量問題沒有任何⼀個框架可以完美cover以上每個階 段。所以⼤資料領域有⾮常多框架,每個框架都有最適合⾃⼰的具體場景。⽐如:HDFS負責⼤資料量儲存,MapReduce(Hive)負責⼤資料量的分析計算,
Impala 拋棄了 MapReduce 使⽤了類似於傳統的 MPP 資料庫技術 ,⼤⼤提⾼了查詢的速度。
MPP 是什麼?MPP (Massively Parallel Processing),就是⼤規模並⾏處理,在MPP叢集中,每個節點資源都是獨⽴享有也就是有獨⽴的磁碟和記憶體,每個節點通過⽹絡互相連線,彼此協同計算,作為整體提供資料服務。
簡單來說,MPP是將任務並⾏的分散到多個伺服器和節點上,在每個節點上計算完成後,將各⾃部分的結果彙總在⼀起得到最終的結果
對於MPP架構的軟體來說聚合操作⽐如計算某張表的總條數,則先進⾏區域性聚合(每個節點並⾏計算),然後把區域性彙總結果進⾏全域性聚合(與Hadoop相似)。
1.2.1Impala與Hive對⽐
- Impala沒有采取MapReduce作為計算引擎,MR是⾮常好的分散式並⾏計算框架,但MR引擎更多 的是⾯向批處理模式,⽽不是⾯向互動式的SQL執⾏。與 Hive相⽐:Impala把整個查詢任務轉為 ⼀棵執⾏計劃樹,⽽不是⼀連串的MR任務,在分發執⾏計劃後,Impala使⽤拉取的⽅式獲取上個 階段的執⾏結果,把結果資料、按執⾏樹流式傳遞彙集,減少的了把中間結果寫⼊磁碟的步驟,再從磁碟讀取資料的開銷。Impala使⽤服務的⽅式避免 每次執⾏查詢都需要啟動的開銷,即相⽐Hive沒了MR啟動時間。
- 使⽤LLVM(C++編寫的編譯器)產⽣運⾏程式碼,針對特定查詢⽣成特定程式碼。
- 優秀的IO排程,Impala⽀持直接資料塊讀取和原生程式碼計算。
- 選擇適合的資料儲存格式可以得到最好的效能(Impala⽀持多種儲存格式)。
- 儘可能使⽤記憶體,中間結果不寫磁碟,及時通過⽹絡以stream的⽅式傳遞。
Impala與Hive對⽐分析
查詢過程Hive:在Hive中,每個查詢都有⼀個“冷啟動”的常⻅問題。(map,reduce每次都要啟動關閉,申請資源,釋放資源。。。)
Impala:Impala避免了任何可能的啟動開銷,這是⼀種本地查詢語⾔。 因為要始終處理查詢,則 Impala守護程式程式總是在叢集啟動之後就準備就緒。守護程式在叢集啟動之後可以接收查詢任務並執⾏查詢任務。
中間結果Hive:Hive通過MR引擎實現所有中間結果,中間結果需要落盤,這對降低資料處理速度有不利影響。
Impala:在執⾏程式之間使⽤流的⽅式傳輸中間結果,避免資料落盤。儘可能使⽤記憶體避免磁碟開銷
互動查詢Hive:對於互動式計算,Hive不是理想的選擇。
Impala:對於互動式計算,Impala⾮常適合。(資料量級PB級)
計算引擎Hive:是基於批處理的Hadoop MapReduce
Impala:更像是MPP資料庫
容錯Hive:Hive是容錯的(通過MR&Yarn實現)
Impala:Impala沒有容錯,由於良好的查詢效能,Impala遇到錯誤會重新執⾏⼀次查詢
查詢速度Impala:Impala⽐Hive快3-90倍。
Impala優勢總結
1. Impala最⼤優點就是查詢速度快,在⼀定資料量下;
2. 速度快的原因:避免了MR引擎的弊端,採⽤了MPP資料庫技術,
1.3 Impala的缺點
1. Impala屬於MPP架構,只能做到百節點級,⼀般併發查詢個數達到20左右時,整個系統的吞吐已經達到滿負荷狀態,在擴容節點也提升不了吞吐量,處理資料量在PB級別最佳。
2. 資源不能通過YARN統⼀資源管理排程,所以Hadoop叢集⽆法實現Impala、Spark、Hive等元件的動態資源共享。
1.4 適⽤場景
Hive: 複雜的批處理查詢任務,資料轉換任務,對實時性要求不⾼同時資料量⼜很⼤的場景。
Impala:實時資料分析,與Hive配合使⽤,對Hive的結果資料集進⾏實時分析。impala不能完全取代hive,impala可以直接處理hive表中的資料。
第 2 部分 Impala 安裝與⼊⻔案例
2.1 叢集準備
2.1.1 安裝Hadoop,Hive
- Impala的安裝需要提前裝好Hadoop,Hive這兩個框架(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包;所以我們選擇使⽤Cloudera的rpm包 進⾏Impala的安裝,但是另外⼀個問題,Impala的rpm包依賴⾮常多的其他的rpm包,我們可以⼀個個 的將依賴找出來,但是這種⽅式實在是浪費時間。
rpm⽅式安裝:需要⾃⼰管理rpm包的依賴關係;⾮常麻煩;解決依賴關係使⽤yum;預設Yum源是沒有 Impala的rpm安裝包,所以我們⾃⼰準備好所有的Impala安裝所需的rpm包,製作Yum本地源,配置 Yum命令去到我們準備的Yun源中下載Impala的rpm包進⾏安裝
本地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 forbiddenvim /etc/selinux/config
5. 修改Yum源配置⽂件
cd /etc/yum.repos.d# 建立⼀個新的配置⽂件vim local.repo
# 新增如下內容[local]name = localbaseurl = http://linux121/cdh57/gpgcheck = 0enabled = 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 叢集規劃
服務名稱
| linux121 | linux122 | linux123 |
impala-catalogd
|
不安裝
|
不安裝
|
安裝
|
impala-statestored
|
不安裝
|
不安裝
|
安裝
|
impala-server
|
安裝
| 安裝 | 安裝 |
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
2.2.2 具體安裝步驟
Linux123
yum install impala -yyum install impala-server -yyum install impala-state-store -yyum install impala-catalog -yyum install impala-shell -y
Linux121與Linux122
yum install impala-server -yyum 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客戶端直接讀取⽂件。很明顯,這種情況只在客戶端與資料放在同⼀地點(譯者注:同⼀主機)時才有可能發 ⽣。短路讀對於許多應⽤程式會帶來重⼤的效能提升。
短路讀取:就是Client與DataNode屬於同⼀節點,⽆需再經過⽹絡傳輸資料,直接本地讀取。
要配置短路本地讀,需要驗證本機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.shstart-dfs.sh# 啟動叢集start-dfs.shstart-yarn.sh
3. Impala具體配置
引⽤HDFS,Hive配置,使⽤Yum⽅式安裝impala預設的Impala配置⽂件⽬錄為 /etc/impala/conf,Impala的使⽤要依賴 Hadoop,Hive框架,所以需要把Hdfs,Hive的配置⽂件告知Impala。
執⾏以下命令把Hdfs,Hive的配置⽂件軟連結到/etc/impala/conf下
ln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/core-site.xml /etc/impala/conf/core-site.xmlln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml /etc/impala/conf/hdfs-site.xmlln -s /opt/lagou/servers/hive-2.3.7/conf/hive-site.xml /etc/impala/conf/hive-site.xml
所有節點更改Impala預設配置⽂件以及新增mysql的驅動包
vim /etc/default/impala
<!-- 更新如下內容 -->IMPALA_CATALOG_SERVICE_HOST=linux123IMPALA_STATE_STORE_HOST=linux123
所有節點建立mysql的驅動包的軟連結
# 建立節點mkdir -p /usr/share/javaln -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-utilsexport JAVA_HOME = /opt/lagou/servers/jdk1.8.0_231
啟動Impala
#linux123 啟動如下⻆⾊service impala-state-store startservice impala-catalog startservice 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/hadooprm -rf /usr/bin/hdfsrm -rf /usr/bin/hiverm -rf /usr/bin/beelinerm -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,0267456198006210000, 李四 ,25,1892456199007203000, 王五 ,24,1492456198712198000, 趙六 ,26,2392456197008193000, 張三 ,20,0392456197008193000, 張三 ,20,0
hadoop fs -mkdir -p /user/impala/t1# 上傳本地 user.csv 到 hdfs /user/impala/table1hadoop fs -put user.csv /user/impala/t1
# 進⼊ impala-shellimpala-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' ;
# 建立⼀個內部表create table t2(id string,name string,age int,gender int)row format delimited fields terminated by ',' ;# 檢視錶結構desc t1;desc formatted t2;
insert overwrite table t2 select * from t1 where gender = 0 ;# 驗證資料select * from t2;
1. 上⾯案例中 Impala 的資料⽂件我們準備的是以逗號分隔的⽂本⽂件,實際上, Impala可以⽀持 RCFile,SequenceFile,Parquet 等多種⽂件格式。2. Impala 與 Hive 後設資料的關係?
- Hive對於後設資料的更新操作不能被Impala感知到;
- Impala對後設資料的更新操作可以被Hive感知到。
Impala 同步 Hive 後設資料命令:⼿動執⾏invalidate metadata ,Impala是通過Hive的metastore服務來訪問和操作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)資料庫引擎,它包括多個程式。Impala與Hive類似不是資料庫⽽是資料分析⼯具;
impalad⻆⾊名稱為Impala Daemon,是在每個節點上運⾏的程式,是Impala的核⼼元件,程式名是 Impalad;
作⽤,負責讀寫資料⽂件,接收來⾃Impala-shell,JDBC,ODBC等的查詢請求,與叢集其它 Impalad分散式並⾏完成查詢任務,並將查詢結果返回給中⼼協調者。
為了保證Impalad程式瞭解其它Impalad的健康狀況,Impalad程式會⼀直與statestore保持通訊。
Impalad服務由三個模組組成:Query Planner、Query Coordinator和Query Executor,前兩個 模組組成前端,負責接收SQL查詢請求,解析SQL並轉換成執⾏計劃,交由後端執⾏,
statestoredstatestore監控叢集中Impalad的健康狀況,並將叢集健康資訊同步給Impalad,
statestore程式名為statestored
catalogdImpala執⾏的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之間有資料依賴關係,處理過程中需要在原有的執⾏計劃之上加⼊⼀些ExchangeNode和DataStreamSink資訊等。
Fragment : sql⽣成的分散式執⾏計劃的⼀個⼦任務;
DataStreamSink:傳輸當前的Fragment輸出資料到不同的節點
3. 任務排程和分發Coordinator將Fragment(⼦任務)根據資料分割槽資訊發配到不同的Impalad節點上執⾏。Impalad節點接收到執⾏Fragment請求交由Executor執⾏。
4. Fragment 之間的資料依賴每⼀個Fragment的執⾏輸出通過DataStreamSink傳送到下⼀個Fragment,Fragment運⾏過程中不斷向coordinator節點彙報當前運⾏狀態。
5. 結果彙總查詢的SQL通常情況下需要有⼀個單獨的Fragment⽤於結果的彙總,它只在Coordinator節點運⾏,將多個節點的最終執⾏結果彙總,轉換成ResultSet資訊。
6. 獲取結果客戶端調⽤獲取ResultSet的接⼝,讀取查詢結果。
第 4 部分 Impala的使⽤
需要注意的⼏點:1. Impala與Hive類似它們的重點都是在與查詢,所以像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 儲存執⾏結果到⽂件當中去。
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 資料庫特定語句
CREATE DATABASE語句⽤於在Impala中建立新資料庫。
CREATE DATABASE IF NOT EXISTS database_name;
/user/hive/warehouse/lagoutest.db
drop database sample cascade;
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 );
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語句
describe table_name;簡寫desc table_name;
drop table database_name .table_name ;
truncate table_name;
create view if not exists view_name as select statement
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 ;
select * from table_name ORDER BY col_name[ ASC |DESC] [NULLS FIRST|NULLS LAST]
where:過濾的資料是原始資料,表中本來就存在的資料;
having:過濾的是查詢結果資料;
select * from employee order by salary limit 2 offset 2 ;
這種⽅式⾮常類似於RDBMS的資料插⼊⽅式。
create table t_test2(id int ,name string);insert into table t_test2 values ( 1 ,”zhangsan”);
第 5 部分 Impala的JDBC⽅式查詢
在實際⼯作當中,因為impala的查詢⽐較快,所以可能有會使⽤到impala來做資料庫查詢的情況,我們可以通過java程式碼來進⾏操作impala的查詢
<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>
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的負載均衡
1.1 HAProxy⽅案
yum install haproxy -y
vim /etc/haproxy/haproxy.cfg
listen impalashellbind 0.0.0.0:25003#ha作為 proxy 所繫結的 IP 和埠mode tcp#以 4 層⽅式代理,重要option tcplogbalance roundrobin#排程演算法 'leastconn' 最少連線數分配,或者 'roundrobin',輪詢server impalashell_1 linux121:21000 checkserver impalashell_2 linux122:21000 checkserver impalashell_3 linux123:21000 checklisten impalajdbcbind 0.0.0.0:25004#ha作為 proxy 所繫結的 IP 和端⼝mode tcp#以 4 層⽅式代理,重要option tcplogbalance roundrobin #排程演算法 'leastconn' 最少連線數分配,或者 'roundrobin',輪詢分server impalajdbc_1 linux121:21050 checkserver impalajdbc_2 linux122:21050 checkserver impalajdbc_3 linux122:21050 check#---------------------------------------------------------------------# main frontend which proxys to the backends#---------------------------------------------------------------------
開啟: service haproxy start關閉: service haproxy stop重啟: service haproxy restart
impala-shell -i linux123:25003
jdbc:hive2://linux123:25004/default;auth=noSasl
第 2 節 Impala優化
- ⽂件格式
對於⼤資料量來說,Parquet⽂件格式是最佳的
- 避免⼩⽂件
insert ... values 會產⽣⼤量⼩⽂件,避免使⽤
- 合理分割槽粒度
利⽤分割槽可以在查詢的時候忽略掉⽆⽤資料,提⾼查詢效率,通常建議分割槽數量在3萬以下 (太多的分割槽也會造成後設資料管理的效能下降)
- 分割槽列資料型別最好是整數型別
- 分割槽列可以使⽤string型別,因為分割槽列的值最後都是作為HDFS⽬錄使⽤,如果分割槽列使⽤ 整數型別可以降低記憶體消耗
- 獲取表的統計指標:在追求效能或者⼤資料量查詢的時候,要先獲取所需要的表的統計指標 (如:執⾏ compute stats )
- 減少傳輸客戶端資料量
聚合(如 count、sum、max 等)
過濾(如 WHERE )
limit限制返回條數
返回結果不要使⽤美化格式進⾏展示(在通過impala-shell展示結果時,新增這些可選引數: - B、 --output_delimiter )
- 在執⾏之前使⽤EXPLAIN來檢視邏輯規劃,分析執⾏邏輯
- Impala join⾃動的優化⼿段就是通過使⽤COMPUTE STATS來收集參與Join的每張表的統計信 息,然後由Impala根據表的⼤⼩、列的唯⼀值數⽬等來⾃動優化查詢。為了更加精確地獲取每張表的統計資訊,每次表的資料變更時(如執⾏Insert,add partition,drop partition等)最好 都要執⾏⼀遍COMPUTE STATS獲取到準確的表統計資訊。
相關文章
- java大資料開發訓練營--NginxJava大資料Nginx
- java小白訓練營Java
- 資料集訓練
- 西部戰略 | GBase資料庫訓練營華西專場培訓資料庫
- k線訓練營排名
- Caffe 訓練mnist資料
- 資料集訓練+1
- 華為昇騰訓練營筆記-Ascend C運算元開發筆記
- 亮資料:高效率資料採集,加速大模型訓練!大模型
- 極客大學java進階訓練營學習分享Java
- 資料模型需要多少訓練資料?模型
- 低程式碼音視訊開發訓練營火熱報名中!
- 華南攻略 | GBase資料庫訓練營專場培訓最後一季資料庫
- fashion資料集訓練
- 避開大資料營銷三大陷阱大資料
- 新春開課 | 歡迎參加GBase 8a MPP CLuster資料庫2月訓練營資料庫
- 大資料 大營銷大資料
- Reddit網友參加資料科學家訓練營被騙經歷資料科學
- 企業級AI問答知識庫訓練營,火熱開營中!AI
- 零基礎的人可以去大資料培訓機構學習大資料開發嗎?大資料
- 大資料開發培訓班需要學習多長時間?大資料
- 監控大模型訓練大模型
- 蘋果捲開源大模型,公開程式碼、權重、資料集、訓練全過程,OpenELM亮相蘋果大模型
- java培訓資料Java
- 認證培訓 | 歡迎參加GBase 8a MPP Cluster資料庫5月訓練營資料庫
- 認證培訓 | 歡迎參加GBase 8a MPP CLuster資料庫3月訓練營資料庫
- Java後端開發工程師是否該轉大資料開發?Java後端工程師大資料
- 學會Java開發才能學習大資料嗎?Java大資料
- java工廠模式訓練Java模式
- 天池python訓練營D3Python
- 訓練指南:資料訓練定期儲存【GpuMall雲平臺特價】GPU
- yolov3訓練自己資料教程YOLO
- Scaled-YOLOv4 快速開始,訓練自定義資料集YOLO
- [開發故事]SQL/NoSQL兩大陣營激辯:誰更適合大資料SQL大資料
- 梯度會洩漏訓練資料?MIT新方法從梯度竊取訓練資料只需幾步梯度MIT
- 大語言模型訓練資料常見的4種處理方法模型
- 使用 PyTorch 完全分片資料並行技術加速大模型訓練PyTorch並行大模型
- 開課啦!硬體安全訓練營——智慧攝像頭漏洞挖掘實戰培訓