『壹』 在操作impala中我想對同一欄位根據不同條件去不同的表中查出數據來去修改它(寫在一條sql語句中)
參考代碼
updatejiagesetprice=casewhenUID>0andUID<=5then'$a'whenUID>5andUID<=10then'$b'whenUID>10andUID<=20then'$c'end
『貳』 impala 理論
impala介紹
Cloudera Imapala是一款開源的MPP架構的SQL查詢引擎,它提供在hadoop環境上的低延遲、高並發的BI/數據分析,是一款開源、與Hadoop高度集成,靈活可擴展的查詢分析引擎,目標是基於SQL提供高並發的即席查詢。
與其他的查詢引擎系統(如presto、spark sql、hive sql)不同,Impala基於 C++ 和Java編寫,支持Hadoop生態下的多種組件集成(如HDFS、HBase、Metastore、YARN、Sentry等),支持多種文件格式的讀寫(如Parqeut、Avro、RCFile等)。
標準的mpp架構,massively-parallel query execution engine,支持在上百台機器的Hadoop集群上執行快速查詢,對底層的存儲系統解耦,不像資料庫要求那麼嚴格,不同的底層存儲可以聯合查詢。
impala在大數據應用處於什麼環節及作用
impala在大數據應用領域中處於數據分析環節,利用mpp架構實現高效數據查詢,下游應用系統使用impala也比較多,尤其在應用集市查詢數據倉庫的時候使用的較多。
impala架構體系
impala由statestore、catalog、impala daemon(impalad)組成。
impala任務執行流程
impala支持的文件格式
Impala可以對Hadoop中大多數格式的文件進行查詢,通過create table和insert的方式將一部分格式的數據載入到table中,但值得注意的是,有一些格式的數據它是無法寫入的(write to),對於Impala無法寫入的數據格式,通常是通過Hive建表,使用Hive進行數據的寫入,然後使用Impala來對這些保存好的數據執行查詢操作。
impala與hive對比
impala數據類型
海汼部落原創文章,原文鏈接:(http://hainiubl.com/topics/75548)
『叄』 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執行。
『肆』 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 簡介
Impala是Cloudera公司主導開發的新型查詢系統,它提供SQL語義,能查詢存儲在Hadoop的HDFS和HBase中的PB級大數據。已有的Hive系統雖然也提供了SQL語義,但由於Hive底層執行使用的是MapRece引擎,仍然是一個批處理過程,難以滿足查詢的交互性。相比之下,Impala的最神友大特點也是最大賣點就是它的快速。
外文名:Impala
開發公司:Cloudera公司
釋坦瞎虧義:一種新型查詢系統
特點:快速作用提供SQL語義,能查詢存儲在Hadoop的HDFS和HBase中的PB級大數據
軟體授權:開源免費
什麼是Impala?
Impala是用於處理存儲在Hadoop集群中的大量數據的MPP(大規模並行讓神處理)SQL查詢引擎。 它是一個用C ++和Java編寫的開源軟體。 與其他Hadoop的SQL引擎相比,它提供了高性能和低延遲。
換句話說,Impala是性能最高的SQL引擎(提供類似RDBMS的體驗),它提供了訪問存儲在Hadoop分布式文件系統中的數據的最快方法。
優點
功能
『陸』 impala 是否可以循環插入
impala的insert into 語句「支持」循環插入,可以執行
『柒』 什麼是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)硬體要求
- 2、安裝准備
- (1)操作系統版本查看
- (2)機器准備
- (3)用戶准備
- (4)軟體准備
注意:Impala不支持在Debian/Ubuntu, SuSE, RHEL/CentOS 5.7系統中安裝。
在Join查詢過程中需要將數據集載入內存中進行計算,因此對安裝Impalad的內存要求較高。
>more/etc/issue
CentOSrelease 6.2 (Final)
Kernel on an m
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
在各個機器上新建用戶hadoop,並打通ssh
到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
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
exportJAVA_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
tarzcvf hadoop-2.0.0-cdh4.1.2.tar.gzhadoop-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)
http://mr5:50070/dfshealth.jsp
http://mr5:8088/cluster
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] >
出現以上提示信息,說明安裝成功。
『捌』 impalasql查詢不是純數字的
不是純數字的。
Impala作為CDH中通用的即席查詢引擎,速度比spark、hive等要快很多,它到底做了什麼能讓查詢變快呢?如果對這個問題感興趣,就來看看這篇文章吧!本章中的內容都源自於impala論文,可能跟最新的版本有些脫節,但是仍然很值得參考。
一般查詢引擎都會分為Frontend和Backend兩部分,Frontend主要用於進行SQL的語法分析、詞法分析、邏輯優化等,Backend則偏向底層做物理優化。
『玖』 怎樣提高impala sql 優化
調用虛函數。沒有編譯就解釋執行表達式(例如col1 + col2 < col3),致使在每個表達式上產生虛函數調用。(這當然依賴於安裝啟用,但是我們,也可能包括大多數其它人採用一種類似「Eval」函數,每一個操作符都會生效。)在這種情況下,表達式自身佔用早鬧資源很少,但虛函數調用的資源佔用是很多的。
各種類型的大的代碼分支判斷,操作符,以及沒有被查詢引用的函數。分支預測器可以緩和這類問題,陸碰罩但同時吵讓分支指令會阻止流水線的效率以及指令集的並行性。
不能傳送所有的常量。Impala能計算一個固定寬度的元組格式(列3位元組偏移值為16)。好處是這些常量不用重復寫入代碼,而不用在內存中去查找。
『拾』 python從impala提取數據,sql可正常執行,但返回失敗
當前在伺服器上部署python程序,遇到impala取數無法返回的情況。
1.1 確定當前遇到impala取數,數據量超過100條無法返回的情況。但在數據量低於10條時,可正常返回。
1.2 採用另一台伺服器進行測試,一切正常。
1.3 通過檢查可正常執行的服務的python工具庫的版本,發現有個別工具的版本不一致。調整後執行正常。
pip3 list