一、Impala概述(Impala是什什么,优势,劣势,与Hive对⽐)
Impala是什什么
Impala是Cloudera提供的⼀一款开源的针对HDFS和HBASE中的PB级别数据进⾏行行交互式实时查询(Impala速度快),Impala是参照⾕谷歌的新三篇论⽂文当中的Dremel实现⽽而来,其中旧三篇论⽂文分别是(BigTable,GFS,MapReduce)分别对应我们即将学的HBase和已经学过的HDFS以及MapReduce。
Impala最⼤大卖点和最⼤大特点就是快速,Impala中⽂文翻译是⾼高⻆角羚⽺羊。
Impala优势
回顾前⾯面⼤大数据课程路路线其实就是⼀一个⼤大数据从业者⾯面对的⼤大数据相关技术发展的过程,技术发展以及更更新换代的原因就是⽼老老的技术架构遇到新的问题,有些问题可以通过不不断优化代码优化设计得以解决,有⼀一些问题就不不再是简简单单修改代码就能解决,需要从框架本身架构设计上改变,以⾄至于需要推到重建。
在⼤大数据领域主要解决的问题是数据的存储和分析,但是其实⼀一个完整的⼤大数据分析任务如果细分会有⾮非常多具体的场景,⾮非常多的环节;并没有⼀一个类似Java Web的Spring框架实现⼤大⼀一统的局⾯面。
⽐比如我们按照阶段划分⼀一个⼤大数据开发任务,会有:数据采集(⽇日志⽂文件,关系型数据库中),数据清洗(数据格式整理理,脏数据过滤等),数据预处理理(为了了后续分析所做的⼯工作),数据分析:离线处理理(T+1分析),实时处理理(数据到来即分析),数据可视化,机器器学习,深度学习等⾯面对如此众多的阶段再加上⼤大数据天⽣生的⼤大数据量量问题没有任何⼀一个框架可以完美cover以上每个阶段。所以⼤大数据领域有⾮非常多框架,每个框架都有最适合⾃自⼰己的具体场景。⽐比如:HDFS负责⼤大数据量量存储,MapReduce(Hive)负责⼤大数据量量的分析计算
Impala的诞⽣
之前学习的Hive以及MR适合离线批处理理,但是对交互式查询的场景⽆无能为⼒力力(要求快速响应),所以为了了解决查询速度的问题,Cloudera公司依据Google的Dremel开发了了Impala,Impala抛弃了了MapReduce使⽤用了了类似于传统的MPP数据库技术,⼤大⼤大提⾼高了了查询的速度。
MPP是什什么?
MPP (Massively Parallel Processing),就是⼤大规模并⾏行行处理理,在MPP集群中,每个节点资源都是独⽴享有也就是有独⽴立的磁盘和内存,每个节点通过⽹网络互相连接,彼此协同计算,作为整体提供数据服务。
简单来说,MPP是将任务并⾏行行的分散到多个服务器器和节点上,在每个节点上计算完成后,将各⾃自部分的结果汇总在⼀一起得到最终的结果
对于MPP架构的软件来说聚合操作⽐比如计算某张表的总条数,则先进⾏行行局部聚合(每个节点并⾏行行计算),然后把局部汇总结果进⾏行行全局聚合(与Hadoop相似)。
Impala的技术优势
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优势总结
- Impala最⼤大优点就是查询速度快,在⼀一定数据量量下;
- 速度快的原因:避免了了MR引擎的弊端,采⽤用了了MPP数据库技术,
Impala的缺点
- Impala属于MPP架构,只能做到百节点级,⼀一般并发查询个数达到20左右时,整个系统的吞吐已经达到满负荷状态,在扩容节点也提升不不了了吞吐量量,处理理数据量量在PB级别最佳。
- 资源不不能通过YARN统⼀一资源管理理调度,所以Hadoop集群⽆无法实现Impala、Spark、Hive等组件的动态资源共享。
适⽤用场景
Hive: 复杂的批处理理查询任务,数据转换任务,对实时性要求不不⾼高同时数据量量⼜又很⼤大的场景。
Impala:实时数据分析,与Hive配合使⽤用,对Hive的结果数据集进⾏行行实时分析。impala不能完全取代hive,impala可以直接处理理hive表中的数据。
二、Impala的安装(制作本地Yum源⽅方式安装)
集群准备
-
安装Hadoop,Hive
Impala的安装需要提前装好Hadoop,Hive这两个框架,
hive需要在所有的Impala安装的节点上⾯面都要有,因为Impala需要引⽤用Hive的依赖包,
hadoop的框架需要⽀支持C程序访问接⼝口,查看下图,如果有该路路径有.so结尾⽂文件,就证明⽀支持C接口。
准备Impala的所有依赖包
Cloudera公司对于Impala的安装只提供了了rpm包没有提供tar包;所以我们选择使⽤用Cloudera的rpm包进⾏行行Impala的安装,但是另外⼀一个问题,Impala的rpm包依赖⾮非常多的其他的rpm包,我们可以⼀一个个的将依赖找出来,但是这种⽅方式实在是浪费时间。
Linux系统中对于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命令(本机,跨⽹网络节点)可以通过⽹网络访问到本地源,我们使⽤用Httpd这种静态资源服务器来开放我们下载所有的rpm包。
- Linux121安装Httpd服务器
#yum⽅方式安装httpd服务器器
yum install httpd -y
#启动httpd服务器器
systemctl start httpd
#验证httpd⼯工作是否正常,默认端⼝口是80,可以省略略
http://linux121
- 新建⼀一个测试⻚页⾯面
httpd默认存放⻚页⾯面路路径
/var/www/html/
新建⼀一个⻚页⾯面test.html
this is a new page!!
访问
http://linux121/test.html
注:后续可以把下载的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。选择⼀一个磁盘空间够的节点,后续还要把压缩包解压所以磁盘空间要剩余10G以上。该包在资料料中提供给⼤大家。
移动该安装包到/opt/lagou/software
解压缩
tar -zxvf cdh5.7.6-centos7.tar.gz
- 使⽤用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
将SELINUX=enforcing改为SELINUX=disabled
修改之后要记得重启机器器!!之前修改过可以不不⽤用修改!!
- 修改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,是否使⽤用当前源
- 分发local.repo⽂文件到其它节点
rsync-script local.repo
安装Impala
-
集群规划
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
官⽅方建议statestore与catalog安装在同⼀一节点上!!
具体安装步骤
- 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
hive.metastore.uris
thrift://linux121:9083,thrift://linux123:9083
hive.metastore.client.socket.timeout
3600
- 分发Hive安装包到集群节点
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将数据发送到客户端。所谓“短路路”是指Client客户端直接读取⽂文件。很明显,这种情况只在客户端与数据放在同⼀一地点(译者注:同⼀一主机)时才有可能发⽣生。短路路读对于许多应⽤用程序会带来重⼤大的性能提升。
短路路读取:就是Client与DataNode属于同⼀一节点,⽆无需再经过⽹网络传输数据,直接本地读取。
要配置短路路本地读,需要验证本机Hadoop是否有libhadoop.so;
进⼊入⼀一下⽬目录:
/opt/lagou/servers/hadoop-2.9.2/lib/native
短路路读取配置步骤
- 创建短路路读取本地中转站
#所有节点创建⼀一下⽬目录
mkdir -p /var/lib/hadoop-hdfs
- 修改hdfs-site.xml
dfs.client.read.shortcircuit
true
dfs.domain.socket.path
/var/lib/hadoop-hdfs/dn_socket
dfs.datanode.hdfs-blocks-metadata.enabled
true
dfs.client.file-block-storage-locations.timeout
30000
注:分发到集群其它节点。重启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。
执⾏行行以下命令把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
注:所有节点都要执⾏行行此命令!
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
修改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
#其余节点启动如下⻆角⾊色
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等会发现,命令⽂文件是/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⼊入⻔门案例例
使⽤用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上,创建⼀一张
Impala外部表,将外部表的存储位置指向数据⽂文件的位置即可。(类似Hive)
通过Insert⽅方式插⼊入数据,适⽤用于我们没有数据⽂文件的场景。
- 准备数据⽂文件
user.csv
392456197008193000,张三,20,0
267456198006210000,李李四,25,1
892456199007203000,王五,24,1
492456198712198000,赵六,26,2
392456197008193000,张三,20,0
392456197008193000,张三,20,0
- 创建HDFS 存放数据的路路径
hadoop fs -mkdir -p /user/impala/t1
#上传本地user.csv到hdfs /user/impala/table1
hadoop fs -put user.csv /user/impala/t1
- 创建表
#进⼊入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';
- 查询数据
[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 |
+--------------------+------+-----+--------+
- 创建t2表
#创建⼀一个内部表
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中的数据,发现通过Impala创建的表,导⼊入的数据都可以被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元数据命令:
⼿手动执⾏行行invalidate metadata ,(后续详细讲解)
Impala是通过Hive的metastore服务来访问和操作Hive的元数据,但是Hive对表进⾏行行创建删
除修改等操作,Impala是⽆无法⾃自动识别到Hive中元数据的变更更情况的,如果想让Impala识别到Hive元数据的变化,所以需要进⼊入impala-shell之后⾸首先要做的操作就是执⾏行行invalidate metadata,该命令会将所有的Impala的元数据失效并重新从元数据库同步元数据信息。后⾯详细讲解元数据更更新命令。 - Impala操作HDFS使⽤用的是Impala⽤用户,所以为了了避免权限问题,我们可以选择关闭权限校验
在hdfs-site.xml中添加如下配置:
dfs.permissions.enabled
false
三、Impala的架构原理理(有哪些组件,组件的作⽤用,查询流程,查询计划)
Impala的组件
Impala是⼀一个分布式,⼤大规模并⾏行行处理理(MPP)数据库引擎,它包括多个进程。Impala与Hive类似不不是数据库⽽而是数据分析⼯工具;
#在linux123执⾏行行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,是在每个节点上运⾏行行的进程,是Impala的核⼼心组件,进程名是Impalad;
作⽤用,负责读写数据⽂文件,接收来⾃自Impala-shell,JDBC,ODBC等的查询请求,与集群其它Impalad分布式并⾏行行完成查询任务,并将查询结果返回给中⼼心协调者。
为了了保证Impalad进程了了解其它Impalad的健康状况,Impalad进程会⼀一直与statestore保持通信。
Impalad服务由三个模块组成:Query Planner、Query Coordinator和Query Executor,前两个
模块组成前端,负责接收SQL查询请求,解析SQL并转换成执⾏行行计划,交由后端执⾏行行, - statestored
statestore监控集群中Impalad的健康状况,并将集群健康信息同步给Impalad,
statestore进程名为statestored - catalogd
Impala执⾏行行的SQL语句句引发元数据发⽣生变化时,catalog服务负责把这些元数据的变化同步给其它Impalad进程(⽇日志验证,监控statestore进程⽇日志)
catalog服务对应进程名称是catalogd
由于⼀一个集群需要⼀一个catalogd以及⼀一个statestored进程,⽽而且catalogd进程所有请求都是经过statestored进程发送,所以官⽅方建议让statestored进程与catalogd进程安排同个节点。
Impala的查询
- Client提交任务
Client发送⼀一个SQL查询请求到任意⼀一个Impalad节点,会返回⼀一个queryId⽤用于之后的客户端操作。 - ⽣生成单机和分布式执⾏行行计划
SQL提交到Impalad节点之后,Analyser依次执⾏行行SQL的词法分析、语法分析、语义分析等操作;
从MySQL元数据库中获取元数据,从HDFS的名称节点中获取数据地址,以得到存储这个查询相关数据的所有数据节点
单机执⾏行行计划: 根据上⼀一步对SQL语句句的分析,由Planner先⽣生成单机的执⾏行行计划,该执⾏行行计划是有PlanNode组成的⼀一棵树,这个过程中也会执⾏行行⼀一些SQL优化,例例如Join顺序改变、谓词下推等。
分布式并⾏行行物理理计划:将单机执⾏行行计划转换成分布式并⾏行行物理理执⾏行行计划,物理理执⾏行行计划由⼀一个个的Fragment组成,Fragment之间有数据依赖关系,处理理过程中需要在原有的执⾏行行计划之上加⼊入⼀一些ExchangeNode和DataStreamSink信息等。
Fragment : sql⽣生成的分布式执⾏行行计划的⼀一个⼦子任务;
DataStreamSink:传输当前的Fragment输出数据到不不同的节点 - 任务调度和分发
Coordinator将Fragment(⼦子任务)根据数据分区信息发配到不不同的Impalad节点上执⾏行行。Impalad节点接收到执⾏行行Fragment请求交由Executor执⾏行行。 - Fragment之间的数据依赖
每⼀一个Fragment的执⾏行行输出通过DataStreamSink发送到下⼀一个Fragment,Fragment运⾏行行过程中不不断向coordinator节点汇报当前运⾏行行状态。 - 结果汇总
查询的SQL通常情况下需要有⼀一个单独的Fragment⽤用于结果的汇总,它只在Coordinator节点运⾏行行,将多个节点的最终执⾏行行结果汇总,转换成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⽣生成单机的执⾏行行计划
分析上⾯面的单机执⾏行行计划,第⼀一步先去扫描t1表中需要的数据,如果数据⽂文件存储是列列式存储我们可以便便利利的扫描到所需的列列id,n1;接着需要与t2表进⾏行行Join操作,扫描t2表与t1表类似获取到所需数据列列id,n2;t1与t2表进⾏行行关联,关联之后再与t3表进⾏行行关联,这⾥里里Impala会使⽤用谓词下推扫描t3表只取join所需数据;对group by进⾏行行相应的aggregation操作,最终是排序取出指定数量量的数据返回。
分布式并⾏行行执⾏行行计划所谓的分布式并⾏行行化执⾏行行计划就是在单机执⾏行行计划基础之上结合数据分布式存储的特点,按照任务的计算要求把单机执⾏行行计划拆分为多段⼦子任务,每个⼦子任务都是可以并⾏行行执⾏行行的。上⾯面的单机执⾏行行计划转为分布式并⾏行行执⾏行行计划如下图所示:
分布式并⾏行行执⾏行行计划流程图
分布式执⾏行行计划中涉及到多表的Join,Impala会根据表的⼤大⼩小来决定Join的⽅方式,主要有两种分别是Hash
Join与Broadcast Join
上⾯面分布式执⾏行行计划中可以看出T1,T2表⼤大⼀一些,⽽而T3表⼩小⼀一些,所以对于T1与T2的Join Impala选择使⽤用Hash Join,对于T3表选择使⽤用Broadcast ⽅方式,直接把T3表⼴广播到需要Join的节点上。
分布式并⾏行行计划流程
- T1和T2使⽤用Hash join,此时需要按照id的值分别将T1和T2分散到不不同的Impalad进程,但是相同的id会散列列到相同的Impalad进程,这样每⼀一个Join之后是全部数据的⼀一部分
- T1与T2Join之后的结果数据再与T3表进⾏行行Join,此时T3表采⽤用Broadcast⽅方式把⾃自⼰己全部数据(id列列)⼴广播到需要的Impala节点上
- T1,T2,T3Join之后再根据Group by执⾏行行本地的预聚合,每⼀一个节点的预聚合结果只是最终结果的⼀一部分(不不同的节点可能存在相同的group by的值),需要再进⾏行行⼀一次全局的聚合。
- 全局的聚合同样需要并⾏行行,则根据聚合列列进⾏行行Hash分散到不不同的节点执⾏行行Merge运算(其实仍然是⼀一次聚合运算),⼀一般情况下为了了较少数据的⽹网络传输, Impala会选择之前本地聚合节点做全局聚合⼯工作。
- 通过全局聚合之后,相同的key只存在于⼀一个节点,然后对于每⼀一个节点进⾏行行排序和TopN计算,最终将每⼀一个全局聚合节点的结果返回给Coordinator进⾏行行合并、排序、limit计算,返回结果给⽤用户.