hive-笔记总结02

我们接着上次的hive继续总结

配置补充,hiveserer2的高可用

node2-hive-site.xml

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
<property>  
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node01:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123</value>
</property>
<property>
<name>hive.server2.support.dynamic.service.discovery</name>
<value>true</value>
</property>
<property>
<name>hive.server2.zookeeper.namespace</name>
<value>hiveserver2_zk</value>
</property>
<property>
<name>hive.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node02</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10001</value>
</property>

node4-hive-site.xml

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
<property>  
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://node01:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123</value>
</property>
<property>
<name>hive.server2.support.dynamic.service.discovery</name>
<value>true</value>
</property>
<property>
<name>hive.server2.zookeeper.namespace</name>
<value>hiveserver2_zk</value>
</property>
<property>
<name>hive.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>node04</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10001</value>
</property>

beeline连接

!connect jdbc:hive2://node01,node02,node03/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_zk root 123

hive权限管理

在hiveserver2的节点添加如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
</property>
<property>
<name>hive.users.in.admin.role</name>
<value>root</value>
</property>
<property>
<name>hive.security.authorization.manager</name> <value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory</value>
</property>
<property>
<name>hive.security.authenticator.manager</name>
<value>org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator</value>
</property>

中间的root改为自己启动hive的用户名,这样以后通过其他角色连接你的hive,操作数据库和表就需要更加细粒度的权限

角色授权命令如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
--角色的添加、删除、查看、设置:
-- 创建角色
CREATE ROLE role_name;
-- 删除角色
DROP ROLE role_name;
-- 设置角色
SET ROLE (role_name|ALL|NONE);
-- 查看当前具有的角色
SHOW CURRENT ROLES;
-- 查看所有存在的角色
SHOW ROLES;

grant 操作名 on psn8 to user 用户名;
为某个用户授权
revoke 操作名 on psn8 from user 用户名;
移除某个用户的权限

hive优化

  1. 查看hive的执行计划
    hive的SQL语句在执行之前需要将SQL转换成Mapreduce任务,因此需要了解具体的转换过程.可以在SQL语句中输入如下命令查看具体的执行计划
1
2
--查看执行计划,添加extended关键字可以查看更加详细的执行计划
explain [extended] query
  1. hive的抓取策略
    理论上来说hive会把所有的SQL语句转换为Mapreduce操作,但实际操作中比如说select,我们看到他并没有输出mapreduce计算任务的log,只不过Hive在转换SQL语句的过程中会做部分优化,使某些简单的操作不再需要转换成MapReduce.
  2. select 仅支持本表字段
  3. where 仅对本表字段做条件过滤
1
set hive.fetch.task.conversion=none/more

3.hive本地模式
在开发测试阶段,可以设置hive的本地模式,提高SQL语句的执行效率,验证SQL是否执行正确

1
set hive.exec.mode.local.auto=true;

注意:要想使用Hive的本地模式,加载数据文件大小不能超过128MB,如果超过128M,计算设置本地模式,也会按照集群模式运行

1
set hive.exec.mode.local.auto.inputbytes.max=128M
  1. hive并行模式
    在SQL语句足够复杂的情况下,可能在一个SQL语句中包含多个子查询语句,且多个自查询语句之间没有任何任何依赖关系,此时,可以设置hive的并行度
1
2
允许设置hive并行执行
set hive.exec.parallel=true;

hive的并行度并不是无限增加的,在一次SQL计算中,可以通过以下参数来设置并行的job的个数

hive.exec.parallel.thread.number
1

  1. hive严格模式
    hive为了提高SQL语句的执行效率,可以设置严格模式,充分利用Hive的某些特点
1
set hive.mapred.mode=strict;
  • 对于分区表,必须添加where对于分区字段的条件过滤
  • order by语句必须包含limit输出限制
  • 限制执行笛卡尔积的查询
  1. Hive排序
    在编写SQL语句的过程中,很多情况下徐亚对数据进行排序操作,Hive中支持多种排序操作适合不同的应用场景
  • Order By-对于查询结果做全排序,只允许有一个reduce处理
  • Sort By 对于单个reduce的数据进行排序
  • Distribute By-分区排序,经常和Sort By结合使用
  • Cluster by 相当于Sort By + Distribute By 无法倒序排列
  1. Hive join
  • Hive在多个表的join操作时尽可能多的使用相同的连接键,这样转换MR任务会转换成少的MR任务
  • 手动Map join在map端完成join操作
1
2
3
--SQL方式,在SQL语句中添加Mapjoin标记
SELECT MAPJOIN(smallTable) smallTable.Key,bigTable.value
FROM smallTable JOIN bigTable ON smallTable.key = bigTabel.key
  • 开启自动的Map join
1
2
3
4
5
--通过修改一下配置启用自动的mapjoin;
set hive.auto.convert.join = true;
--(该参数为true时,Hive自动对左边的表统计量,如果是小表就加入内存,即对小表使用Map join)
--相关配置参数:
hive.mapjoin.smalltable.filesize;
  • 大表join大表
  • 空key过滤:有时join超时是因为某些key对应的数据太多,而相同对应的数据就会发送到相同的reducer,从而导致内存不够,此时我们应该仔细分析这些异常的key,很多情况下,这些key对应的数据是异常数据,我们需要在SQL语句进行
  • 空key转换:有时虽然某个key为空对应的数据很多,但是相应的不是异常数据,必须要包含在join的结果中,此时我们可以表a中key为空的字段赋值一个随机的值,使得数据随机均匀地分布到不同的reducer上
  1. 合并小文件
    hive在操作的时候,如果文件数目小,容易在文件存储造成压力,给hdfs造成压力,影响效率
1
2
3
4
5
6
7
--设置合并属性
--是否合并map输出文件:
set hive.merge.mapfiles=true
--是否合并reduce输出文件:
set hive.merge.mapredfiles=true;
--合并文件的大小:
set hive.merge.size.per.task=256*1000*1000
  1. 合理设置Map以及Reduce的数量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
--Map数量相关的参数
--一个split的最大值,即每个map处理文件的最大值
set mapred.max.split.size
--一个节点上split的最小值
set mapred.min.split.size.per.node
--一个机架上split的最小值
set mapred.min.split.size.per.rack
--Reduce数量相关的参数
--强制指定reduce任务的数量
set mapred.reduce.tasks
--每个reduce任务处理的数据量
set hive.exec.reducers.bytes.per.reducer
--每个任务最大的reduce数
set hive.exec.reducers.max
  1. JVM重用
1
2
3
4
5
6
7
8
/*
适用场景:
1、小文件个数过多
2、task个数过多
缺点:
设置开启之后,task插槽会一直占用资源,不论是否有task运行,直到所有的task即整个job全部执行完成时,才会释放所有的task插槽资源!
*/
set mapred.job.reuse.jvm.num.tasks=n;--(n为task插槽个数)