大数据 - (五-1)- Impala

什么是Impala

  • 针对存储在HadoopHDFSHBase中的PB级大数据
  • 进行交互式实时查询(速度快)

Impala有什么优势

  • 大数据领域最大的问题是数据存储和分析
  • 粗略划分大数据开发任务
    • 数据采集(日志文件,关系型数据库)
    • 数据清洗(数据格式整理,脏数据过滤)
    • 数据预处理
    • 数据分析
      • 离线处理(T+1)
      • 实时处理
    • 数据可视化
    • 机器学习
    • 深度学习

Impala产生背景

  • HiveMR适合离线批处理,不能进行交互性实时查询
  • 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:通过MRYarn机型
  • Impala:没有容错,遇到错误重新查询
速度
  • ImpalaHive3-90

Impala缺点

  • 百级节点,并发个数20个左右时,系统基本已经满负荷状态,处理PB级别最佳
  • 不能通过Yarn统一资源管理调度,资源不能共享

适用场景

  • Hive:复杂批处理任务,实时性不高,数据量庞大的
  • Impala:实时数据分析,配合Hive,对Hive数据结果实时分析

Impala安装

集群准备

  • 安装HadoopHiveImpala需要引用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
    
  • 配置/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-serverimpala-server出现异常时告知给其它impala-server,进程名叫做statestored
  • impala-catalogd:管理理和维护元数据(Hive),impala更新操作,把impala-server更新的元数据通知给其它impala-server,进程名catalogd
  • 官⽅方建议statestorecatalog安装在同一节点上
逐步安装
  • 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
 

  hive.metastore.uris
  thrift://linux121:9083,thrift://linux123:9083


  hive.metastore.client.socket.timeout
  3600

分发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



  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集群
Impala具体配置
  • 引⽤用HDFSHive配置
# 所有节点执行
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
  • 修改bigtopJAVA_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)数据库引擎
  • 它包括多个进程
  • ImpalaHive类似,不是数据库,而是数据分析⼯具
impalad
  • ⻆色名称为Impala Daemon,是在每个节点上运行的进程,是Impala的核心组件,进程名是Impalad
  • 作用:负责读写数据⽂文件,接收来自Impala-shellJDBCODBC等的查询请求,与集群其它 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之间有数据依赖关系,处理理过程中需要在原有的执⾏计划之上加入一些ExchangeNodeDataStreamSink信息等
        • Fragmentsql⽣成的分布式执⾏计划的一个子任务;
        • DataStreamSink:传输当前的Fragment输出数据到不同的节点
  • 3、任务调度和分发
    • CoordinatorFragment(⼦任务)根据数据分区信息发配到不同的Impalad节点上执行。
    • Impalad节点接收到执行Fragment请求交由Executor执行
  • 4、Fragment之间的数据依赖
    • 每一个Fragment的执行输出通过DataStreamSink发送到下一个FragmentFragment运行过程中不断向coordinator节点汇报当前运⾏行行状态。
  • 5、结果汇总
    • 查询的SQL通常情况下需要有一个单独的Fragment用于结果的汇总,
    • 它只在Coordinator节点运行,将多个节点的最终执行结果汇总,转换成ResultSet信息。
  • 6、获取结果
    • 客户端调⽤用获取ResultSet的接⼝,读取查询结果。

QueryPlanner⽣成单机的执行计划

image.png
  • 第⼀步,先去扫描t1表中需要的数据
    • 如果数据文件存储是列式存储,我们可以便利的扫描到所需的列idn1
  • 接着,需要与t2表进⾏Join操作,扫描t2表与t1表类似获取到所需数据列idn2
    • t1t2表进⾏关联,关联之后再与t3表进⾏关联,这里Impala会使⽤谓词下推扫描t3表只取join所需数据;
  • group by进⾏相应的aggregation操作,最终是排序取出指定数量量的数据返回

分布式并⾏执行计划

  • 分布式并行化执计划——在单机执行计划基础之上结合数据分布式存储的特点
    • 按照任务的计算要求把单机执⾏计划拆分为多段子任务
    • 每个子任务都是可以并⾏执⾏的


      image.png
  • 分布式执⾏行行计划中涉及到多表的Join
  • Impala会根据表的⼤⼩来决定Join的方式,主要有两种分别是:
  • Hash Join,用于大表
  • Broadcast Join,用于小表
  • 分布式并⾏行行计划流程:
    • 1、 T1T2使用Hash join,此时需要按照id的值分别将T1T2分散到不同的Impalad进程,但是相同的id会散列到相同的Impalad进程,这样每一个Join之后是全部数据的一部分
    • 2、T1T2Join之后的结果数据再与T3表进行Join,此时T3表采用Broadcast方式把⾃己全部数据(id列) 广播到需要的Impala节点上
    • 3、T1,T2,T3Join之后再根据Group by执⾏本地的预聚合,每一个节点的预聚合结果只是最终结果的⼀部分(不同的节点可能存在相同的group by的值),需要再进⾏一次全局的聚合
    • 4、全局的聚合同样需要并行,则根据聚合列进⾏Hash分散到不同的节点执行Merge运算(其实仍然是一次聚合运算),⼀般情况下为了较少数据的⽹络传输, Impala会选择之前本地聚合节点做全
      局聚合⼯作。
    • 5、通过全局聚合之后,相同的key只存在于一个节点,然后对于每一个节点进行排序和TopN计算,最终将每一个全局聚合节点的结果返回给Coordinator进⾏合并、排序、limit计算,返回结果给⽤户

你可能感兴趣的:(大数据 - (五-1)- Impala)