Impala是Cloudera提供的⼀款开源的针对HDFS和HBASE中的PB级别数据进⾏交互式实时查询(Impala 速度快),Impala是参照⾕歌的新三篇论⽂当中的Dremel实现⽽来,其中旧三篇论⽂分别是 (BigTable,GFS,MapReduce)分别对应我们即将学的HBase和已经学过的HDFS以及MapReduce。
Impala最⼤卖点和最⼤特点就是快速,Impala中⽂翻译是⾼⻆羚⽺。
回顾前⾯⼤数据课程路线其实就是⼀个⼤数据从业者⾯对的⼤数据相关技术发展的过程,
⽐如我们按照阶段划分⼀个⼤数据开发任务,会有:数据采集(⽇志⽂件,关系型数据库中),数据清洗 (数据格式整理,脏数据过滤等),数据预处理(为了后续分析所做的⼯作),数据分析:离线处理(T+1分析),实时处理(数据到来即分析),数据可视化,机器学习,深度学习等
⾯对如此众多的阶段再加上⼤数据天⽣的⼤数据量问题没有任何⼀个框架可以完美cover以上每个阶 段。所以⼤数据领域有⾮常多框架,每个框架都有最适合⾃⼰的具体场景。⽐如:HDFS负责⼤数据量存储,MapReduce(Hive)负责⼤数据量的分析计算,
Impala 抛弃了 MapReduce 使⽤了类似于传统的 MPP 数据库技术 ,⼤⼤提⾼了查询的速度。
MPP 是什么?MPP (Massively Parallel Processing),就是⼤规模并⾏处理,在MPP集群中,每个节点资源都是独⽴享有也就是有独⽴的磁盘和内存,每个节点通过⽹络互相连接,彼此协同计算,作为整体提供数据服务。
简单来说,MPP是将任务并⾏的分散到多个服务器和节点上,在每个节点上计算完成后,将各⾃部分的结果汇总在⼀起得到最终的结果
对于MPP架构的软件来说聚合操作⽐如计算某张表的总条数,则先进⾏局部聚合(每个节点并⾏计算),然后把局部汇总结果进⾏全局聚合(与Hadoop相似)。
Impala与Hive对⽐分析
查询过程Hive:在Hive中,每个查询都有⼀个“冷启动”的常⻅问题。(map,reduce每次都要启动关闭,申请资源,释放资源。。。)
Impala:Impala避免了任何可能的启动开销,这是⼀种本地查询语⾔。 因为要始终处理查询,则 Impala守护程序进程总是在集群启动之后就准备就绪。守护进程在集群启动之后可以接收查询任务并执⾏查询任务。
中间结果Hive:Hive通过MR引擎实现所有中间结果,中间结果需要落盘,这对降低数据处理速度有不利影响。
Impala:在执⾏程序之间使⽤流的⽅式传输中间结果,避免数据落盘。尽可能使⽤内存避免磁盘开销
交互查询Hive:对于交互式计算,Hive不是理想的选择。
Impala:对于交互式计算,Impala⾮常适合。(数据量级PB级)
计算引擎Hive:是基于批处理的Hadoop MapReduce
Impala:更像是MPP数据库
容错Hive:Hive是容错的(通过MR&Yarn实现)
Impala:Impala没有容错,由于良好的查询性能,Impala遇到错误会重新执⾏⼀次查询
查询速度Impala:Impala⽐Hive快3-90倍。
1. Impala最⼤优点就是查询速度快,在⼀定数据量下;
2. 速度快的原因:避免了MR引擎的弊端,采⽤了MPP数据库技术,
1. Impala属于MPP架构,只能做到百节点级,⼀般并发查询个数达到20左右时,整个系统的吞吐已经达到满负荷状态,在扩容节点也提升不了吞吐量,处理数据量在PB级别最佳。
2. 资源不能通过YARN统⼀资源管理调度,所以Hadoop集群⽆法实现Impala、Spark、Hive等组件的动态资源共享。
Hive: 复杂的批处理查询任务,数据转换任务,对实时性要求不⾼同时数据量⼜很⼤的场景。
Impala:实时数据分析,与Hive配合使⽤,对Hive的结果数据集进⾏实时分析。impala不能完全取代hive,impala可以直接处理hive表中的数据。
Cloudera公司对于Impala的安装只提供了rpm包没有提供tar包;所以我们选择使⽤Cloudera的rpm包 进⾏Impala的安装,但是另外⼀个问题,Impala的rpm包依赖⾮常多的其他的rpm包,我们可以⼀个个 的将依赖找出来,但是这种⽅式实在是浪费时间。
rpm⽅式安装:需要⾃⼰管理rpm包的依赖关系;⾮常麻烦;解决依赖关系使⽤yum;默认Yum源是没有 Impala的rpm安装包,所以我们⾃⼰准备好所有的Impala安装所需的rpm包,制作Yum本地源,配置 Yum命令去到我们准备的Yun源中下载Impala的rpm包进⾏安装
本地Yum源⽅式
具体制作步骤
1. Linux121安装Httpd服务器
#yum ⽅式安装 httpd 服务器yum install httpd -y
# 启动 httpd 服务器systemctl start httpd
# 验证 httpd ⼯作是否正常 , 默认端⼝是 80 ,可以省略http://linux121
2.httpd默认存放⻚⾯路径
/var/www/html/
注:后续可以把下载的rpm包解压放置到此处便可以供⼤家访问。
3. 下载Impala安装所需rpm包
Impala所需安装包需要到Cloudera提供地址下载
http://archive.cloudera.com/cdh5/repo-as-tarball/5.7.6/cdh5.7.6- centos7.tar.gz
移动该安装包到/opt/lagou/software
解压缩tar -zxvf cdh5.7.6-centos7.tar.gz
4. 使⽤Httpd盛放依赖包
创建软链接到 /var/www/html 下ln -s /opt/lagou/software/cdh/5.7.6 /var/www/html/cdh57
验证http://linux121/cdh57/
如果提示403 forbiddenvim /etc/selinux/config
5. 修改Yum源配置⽂件
cd /etc/yum.repos.d# 创建⼀个新的配置⽂件vim local.repo
# 添加如下内容[local]name = localbaseurl = http://linux121/cdh57/gpgcheck = 0enabled = 1
name:对于当前源的描述
baseurl:访问当前源的地址信息
gpgcheck: 1 0,gpg校验
enabled:1/0,是否使⽤当前源
6. 分发local.repo⽂件到其它节点
rsync-script local.repo
rsync-script是自定义的分发函数
1.yum install -y rsync
2.cd /usr/local/bin
3.vi rsync-script
写入,注意循环使用自己的hostname
#!/bin/bash paramnum=$# if((paramnum==0)); then echo no params; exit; fi p1=$1 file_name=`basename $p1` echo fname=$file_name pdir=`cd -P $(dirname $p1); pwd` echo pdir=$pdir user=`whoami` for((host=1; host<4; host++)); do echo ------------------- linux12$host-------------- rsync -rvl $pdir/$file_name $user@linux12$host:$pdir done
4.chmod 777 rsync-script
服务名称
|
linux121 | linux122 | linux123 |
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
Linux123
yum install impala -yyum install impala-server -yyum install impala-state-store -yyum install impala-catalog -yyum install impala-shell -y
Linux121与Linux122
yum install impala-server -yyum install impala-shell -y
配置Impala
1. 修改hive-site.xml
vim hive-site.xmldfs.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.shstart-dfs.sh# 启动集群start-dfs.shstart-yarn.sh
3. Impala具体配置
引⽤HDFS,Hive配置,使⽤Yum⽅式安装impala默认的Impala配置⽂件⽬录为 /etc/impala/conf,Impala的使⽤要依赖 Hadoop,Hive框架,所以需要把Hdfs,Hive的配置⽂件告知Impala。
执⾏以下命令把Hdfs,Hive的配置⽂件软链接到/etc/impala/conf下
ln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/core-site.xml /etc/impala/conf/core-site.xmlln -s /opt/lagou/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml /etc/impala/conf/hdfs-site.xmlln -s /opt/lagou/servers/hive-2.3.7/conf/hive-site.xml /etc/impala/conf/hive-site.xml
所有节点更改Impala默认配置⽂件以及添加mysql的驱动包
vim /etc/default/impala
IMPALA_CATALOG_SERVICE_HOST=linux123IMPALA_STATE_STORE_HOST=linux123
所有节点创建mysql的驱动包的软链接
# 创建节点mkdir -p /usr/share/javaln -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-utilsexport JAVA_HOME = /opt/lagou/servers/jdk1.8.0_231
启动Impala
#linux123 启动如下⻆⾊service impala-state-store startservice impala-catalog startservice impala-server start# 其余节点启动如下⻆⾊service impala-server start
验证Impala启动结果
ps -ef | grep impala
注意:启动之后所有关于 Impala 的⽇志默认都在 /var/log/impala 这个路径下, Linux123机器上⾯应该有三个进程, Linux121 与 Linux122机器上⾯只有⼀个进程,如果进程个数不对,去对应⽬录 下查看报错⽇志 .
浏览器Web界⾯验证
访问 impalad 的管理界⾯http://linux123:25000/访问 statestored 的管理界⾯http://linux123:25010/
由于使⽤Yum命令安装Impala,我们选择使⽤yum⾃动进⾏Impala依赖的安装和处理,所以本次安装 默认会把Impala依赖的所有框架都会安装,⽐如Hadoop,Hive,Mysql等,为了保证我们⾃⼰安装的 Hadoop等使⽤正常我们需要删除掉Impala默认安装的其它框架
[root@linux122 conf] # which hadoop/usr/bin/hadoop[root@linux122 conf] # which hive/usr/bin/hive# 使⽤ which 命令 查找 hadoop,hive 等会发现,命令⽂件是 /usr/bin/hadoop ⽽⾮我们⾃⼰安装的路径,需要把这些删除掉 , 所有节点都要执⾏rm -rf /usr/bin/hadooprm -rf /usr/bin/hdfsrm -rf /usr/bin/hiverm -rf /usr/bin/beelinerm -rf /usr/bin/hiveserver2# 重新⽣效环境变量source /etc/profile
jps 时出现没有名字的进程 或者process information unavailable
rm -rf /tmp/hsperfdata_impala/
使⽤Yum⽅式安装Impala后,impala-shell可以全局使⽤;进⼊impala-shell命令⾏
impala-shell进⼊到impala的交互窗⼝
如果想要使⽤Impala ,需要将数据加载到Impala中,如何加载数据到Impala中呢?
- 使⽤Impala的外部表,这种适⽤于已经有数据⽂件,只需将数据⽂件拷⻉到HDFS上,创建⼀张Impala外部表,将外部表的存储位置指向数据⽂件的位置即可。(类似Hive)
- 通过Insert⽅式插⼊数据,适⽤于我们没有数据⽂件的场景。
1. 准备数据⽂件 user.csv
392456197008193000, 张三 ,20,0267456198006210000, 李四 ,25,1892456199007203000, 王五 ,24,1492456198712198000, 赵六 ,26,2392456197008193000, 张三 ,20,0392456197008193000, 张三 ,20,0
hadoop fs -mkdir -p /user/impala/t1# 上传本地 user.csv 到 hdfs /user/impala/table1hadoop fs -put user.csv /user/impala/t1
# 进⼊ impala-shellimpala-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' ;
# 创建⼀个内部表create table t2(id string,name string,age int,gender int)row format delimited fields terminated by ',' ;# 查看表结构desc t1;desc formatted t2;
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中添加如下配置
dfs.permissions.enabled false
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并转换成执⾏计划,交由后端执⾏,
statestoredstatestore监控集群中Impalad的健康状况,并将集群健康信息同步给Impalad,
statestore进程名为statestored
catalogdImpala执⾏的SQL语句引发元数据发⽣变化时,catalog服务负责把这些元数据的变化同步给其它 Impalad进程(⽇志验证,监控statestore进程⽇志)
catalog服务对应进程名称是catalogd
由于⼀个集群需要⼀个catalogd以及⼀个statestored进程,⽽且catalogd进程所有请求都是经过statestored进程发送,所以官⽅建议让statestored进程与catalogd进程安排同个节点。
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的接⼝,读取查询结果。
需要注意的⼏点:1. Impala与Hive类似它们的重点都是在与查询,所以像Update,delete等具有更新性质的操作最好不要使⽤这种⼯具,对于删除数据的操作可以通过Drop Table,Alter Table Drop Partition来实现,更新可以尝试使⽤Insert overwrite⽅式
2. 通常使⽤Impala的⽅式是数据⽂件存储在Hdfs⽂件系统,借助于Impala的表定义来查询和管理 Hdfs上的数据⽂件;
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 保存执⾏结果到⽂件当中去。
use _impala_builtins;show functions;
connect hostname 连接到指定的机器 impalad 上去执⾏。refresh dbname.tablename 增量刷新,刷新某⼀张表的元数据,主要⽤于刷新 hive当中数据表⾥⾯的数据改变的情况。invalidate metadata 全量刷新,性能消耗较⼤,主要⽤于 hive当中新建数据库或者数据库表的时候来进⾏刷新。quit/exit 命令 从 Impala shell 中退出explain 命令 ⽤于查看sql语句的执⾏计划。explain 的值可以设置成 0,1,2,3 等⼏个值,其中 3级别是最⾼的,可以打印出最全的信息 set explain_level = 3 ;profifile 命令执⾏ sql语句之后执⾏,可以打印出更加详细的执⾏步骤,主要⽤于查询结果的查看,集群的调优等。
CREATE DATABASE语句⽤于在Impala中创建新数据库。
CREATE DATABASE IF NOT EXISTS database_name;
/user/hive/warehouse/lagoutest.db
drop database sample cascade;
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 );
insert into table_name (column1, column2, column3,.. .columnN ) values (value1,value2, value3,.. .valueN );Insert into table_name values (value1, value2, value2);
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 );
3. select语句
describe table_name;简写desc table_name;
drop table database_name .table_name ;
truncate table_name;
create view if not exists view_name as select statement
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 ;
select * from table_name ORDER BY col_name[ ASC |DESC] [NULLS FIRST|NULLS LAST]
where:过滤的数据是原始数据,表中本来就存在的数据;
having:过滤的是查询结果数据;
select * from employee order by salary limit 2 offset 2 ;
这种⽅式⾮常类似于RDBMS的数据插⼊⽅式。
create table t_test2(id int ,name string);insert into table t_test2 values ( 1 ,”zhangsan”);
在实际⼯作当中,因为impala的查询⽐较快,所以可能有会使⽤到impala来做数据库查询的情况,我们可以通过java代码来进⾏操作impala的查询
org.apache.hadoop hadoop-common 2.9.2 org.apache.hive hive-common 2.3.7 org.apache.hive hive-metastore 2.3.7 org.apache.hive hive-service 2.3.7 org.apache.hive hive-jdbc 2.3.7 org.apache.hive hive-exec 2.3.7
import java.sql.*;
public class ImpalaTest {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
//定义连接impala的驱动和连接url
String driver = "org.apache.hive.jdbc.HiveDriver";
String driverUrl = "jdbc:hive2://test3.bigload.com:21050/impala;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();
}
}
yum install haproxy -y
vim /etc/haproxy/haproxy.cfg
listen impalashellbind 0.0.0.0:25003#ha作为 proxy 所绑定的 IP 和端口mode tcp#以 4 层⽅式代理,重要option tcplogbalance roundrobin#调度算法 'leastconn' 最少连接数分配,或者 'roundrobin',轮询server impalashell_1 linux121:21000 checkserver impalashell_2 linux122:21000 checkserver impalashell_3 linux123:21000 checklisten impalajdbcbind 0.0.0.0:25004#ha作为 proxy 所绑定的 IP 和端⼝mode tcp#以 4 层⽅式代理,重要option tcplogbalance roundrobin #调度算法 'leastconn' 最少连接数分配,或者 'roundrobin',轮询分server impalajdbc_1 linux121:21050 checkserver impalajdbc_2 linux122:21050 checkserver impalajdbc_3 linux122:21050 check#---------------------------------------------------------------------# main frontend which proxys to the backends#---------------------------------------------------------------------
开启: service haproxy start关闭: service haproxy stop重启: service haproxy restart
impala-shell -i linux123:25003
jdbc:hive2://linux123:25004/default;auth=noSasl
对于⼤数据量来说,Parquet⽂件格式是最佳的
insert ... values 会产⽣⼤量⼩⽂件,避免使⽤
利⽤分区可以在查询的时候忽略掉⽆⽤数据,提⾼查询效率,通常建议分区数量在3万以下 (太多的分区也会造成元数据管理的性能下降)
聚合(如 count、sum、max 等)
过滤(如 WHERE )
limit限制返回条数
返回结果不要使⽤美化格式进⾏展示(在通过impala-shell展示结果时,添加这些可选参数: - B、 --output_delimiter )