大数据 - (五-1)- Impala
2020-08-14 本文已影响0人
啦啦啦喽啰
什么是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 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的查询
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、