當前位置:首頁 » 編程語言 » impalasql執行順序
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

impalasql執行順序

發布時間: 2022-10-17 01:25:15

⑴ 什麼是impala,如何安裝使用Impala

一、Impala簡介
Cloudera Impala對你存儲在Apache Hadoop在HDFS,HBase的數據提供直接查詢互動的sql。除了像Hive使用相同的統一存儲平台,Impala也使用相同的元數據,SQL語法(Hive SQL),ODBC驅動程序和用戶界面(Hue Beeswax)。Impala還提供了一個熟悉的面向批量或實時查詢和統一平台。
二、Impala安裝
1.安裝要求
(1)軟體要求

Red Hat Enterprise Linux (RHEL)/CentOS 6.2 (64-bit)
CDH 4.1.0 or later
Hive
MySQL

(2)硬體要求
在Join查詢過程中需要將數據集載入內存中進行計算,因此對安裝Impalad的內存要求較高。
2、安裝准備

(1)操作系統版本查看
>more/etc/issue
CentOSrelease 6.2 (Final)
Kernel \ron an \m
(2)機器准備
10.28.169.112mr5
10.28.169.113mr6
10.28.169.114mr7
10.28.169.115mr8

各機器安裝角色
mr5:NameNode、ResourceManager、SecondaryNameNode、Hive、impala-state-store
mr6、mr7、mr8:DataNode、NodeManager、impalad
(3)用戶准備
在各個機器上新建用戶hadoop,並打通ssh
(4)軟體准備
到cloudera官網下載:
Hadoop:
hadoop-2.0.0-cdh4.1.2.tar.gz
hive:
hive-0.9.0-cdh4.1.2.tar.gz
impala:
impala-0.3-1.p0.366.el6.x86_64.rpm
impala-debuginfo-0.3-1.p0.366.el6.x86_64.rpm
impala-server-0.3-1.p0.366.el6.x86_64.rpm
impala-shell-0.3-1.p0.366.el6.x86_64.rpm
impala依賴包下載:

4、hadoop-2.0.0-cdh4.1.2安裝

(1)安裝包準備
hadoop用戶登錄到mr5機器,將hadoop-2.0.0-cdh4.1.2.tar.gz上傳到/home/hadoop/目錄下並解壓:
tar zxvf hadoop-2.0.0-cdh4.1.2.tar.gz
(2)配置環境變數
修改mr5機器hadoop用戶主目錄/home/hadoop/下的.bash_profile環境變數:
exportJAVA_HOME=/usr/jdk1.6.0_30
exportJAVA_BIN=${JAVA_HOME}/bin
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_OPTS="-Djava.library.path=/usr/local/lib-server -Xms1024m -Xmx2048m -XX:MaxPermSize=256m -Djava.awt.headless=true-Dsun.net.client.defaultReadTimeout=600
00-Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300-Dsun.net.inetaddr.ttl=300"
exportHADOOP_HOME=/home/hadoop/hadoop-2.0.0-cdh4.1.2
exportHADOOP_PREFIX=$HADOOP_HOME
exportHADOOP_MAPRED_HOME=${HADOOP_HOME}
exportHADOOP_COMMON_HOME=${HADOOP_HOME}
exportHADOOP_HDFS_HOME=${HADOOP_HOME}
exportHADOOP_YARN_HOME=${HADOOP_HOME}
export PATH=$PATH:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
exportJAVA_HOME JAVA_BIN PATH CLASSPATH JAVA_OPTS
exportHADOOP_LIB=${HADOOP_HOME}/lib
exportHADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
(3)修改配置文件
在機器mr5上hadoop用戶登錄修改hadoop的配置文件(配置文件目錄:hadoop-2.0.0-cdh4.1.2/etc/hadoop)
(1)、slaves :
添加以下節點
mr6
mr7
mr8

(2)、hadoop-env.sh :
增加以下環境變數
exportJAVA_HOME=/usr/jdk1.6.0_30
exportHADOOP_HOME=/home/hadoop/hadoop-2.0.0-cdh4.1.2
exportHADOOP_PREFIX=${HADOOP_HOME}
export HADOOP_MAPRED_HOME=${HADOOP_HOME}
exportHADOOP_COMMON_HOME=${HADOOP_HOME}
exportHADOOP_HDFS_HOME=${HADOOP_HOME}
exportHADOOP_YARN_HOME=${HADOOP_HOME}
exportPATH=$PATH:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
exportJAVA_HOME JAVA_BIN PATH CLASSPATH JAVA_OPTS
exportHADOOP_LIB=${HADOOP_HOME}/lib
exportHADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop

(3)、core-site.xml :

fs.default.name
hdfs://mr5:9000
The name of the defaultfile system.Either the literal string "local" or a host:port forNDFS.
true

io.native.lib.available
true

hadoop.tmp.dir
/home/hadoop/tmp
A base for other temporarydirectories.

(4)、hdfs-site.xml :

dfs.namenode.name.dir
file:/home/hadoop/dfsdata/name
Determines where on thelocal filesystem the DFS name node should store the name table.If this is acomma-delimited list of directories,then name table is replicated in all of thedirectories,for rendancy.
true

dfs.datanode.data.dir
file:/home/hadoop/dfsdata/data
Determines where on thelocal filesystem an DFS data node should store its blocks.If this is acomma-delimited list of directories,then data will be stored in all nameddirectories,typically on different devices.Directories that do not exist areignored.

true

dfs.replication
3

dfs.permission
false

(5)、mapred-site.xml:

maprece.framework.name
yarn

maprece.job.tracker
hdfs://mr5:9001
true

maprece.task.io.sort.mb
512

maprece.task.io.sort.factor
100

maprece.rece.shuffle.parallelcopies
50

maprece.cluster.temp.dir
file:/home/hadoop/mapreddata/system
true

maprece.cluster.local.dir
file:/home/hadoop/mapreddata/local
true

(6)、yarn-env.sh :
增加以下環境變數
exportJAVA_HOME=/usr/jdk1.6.0_30
exportHADOOP_HOME=/home/hadoop/hadoop-2.0.0-cdh4.1.2
exportHADOOP_PREFIX=${HADOOP_HOME}
exportHADOOP_MAPRED_HOME=${HADOOP_HOME}
exportHADOOP_COMMON_HOME=${HADOOP_HOME}
exportHADOOP_HDFS_HOME=${HADOOP_HOME}
exportHADOOP_YARN_HOME=${HADOOP_HOME}
exportPATH=$PATH:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
exportJAVA_HOME JAVA_BIN PATH CLASSPATH JAVA_OPTS
exportHADOOP_LIB=${HADOOP_HOME}/lib
exportHADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop

(7)、yarn-site.xml:

yarn.resourcemanager.address
mr5:8080

yarn.resourcemanager.scheler.address
mr5:8081

yarn.resourcemanager.resource-tracker.address
mr5:8082

yarn.nodemanager.aux-services
maprece.shuffle

yarn.nodemanager.aux-services.maprece.shuffle.class
org.apache.hadoop.mapred.ShuffleHandler

yarn.nodemanager.local-dirs
file:/home/hadoop/nmdata/local
thelocal directories used by the nodemanager

yarn.nodemanager.log-dirs
file:/home/hadoop/nmdata/log
thedirectories used by Nodemanagers as log directories

(4)拷貝到其他節點
(1)、在mr5上配置完第2步和第3步後,壓縮hadoop-2.0.0-cdh4.1.2
rm hadoop-2.0.0-cdh4.1.2.tar.gz
tar zcvf hadoop-2.0.0-cdh4.1.2.tar.gz hadoop-2.0.0-cdh4.1.2

然後將hadoop-2.0.0-cdh4.1.2.tar.gz遠程拷貝到mr6、mr7、mr8機器上
scp/home/hadoop/hadoop-2.0.0-cdh4.1.2.tar.gz hadoop@mr6:/home/hadoop/
scp/home/hadoop/hadoop-2.0.0-cdh4.1.2.tar.gz hadoop@mr7:/home/hadoop/
scp/home/hadoop/hadoop-2.0.0-cdh4.1.2.tar.gz hadoop@mr8:/home/hadoop/

(2)、將mr5機器上hadoop用戶的配置環境的文件.bash_profile遠程拷貝到mr6、mr7、mr8機器上
scp/home/hadoop/.bash_profile hadoop@mr6:/home/hadoop/
scp/home/hadoop/.bash_profile hadoop@mr7:/home/hadoop/
scp/home/hadoop/.bash_profile hadoop@mr8:/home/hadoop/
拷貝完成後,在mr5、mr6、mr7、mr8機器的/home/hadoop/目錄下執行
source.bash_profile
使得環境變數生效
(5)啟動hdfs和yarn
以上步驟都執行完成後,用hadoop用戶登錄到mr5機器依次執行:
hdfsnamenode -format
start-dfs.sh
start-yarn.sh
通過jps命令查看:
mr5成功啟動了NameNode、ResourceManager、SecondaryNameNode進程;
mr6、mr7、mr8成功啟動了DataNode、NodeManager進程。
(6)驗證成功狀態
通過以下方式查看節點的健康狀態和作業的執行情況:
瀏覽器訪問(本地需要配置hosts)

5、hive-0.9.0-cdh4.1.2安裝

(1)安裝包準備
使用hadoop用戶上傳hive-0.9.0-cdh4.1.2到mr5機器的/home/hadoop/目錄下並解壓:
tar zxvf hive-0.9.0-cdh4.1.2

(2)配置環境變數
在.bash_profile添加環境變數:
exportHIVE_HOME=/home/hadoop/hive-0.9.0-cdh4.1.2
exportPATH=$PATH:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:${HIVE_HOME}/bin
exportHIVE_CONF_DIR=$HIVE_HOME/conf
exportHIVE_LIB=$HIVE_HOME/lib

添加完後執行以下命令使得環境變數生效:
..bash_profile

(3)修改配置文件
修改hive配置文件(配置文件目錄:hive-0.9.0-cdh4.1.2/conf/)
在hive-0.9.0-cdh4.1.2/conf/目錄下新建hive-site.xml文件,並添加以下配置信息:

hive.metastore.local
true

javax.jdo.option.ConnectionURL
jdbc:mysql://10.28.169.61:3306/hive_impala?createDatabaseIfNotExist=true

javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver

javax.jdo.option.ConnectionUserName
hadoop

javax.jdo.option.ConnectionPassword
123456

hive.security.authorization.enabled
false

hive.security.authorization.createtable.owner.grants
ALL

hive.querylog.location
${user.home}/hive-logs/querylog

(4)驗證成功狀態
完成以上步驟之後,驗證hive安裝是否成功
在mr5命令行執行hive,並輸入」show tables;」,出現以下提示,說明hive安裝成功:
>hive
hive>show tables;
OK
Time taken:18.952 seconds
hive>

6、impala安裝
說明:
(1)、以下1、2、3、4步是在root用戶分別在mr5、mr6、mr7、mr8下執行
(2)、以下第5步是在hadoop用戶下執行
(1)安裝依賴包:
安裝mysql-connector-java:
yum install mysql-connector-java
安裝bigtop
rpm -ivh bigtop-utils-0.4+300-1.cdh4.0.1.p0.1.el6.noarch.rpm
安裝libevent
rpm -ivhlibevent-1.4.13-4.el6.x86_64.rpm
如存在其他需要安裝的依賴包,可以到以下鏈接:
http://mirror.bit.e.cn/centos/6.3/os/x86_64/Packages/進行下載。
(2)安裝impala的rpm,分別執行
rpm -ivh impala-0.3-1.p0.366.el6.x86_64.rpm
rpm -ivh impala-server-0.3-1.p0.366.el6.x86_64.rpm
rpm -ivh impala-debuginfo-0.3-1.p0.366.el6.x86_64.rpm
rpm -ivh impala-shell-0.3-1.p0.366.el6.x86_64.rpm
(3)找到impala的安裝目錄
完成第1步和第2步後,通過以下命令:
find / -name impala
輸出:
/usr/lib/debug/usr/lib/impala
/usr/lib/impala
/var/run/impala
/var/log/impala
/var/lib/alternatives/impala
/etc/default/impala
/etc/alternatives/impala

找到impala的安裝目錄:/usr/lib/impala
(4)配置Impala
在Impala安裝目錄/usr/lib/impala下創建conf,將hadoop中的conf文件夾下的core-site.xml、hdfs-site.xml、hive中的conf文件夾下的hive-site.xml復制到其中。
在core-site.xml文件中添加如下內容:

dfs.client.read.shortcircuit
true

dfs.client.read.shortcircuit.skip.checksum
false

在hadoop和impala的hdfs-site.xml文件中添加如下內容並重啟hadoop和impala:

dfs.datanode.data.dir.perm
755

dfs.block.local-path-access.user
hadoop

dfs.datanode.hdfs-blocks-metadata.enabled
true

(5)啟動服務
(1)、在mr5啟動Impala state store,命令如下:
>GLOG_v=1 nohup statestored-state_store_port=24000 &
如果statestore正常啟動,可以在/tmp/statestored.INFO查看。如果出現異常,可以查看/tmp/statestored.ERROR定位錯誤信息。

(2)、在mr6、mr7、mr8啟動Impalad,命令如下:
mr6:
>GLOG_v=1 nohup impalad -state_store_host=mr5-nn=mr5 -nn_port=9000 -hostname=mr6 -ipaddress=10.28.169.113 &
mr7:
>GLOG_v=1 nohup impalad -state_store_host=mr5-nn=mr5 -nn_port=9000 -hostname=mr7 -ipaddress=10.28.169.114 &
mr8:
>GLOG_v=1 nohup impalad -state_store_host=mr5-nn=mr5 -nn_port=9000 -hostname=mr8 -ipaddress=10.28.169.115 &
如果impalad正常啟動,可以在/tmp/impalad.INFO查看。如果出現異常,可以查看/tmp/ impalad.ERROR定位錯誤信息。

(6)使用shell
使用impala-shell啟動Impala Shell,分別連接各Impalad主機(mr6、mr7、mr8),刷新元數據,之後就可以執行shell命令。相關的命令如下(可以在任意節點執行):
>impala-shell
[Not connected]> connect mr6:21000
[mr6:21000] >refresh
[mr6:21000]>connectmr7:21000
[mr7:21000]>refresh
[mr7:21000]>connectmr8:21000
[mr8:21000]>refresh
(7)驗證成功狀態
使用impala-shell啟動Impala Shell,分別連接各Impalad主機,刷新元數據,之後就可以執行shell命令。相關的命令如下(可以在任意節點執行):
>impala-shell
[Not connected]> connect mr6:21000
[mr6:21000]>refresh
[mr6:21000] >show databases
default
[mr6:21000] >
出現以上提示信息,說明安裝成功。

⑵ impala和hive的區別有什麼

impala和hive的區別主要有以下幾個:



1、執行計劃不同:

Impala:把執行計劃表現為一棵完整的執行計劃樹,可以更自然地分發執行計劃到各個Impalad執行查詢,而不用像Hive那樣把它組合成管道型的map-rece模式,以此保證Impala有更好的並發性和避免不必要的中間sort與shuffle。

Hive的執行計劃分成map-shuffle-rece-map-shuffle-rece…的模型。如果一個Query會被編譯成多輪MapRece,則會有更多的寫中間結果。由於MapRece執行框架本身的特點,過多的中間過程會增加整個Query的執行時間。

2、數據流不同:

Impala:採用拉的方式,後續節點通過getNext主動向前面節點要數據,以此方式數據可以流式的返回給客戶端,且只要有1條數據被處理完,就可以立即展現出來,而不用等到全部處理完成,更符合SQL互動式查詢使用。

Hive:採用推的方式,每一個計算節點計算完成後將數據主動推給後續節點。

3、所使用的內存不同:

Impala:在遇到內存放不下數據時,會直接返回錯誤,而不會利用外存,這使用得Impala目前處理Query會受到一定的限制,最好還是與Hive配合使用。Impala在多個階段之間利用網路傳輸數據,在執行過程不會有寫磁碟的操作(insert除外)。

Hive:在執行過程中如果內存放不下所有數據,則會使用外存,以保證Query能順序執行完。每一輪MapRece結束,中間結果也會寫入HDFS中,同樣由於MapRece執行架構的特性,shuffle過程也會有寫本地磁碟的操作。

4、調度不同:

Impala:調度由自己完成,目前只有一種調度器simple-schele,它會盡量滿足數據的局部性,掃描數據的進程盡量靠近數據本身所在的物理機器。

Hive:任務調度依賴於Hadoop的調度策略。

⑶ impala並發設置

impala並發設置通過查了Impala的代碼,出現這種報錯一般是由於兩種情況造成:
一種情況是可用內存不足;另一種情況是impalaservicepool已經滿了。
Impala是Cloudera公司主導開發的新型查詢系統,它提供SQL語義,能查詢存儲在Hadoop的HDFS和HBase中的PB級大數據。已有的Hive系統雖然也提供了SQL語義,但由於Hive底層執行使用的是MapRece引擎,仍然是一個批處理過程,難以滿足查詢的交互性。相比之下,Impala的最大特點也是最大賣點就是它的快速。
優點:Impala不需要把中間結果寫入磁碟,省掉了大量的I/O開銷。省掉了MapRece作業啟動的開銷。MapRece啟動task的速度很慢(默認每個心跳間隔是3秒鍾),Impala直接通過相應的服務進程來進行作業調度,速度快了很多。
Impala完全拋棄了MapRece這個不太適合做SQL查詢的範式,而是像Dremel一樣借鑒了MPP並行資料庫的思想另起爐灶,因此可做更多的查詢優化,從而省掉不必要的shuffle、sort等開銷。通過使用LLVM來統一編譯運行時代碼,避免了為支持通用編譯而帶來的不必要開銷。用C++實現,做了很多有針對性的硬體優化,例如使用SSE指令。使用了支持Datalocality的I/O調度機制,盡可能地將數據和計算分配在同一台機器上進行,減少了網路開銷。

⑷ Hadoop下的impala資料庫語法SQL應用

Impala的SQL解析與執行計劃生成部分是由impala-frontend(Java)實現的,監聽埠是21000。用戶通過Beeswax介面BeeswaxService.query()提交一個請求,在impalad端的處理邏輯是由void ImpalaServer::query(QueryHandle& query_handle, const Query& query)這個函數(在impala-beeswax-server.cc中實現)完成的。
在impala中一條SQL語句先後經歷BeeswaxService.Query->TClientRequest->TExecRequest,最後把TExecRequest交由impala-coordinator分發給多個backend處理。本文主要講一條SQL語句是怎麼一步一步變成TExecRequest的。

⑸ 在操作impala中我想對同一欄位根據不同條件去不同的表中查出數據來去修改它(寫在一條sql語句中)

參考代碼

updatejiagesetprice=casewhenUID>0andUID<=5then'$a'whenUID>5andUID<=10then'$b'whenUID>10andUID<=20then'$c'end

⑹ impala 是否可以循環插入

impala的insert into 語句「支持」循環插入,可以執行

⑺ impala怎麼解析sql語句

Impala的SQL解析與執行計劃生成部分是由impala-frontend(Java)實現的,監聽埠是21000。用戶通過Beeswax介面BeeswaxService.query()提交一個請求,在impalad端的處理邏輯是由void ImpalaServer::query(QueryHandle& query_handle, const Query& query)這個函數(在impala-beeswax-server.cc中實現)完成的。
在impala中一條SQL語句先後經歷BeeswaxService.Query->TClientRequest->TExecRequest,最後把TExecRequest交由impala-coordinator分發給多個backend處理。本文主要講一條SQL語句是怎麼一步一步變成TExecRequest的。
本文以下內容都以這樣的一個SQL為例說明:
select jobinfo.dt,user,
max(taskinfo.finish_time-taskinfo.start_time),
max(jobinfo.finish_time-jobinfo.submit_time)
from taskinfo join jobinfo on jobinfo.jobid=taskinfo.jobid
where jobinfo.job_status='SUCCESS' and taskinfo.task_status='SUCCESS'
group by jobinfo.dt,user

通過調用Status ImpalaServer::GetExecRequest(const TClientRequest& request, TExecRequest* result) 函數把TClientRequest轉化成TExecRequest
在這個函數里通過JNI介面調用frontend.createExecRequest()生成TExecRequest。首先調用AnalysisContext.analyze(String stmt)分析提交的SQL語句。
注釋:Analyzer對象是個存放這個SQL所涉及到的所有信息(包含Table, conjunct, slot,slotRefMap, eqJoinConjuncts等)的知識庫,所有跟這個SQL有關的東西都會存到Analyzer對象裡面。
1,SQL的詞法分析,語法分析
AnalysisContext.analyze(String stmt)會調用SelectStmt.analyze()函數,這個函數就是對SQL的analyze和向中央知識庫Analyzer register各種信息。
(1)處理這個SQL所涉及到的Table(即TableRefs),這些Table是在from從句中提取出來的(包含關鍵字from, join, on/using)。注意JOIN操作以及on/using條件是存儲在參與JOIN操作的右邊的表的TableRef中並分析的。依次analyze()每個TableRef,向Analyzer注冊registerBaseTableRef(填充TupleDescriptor)。如果對應的TableRef涉及到JOIN操作,還要analyzeJoin()。在analyzeJoin()時會向Analyzer registerConjunct()填充Analyzer的一些成員變數:conjuncts,tuplePredicates(TupleId與conjunct的映射),slotPredicates(SlotId與conjunct的映射),eqJoinConjuncts。本例中on從句是一種BinaryPredicate,然後onClause.analyze(analyzer)會遞歸analyze這個on從句里的各種組件。
(2)處理select從句(包含關鍵字select, MAX(), AVG()等聚集函數):分析這個SQL都select了哪幾項,每一項都是個Expr類型的子類對象,把這幾項填入resultExprs數組和colLabels。然後把resultExprs裡面的Expr都遞歸analyze一下,要分析到樹的最底層,向Analyzer注冊SlotRef等。
(3)分析where從句(關鍵字where),首先遞歸Analyze從句中Expr組成的樹,然後向Analyzer registerConjunct()填充Analyzer的一些成員變數(同1,此外還要填充whereClauseConjuncts) 。
(4)處理sort相關信息(關鍵字order by)。先是解析aliases和ordinals,然後從order by後面的從句中提取Expr填入orderingExprs,接著遞歸Analyze從句中Expr組成的樹,最後創建SortInfo對象。
(5)處理aggregation相關信息(關鍵字group by, having, avg, max等)。首先遞歸分析group by從句里的Expr,然後如果有having從句就像where從句一樣,先是analyze having從句中Expr組成的樹,然後向Analyzer registerConjunct()等。
(6)處理InlineView。
關於SQL解析中所涉及到的各種數據結構表示如下:

至此詞法分析,語法分析結束,有點像一個小的編譯器。我們現在回到frontend.createExecRequest()函數中。調用完AnalysisContext.analyze()之後,就開始填充TExecRequest內的成員變數。
(1)如果是DDL命令(use, show tables, show databases, describe),那麼調用createDdlExecRequest();
(2)另外一種情況就是Query或者DML命令,那麼就得創建和填充TQueryExecRequest了。
2,根據SQL語法樹生成執行計劃(PlanNode和PlanFragment的生成)
下面就是用Planner把SQL解析出的語法樹轉換成Plan fragments,後者能在各個backend被執行。
Planner planner = new Planner();
ArrayListfragments =
planner.createPlanFragments(analysisResult, request.queryOptions);
這個createPlanFragments()函數是frontend最重要的函數:根據SQL解析的結果和client傳入的query options,生成執行計劃。執行計劃是用PlanFragment的數組表示的,最後會序列化到TQueryExecRequest.fragments然後傳給backend的coordinator去調度執行。
下面進入Planner.createPlanFragments()函數看看執行計劃是怎麼生成的:
首先要搞清楚兩個概念:PlanNode和PlanFragment。
PlanNode是SQL解析出來的邏輯功能節點;PlanFragment是真正的執行計劃節點。
2.1,創建PlanNode
PlanNode singleNodePlan =
createQueryPlan(queryStmt, analyzer, queryOptions.getDefault_order_by_limit());
(1)這個函數首先根據from從句中的第一個TableRef創建一個PlanNode,一般為ScanNode(HdfsScanNode或者HBaseScanNode)。這個ScanNode關聯一個ValueRange的數組(由多個cluster column取值區間組成)表示要讀取的Table的范圍,還關聯一個conjunct(where從句)。
(2)這個SQL語句中TableRef中剩下的其他Table就需要建立HashJoinNode了。進入Planner.createHashJoinNode()函數:首先為這個Table建立ScanNode(同上),然後調用getHashLookupJoinConjuncts()獲取兩表或者多表JOIN的eqJoinConjuncts和eqJoinPredicates,利用這兩個條件創建HashJoinNode。每個HashJoinNode也是樹狀的,會有孩子節點,對於我們舉例的兩表JOIN,孩子節點分別是兩個表對應的ScanNode。(注意目前impala只支持一大一小兩個表的JOIN,默認是左大右小,是通過把右邊的小表分發到每個節點的內存中分別於左邊大表的一個區間進行JOIN過濾實現的。)
(3)如果有group by從句,創建AggregationNode,並把剛才的HashJoinNode設為它的孩子。這里暫時不考慮DISTINCT aggregation function。
(4)如果有order by… limit從句,創建SortNode。
這樣createQueryPlan()函數執行完畢,PlanNode組成的execution tree形成如下:

2.2,創建PlanFragment
接下來就看impala backend節點數目有多少,如果只有一個節點,那麼整棵執行樹都在同一個impalad上執行;否則調用createPlanFragments(singleNodePlan, isPartitioned, false, fragments)把PlanNode組成的執行樹轉換成PlanFragment組成的執行計劃。
下面進入createPlanFragments()這個函數:
這是一個遞歸函數,沿著PlanNode組成的執行樹遞歸下去,分別創建對應的Fragment。
(1)如果是ScanNode,創建一個PlanFragment(這個PlanFragment的root node是這個ScanNode,而且這個PlanFragment只包含一個PlanNode)。
(2)如果是HashJoinNode,並不是創建一個新的PlanFragment,而是修改leftChildFragment(是一個ScanNode)為以HashJoinNode作為root node的PlanFragment。因為對於HashJoinNode一般有兩個ScanNode孩子,在處理HashJoinNode之前已經把這兩個ScanNode變成了對應的PlanFragment。那麼此時要得到HashJoinNode作為root node的PlanFragment是通過Planner.createHashJoinFragment()函數完成的:首先把當前HashJoinNode作為HashJoinFragment的root node;然後把leftChildFragment中的root PlanNode(也就是參與JOIN的兩個表中左邊的那個表對應的ScanNode)作為HashJoinNode的左孩子;通過調用Planner.connectChildFragment()函數把HashJoinNode的右孩子設置為一個ExchangeNode(這個ExchangeNode表示一個1:n的數據流的receiver);同時把rightChildFragment(ScanNode作為root node)的destination設置為這個ExchangeNode。
(3)如果是AggregationNode,聚集操作很復雜了。以我們的例子來說明:如果這個AggregationNode不是DISTINCT aggregation的2nd phase(因為本例中的AggregationNode的孩子是HashJoinNode而不是另外一個AggregationNode),首先把剛才生成的HashJoinNode作為root node對應的PlanFragment的root node設置為該AggregationNode,並把原來的root node(即HashJoinNode)設為新root node的孩子。然後通過Planner.createParentFragment()創建一個包含ExchangeNode作為root node的新的PlanFragment。並把孩子PlanFragment的destination設置為這個ExchangeNode。然後在這個新的PlanFragment中創建一個新的AggregationNode作為新的root node並把剛才的ExchangeNode作為其孩子節點。
至此,createPlanFragments()調用完成,生成的三個PlanFragment如下:

通過createPlanFragments(singleNodePlan, isPartitioned, false, fragments)獲取了所以執行計劃PlanFragment組成的數組fragments,這個數組的最後一個元素就是根節點PlanFragment。然後就是調用PlanFragment.finalize()把這個執行計劃finalize(遞歸finalize每個PlanNode)同時為每個PlanFragment指定 DataStreamSink。
然後回到frontend.createExecRequest()函數中。執行完Planner.createPlanFragments()返回的ArrayList就是完整的執行計劃了。然後就是一次調用PlanFragment.toThrift()把它序列化到TQueryExecRequest。填充TQueryExecRequest的相關變數:dest_fragment_idx,per_node_scan_ranges,query_globals,result_set_metadata等。最後返回TExecRequest型的對象給backend執行。

⑻ impalasql查詢不是純數字的

不是純數字的。
Impala作為CDH中通用的即席查詢引擎,速度比spark、hive等要快很多,它到底做了什麼能讓查詢變快呢?如果對這個問題感興趣,就來看看這篇文章吧!本章中的內容都源自於impala論文,可能跟最新的版本有些脫節,但是仍然很值得參考。
一般查詢引擎都會分為Frontend和Backend兩部分,Frontend主要用於進行SQL的語法分析、詞法分析、邏輯優化等,Backend則偏向底層做物理優化。

⑼ 大數據查詢分析技術有哪些

Hive的核心工作就是把SQL語句翻譯成MR程序,可以將結構化的數據映射為一張資料庫表,並提供 HQL(Hive SQL)查詢功能。Hive本身不存儲和計算數據,它完全依賴於HDFS和MapRece。

Hive是為大數據批量處理而生的,它的出現解決了傳統的關系型資料庫(MySql、Oracle)在大數據處理上的瓶頸 。Hive 將執行計劃分成map->shuffle->rece->map->shuffle->rece…的模型。

Impala是對Hive的一個補充,可以實現高效的SQL查詢。使用Impala來實現SQL on Hadoop,用來進行大數據實時查詢分析。

Hive 適合於長時間的批處理查詢分析,而Impala適合於實時互動式SQL查詢,Impala給數據人員提供了快速實驗,驗證想法的大數據分析工具,可以先使用Hive進行數據轉換處理,之後使用Impala在Hive處理好後的數據集上進行快速的數據分析。

Spark擁有Hadoop MapRece所具有的特點,它將Job中間輸出結果保存在內存中,從而不需要讀取HDFS。Spark 啟用了內存分布數據集,除了能夠提供互動式查詢外,它還可以優化迭代工作負載。成都加米穀大數據培訓機構,小班教學,免費試聽。Spark 是在 Scala 語言中實現的,它將 Scala 用作其應用程序框架。與 Hadoop 不同,Spark 和 Scala 能夠緊密集成,其中的 Scala 可以像操作本地集合對象一樣輕松地操作分布式數據集。

關於大數據查詢分析技術有哪些,青藤小編就和您分享到這里了。如果您對大數據工程有濃厚的興趣,希望這篇文章可以為您提供幫助。如果您還想了解更多關於數據分析師、大數據工程師的技巧及素材等內容,可以點擊本站的其他文章進行學習。