Impala的介绍、使用和原理架构
作者:mmseoamin日期:2023-12-14

文章目录

  • 简介
    • 介绍
    • Impala与Hive关系
    • Impala与Hive异同
      • Impala使用的优化技术
      • 执行计划
      • 数据流
      • 内存使用
      • 调度
      • 容错
      • 适用面
      • 优缺点
      • Impala架构
      • Impala查询处理过程
        • 处理过程
        • 单机执行计划
        • 分布式执行计划
        • Impala安装部署
          • 安装前提
          • 下载安装包、依赖包
          • 虚拟机新增磁盘(可选)
          • 配置本地yum源
          • 安装Impala
          • 修改Hadoop、Hive配置
          • 修改impala配置
          • 启动、关闭impala服务
          • Impala-shell命令参数
            • impala-shell外部命令
            • impala-shell内部命令
            • Impala sql语法
              • 数据库特定语句
                • 创建数据库
                • 删除数据库
                • 表特定语句
                  • create table语句
                  • insert语句
                  • select语句
                  • describe语句
                  • alter table
                  • delete、truncate table
                  • view视图
                  • order by子句
                  • group by、having子句
                  • limit、offset
                  • with子句
                  • distinct
                  • Impala数据导入方式
                  • Impala的java开发

                    简介

                    介绍

                    impala是cloudera提供的一款高效率的sql查询工具,提供实时的查询效果,官方测试性能比hive快10到100倍,其sql查询比sparkSQL还要更加快速,号称是当前大数据领域最快的查询sql工具,

                    impala是参照谷歌的新三篇论文(Caffeine–网络搜索引擎、Pregel–分布式图计算、Dremel–交互式分析工具)当中的Dremel实现而来,其中旧三篇论文分别是(BigTable,GFS,MapReduce)分别对应我们即将学的HBase和已经学过的HDFS以及MapReduce。

                    impala是基于hive并使用内存进行计算,兼顾数据仓库,具有实时,批处理,多并发等优点。

                    Impala与Hive关系

                    impala是基于hive的大数据分析查询引擎,直接使用hive的元数据库metadata,意味着impala元数据都存储在hive的metastore当中,并且impala兼容hive的绝大多数sql语法。所以需要安装impala的话,必须先安装hive,保证hive安装成功,并且还需要启动hive的metastore服务。

                    Hive元数据包含用Hive创建的database、table等元信息。元数据存储在关系型数据库中,如Derby、MySQL等。

                    客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。

                    nohup hive --service metastore >> ~/metastore.log 2>&1 &

                    Impala的介绍、使用和原理架构,第1张

                    Hive适合于长时间的批处理查询分析,而Impala适合于实时交互式SQL查询。可以先使用hive进行数据转换处理,之后使用Impala在Hive处理后的结果数据集上进行快速的数据分析。

                    Impala与Hive异同

                    Impala 与Hive都是构建在Hadoop之上的数据查询工具各有不同的侧重适应面,但从客户端使用来看Impala与Hive有很多的共同之处,如数据表元数据、ODBC/JDBC驱动、SQL语法、灵活的文件格式、存储资源池等。

                    但是Impala跟Hive最大的优化区别在于:没有使用 MapReduce进行并行计算,虽然MapReduce是非常好的并行计算框架,但它更多的面向批处理模式,而不是面向交互式的SQL执行。与 MapReduce相比,Impala把整个查询分成一执行计划树,而不是一连串的MapReduce任务,在分发执行计划后,Impala使用拉式获取数据的方式获取结果,把结果数据组成按执行树流式传递汇集,减少的了把中间结果写入磁盘的步骤,再从磁盘读取数据的开销。Impala使用服务的方式避免每次执行查询都需要启动的开销,即相比Hive没了MapReduce启动时间。

                    Impala的介绍、使用和原理架构,第2张

                    Impala使用的优化技术

                    • 没有使用MapReduce进行并行计算,虽然MapReduce是非常好的并行计算框架,但它更多的面向批处理模式,而不是面向交互式的SQL执行。与MapReduce相比:Impala把整个查询分成一执行计划树,而不是一连串的MapReduce任务,在分发执行计划后,Impala使用拉式获取数据的方式获取结果,把结果数据组成按执行树流式传递汇集,减少的了把中间结果写入磁盘的步骤,再从磁盘读取数据的开销。Impala使用服务的方式避免每次执行查询都需要启动的开销,即相比Hive没了MapReduce启动时间。
                    • 使用LLVM产生运行代码,针对特定查询生成特定代码,同时使用Inline的方式减少函数调用的开销,加快执行效率。
                    • 充分利用可用的硬件指令(SSE4.2)。
                    • 更好的IO调度,Impala知道数据块所在的磁盘位置能够更好的利用多磁盘的优势,同时Impala支持直接数据块读取和本地代码计算checksum。
                    • 通过选择合适的数据存储格式可以得到最好的性能(Impala支持多种存储格式)。
                    • 最大使用内存,中间结果不写磁盘,及时通过网络以stream的方式传递。

                      执行计划

                      Hive: 依赖于MapReduce执行框架,执行计划分成 map->shuffle->reduce->map->shuffle->reduce…的模型。如果一个Query会 被编译成多轮MapReduce,则会有更多的写中间结果。由于MapReduce执行框架本身的特点,过多的中间过程会增加整个Query的执行时间。

                      Impala: 把执行计划表现为一棵完整的执行计划树,可以更自然地分发执行计划到各个Impalad执行查询,而不用像Hive那样把它组合成管道型的 map->reduce模式,以此保证Impala有更好的并发性和避免不必要的中间sort与shuffle。

                      数据流

                      Hive: 采用推的方式,每一个计算节点计算完成后将数据主动推给后续节点。

                      Impala: 采用拉的方式,后续节点通过getNext主动向前面节点要数据,以此方式数据可以流式的返回给客户端,且只要有1条数据被处理完,就可以立即展现出来,而不用等到全部处理完成,更符合SQL交互式查询使用。

                      内存使用

                      Hive: 在执行过程中如果内存放不下所有数据,则会使用外存,以保证Query能顺序执行完。每一轮MapReduce结束,中间结果也会写入HDFS中,同样由于MapReduce执行架构的特性,shuffle过程也会有写本地磁盘的操作。

                      Impala: 在遇到内存放不下数据时,版本1.0.1是直接返回错误,而不会利用外存,以后版本应该会进行改进。这使用得Impala目前处理Query会受到一定的限制,最好还是与Hive配合使用。

                      调度

                      Hive: 任务调度依赖于Hadoop的调度策略。

                      Impala: 调度由自己完成,目前只有一种调度器simple-schedule,它会尽量满足数据的局部性,扫描数据的进程尽量靠近数据本身所在的物理机器。调度器 目前还比较简单,在SimpleScheduler::GetBackend中可以看到,现在还没有考虑负载,网络IO状况等因素进行调度。但目前 Impala已经有对执行过程的性能统计分析,应该以后版本会利用这些统计信息进行调度吧。

                      容错

                      Hive: 依赖于Hadoop的容错能力。

                      Impala: 在查询过程中,没有容错逻辑,如果在执行过程中发生故障,则直接返回错误(这与Impala的设计有关,因为Impala定位于实时查询,一次查询失败, 再查一次就好了,再查一次的成本很低)。

                      适用面

                      Hive: 复杂的批处理查询任务,数据转换任务。

                      Impala:实时数据分析,因为不支持UDF,能处理的问题域有一定的限制,与Hive配合使用,对Hive的结果数据集进行实时分析。

                      优缺点

                      优点:

                      • 基于内存进行计算,能够对PB级数据进行交互式实时查询、分析

                      • 无需转换为MR,直接读取HDFS及Hbase数据 ,从而大大降低了延迟。

                        Impala没有MapReduce批处理,而是通过使用与商用并行关系数据库中类似的分布式查询引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分组成

                      • C++编写,LLVM统一编译运行

                        在底层对硬件进行优化, LLVM:编译器,比较稳定,效率高

                      • 兼容HiveSQL

                        支持hive基本的一些查询等,hive中的一些复杂结构是不支持的

                      • 具有数据仓库的特性,可对hive数据直接做数据分析

                      • 支持Data Local

                        数据本地化:无需数据移动,减少数据的传输

                      • 支持列式存储

                        可以和Hbase整合:因为Hive可以和Hbase整合

                      • 支持JDBC/ODBC远程访问

                        缺点:

                        • 对内存依赖大

                          只在内存中计算,官方建议128G(一般64G基本满足),可优化: 各个节点汇总的节点(服务器)内存选用大的,不汇总节点可小点

                        • C++编写 开源 ?

                          对于java, C++可能不是很了解

                        • 完全依赖hive

                        • 实践过程中分区超过1w 性能严重下下降

                          定期删除没有必要的分区,保证分区的个数不要太大

                        • 稳定性不如hive

                          因完全在内存中计算,内存不够,会出现问题, hive内存不够,可使用外存

                        • Impala不提供任何对序列化和反序列化的支持。

                        • Impala只能读取文本文件,而不能读取自定义二进制文件。

                        • 每当新的记录/文件被添加到HDFS中的数据目录时,该表需要被刷新。

                          Impala架构

                          Impala主要由Impalad、 State Store、Catalogd和CLI组成。

                          Impala的介绍、使用和原理架构,第3张

                          (1)Impalad

                          Impalad: 与DataNode运行在同一节点上,由Impalad进程表示,它接收客户端(Impala-shell,JDBC,ODBC)的查询请求(接收查询请求的Impalad为Coordinator,Coordinator通过JNI调用java前端解释SQL查询语句,生成查询计划树,再通过调度器把执行计划分发给具有相应数据的其它Impalad进行执行),读写数据,并行执行查询,并把结果通过网络流式的传送回给Coordinator,由Coordinator返回给客户端。

                          同时Impalad也与State Store保持连接,用于确定哪个Impalad是健康和可以接受新的工作。

                          Impalad服务由三个模块组成:Query Planner、Query Coordinator和Query Executor,前两个模块组成前端,负责接收SQL查询请求,解析SQL并转换成执⾏计划,交由后端执⾏。

                          在Impalad中启动三个ThriftServer: beeswax_server(连接客户端),hs2_server(借用Hive元数据), be_server(Impalad内部使用)和一个ImpalaServer服务。

                          (2)Impala State Store

                          Impala State Store: 跟踪集群中的Impalad的健康状态及位置信息,并将集群健康信息同步给Impalad。由statestored进程表示,它通过创建多个线程来处理Impalad的注册订阅和与各Impalad保持心跳连接,各Impalad都会缓存一份State Store中的信息,当State Store离线后(Impalad发现State Store处于离线时,会进入recovery模式,反复注册,当State Store重新加入集群后,自动恢复正常,更新缓存数据)因为Impalad有State Store的缓存仍然可以工作,但会因为有些Impalad失效了,而已缓存数据无法更新,导致把执行计划分配给了失效的Impalad,导致查询失败。

                          (3)CLI

                          CLI: 提供给用户查询使用的命令行工具(Impala Shell使用python实现),同时Impala还提供了Hue,JDBC, ODBC使用接口。

                          (4)Catalogd

                          Catalogd:catalog服务对应进程名称是catalogd。作为metadata访问网关,从Hive Metastore等外部catalog中获取元数据信息,放到impala自己的catalog结构中。impalad执行ddl命令时通过catalogd由其代为执行,该更新则由statestored广播。

                          Impala执⾏的SQL语句引发元数据发⽣变化时,catalog服务负责把这些元数据的变化同步给其它Impalad进程(⽇志验证,监控statestore进程⽇志)

                          catalogd会在Impala集群启动的时候加载hive元数据信息到Impala,其他时候不会主动加载,需要使用invalidate metadata,refresh命令。

                          由于⼀个集群需要⼀个catalogd以及⼀个statestored进程,⽽且catalogd进程所有请求都是经过statestored进程发送,所以官⽅建议让statestored进程与catalogd进程安排同个节点

                          Impala查询处理过程

                          处理过程

                          Impalad分为Java前端与C++处理后端,接受客户端连接的Impalad即作为这次查询的Coordinator。Coordinator通过JNI调用Java前端对用户的查询SQL进行分析生成执行计划树,Java前端产生的执行计划树以Thrift数据格式返回给C++后端(Coordinator)。

                          Impala的介绍、使用和原理架构,第4张

                          • Client提交任务

                            Client发送⼀个SQL查询请求到任意⼀个Impalad节点,会返回⼀个queryId⽤于之后的客户端操作。

                          • 生成查询计划(单机计划、分布式执行计划)

                            SQL提交到Impalad节点之后,Analyser依次执⾏SQL的词法分析、语法分析、语义分析等操作;从MySQL元数据库中获取元数据,从HDFS的名称节点中获取数据地址,以得到存储这个查询相关数据的所有数据节点。

                          • 单机执行计划:根据上⼀步对SQL语句的分析,由Planner先⽣成单机的执⾏计划,该执⾏计划是有PlanNode组成的⼀棵树,这个过程中也会执⾏⼀些SQL化,例如Join顺序改变、谓词下推等。

                          • 分布式并⾏物理计划:将单机执⾏计划转换成分布式并⾏物理执⾏计划,物理执⾏计划由⼀个个的PlanFragment组成,Fragment之间有数据依赖关系,每一个PlanFragment在执行时可以由多个Impalad实例并行执行(有些PlanFragment只能由一个Impalad实例执行,如聚合操作),处理过程中要在原有的执⾏计划之上加⼊⼀些ExchangeNode和DataStreamSink信息等。

                            • PlanFragment : sql⽣成的分布式执⾏计划的⼀个⼦任务;
                            • DataStreamSink:传输当前的Fragment输出数据到不同的节点;
                            • 任务调度和分发

                              Coordinator将PlanFragment(⼦任务)根据数据分区信息发配到不同的Impalad节点上执⾏。Impalad节点接收到执⾏Fragment请求交由Executor执⾏。

                            • Fragment之间的数据依赖

                              每⼀个Fragment的执⾏输出通过DataStreamSink发送到下⼀个Fragment,Fragment运⾏过程中不断向coordinator节点汇报当前运⾏状态。

                            • 结果汇总

                              查询的SQL通常情况下需要有⼀个单独的Fragment⽤于结果的汇总,它只在Coordinator节点运⾏,将多个节点的最终执⾏结果汇总,转换成ResultSet信息。

                            • 获取结果

                              客户端调⽤获取ResultSet的接⼝,读取查询结果。

                              单机执行计划

                              以⼀个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;
                              

                              Impala的介绍、使用和原理架构,第5张

                              分析上图流程:

                              1. 第一步去扫描t1表中的需要的数据n1、id列,再扫描t2表需要的数据n2、id列,然后这部分数据进行Join操作。
                              2. t1表和t2表关联后,同样的操作,将中间结果表和t3进行关联Join,此处Impala会使用谓词下推优化,只读取需要的数据进行表Join。
                              3. 将最后的结果数据进行聚合操作。

                              分布式执行计划

                              Impala的介绍、使用和原理架构,第6张

                              分布式执⾏计划中涉及到多表的Join,Impala会根据表的⼤⼩来决定Join的⽅式,主要有两种分别是HashJoin与Broadcast Join;

                              上⾯分布式执⾏计划中可以看出T1,T2表⼤⼀些,⽽T3表⼩⼀些,所以对于T1与T2的Join Impala选择使⽤Hash Join,对于T3表选择使⽤Broadcast ⽅式,直接把T3表⼴播到需要Join的节点上。

                              分布式并⾏计划流程

                              1. T1和T2使⽤Hash join,此时需要按照id的值分别将T1和T2分散到不同的Impalad进程,但是相同的id会散列到相同的Impalad进程,这样每⼀个Join之后是全部数据的⼀部分。
                              2. T1与T2Join之后的结果数据再与T3表进⾏Join,此时T3表采⽤Broadcast⽅式把⾃⼰全部数据(id列)⼴播到需要的Impala节点上。
                              3. T1,T2,T3Join之后再根据Group by执⾏本地的预聚合,每⼀个节点的预聚合结果只是最终结果的⼀部分(不同的节点可能存在相同的group by的值),需要再进⾏⼀次全局的聚合。
                              4. 全局的聚合同样需要并⾏,则根据聚合列进⾏Hash分散到不同的节点执⾏Merge运算(其实仍然是⼀次聚合运算),⼀般情况下为了较少数据的⽹络传输, Impala会选择之前本地聚合节点做全局聚合⼯作。
                              5. 通过全局聚合之后,相同的key只存在于⼀个节点,然后对于每⼀个节点进⾏排序和TopN计算,最终将每⼀个全局聚合节点的结果返回给Coordinator进⾏合并、排序、limit计算,返回结果给⽤户。

                              Impala安装部署

                              安装前提

                              集群提前安装好hadoop,hive。

                              hive安装包scp在所有需要安装impala的节点上,因为impala需要引用hive的依赖包。

                              hadoop框架需要支持C程序访问接口,查看下图,如果有该路径下有这么文件,就证明支持C接口。

                              Impala的介绍、使用和原理架构,第7张

                              下载安装包、依赖包

                              由于impala没有提供tar包进行安装,只提供了rpm包。因此在安装impala的时候,需要使用rpm包来进行安装。rpm包只有cloudera公司提供了,所以去cloudera公司网站进行下载rpm包即可。

                              但是另外一个问题,impala的rpm包依赖非常多的其他的rpm包,可以一个个的将依赖找出来,也可以将所有的rpm包下载下来,制作成我们本地yum源来进行安装。这里就选择制作本地的yum源来进行安装。

                              所以首先需要下载到所有的rpm包,下载地址如下

                              http://archive.cloudera.com/cdh5/repo-as-tarball/5.14.0/cdh5.14.0-centos6.tar.gz

                              虚拟机新增磁盘(可选)

                              由于下载的cdh5.14.0-centos6.tar.gz包非常大,大概5个G,解压之后也最少需要5个G的空间。而我们的虚拟机磁盘有限,可能会不够用了,所以可以为虚拟机挂载一块新的磁盘,专门用于存储的cdh5.14.0-centos6.tar.gz包。

                              注意事项:新增挂载磁盘需要虚拟机保持在关机状态。

                              如果磁盘空间有余,那么本步骤可以省略不进行。

                              Impala的介绍、使用和原理架构,第8张

                              (1)关机新增磁盘

                              虚拟机关机的状态下,在VMware当中新增一块磁盘。

                              Impala的介绍、使用和原理架构,第9张

                              Impala的介绍、使用和原理架构,第10张

                              Impala的介绍、使用和原理架构,第11张

                              Impala的介绍、使用和原理架构,第12张

                              Impala的介绍、使用和原理架构,第13张

                              (2)开机挂载磁盘

                              开启虚拟机,对新增的磁盘进行分区,格式化,并且挂载新磁盘到指定目录。

                              Impala的介绍、使用和原理架构,第14张

                              Impala的介绍、使用和原理架构,第15张

                              Impala的介绍、使用和原理架构,第16张

                              Impala的介绍、使用和原理架构,第17张

                              下面对分区进行格式化操作:

                              mkfs -t ext4 -c /dev/sdb1
                              

                              Impala的介绍、使用和原理架构,第18张

                              创建挂载目录:

                              mount -t ext4 /dev/sdb1 /cloudera_data/
                              

                              Impala的介绍、使用和原理架构,第19张

                              添加至开机自动挂载:

                              vim /etc/fstab
                              /dev/sdb1 /cloudera_data ext4 defaults 0 0
                              

                              Impala的介绍、使用和原理架构,第20张

                              配置本地yum源

                              (1)上传安装包解压

                              使用sftp的方式把安装包大文件上传到服务器/cloudera_data目录下。

                              Impala的介绍、使用和原理架构,第21张

                              cd /cloudera_data
                              tar -zxvf cdh5.14.0-centos6.tar.gz
                              

                              (2)配置本地yum源信息

                              安装Apache Server服务器

                              yum -y install httpd
                              service httpd start
                              chkconfig httpd on
                              

                              配置本地yum源的文件

                              cd /etc/yum.repos.d
                              vim localimp.repo
                              [localimp]
                              name=localimp
                              baseurl=http://node-3/cdh5.14.0/
                              gpgcheck=0
                              enabled=1
                              

                              创建apache httpd的读取链接

                              ln -s /cloudera_data/cdh/5.14.0 /var/www/html/cdh5.14.0
                              

                              确保linux的Selinux关闭

                              临时关闭:
                              [root@localhost ~]# getenforce
                              Enforcing
                              [root@localhost ~]# setenforce 0
                              [root@localhost ~]# getenforce
                              Permissive
                              永久关闭:
                              [root@localhost ~]# vim /etc/sysconfig/selinux
                              SELINUX=enforcing 改为 SELINUX=disabled
                              重启服务reboot
                              

                              通过浏览器访问本地yum源,如果出现下述页面则成功。

                              http://192.168.227.153/cdh5.14.0/

                              Impala的介绍、使用和原理架构,第22张

                              将本地yum源配置文件localimp.repo发放到所有需要安装impala的节点。

                              cd /etc/yum.repos.d/
                              scp localimp.repo node-2:$PWD
                              scp localimp.repo node-3:$PWD
                              

                              安装Impala

                              集群规划:

                              服务名称从节点从节点主节点
                              impala-catalogNode-3
                              impala-state-storeNode-3
                              impala-server(impalad)Node-1Node-2Node-3

                              (1)主节点安装

                              在规划的主节点node-3执行以下命令进行安装:

                              yum install -y impala impala-server impala-state-store impala-catalog impala-shell
                              

                              (2)从节点安装

                              在规划的从节点node-1、node-2执行以下命令进行安装:

                              yum install -y impala-server
                              

                              修改Hadoop、Hive配置

                              需要在3台机器整个集群上进行操作,都需要修改。hadoop、hive是否正常服务并且配置好,是决定impala是否启动成功并使用的前提。

                              (1)修改hive配置

                              可在node-1机器上进行配置,然后scp给其他2台机器。

                              vim /export/servers/hive/conf/hive-site.xml
                              
                               
                                   
                                      javax.jdo.option.ConnectionURL  
                                      jdbc:mysql://node-1:3306/hive?createDatabaseIfNotExist=true 
                                    
                                   
                                      javax.jdo.option.ConnectionDriverName  
                                      com.mysql.jdbc.Driver 
                                    
                                   
                                      javax.jdo.option.ConnectionUserName  
                                      root 
                                    
                                   
                                      javax.jdo.option.ConnectionPassword  
                                      hadoop 
                                    
                                   
                                      hive.cli.print.current.db  
                                      true 
                                    
                                   
                                      hive.cli.print.header  
                                      true 
                                    
                                    
                                   
                                      hive.server2.thrift.bind.host  
                                      node-1 
                                    
                                    
                                   
                                      hive.metastore.uris  
                                      thrift://node-1:9083 
                                    
                                   
                                      hive.metastore.client.socket.timeout  
                                      3600 
                                   
                              
                              

                              将hive安装包cp给其他两个机器。

                              cd /export/servers/
                              scp -r hive/ node-2:$PWD
                              scp -r hive/ node-3:$PWD
                              

                              (2)修改hadoop配置

                              所有节点创建下述文件夹

                              mkdir -p /var/run/hdfs-sockets
                              

                              修改所有节点的hdfs-site.xml添加以下配置,修改完之后重启hdfs集群生效

                              vim etc/hadoop/hdfs-site.xml
                              
                              
                                  dfs.client.read.shortcircuit
                                  true
                              
                              
                                  dfs.domain.socket.path
                                  /var/run/hdfs-sockets/dn
                              
                              
                                  dfs.client.file-block-storage-locations.timeout.millis
                                  10000
                              
                              
                                  dfs.datanode.hdfs-blocks-metadata.enabled
                                  true
                              
                              
                              • dfs.client.read.shortcircuit 打开DFSClient本地读取数据的控制,
                              • dfs.domain.socket.path是Datanode和DFSClient之间沟通的Socket的本地路径。

                                把更新hadoop的配置文件,scp给其他机器。

                                cd /export/servers/hadoop-2.7.5/etc/hadoop
                                scp -r hdfs-site.xml node-2:$PWD
                                scp -r hdfs-site.xml node-3:$PWD
                                

                                注意:root用户不需要下面操作,普通用户需要这一步操作。

                                给这个文件夹赋予权限,如果用的是普通用户hadoop,那就直接赋予普通用户的权限,例如:

                                chown -R hadoop:hadoop /var/run/hdfs-sockets/
                                

                                因为这里直接用的root用户,所以不需要赋权限了。

                                (3)重启hadoop、hive

                                在node-1上执行下述命令分别启动hive metastore服务和hadoop。

                                cd  /export/servers/hive
                                nohup bin/hive --service metastore &
                                nohup bin/hive --service hiveserver2 &
                                cd /export/servers/hadoop-2.7.5/
                                sbin/stop-dfs.sh  |  sbin/start-dfs.sh
                                

                                (4)复制hadoop、hive配置文件

                                impala的配置目录为/etc/impala/conf,这个路径下面需要把core-site.xml,hdfs-site.xml以及hive-site.xml。

                                所有节点执行以下命令:

                                cp -r /export/servers/hadoop-2.7.5/etc/hadoop/core-site.xml /etc/impala/conf/core-site.xml
                                cp -r /export/servers/hadoop-2.7.5/etc/hadoop/hdfs-site.xml /etc/impala/conf/hdfs-site.xml
                                cp -r /export/servers/hive/conf/hive-site.xml /etc/impala/conf/hive-site.xml
                                

                                修改impala配置

                                (1)修改impala默认配置

                                所有节点更改impala默认配置文件

                                vim /etc/default/impala
                                IMPALA_CATALOG_SERVICE_HOST=node-3
                                IMPALA_STATE_STORE_HOST=node-3
                                

                                (2)添加mysql驱动

                                通过配置/etc/default/impala中可以发现已经指定了mysql驱动的位置名字。

                                Impala的介绍、使用和原理架构,第23张

                                使用软链接指向该路径即可(3台机器都需要执行)

                                ln -s /export/servers/hive/lib/mysql-connector-java-5.1.32.jar /usr/share/java/mysql-connector-java.jar
                                

                                (3)修改bigtop配置

                                修改bigtop的java_home路径(3台机器)

                                vim /etc/default/bigtop-utils
                                export JAVA_HOME=/export/servers/jdk1.8.0_65
                                

                                启动、关闭impala服务

                                主节点node-3启动以下三个服务进程:

                                service impala-state-store start
                                service impala-catalog start
                                service impala-server start
                                

                                从节点启动node-1与node-2启动impala-server

                                service impala-server start
                                

                                查看impala进程是否存在

                                ps -ef \| grep impala
                                

                                Impala的介绍、使用和原理架构,第24张

                                启动之后所有关于impala的日志默认都在/var/log/impala

                                如果需要关闭impala服务 把命令中的start该成stop即可。注意如果关闭之后进程依然驻留,可以采取下述方式删除。正常情况下是随着关闭消失的。

                                解决方式:

                                Impala的介绍、使用和原理架构,第25张

                                impala web ui:

                                访问impalad的管理界面http://node-3:25000/

                                访问statestored的管理界面http://node-3:25010/

                                Impala-shell命令参数

                                impala-shell外部命令

                                所谓的外部命令指的是不需要进入到impala-shell交互命令行当中即可执行的命令参数。impala-shell后面执行的时候可以带很多参数。你可以在启动 impala-shell 时设置,用于修改命令执行环境。

                                impala-shell –h可以帮助我们查看帮助手册。也可以参考课程附件资料。

                                比如几个常见的:

                                • impala-shell –r刷新impala元数据,与建立连接后执行 REFRESH 语句效果相同。
                                • impala-shell –f文件路径 执行指的的sql查询文件。
                                • impala-shell –i指定连接运行 impalad 守护进程的主机。默认端口是 21000。你可以连接到集群中运行 impalad 的任意主机。
                                • impala-shell –o保存执行结果到文件当中去。

                                  Impala的介绍、使用和原理架构,第26张

                                  impala-shell内部命令

                                  所谓内部命令是指,进入impala-shell命令行之后可以执行的语法。

                                  Impala的介绍、使用和原理架构,第27张

                                  connect hostname 连接到指定的机器impalad上去执行。

                                  Impala的介绍、使用和原理架构,第28张

                                  refresh dbname.tablename增量刷新,刷新某一张表的元数据,主要用于刷新hive当中数据表里面的数据改变的情况。

                                  Impala的介绍、使用和原理架构,第29张

                                  invalidate metadata全量刷新,性能消耗较大,主要用于hive当中新建数据库或者数据库表的时候来进行刷新。

                                  quit/exit命令 从Impala shell中弹出

                                  explain 命令 用于查看sql语句的执行计划。

                                  Impala的介绍、使用和原理架构,第30张

                                  explain的值可以设置成0,1,2,3等几个值,其中3级别是最高的,可以打印出最全的信息

                                  set explain_level=3;

                                  profile命令执行sql语句之后执行,可以打印出更加详细的执行步骤,主要用于查询结果的查看,集群的调优等。

                                  Impala的介绍、使用和原理架构,第31张

                                  注意:如果在hive窗口中插入数据或者新建的数据库或者数据库表,那么在impala当中是不可直接查询,需要执行invalidate metadata以通知元数据的更新;

                                  在impala-shell当中插入的数据,在impala当中是可以直接查询到的,不需要刷新数据库,其中使用的就是catalog这个服务的功能实现的,catalog是impala1.2版本之后增加的模块功能,主要作用就是同步impala之间的元数据。

                                  更新操作通知Catalog,Catalog通过广播的方式通知其它的Impalad进程。默认情况下Catalog是异步加载元数据的,因此查询可能需要等待元数据加载完成之后才能进行(第一次加载)。

                                  Impala sql语法

                                  数据库特定语句

                                  创建数据库

                                  CREATE DATABASE语句用于在Impala中创建新数据库。

                                  CREATE DATABASE IF NOT EXISTS database_name;
                                  

                                  这里,IF NOT EXISTS是一个可选的子句。如果我们使用此子句,则只有在没有具有相同名称的现有数据库时,才会创建具有给定名称的数据库。

                                  Impala的介绍、使用和原理架构,第32张

                                  impala默认使用impala用户执行操作,会报权限不足问题,解决办法:

                                  • 给HDFS指定文件夹授予权限

                                    hadoop fs -chmod -R 777 hdfs://node-1:9000/user/hive
                                    
                                  • haoop 配置文件中hdfs-site.xml 中设置权限为false

                                    
                                        dfs.permissions.enabled
                                        false
                                    
                                    

                                    上述两种方式都可以。

                                    Impala的介绍、使用和原理架构,第33张

                                    默认就会在hive的数仓路径下创建新的数据库名文件夹

                                    /user/hive/warehouse/ittest.db
                                    

                                    也可以在创建数据库的时候指定hdfs路径。需要注意该路径的权限。

                                    hadoop fs -mkdir -p /input/impala
                                    hadoop fs -chmod -R 777 /input/impala
                                    create  external table  t3(id int ,name string ,age int )  row  format  delimited fields terminated  by  '\t' location  '/input/impala/external';	
                                    

                                    删除数据库

                                    Impala的DROP DATABASE语句用于从Impala中删除数据库。 在删除数据库之前,建议从中删除所有表。

                                    如果使用级联删除,Impala会在删除指定数据库中的表之前删除它。

                                    DROP database sample cascade;
                                    

                                    表特定语句

                                    create table语句

                                    CREATE TABLE语句用于在Impala中的所需数据库中创建新表。 需要指定表名字并定义其列和每列的数据类型。

                                    impala支持的数据类型和hive类似,除了sql类型外,还支持java类型。

                                    create table IF NOT EXISTS database_name.table_name (
                                       column1 data_type,
                                       column2 data_type,
                                       column3 data_type,
                                       ………
                                       columnN data_type
                                    );
                                    
                                    CREATE TABLE IF NOT EXISTS my_db.student(name STRING, age INT, contact INT );
                                    create external table externaltemp1
                                    (
                                        c_col1             int,
                                        c_col2             string
                                        c_col3              string,
                                        c_col4              int,
                                        c_col5               string
                                    )
                                    --指明列之间的分隔符为'|'
                                    row format delimited fields terminated by '|' 
                                    --指明数据在HDFS中的目录位置
                                    location '/tmp/testexternal/externaltemp1';
                                    

                                    默认建表的数据存储路径跟hive一致。也可以在建表的时候通过location指定具体路径,需要注意hdfs权限问题。

                                    insert语句

                                    Impala的INSERT语句有两个子句: into和overwrite。into用于插入新记录数据,overwrite用于覆盖已有的记录。

                                    insert into table_name (column1, column2, column3,...columnN) values (value1, value2, value3,...valueN);
                                    Insert into table_name values (value1, value2, value2);
                                    

                                    这里,column1,column2,… columnN是要插入数据的表中的列的名称。还可以添加值而不指定列名,但是,需要确保值的顺序与表中的列的顺序相同。

                                    举个例子:

                                    create table employee (Id INT, name STRING, age INT,address STRING, salary BIGINT);
                                    insert into employee VALUES (1, 'Ramesh', 32, 'Ahmedabad', 20000 );
                                    insert into employee values (2, 'Khilan', 25, 'Delhi', 15000 );
                                    Insert into employee values (3, 'kaushik', 23, 'Kota', 30000 );
                                    Insert into employee values (4, 'Chaitali', 25, 'Mumbai', 35000 );
                                    Insert into employee values (5, 'Hardik', 27, 'Bhopal', 40000 );
                                    Insert into employee values (6, 'Komal', 22, 'MP', 32000 );
                                    

                                    overwrite覆盖子句覆盖表当中全部记录。 覆盖的记录将从表中永久删除。

                                    Insert overwrite employee values (1, 'Ram', 26, 'Vishakhapatnam', 37000 );
                                    

                                    select语句

                                    Impala SELECT语句用于从数据库中的一个或多个表中提取数据。 此查询以表的形式返回数据。

                                    Impala的介绍、使用和原理架构,第34张

                                    describe语句

                                    Impala中的describe语句用于提供表的描述。 此语句的结果包含有关表的信息,例如列名称及其数据类型。

                                    Describe table_name;

                                    Impala的介绍、使用和原理架构,第35张

                                    此外,还可以使用hive的查询表元数据信息语句。

                                    desc formatted table_name;
                                    

                                    Impala的介绍、使用和原理架构,第36张

                                    alter table

                                    Impala中的Alter table语句用于对给定表执行更改。使用此语句,我们可以添加,删除或修改现有表中的列,也可以重命名它们。

                                    表重命名:

                                    ALTER TABLE [old_db_name.]old_table_name RENAME TO [new_db_name.]new_table_name
                                    

                                    向表中添加列**:**

                                    ALTER TABLE name ADD COLUMNS (col_spec\[, col_spec ...\])
                                    

                                    从表中删除列:

                                    ALTER TABLE name DROP \[COLUMN\] column_name
                                    

                                    更改列的名称和类型:

                                    ALTER TABLE name CHANGE column_name new_name new_type
                                    

                                    delete、truncate table

                                    Impala drop table语句用于删除Impala中的现有表。此语句还会删除内部表的底层HDFS文件。

                                    注意:使用此命令时必须小心,因为删除表后,表中可用的所有信息也将永远丢失。

                                    DROP table database_name.table_name;
                                    

                                    Impala的Truncate Table语句用于从现有表中删除所有记录。保留表结构。

                                    您也可以使用DROP TABLE命令删除一个完整的表,但它会从数据库中删除完整的表结构,如果您希望存储一些数据,您将需要重新创建此表。

                                    truncate table_name;
                                    

                                    Impala的介绍、使用和原理架构,第37张

                                    view视图

                                    视图仅仅是存储在数据库中具有关联名称的Impala查询语言的语句。 它是以预定义的SQL查询形式的表的组合。

                                    视图可以包含表的所有行或选定的行。

                                    Create View IF NOT EXISTS view_name as Select statement
                                    

                                    Impala的介绍、使用和原理架构,第38张

                                    创建视图view、查询视图view

                                    CREATE VIEW IF NOT EXISTS employee_view AS select name, age from employee;
                                    

                                    Impala的介绍、使用和原理架构,第39张

                                    修改视图

                                    ALTER VIEW database_name.view_name 为Select语句
                                    

                                    删除视图

                                    DROP VIEW database_name.view_name;
                                    

                                    order by子句

                                    Impala ORDER BY子句用于根据一个或多个列以升序或降序对数据进行排序。 默认情况下,一些数据库按升序对查询结果进行排序。

                                    select * from table_name ORDER BY col_name [ASC|DESC] [NULLS FIRST|NULLS LAST]
                                    

                                    可以使用关键字ASC或DESC分别按升序或降序排列表中的数据。

                                    如果我们使用NULLS FIRST,表中的所有空值都排列在顶行; 如果我们使用NULLS LAST,包含空值的行将最后排列。

                                    Impala的介绍、使用和原理架构,第40张

                                    group by、having子句

                                    Impala GROUP BY子句与SELECT语句协作使用,以将相同的数据排列到组中。

                                    select data from table_name Group BY col_name;
                                    

                                    Impala中的Having子句允许您指定过滤哪些组结果显示在最终结果中的条件。

                                    一般来说,Having子句与group by子句一起使用; 它将条件放置在由GROUP BY子句创建的组上。

                                    limit、offset

                                    Impala中的limit子句用于将结果集的行数限制为所需的数,即查询的结果集不包含超过指定限制的记录。

                                    一般来说,select查询的resultset中的行从0开始。使用offset子句,我们可以决定从哪里考虑输出。

                                    Impala的介绍、使用和原理架构,第41张

                                    with子句

                                    如果查询太复杂,我们可以为复杂部分定义别名,并使用Impala的with子句将它们包含在查询中。

                                    with x as (select 1), y as (select 2) (select \* from x union y);
                                    

                                    例如:使用with子句显示年龄大于25的员工和客户的记录。

                                    with t1 as (select * from customers where age>25), 
                                       t2 as (select * from employee where age>25) 
                                       (select * from t1 union select * from t2);
                                    

                                    distinct

                                    Impala中的distinct运算符用于通过删除重复值来获取唯一值。

                                    select distinct columns… from table_name;
                                    

                                    Impala数据导入方式

                                    (1)load data

                                    首先创建一个表:

                                    create table user(id int ,name string,age int ) row format delimited fields terminated by "\t";
                                    

                                    准备数据user.txt并上传到hdfs的 /user/impala路径下去

                                    Impala的介绍、使用和原理架构,第42张

                                    Impala的介绍、使用和原理架构,第43张

                                    加载数据:

                                    load data inpath '/user/impala/' into table user;
                                    

                                    查询加载的数据

                                    select * from user;
                                    

                                    Impala的介绍、使用和原理架构,第44张

                                    如果查询不不到数据,那么需要刷新一遍数据表。

                                    refresh user;
                                    

                                    (2)insert into values

                                    这种方式非常类似于RDBMS的数据插入方式。

                                    create table t_test2(id int,name string);
                                    insert into table t_test2 values(1,”zhangsan”);
                                    

                                    Impala的介绍、使用和原理架构,第45张

                                    (3)insert into select

                                    插入一张表的数据来自于后面的select查询语句返回的结果。

                                    Impala的介绍、使用和原理架构,第46张

                                    (4)create as select

                                    建表的字段个数、类型、数据来自于后续的select查询语句。

                                    Impala的介绍、使用和原理架构,第47张

                                    Impala的java开发

                                    在实际工作当中,因为impala的查询比较快,所以可能有会使用到impala来做数据库查询的情况,可以通过java代码来进行操作impala的查询。

                                    (1)下载impala jdbc依赖

                                    下载路径:

                                    https://www.cloudera.com/downloads/connectors/impala/jdbc/2-5-28.html

                                    因为cloudera属于商业公司性质,其提供的jar并不会出现在开源的maven仓库中,如果在企业中需要使用,请添加到企业maven私服。

                                    Impala的介绍、使用和原理架构,第48张

                                    (2)创建java工程

                                    创建普通java工程,把依赖添加工程。

                                    Impala的介绍、使用和原理架构,第49张

                                    (3)java api

                                    public static void test(){
                                        Connection con = null;
                                        ResultSet rs = null;
                                        PreparedStatement ps = null;
                                        String JDBC_DRIVER = "com.cloudera.impala.jdbc41.Driver";
                                        String CONNECTION_URL = "jdbc:impala://node-3:21050";
                                        try
                                        {
                                            Class.forName(JDBC_DRIVER);
                                            con = (Connection) DriverManager.getConnection(CONNECTION_URL);
                                            ps = con.prepareStatement("select * from my_db.employee;");
                                            rs = ps.executeQuery();
                                            while (rs.next())
                                            {
                                                System.out.println(rs.getString(1));
                                                System.out.println(rs.getString(2));
                                                System.out.println(rs.getString(3));
                                            }
                                        } catch (Exception e)
                                        {
                                            e.printStackTrace();
                                        } finally
                                        {
                                            try {
                                                rs.close();
                                                ps.close();
                                                con.close();
                                            } catch (SQLException e) {
                                                e.printStackTrace();
                                            }
                                        }
                                    }
                                    public static void main(String[] args) {
                                        test();
                                    }