美文网首页
大数据 - (五-1)- Impala

大数据 - (五-1)- Impala

作者: 啦啦啦喽啰 | 来源:发表于2020-08-14 17:30 被阅读0次

    什么是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
    <!--指定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具体配置
    • 引⽤用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

          本文链接:https://www.haomeiwen.com/subject/gededktx.html