Impala是Cloudera提供的一款开源的针对HDFS和HBASE中PB级别数据进行交互式实时查询(Impala速度快),Impala是参照谷歌中新三篇论文中Dremel实现而来,其中旧三篇论文分别是(BigTable、GFS、MapReduce)分别对应即将学的HBase和以及学过的HDFS、MapReduce。
Impala最大卖点和特点就是“快速”,Impala中文翻译是“高角羚羊”。
在大数据领域主要解决的问题就是数据的存储和分析,但是一个完整的大数据分析任务如果细分会有非常多具体的场景,非常多的环节;并没有一个类似于java web的Spring框架实现大一统的局面。
比如我们按照划分一个大数据的开发任务,会有:数据采集(日志文件,关系型数据库中),数据清洗(数据格式管理,脏数据过滤等),数据预处理(为了后续分析所做的工作),数据分析:离线处理(T+1分析),实时处理(数据到来即分析),数据可视化,机器学习,深度学习等。
面对如此多的阶段再加上大数据天生的大数据量的问题没有任何一个框架可以完美的cover以上每个阶段。所以大数据领域有非常多的框架,每个框架都有最适合自己的具体场景。比如:HDFS负责大数据量存储,MapReduce(Hive)负责大数据量的分析计算。
Impala的诞生:
之前学习的Hive以及MR适合离线批处理,但是对于交互式查询的场景无能为力(要求快速响应),所以为了解决查询速度问题,Cloudera公司依据Google的Dremel开发了了Impala,Impala摒弃了MapReduce,使用了类似于传统的MPP数据库技术,大大提高了查询的速度。
MPP是什么?
MPP(Massively Parallel Processing),就是大规模并行处理,在MPP集群中,每个节点资源都是独立享有也就是独立的磁盘和内存,每个节点通过网络互相连接,彼此协同计算,为整体提供数据服务。
简单的说,MPP是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,再将各自部分的结果汇总在一起得到最终结果。
对于MPP架构的软件来说聚合操作比如计算某张表的总数,则先进行局部聚合(每个节点并行计算),然后再把局部汇总结果进行全局聚合(与hadoop类似)。
Impala与Hive对比:
Impala的技术优势
1. Impala没有采用MapReduce作为计算引擎,MR是非常好的分布式并行计算框架,但是MR引擎更多的是面向批处理模式,而不是面向交互式SQL执行。
与Hive相比:Impala把整个查询任务转化为一棵执行计划树,而不是一连串的MR任务,在分发执行后,Impala采用拉取的方式获取上个阶段的执行结果,把结果数据、按执行树流式传递汇集,减少了把中间结果写入磁盘的步骤,再从磁盘读取数据的开销。Impala使用服务的方式避免每次执行查询都需要启动的开销,即相比Hive没有MR启动时间。
2. 使用LLVM(C++编写的编译器)产生运行代码,针对特定查询生成特定代码。
3. 优秀的IO调度,Impala支持直接数据块读取和本地代码计算。
4. 选择适合的数据存储格式可以得到最好的性能(Impala支持多种存储格式)。
5. 尽可能使用内存,中间结果不写磁盘,及时通过网络以stream的方式传递。
Impala与Hive对比分析:
查询过程:
在Hive中,每个查询都有一个“冷启动”的常见问题。(map,reduce每次都要启动关闭、申请资源、释放资源。)
Impala中,避免了任何可能的启动开销,这是一种本地查询语言。因为要始终处理查询,则Impala守护程序进程总是在集群启动之后就准备就绪,守护进程在集群启动之后可以接受穿任务并执行查询任务。
中间结果:
Hive通过MR引擎实现的所有中间结果都要落盘,这对降低数据处理速度有不利影响。
Impala在执行程序之间使用流的方式传输中间结果,避免数据落盘。尽可能的使用内存避免磁盘开销。
交互查询:
Hive对于交互式计算,Hive不是理想的选择。
Impala对于交互式计算,Impala非常适合(数据量级PB级)。
计算引擎:
Hive是基于批处理的Hadoop MapReduce。
Impala更像是MPP数据库。
容错:
Hive是容错的(通过MR和Yarn实现)。
Impala没有容错,由于良好的查询性能,Impala遇到错误会重新执行一次。
查询速度:
Impala比Hive块3-90倍。
Impala优势总结:
Impala最大的优点是查询速度快,在一定数据量下(PB级别)。
速度快的原因:避免了MR引擎的弊端,采用了MPP数据库技术。
1. Impala属于MPP架构,只能做到百节点级,一般并发查询个数达到20个左右时,整个系统的吞吐已经达到满负荷状态,再扩容节点也提升不了吞吐量,处理数据量在PB级别最佳。
2. 资源不能通过YARN统一资源调度,所以Hadoop集群无法实现Impala、Spark、Hive等组件的动态资源共享。
Hive:复杂的批处理查询任务,数据转移任务,对实时性要求不高同时数据量又很大的场景。
Impala:实时数据分析,与Hive配合使用,对Hive的结果数据集进行实时分析。Impala不能完全取代Hive,Impala可以直接处理hive表中的数据。
1. Impala的安装需要提前装好Hadoop,Hive这两个框架。
Impala的数据存储在hdfs上;
Impala直接使用hive元数据管理数据;
2. hive需要在所有的Impala安装的节点上⾯面都要有,因为Impala需要引⽤用Hive的依赖包。
3. hadoop的框架需要⽀支持C程序访问接⼝口,查看下图,如果有该路路径有.so结尾⽂文件,就证明⽀支持C接⼝口。
rpm⽅方式安装:需要⾃自⼰己管理理rpm包的依赖关系;⾮非常麻烦;解决依赖关系使⽤用yum;默认Yum源是没有Impala的rpm安装包,所以我们⾃自⼰己准备好所有的Impala安装所需的rpm包,制作Yum本地源,配置Yum命令去到我们准备的Yun源中下载Impala的rpm包进⾏行行安装。
Yum命令默认源:
1. 对于我们这样三台节点,默认Yum命令安装软件时,下载相关依赖都是从默认源处理下载
2. 如果使用Yum安装Impala,Yum的默认源中没有Impala的rpm包,所以我们提前下载Impala安装所需要的所有rpm包,并制作成为本地的Yum源供集群所有节点使用。
具体制作步骤:
Yum源是Centos当中下载软件rpm包的地址,因此通过制作本地Yum源并指定Yum命令使⽤用本地Yum源,为了了使Yum命令(本机,跨⽹网络节点)可以通过⽹网络访问到本地源,我们使⽤用Httpd这种静态资源服务器器来开放我们下载所有的rpm包。
1. linux121 安装Httpd服务器
#yum⽅方式安装httpd服务器器:yum install httpd -y
#启动httpd服务器器:systemctl start httpd
#验证httpd⼯工作是否正常,默认端⼝口是80,可以省略略:http://linux121
2. 新建一个测试页面:
httpd默认存放⻚页⾯面路路径:/var/www/html/
新建⼀一个⻚页⾯面test.html
访问:http://linux121/test.html
3. 下载Impala安装所需rpm包
Impala所需安装包需要到Cloudera提供地址下载
http://archive.cloudera.com/cdh5/repo-as-tarball/5.7.6/cdh5.7.6-centos7.tar.gz
注意:该tar.gz包是包含了了Cloudera所提供的⼏几乎所有rpm包,但是为了了⽅方便便我们不不再去梳理理其中依赖关系,全部下载来,整个⽂文件⽐比较⼤大,有3.8G。选择⼀一个磁盘空间够的节点,后续还要把压缩包解压所以磁盘空间要剩余10G以上。
4. 使用httpd盛放依赖包
创建软链接到/var/www/html下:
ln -s /opt/lagou/software/cdh/5.7.6 /var/www/html/cdh57
验证
http://linux121/cdh57/
如果提示404 forbidden
vim /etc/selinux/config:将SELINUX=enforcing改为SELINUX=disabled
修改之后要记得重启机器器!!
5. 修改Yum源配置文件
cd /etc/yum.repos.d
#创建⼀一个新的配置⽂文件
vim local.repo
#添加如下内容
[local]
name=local
baseurl=http://linux121/cdh57/
gpgcheck=0
enabled=1
name:对于当前源的描述
baseurl:访问当前源的地址信息
gpgcheck: 1 0,gpg校验
enabled:1/0,是否使⽤用当前源
6. 分发local.repo文件到其它节点
rsync-script local.repo
Impala-server:这个进程是Impala真正工作的进程,官方建议把impala-server安装在datanode节点,更靠近数据(短路读取),进程名impalad。
Impala-statestored:健康监控角色,主要监控impala-server,impala-server出现异常时告知给其它的impala-server;进程名叫做statestored。
Impala-catalogd:管理和维护元数据(Hive),impala更新操作;把impala更新的元数据通知给其它的impala-server;进程名catalogd。
官方建议statestored和catalogd安装在同一节点上。
linux123:
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
linux122和linux121:
yum install impala-server -y
yum install impala-shell -y
配置Impala
1. 修改hive-site.xml
2. 分发Hive安装包到集群节点
rsync -r /opt/lagou/servers/hive-2.3.7/ linux122:/opt/lagou/servers/
rsync -r /opt/lagou/servers/hive-2.3.7/ linux121:/opt/lagou/servers/
3. linux123启动metastore服务
nohup hive --service metastore &
启动hiveserver2:nohup hive --service hiveserver2 &
4. 修改HDFS集群hdfs-site.xml
配置HDFS集群短路读取。
什么是短路读取?
在HDFS中通过datanode来去取数据。但是,当客户端向DataNode请求读取⽂文件时,DataNode就会从磁盘读取该⽂文件并通过TCP socket将数据发送到客户端。所谓“短路路”是指Client客户端直接读取⽂文件。很明显,这种情况只在客户端与数据放在同⼀一地点(译者注:同⼀一主机)时才有可能发⽣生。短路路读对于许多应⽤用程序会带来重⼤大的性能提升。
短路路读取:就是Client与DataNode属于同⼀一节点,⽆无需再经过⽹网络传输数据,直接本地读取。
要配置短路路本地读,需要验证本机Hadoop是否有libhadoop.so;
进⼊入⼀一下⽬目录:/opt/lagou/servers/hadoop-2.9.2/lib/native
短路读取配置步骤:
1. 创建短路读取本地中转站
所有节点创建一个目录:mkdir -p /var/lib/hadoop-hdfs
2. 修改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集群。
#停⽌止集群
stop-dfs.sh
start-dfs.sh
#启动集群
start-dfs.sh
start-yarn.sh
5. Impala具体配置
使用Yum方式安装impala默认的impala配置文件目录为:/etc/impala/conf,impala的使用要依赖于Hadoop和Hive框架,所以需要把HDFS和Hive的配置文件告知Impala。
执行以下命令把HDFS和Hive的配置文件软连接到/ect/impala/conf下
ln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/core-site.xml /etc/impala/conf/core-site.xml
ln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml /etc/impala/conf/hdfs-site.xml
ln -s /opt/lagou/servers/hive-2.3.7/conf/hive-site.xml /etc/impala/conf/hive-site.xml
注:所有节点都要执⾏行行此命令!
Impala自身的配置:
所有节点更改impala默认配置文件以及添加mysql的驱动包。
1. vim /etc/default/impala
IMPALA_CATALOG_SERVICE_HOST=linux123
IMPALA_STATE_STORE_HOST=linux123
2. 所有节点创建mysql的驱动包的软链接
#创建节点
mkdir -p /usr/share/java
ln -s /opt/lagou/servers/hive-2.3.7/lib/mysql-connector-java-5.1.49.jar
/usr/share/java/mysql-connector-java.jar
修改bigtop的java_home路径:
vim /etc/default/bigtop-utils
export JAVA_HOME=/opt/lagou/servers/jdk1.8.0_231
注意:Apache Bigtop 是⼀一个针对基础设施⼯工程师和数据科学家的开源项⽬目,旨在全⾯面打包、测试和配置领先的开源⼤大数据组件/项⽬目。Impala项⽬目中使⽤用到了了此软件。
启动Impala:
#linux123启动如下⻆角⾊色
service impala-state-store start
service impala-catalog start
service impala-server start
#其余节点启动如下⻆角⾊色
service impala-server start
验证Impala启动结果:
ps -ef | grep impala
浏览web界面验证:
访问impalad的管理理界⾯面
http://linux123:25000/
访问statestored的管理理界⾯面
http://linux123:25010/
注意:启动之后所有关于Impala的⽇日志默认都在/var/log/impala 这个路路径下,Linux123机器器上⾯面应该有三个进程,Linux121与Linux122机器器上⾯面只有⼀一个进程,如果进程个数不不对,去对应⽬目录下查看报错⽇日志。
消除Impala影响:
由于使⽤用Yum命令安装Impala,我们选择使⽤用yum⾃自动进⾏行行Impala依赖的安装和处理,所以本次安装默认会把Impala依赖的所有框架都会安装,⽐如Hadoop,Hive,Mysql等,为了保证我们自己安装的Hadoop等使用正常我们需要删除掉Impala默认安装的其它框架。
jps 时出现没有名字的进程 或者process information unavailable
解决方式:rm -rf /tmp/hsperfdata_*
使用Yum方式安装Impala后,impala-shell可以全局使用;进入impala-shell命令;
查看所有数据库:show databases;
如果想要使用Impala,需要将数据加载到Impala中,如何加载数据到Impala中呢?
1. 使用impala的外部表,这种适用于已有数据文件,只需要将数据文件拷贝到HDFS上,创建一张impala外部表,将外部表的存储位置指向数据文件的位置即可。
2. 通过Insert方式插入数据,适用于我们没有数据文件的场景。
----------1 准备数据文件------------
user.csv
392456197008193000,张三,20,0
267456198006210000,李李四,25,1
892456199007203000,王五,24,1
492456198712198000,赵六,26,2
392456197008193000,张三,20,0
392456197008193000,张三,20,0
----------2 创建HDFS存放数据的路径--------------
hadoop fs -mkdir -p /user/impala/t1
#上传本地user.csv到hdfs /user/impala/table1
hadoop fs -put user.csv /user/impala/t1
---------3 创建表---------
#进⼊入impala-shell
impala-shell
#表如果存在则删除
drop table if exists t1;
#执⾏行行创建
create external table t1(id string,name string,age int,gender int)
row format delimited fields terminated by ','
location '/user/impala/t1';
---------4 查询数据 ----------
select * from t1;
---------5 创建t2表 -----------
#创建⼀一个内部表
create table t2(id string,name string,age int,gender int)
row format delimited fields terminated by ',';
#查看表结构
desc t1;
desc formatted t2;
--------6 插⼊入数据到t2 ----------
insert overwrite table t2 select * from t1 where gender =0;
#验证数据
select * from t2;
更新元数据
适用Beenline连接Hive查看Hive中的数据,发现通过impala创建的表,导入的数据可以被Hive感知到。
小结:
1. 上面案例中impala的数据文件我们准备的是以逗号分隔的文本文件,实际上,impala可以支持RCFile、SequenceFile、Parquet等多种文件格式。
2. Impala与Hive元数据的关系?
Hive对元数据的更新操作,不能被Impala感知到;
Impala对元数据的更新操作,可以被Hive感知到;
Impala同步Hive元数据命令:invalidate metadata
Impala是通过Hive的metastore服务来访问和操作Hive的元数据,但是Hive对表进⾏行行创建删除修改等操作,Impala是⽆无法⾃自动识别到Hive中元数据的变更更情况的,如果想让Impala识别到Hive元数据的变化,所以需要进⼊入impala-shell之后⾸首先要做的操作就是执⾏行行invalidate metadata,该命令会将所有的Impala的元数据失效并重新从元数据库同步元数据信息。后⾯面详细讲解元数据更更新命令。
3. Impala操作HDFS使用的是Impala用户,所以为了避免权限问题,我们可以选择关闭权限校验。在hdfs-site.xml中添加如下配置:
Impala是一个分布式,大规模并行处理(MPP)数据库引擎,它包括多个进程。Impala与Hive类似,不是数据库而是数据分析工具。
impalad:
1.角色名称为Impala Daemon,是在每个节点上运行的进程,是Impala的核心组件,
进程名是impalad。
2.作用是负责读写数据文件,接受来自impala-shell、JDBC、ODBC等的查询请求,
与集群其它的impalad分布式并行完成查询任务,将查询结果返回给中心协调者。
3.为了保证impalad进程了解其它impalad的健康状况,impalad会一直与statestore
保持通信。
4.Impalad服务由三个模块组成:Query Planner、Query Coordinator、Query Executor
前两个模块组成前端,负责接受SQL查询请求,解析SQL并转换成执行计划,交由后端
执行。
statestore:
1.监控集群中impalad的健康状况,并将集群健康信息同步给impalad;
2.进程名为statestored。
catalogd:
1.impala执行的SQL语句引发元数据发生变化时,catalog服务负责把这些元数据的变化
同步给其它的impalad进程(日志验证,监控statestore进程日志)。
2.进程名是catalogd。
3.由于一个集群需要一个catalogd以及一个statestored进程,而且catalogd进程所有请求
都是经过statestored进程发送,所以官方建议让catalogd与statestored安排同个节点上。
1. Client提交任务
Client发送一个SQL查询请求到任意一个Impalad节点,会返回一个queryId用于之后的
客户端操作。
2. 生成单机和分布式执行计划
SQL提交到impalad节点之后,Analyser一次执行SQL的词法分析、语法分析、语义分析等操作;从Mysql的源数据库中获取元数据,从HDFS的namenode节点中获取数据地址,以得到存储这个查询相关数据的所有数据节点datanode。
单机执行计划:根据上一步对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的接口,读取查询结果。
查询计划示例:
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;
分析上⾯面的单机执⾏行行计划,第⼀一步先去扫描t1表中需要的数据,如果数据⽂文件存储是列列式存储我们可以便便利利的扫描到所需的列列id,n1;接着需要与t2表进⾏行行Join操作,扫描t2表与t1表类似获取到所需数据列列id,n2;t1与t2表进⾏行行关联,关联之后再与t3表进⾏行行关联,这⾥里里Impala会使⽤用谓词下推扫描t3表只取join所需数据;对group by进⾏行行相应的aggregation操作,最终是排序取出指定数量量的数据返回。
分布式并行执行计划
所谓分布式并行执行计划就是在单机执行计划基础之上结合数据分布式存储的特点,按照任务的计算要求把单机执行计划拆分成多段子任务,每个子任务都是可以并行执行的。上面的单机执行计划转换成分布式并行执行计划如下图所示:
分布式执行计划中涉及到多表的join,impala会根据表的大小来决定join的方式,主要有两种分别是Hash Join和Broadcat 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的核心开发语言是sql语句,Impala有shell命令行窗口,以及JDBC等方式来接受sql语句执行,对于复杂类型分析可以使用C++或者java来编写UDF函数。
Impala的sql语法是高度集成了Apache Hive的sql语法,Impala支持Hive支持的数据类型以及部分Hive的内置函数。
需要注意以下几点:
1. Impala与Hive类似它们的重点都是在于查询,所以向delete、update这种具有更新性质的操作最好不要使用这种工具,对于删除数据的操作可以使用drop table,alter table drop partition来实现,更新可以尝试使用insert overwrite方式。
2. 通常使用Impala的方式是数据文件存储在HDFS文件系统,借助Impala的表定义来查询和管理Impala上的数据文件。
3. Impala的使用大多数和Hive相同,比如Impala同样支持内外部表、分区等,可以借鉴参考Hive的使用。
所谓的外部命令指的是不需要进入到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默认支持的内置函数需要进入impala默认系统数据库(_impala_builtins)中执行。在其它数据库中无法查看。
所谓内部命令是指需要进入到impala-shell命令行之后才可以执行的命令。
connect hostname 连接到指定的机器impalad上去执行。
refresh dbname.tablename增量刷新,刷新某一张表的元数据,主要⽤用于刷新hive当中数据表里面的数据改变的情况。
invalidate metadata全量刷新,性能消耗较大,主要⽤用于hive当中新建数据库或者数据库表的时候来进行刷新。
quit/exit命令 从Impala shell中退出。
explain 命令用于查看sql语句的执行计划。并未执行sql语句。
explain的值可以设置成0,1,2,3等几个值,其中3级别是最高的,可以打印出最全的信息。
set explain_level=3;
profile命令执行sql语句之后执行,可以打印出更加详细的执行步骤,主要用于查询结果的查看,集群的调优等。
1. 创建数据库
CREATE DATABASE语句用于在Impala中创建新数据库。
CREATE DATABASE IF NOT EXISTS database_name;
这⾥,IF NOT EXISTS是⼀一个可选的子句。如果我们使用此子句,则只有在没有具有相同名称的现有数据库时,才会创建具有给定名称的数据库。
默认就会在hive的数仓路径下创建新的数据库名文件夹
/user/hive/warehouse/lagoutest.db
2. 删除数据库
Impala的DROP DATABASE语句用于从Impala中删除数据库。 在删除数据库之前,建议从中删除所有表。
如果使用级联删除,Impala会在删除指定数据库中的表之前删除它。
drop database sample cascade;
1. create table语句
CREATE TABLE语句用于在Impala中的所需数据库中创建新表。 需要指定表名字并定义其列和每列的数据类型。
impala支持的数类型和hive类似。
默认建表的数据存储路径跟hive一致。也可以在建表的时候通过location指定具体路径。
2. insert语句
Impala的INSERT语句有两个子句: into和overwrite。into用于插入新记录数据,overwrite用于覆盖已有的记录。
overwrite覆盖子句覆盖表当中全部记录。 覆盖的记录将从表中永久删除。
3. select语句
Impala SELECT语句用于从数据库查询数据, 此查询以表的形式返回数据。
4. describe语句
Impala中的describe语句用于提供表的描述。 此语句的结果包含有关表的信息,例如列名称及其数据类型。describe table_name;
5. alert table语句
Impala中的Alter table语句用于对给定表执行更改。使⽤此语句,我们可以添加,删除或修改现有表中的列,也可以重命名它们。
6. delete和truncate table 语句
Impala drop table语句用于删除Impala中现有表。此语句还会删除内部表的底层HDFS文件。
注意:使用此命令时必须小心,因为删除表后,表中可用的所有信息也将永远丢失。
drop table database_name.table_name;
Impala的Truncate Table语句用于从现有表中删除所有记录。保留表结构。
truncate table_name;
Impala对复杂数据类型的⽀持。
对于Text存储格式中的复杂类型不支持,复杂类型要使用parquet格式。
7. 视图
视图仅是存储在数据库中具有关联名称的Impala查询语言的语句。 它是以预定义的SQL查询形式的表的组合。
视图可以包含表的所有行或选定的行。
create view if not exists view_name as select statement
创建视图view、查询视图view
create view if not exists employee_view AS select name, age from employee;
修改视图
alter view database_name.view_name as Select语句句
删除视图
drop view database_name.view_name;
8. 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,包含空值的行将最后排列。
9. group by子句
Impala GROUP BY⼦句与SELECT语句协作使用,以将相同的数据排列到组中。
select name, sum(salary) from employee group by name;
10. having⼦子句句
容易与where过滤进⾏行行混淆,
如何区分:
where:过滤的数据是原始数据,表中本来就存在的数据;
having:过滤的是查询结果数据;
按年龄对表进行分组,并选择每个组的最⼤工资,并显示大于20000的工资
select max(salary) from employee group by age having max(salary) > 20000;
11. limit、offset
Impala中的limit子句用于将结果集的行数限制为所需的数,即查询的结果集不包含超过指定限制的记录。
一般来说,select查询的resultset中的行从0开始。使用offset子句,我们可以决定从哪里考虑输出。
select * from employee order by salary limit 2 offset 2;
使用offset关键字要求结果数据必须是排序之后的!!
1. insert into values
这种方式⾮非常类似于RDBMS的数据插⼊方式。
create table t_test2(id int,name string);
insert into table t_test2 values(1,”zhangsan”);
2. insert into select
插入一张表的数据来自于后面的select查询语句返回的结果。
3. create table as select
建表的字段个数、类型、数据来自于后续的select查询语句。
load data方式,这种方式不建议在Impala中使用,先使用load data方式把数据加载到Hive表中,然后使用以上方式插⼊入Impala表中。
在实际工作当中,因为impala的查询比较快,所以可能有会使用到impala来做数据库查询的情况,我们可以通过java代码来进行操作impala的查询。
1. 导入Jar包
org.apache.hadoop
hadoop-common
2.9.2
org.apache.hive
hive-metastore
2.3.7
org.apache.hive
hive-jdbc
2.3.7
org.apache.hive
hive-exec
2.3.7
2, java代码开发
package com.lagou.impala.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class ImpalaTest {
public static void main(String[] args) throws Exception {
//定义连接impala的驱动和连接url
String driver = "org.apache.hive.jdbc.HiveDriver";
String driverUrl = "jdbc:hive2://linux122:21050/default;auth=noSasl";
//查询的sql语句句
String querySql = "select * from t1";
//获取连接
Class.forName(driver);
//通过Drivermanager获取连接
final Connection connection = DriverManager.getConnection(driverUrl);
final PreparedStatement ps = connection.prepareStatement(querySql);
//执⾏行行查询
final ResultSet resultSet = ps.executeQuery();
//解析返回结果
//获取到每条数据的列列数
final int columnCount = resultSet.getMetaData().getColumnCount();
//遍历结果集
while (resultSet.next()) {
for (int i = 1; i <= columnCount; i++) {
final String string = resultSet.getString(i);
System.out.print(string + "\t");
}
System.out.println();
}
//关闭资源
ps.close();
connection.close();
}
}
Impala主要有三个组件,分别是statestore、catalog、impalad,对于impalad节点,每一个节点都可以接受客户端的查询请求,并且对于连接到该impalad的查询还要作为Coordinator节点(需要消耗一定的内存和CPU)存在,为了保证每一个节点资源开销的平衡需要对集群中impalad节点做一下负载均衡。
Cloudera官方推荐的代理方案:HAProxy
DNS做负载均衡
DNS做负载均衡方案是最简单的,但性能一般,所以这里我们按照官方的建议使用HAProxy实现负载均衡。
生产中选择一个非Impalad节点做为HAProxy的安装节点。
1. HAProxy方案
安装HAProxy:yum install -y haproxy
配置文件:vim /etc/haproxy/haproxy.cfg
具体配置内容:
# Example configuration for a possible web application. See the
# full configuration options online.
#
# http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http#mode { tcp|http|health },tcp 表示4层,http表示7
层,health仅作为健康检查使⽤用
log global
option httplog
option dontlognull
#option http-server-close
#option forwardfor except 127.0.0.0/8
#option abortonclose##连接数过⼤大⾃自动关闭
option redispatch#如果失效则强制转换其他服务器器
retries 3#尝试3次失败则从集群摘除
timeout http-request 10s
timeout queue 1m
#timeout connect 10s
#timeout client 1m
#timeout server 1m
timeout connect 1d#连接超时时间,重要,hive查询数据能返回结果的保证
timeout client 1d#同上
timeout server 1d#同上
timeout http-keep-alive 10s
timeout check 10s#健康检查时间
maxconn 3000#最⼤大连接数
listen status#定义管理理界⾯面
bind 0.0.0.0:1080#管理理界⾯面访问IP和端⼝口
mode http#管理理界⾯面所使⽤用的协议
option httplog
maxconn 5000#最⼤大连接数
stats refresh 30s#30秒⾃自动刷新
stats uri /stats
listen impalashell
bind 0.0.0.0:25003#ha作为proxy所绑定的IP和端⼝口
mode tcp#以4层⽅方式代理理,重要
option tcplog
balance roundrobin#调度算法 'leastconn' 最少连接数分配,或者 'roundrobin',轮询
分
server impalashell_1 linux121:21000 check
server impalashell_2 linux122:21000 check
server impalashell_3 linux123:21000 check
listen impalajdbc
bind 0.0.0.0:25004#ha作为proxy所绑定的IP和端⼝口
mode tcp#以4层⽅方式代理理,重要
option tcplog
balance roundrobin #调度算法 'leastconn' 最少连接数分配,或者 'roundrobin',轮询
分
server impalajdbc_1 linux121:21050 check
server impalajdbc_2 linux122:21050 check
server impalajdbc_3 linux122:21050 check
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main *:5000
acl url_static path_beg -i /static /images /javascript
/stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend static if url_static
default_backend app
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
balance roundrobin
server static 127.0.0.1:4331 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
balance roundrobin
server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check
启动:
开启:service haproxy start
关闭:service haproxy stop
重启:service haproxy restart
使用:
impala-shell访问方式:impala-shell -i linux123:25003
使用起来十分方便,区别仅相当于是修改了一个ip址和端口而已,其余不变。
jdbc:hive2://linux123:25004/default;auth=noSasl
Impala集群在操作过程中尽量多给内存,如果内存不能满足使用要求,Impala的执行很可能会报错!!
cloudera官网上的Impala文档,原名为《Impala Performance Guidelines and Best Practices》。主要介绍了为了提升impala性能应该考虑的一些事情,结合实际考虑:
1. 基本优化策略
文件格式:对于大数据量来说,Parquet文件格式是最佳的。
避免小文件:insert...values会产生大量小文件,避免使用。
合理分区粒度:利用分区可以在查询的时候忽略掉无用的数据,提高查询效率,通常情况下建议分区数量在3万以下(太多分区会造成元数据管理的性能下降)。
分区列数据类型最好是整数类型:分区列可以使用string类型,因为分区列的值最后都是作为HDFS目录使用,如果分区列使用整数类型可以降低内存消耗。
获取表的统计指标:在追求性能或者大量数据查询的时候,要先获取所需要表的统计指标(如:执行compute stats)。
减少传输客户端数据量:
聚合(如count、sum、max等)
过滤(where)
limit限制返回条数
返回结果不要使用美化格式进行展示(通过impala-shell展示结果时,添加这些可选参数:-B、--output_delimiter).
在执行之前使用EXPLAIN来查看逻辑规划,分析执行逻辑。
Impala join自动优化手段就是通过使用compute stats来收集参与join的每张表的统计信息,然后由impala根据表的大小、列的唯一值数目等来自动优化查询。为了更精确地获取每张表的统计信息,每次表的数据变更时(如执行insert、,add partition,drop partition等)最好执行一次compute stats获取准确的表的统计信息。
------------------------------------------------------------------------------------------------------------------------------
总结:
1. 121上:start-dfs.sh
123上:start-yarn.sh
2. 123上:nohup hive --service metastore &
nohup hive --service hiveserver2 &
3. 123上:service impala-state-store start
service impala-catalog start
service impala-server start
121上:service impala-server start
遇到的问题:
1. impala-server启动失败,应该是没有配置短路连接。
2. start-dfs.sh后 datanode没有启动成功,应该是短路连接配置里有中文乱码导致的