什么是Impala
- 针对存储在
Hadoop的HDFS和HBase中的PB级大数据 - 进行交互式实时查询(速度快)
Impala有什么优势
- 大数据领域最大的问题是数据存储和分析
- 粗略划分大数据开发任务
- 数据采集(日志文件,关系型数据库)
- 数据清洗(数据格式整理,脏数据过滤)
- 数据预处理
- 数据分析
- 离线处理(T+1)
- 实时处理
- 数据可视化
- 机器学习
- 深度学习
Impala产生背景
-
Hive,MR适合离线批处理,不能进行交互性实时查询 - Impala采用MPP数据库技术,提高了查询技术
MPP是什么?
- (
Massively Parallel Processing)大规模并行处理,在MPP集群中,每个节点资源都是独立享有磁盘和内存 - 每个节点通过网络互相连接,彼此协同计算,作为整体提供数据服务
- MPP是将任务并行分散到多个服务器和节点上,每个节点计算完成后,将各自部分的结果汇总得到最终结果
- 对于
MPP架构的软件主要是聚合操作,局部聚合,全局聚合
Impala和Hive对比
-
Impala没有采用MR作为计算引擎,MR慢的原因:-
shuffle阶段->溢出到IO,有IO开销 -
shuffle阶段默认对`key·排序
-
-
Impala把整个查询任务转为一颗执行计划树 - 分发结束后,
Impala采用拉取方式获取上个执行阶段结果 - 把结果数据,按执行树流式传递汇集,减少中间磁盘读写的开销,默认不排序,(尽可能使用内存)
-
Impala采用服务的方式,避免每次都启动 - 底层使用
C++编写 - 优秀的
IO调度,HDFS短路读取
不同场景下Impala和Hive对比
查询过程
-
Hive:每个查询都有冷启动(map,reduce每次都需要启动,关闭) -
Impala:集群启动后,守护进程就准备就绪,即可接收、执行查询任务以,守护进程避免每次都启动关闭
交互式查询
-
Hive:不擅长交互式查询 -
Impala:查询速度快,适合数据集PB级的任务
计算引擎
-
Hive:基于MapReduce -
Impala:类似MPP数据库
容错
-
Hive:通过MR,Yarn机型 -
Impala:没有容错,遇到错误重新查询
速度
-
Impala比Hive快3-90倍
Impala缺点
- 百级节点,并发个数20个左右时,系统基本已经满负荷状态,处理
PB级别最佳 - 不能通过
Yarn统一资源管理调度,资源不能共享
适用场景
- Hive:复杂批处理任务,实时性不高,数据量庞大的
-
Impala:实时数据分析,配合Hive,对Hive数据结果实时分析
Impala安装
集群准备
- 安装
Hadoop,Hive,Impala需要引用Hive依赖包
准备Impala的所有依赖包
-
Impala的安装只提供了了rpm包没有提供tar包 - 通过
Yum进行安装
配置本地Yum源
-
Yum源是Centos当中下载软件rpm包的地址 - 使⽤用
httpd静态资源服务器来开放我们下载所有的rpm包- os1安装
httpd服务器
# yum⽅方式安装httpd服务器器 yum install httpd -y # 启动httpd服务器器 systemctl start httpd # 验证httpd⼯作是否正常,默认端⼝口是80,可以省略略 # http://os1- httpd默认存放⻚页⾯面路路径
/var/www/html/ - 链接到
httpd目录下
ln -s /sw/cdh/5.7.6 /var/www/html/cdh57 - os1安装
- 配置
/etc/selinux/config,解决403 forbidden- 将
SELINUX=enforcing改为SELINUX=disabled
- 将
- 修改Yum源配置⽂文件
-
name:对于当前源的描述 -
baseurl:访问当前源的地址信息 -
gpgcheck:1 0, gpg 校验 -
enabled:1/0是否使⽤用当前源
-
cd /etc/yum.repos.d
# 创建⼀一个新的配置⽂文件
vim local.repo #添加如下内容
[local]
name=local
baseurl=http://os1/cdh57/
gpgcheck=0
enabled=1
- 分发local.repo⽂文件到其它节点
rsync-script local.repo
安装Impala
集群规划
| 服务名称 | os1 | os2 | os3 |
|---|---|---|---|
| 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 - 官⽅方建议
statestore与catalog安装在同一节点上
逐步安装
- os3
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
- os1,os2
yum install impala-server -y
yum install impala-shell -y
配置Impala
- 修改
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>
分发Hive安装目录到集群节点
os3启动metastore服务
nohup hive --service metastore &
启动hiveserver2服务
nohup hive --service hiveserver2 &
修改HDFS集群hdfs-site.xml
- 配置
HDFS集群的短路路读取
短路路读取——就是Client与DataNode属于同⼀节点,无需再经过⽹络传输数据,直接本地读取
- 要配置短路路本地读,需要验证本机
Hadoop是否有libhadoop.so
短路路读取配置步骤
- 创建短路路读取本地中转站
#所有节点创建⼀一下⽬目录
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存储元数据信息开发开关 -->
<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集群
Impala具体配置
- 引⽤用
HDFS,Hive配置
# 所有节点执行
ln -s /opt/servers/hadoop-2.9.2/etc/hadoop/core-site.xml /etc/impala/conf/core-site.xml && ln -s /opt/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml /etc/impala/conf/hdfs-site.xml && ln -s /opt/servers/hive-2.3.7/conf/hive-site.xml /etc/impala/conf/hive-site.xml
ln -s /opt/servers/hive-2.3.7/lib/mysql-connector-java-5.1.49.jar /usr/share/java/mysql-connector-java.jar
- Impala⾃自身配置(所有节点)
vim /etc/default/impala
<!--节点更新如下内容 -->
IMPALA_CATALOG_SERVICE_HOST=os3
IMPALA_STATE_STORE_HOST=os3
- 所有节点创建
mysql的驱动包的软链接
#创建节点
mkdir -p /usr/share/java
ln -s /opt/servers/hive-2.3.7/lib/mysql-connector-java-5.1.49.jar /usr/share/java/mysql-connector-java.jar
- 修改
bigtop的JAVA_HOME路路径
vi /etc/default/bigtop-utils
export JAVA_HOME=/opt/servers/jdk1.8
启动Impala
#os3启动如下⻆角⾊色
service impala-state-store start
service impala-catalog start
service impala-server start
#其余节点启动如下⻆角⾊色
service impala-server start
浏览器器Web界⾯面验证
# 访问impalad的管理理界⾯面
http://os3:25000/
# 访问statestored的管理理界⾯面
http://os3:25010/
消除Impala影响
# 删除yum自动安装的依赖
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_*
Imapla的架构原理
Imapla组件
image.png
-
Impala是一个分布式 - 大规模并行处理(
MPP)数据库引擎 - 它包括多个进程
-
Impala与Hive类似,不是数据库,而是数据分析⼯具
impalad
- ⻆色名称为
Impala Daemon,是在每个节点上运行的进程,是Impala的核心组件,进程名是Impalad -
作用:负责读写数据⽂文件,接收来自
Impala-shell,JDBC、ODBC等的查询请求,与集群其它Impalad分布式并行完成查询任务,并将查询结果返回给中心协调者 - 为了保证
Impalad进程了解其它Impalad的健康状况,Impalad进程会⼀直与statestore保持通信 -
Impalad服务由三个模块组成:Query PlannerQuery CoordinatorQuery Executor- 前两个模块组成前端,负责接收
SQL查询请求 - 解析
SQL并转换成执⾏行行计划,交由后端执⾏
statestored
-
statestore监控集群中Impalad的健康状况,并将集群健康信息同步给Impalad -
statestore进程名为statestored
catalogd
-
Impala执⾏的SQL语句引发元数据发⽣生变化时,catalog服务负责把这些元数据的变化同步给其它Impalad进程(日志验证、监控statestore进程⽇日志) -
catalog服务对应进程名称是catalogd - 由于⼀个集群需要一个
catalogd以及⼀个statestored进程,而且catalogd进程所有请求都是经过statestored进程发送,所以官⽅建议让statestored进程与catalogd进程安排同个节点
Impala的查询
image.png
- 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的接⼝,读取查询结果。
- 客户端调⽤用获取
QueryPlanner⽣成单机的执行计划
image.png
- 第⼀步,先去扫描
t1表中需要的数据- 如果数据文件存储是列式存储,我们可以便利的扫描到所需的列
id,n1;
- 如果数据文件存储是列式存储,我们可以便利的扫描到所需的列
- 接着,需要与
t2表进⾏Join操作,扫描t2表与t1表类似获取到所需数据列id,n2;-
t1与t2表进⾏关联,关联之后再与t3表进⾏关联,这里Impala会使⽤谓词下推扫描t3表只取join所需数据;
-
- 对
group by进⾏相应的aggregation操作,最终是排序取出指定数量量的数据返回
分布式并⾏执行计划
- 分布式并行化执计划——在单机执行计划基础之上结合数据分布式存储的特点
- 按照任务的计算要求把单机执⾏计划拆分为多段子任务
-
每个子任务都是可以并⾏执⾏的
image.png
- 分布式执⾏行行计划中涉及到多表的
Join -
Impala会根据表的⼤⼩来决定Join的方式,主要有两种分别是: -
Hash Join,用于大表 -
Broadcast Join,用于小表 - 分布式并⾏行行计划流程:
- 1、
T1和T2使用Hash join,此时需要按照id的值分别将T1和T2分散到不同的Impalad进程,但是相同的id会散列到相同的Impalad进程,这样每一个Join之后是全部数据的一部分 - 2、
T1与T2,Join之后的结果数据再与T3表进行Join,此时T3表采用Broadcast方式把⾃己全部数据(id列) 广播到需要的Impala节点上 - 3、
T1,T2,T3在Join之后再根据Group by执⾏本地的预聚合,每一个节点的预聚合结果只是最终结果的⼀部分(不同的节点可能存在相同的group by的值),需要再进⾏一次全局的聚合 - 4、全局的聚合同样需要并行,则根据聚合列进⾏
Hash分散到不同的节点执行Merge运算(其实仍然是一次聚合运算),⼀般情况下为了较少数据的⽹络传输,Impala会选择之前本地聚合节点做全
局聚合⼯作。 - 5、通过全局聚合之后,相同的
key只存在于一个节点,然后对于每一个节点进行排序和TopN计算,最终将每一个全局聚合节点的结果返回给Coordinator进⾏合并、排序、limit计算,返回结果给⽤户
- 1、











网友评论