Impala的负载均衡

Impala主要有三个组件,分别是statestore,catalog和impalad,对于Impalad节点,每⼀个节点都可以接收客户端的查询请求,并且对于连接到该Impalad的查询还要作为Coordinator节点(需要消耗⼀定的内存和CPU)存在,为了保证每⼀个节点的资源开销的平衡需要对于集群中的Impalad节点做⼀下负载均衡.

  • Cloudera官⽅推荐的代理⽅案:HAProxy

  • DNS做负载均衡

DNS做负载均衡⽅案是最简单的,但是性能⼀般,所以这⾥我们按照官⽅的建议使⽤HAProxy实现负载均衡

⽣产中应该选择⼀个⾮Impalad节点作为HAProxy的安装节点

HAProxy⽅案

  1. 安装haproxy
1
yum install haproxy -y
  1. 配置⽂件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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 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
  1. 启动,查看状态,重启
1
2
# 开启:
service haproxy start
1
2
# 状态:
service haproxy status

如出现以上问题,应该是selinux问题,尝试关闭selinux

1
2
3
4
setsebool -P haproxy_connect_any=1

#重启:
service haproxy restart
1
2
# 关闭:
service haproxy stop
  1. 使⽤

Impala-shell访问⽅式

1
impala-shell -i Linux123:25003

JDBC访问方式

使⽤起来⼗分⽅便,区别仅仅相当于是修改了⼀个ip地址和端⼝⽽已,其余不变。

1
jdbc:hive2://Linux123:25004/default;auth=noSasl

Impala集群在操作过程中尽量多给内存,如果内存不能满⾜使⽤要求,Impala的执⾏很可能会报错!!

Impala优化

cloudera官⽹上的Impala⽂档,原名为《Impala Performance Guidelines and Best Practices》。主要介绍了为了提升impala性能应该考虑的⼀些事情,结合实际考虑:

  • ⽂件格式

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