impala笔记

Impala

1、Impala简介

1、优缺点

优点

  1. Impala不需要把中间结果写入磁盘,省掉了大量的I/O开销。
  2. Impala抛弃了MapReduce ,impala直接通过相应的服务进程来进行作业调度,使⽤了类似于传统的MPP数据库技术,⼤⼤提⾼了查询的速度。,从而省掉不必要的shuffle、sort等开销。
  3. 通过使用LLVM来统一编译运行时代码,避免了为支持通用编译而带来的不必要开销。
  4. 用C++实现,做了很多有针对性的硬件优化,例如使用SSE指令。
  5. 使用了支持Data locality的I/O调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销

缺点

1)对内存的依赖大,且完全依赖于hive。

2)实践中,分区超过1万,性能严重下降。

3)只能读取文本文件,而不能直接读取自定义二进制文件。

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

  1. Impala属于MPP架构,只能做到百节点级,⼀般并发查询个数达到20左右时,整个系统的吞吐已

​ 经达到满负荷状态,在扩容节点也提升不了吞吐量,处理数据量在PB级别最佳

  1. 资源不能通过YARN统⼀资源管理调度,所以Hadoop集群⽆法实现Impala、Spark、Hive等组件

​ 的动态资源共享

2、Impala和hive 区别

1、执行计划不同

​ impala 执行计划表现为一颗完整的世界树,分发计划到各个impalad执行查询,能更好的并发和减少sort与 shuffle

​ hive map-shuffle-reduce-map-shuffle-reduce

2、数据流不同

​ impala 采用拉取方式,后续节点通过getnext主动向前一节点要数据,并返回给客户端,实时处理

​ hive 推进放方式,由前一节点处理完后,推给后节点

3、使用内存不同

​ impala 使用内存,内存不够时报错,不涉及io操作,insert除外

​ hive 内存不够则使用外存,每一轮map-reduce结束,写入hdfs。shuffle也有io操作

4、调度不同

​ impala 调度由自己完成,只有simple-shedule一种

​ hive 依赖hadoop的调度策略

5、容错不同

​ impala查询时无容错逻辑,直接报错,

​ hive 依赖hadoop的容错能能力

6、使用面不同

​ impala实时分析,不支持udf,处理的问题域由一定的限制,结合hive使用

​ hive 复杂的批处理任务,数据转移任务

Impala优势总结

  1. Impala最⼤优点就是查询速度快,在⼀定数据量下;

  2. 速度快的原因:避免了MR引擎的弊端,采⽤了MPP数据库技术,

MPP是将任务并⾏的分散到多个服务器和节点上,在每个节点上计算完成后,将各⾃部分的

结果汇总在⼀起得到最终的结果

2、服务部署,环境准备

服务名称hadoop201hadoop202hadoop203
hadoopnamenodesecondnamenode
hadoopyarn
hivehivehivehive
hueHue(不能有mysql)
flume-flume-
Impalaimpala-catalogd
Impalaimpala-statestored
Impalaimpala-server(与nodedata一块)impala-serverr(与nodedata一块)impala-serverr(与nodedata一块)
HiveServer2clientHiveServer2
metastoremetastoreclientmetastore

1、impala角色

Impala⻆⾊
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  官⽅建议statestore与catalog安装在同⼀节点上!!

2、安装步骤

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

Linux121与Linux122

yum install impala-server -y
yum install impala-shell -y

3、修改配置

  1. 修改hive-site.xml

    1、
    <!--指定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>
    
    2、
    短路读取:就是Client与DataNode属于同⼀节点,⽆需再经过⽹络传输数据,直接本地读取。
    要配置短路本地读,需要验证本机Hadoop是否有libhadoop.so;
    /opt/lagou/servers/hadoop-2.9.2/lib/native  含还有.so结尾的就是c++语言 缺少时不能运行的
    
    #所有节点创建⼀下⽬录
    mkdir -p /var/lib/hadoop-hdfs
    
    <!-- 打开短路读取配置-->
    <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>
    
    
    

2、impala 配置

引⽤HDFS,Hive配置

注:所有节点都要执⾏此命令!
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

所有节点更改Impala默认配置⽂件以及添加mysql的驱动包

vim /etc/default/impala
<!--更新如下内容 -->
IMPALA_CATALOG_SERVICE_HOST=linux123
IMPALA_STATE_STORE_HOST=linux123

#创建节点
mkdir -p /usr/share/java

ln -s /opt/servers/hive-2.3.7/lib/mysql-connector-java-5.1.46.jar /usr/share/java/mysql-connector-java.jar

修改bigtop的java_home路径 
vim /etc/default/bigtop-utils

export JAVA_HOME=/opt/servers/jdk1.8.0_231

注意:Apache Bigtop 是⼀个针对基础设施⼯程师和数据科学家的开源项⽬,旨在全⾯打包、测试

和配置领先的开源⼤数据组件/项⽬。Impala项⽬中使⽤到了此软件。

4、启动Impala

#linux123启动如下⻆⾊
service impala-state-store start
service impala-catalog start
service impala-server start
#其余节点启动如下⻆⾊
service impala-server start


ps -ef | grep impala

浏览器Web界⾯验证

访问impalad的管理界⾯
http://linux123:25000/
访问statestored的管理界⾯
http://linux123:25010/

注意:

启动之后所有关于Impala的⽇志默认都在/var/log/impala 这个路径下,

Linux203机器上⾯ 应该有三个进程,

Linux201与Linux202机器上⾯只有⼀个进程,如果进程个数不对,去对应⽬录 下查看报错⽇志.

消除Impala影响

由于使⽤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/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_*

3、架构

1、架构

在这里插入图片描述

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并转换成执⾏计划,交由后端执⾏,

statestored
	1、statestore监控集群中Impalad的健康状况,并将集群健康信息同步给Impalad,
	2、statestore进程名为statestored
catalogd
	1、Impala执⾏的SQL语句引发元数据发⽣变化时,catalog服务负责把这些元数据的变化同步给其它Impalad进程(⽇志验证,监控statestore进程⽇志)
	2、catalog服务对应进程名称是catalogd
	3、由于⼀个集群需要⼀个catalogd以及⼀个statestored进程,⽽且catalogd进程所有请求都是经过statestored进程发送,所以官⽅建议让statestored进程与catalogd进程安排同个节点。

2、查询流程

在这里插入图片描述

1. Client提交任务
	Client发送⼀个SQL查询请求到任意⼀个Impalad节点,会返回⼀个queryId⽤于之后的客户端操作。
2. ⽣成单机和分布式执⾏计划
SQL提交到Impalad节点之后,Analyser依次执⾏SQL的词法分析、语法分析、语义分析等操作;从MySQL元数据库中获取元数据,从HDFS的名称节点中获取数据地址,以得到存储这个查询相关数据的所有数据节点
	a、单机执⾏计划: 根据上⼀步对SQL语句的分析,由Planner先⽣成单机的执⾏计划,该执⾏计划是有PlanNode组成的⼀棵树,这个过程中也会执⾏⼀些SQL优化,例如Join顺序改变、谓词下推等。
	b、分布式并⾏物理计划:将单机执⾏计划转换成分布式并⾏物理执⾏计划,物理执⾏计划由⼀个个的Fragment组成,Fragment之间有数据依赖关系,处理过程中需要在原有的执⾏计划之上加⼊⼀些ExchangeNode和DataStreamSink信息等。
		b-1)Fragment : sql⽣成的分布式执⾏计划的⼀个⼦任务;
		b-2)DataStreamSink:传输当前的Fragment输出数据到不同的节点
3. 任务调度和分发
	Coordinator将Fragment(⼦任务)根据数据分区信息发配到不同的Impalad节点上执⾏。Impalad节点接收到执⾏Fragment请求交由Executor执⾏。
4. Fragment之间的数据依赖
	每⼀个Fragment的执⾏输出通过DataStreamSink发送到下⼀个Fragment,Fragment运⾏过程中不断向coordinator节点汇报当前运⾏状态。
5. 结果汇总
	查询的SQL通常情况下需要有⼀个单独的Fragment⽤于结果的汇总,它只在Coordinator节点运⾏,将多个节点的最终执⾏结果汇总,转换成ResultSet信息。
6. 获取结果
	客户端调⽤获取ResultSet的接⼝,读取查询结果。

单机执行计划
在这里插入图片描述

分布式执行计划
在这里插入图片描述

分布式执⾏计划中涉及到多表的Join,Impala会根据表的⼤⼩来决定Join的⽅式,主要有两种分别是Hash Join与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计算,返回结果给⽤户

常用命令

刷新表 refresh db.table;
全量刷新所有数据库 invalidate metadata	
没有真正执行sql 只列举查询计划  exlain select * from table;
--------------------------------------------
explain的值可以设置成0,1,2,3等⼏个值,其中3级别是最⾼的,可以打印出最全的信息
set explain_level=3;

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

区别
expalin:可以不真正执⾏任务,只是展示任务的执⾏计划;
profile:需要任务执⾏完成后调⽤,可以从更底层以及更详细的层⾯来观察我们运⾏impala的任务,进⾏调优
---------------------------------------------------
DROP DATABASE语句⽤于从Impala中删除数据库。 在删除数据库之前,建议从中删除所有表。
drop database sample cascade; 强制删除

 drop table database_name.table_name; 语句⽤于删除Impala中的现有表。此语句还会删除内部表的底层HDFS⽂件。

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;
----------------------------------------------------
 limit、offset
 select查询的resultset中的⾏从0开始。使⽤offset⼦句,我们可以决定从哪⾥考虑输出。
 select * from employee order by salary limit 2 offset 2;
 使⽤offset关键字要求结果数据必须是排序之后的!!
 

4、 负载均衡 和 Impala优化

1、
Cloudera官⽅推荐的代理⽅案:HAProxy
DNS做负载均衡
⽣产中应该选择⼀个⾮Impalad节点作为HAProxy的安装节点

1、安装haproxy
yum install haproxy -y
2、配置⽂件
vim /etc/haproxy/haproxy.cfg

global
 log 127.0.0.1 local2
 chroot /var/lib/haproxy
 pidfile /var/run/haproxy.pid
 maxconn 4000
 user haproxy
 group haproxy
 daemon

 stats socket /var/lib/haproxy/stats
 
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

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


3、启动
开启: service haproxy start
 关闭: service haproxy stop
 重启: service haproxy restart

4、 测试

impala-shell -i linux123:25003

jdbc:hive2://linux123:25004/default;auth=noSasl


优化
基本优化策略

⽂件格式
	对于⼤数据量来说,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获取到准确的表统计信息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值