hive 三 排序和优化

排序:

order by:

全局排序,执行一个reduce任务

sort by:

在一个reduce任务中的数据是有序的,但是总体数据看是无序的。如果只是执行一个reduce任务和order by是一样的。

通过set   mapreduce.job.reduces=num  设置reduce任务的数量。数据的分到不同的reduce默认使用hash算法。

distribute by:

分区排序,指定以什么字段进行分区排序,结合sort by使用。select * from testA distribute by field1 sort by field2.

需要注意的是distribute by需要在sort by之前,这是因为需要先指定分区。

cluster by:

当distribute by和sort by选择的字段是一样的时候,直接使用cluster by效果是一样的。

hive数据压缩:推荐使用snappy  数据存储推荐使用orc(列式存储)  在创建表时可以指定存储格式和压缩方式

STORED AS orc tabproperties(" orc.compress"="SNAPPY")

hive优化:

1.FetchTask  取消某些MR

修改配置文件 hive-site.xml:

<property>
    <name>hive.fetch.task.conversion</name>
    <value>more</value>
  </property>

2.表拆分(子表)

3.分区表,外部表 结合使用 多级分区 (month,day,hour)

4.数据格式(orc),数据压缩(snappy)

5.sql优化  先filter后join

Reduce Join:

表join发生在Reduce阶段 通常是两个较大表join   每个表的数据都是从文件中读取的

Map Join:

表join发生在Map阶段 通常是一大一小的表join  大表数据从文件中读取,小表数据从内存中读取   通过DistributedCache 类将小表数据缓存到各个节点中

SMB Join:Sort-Merge-Bucket 在大表join时进行优化

在创建表时以jion字段进行分区排序,将排序完成的数据划分到不同的Bucket(分区)中。大表join的时候就会根据对应的Bucket进行join,减少查询对表的次数。 官网

6.数据倾斜:group by ,distinct

hive执行计划:

显示执行计划:explain extended select XXX

hive在job中没有依赖关系时,可以设置并行执行:

最多可以并行执行多少个作业:hive.exec.parallel.thread.number  一般在10~20    

是否并行执行作业:   hive.exec.parallel  默认是false

JVM重用:就是在一个JVM中启动多个MR   mapreduce.job.jvm.numtasks    不要超过9个

设置Map数目: hive.merge.size.per.task  通过设置map读取最大文件的值来控制map的数量

设置Reduce数目:mapreduce.job.reduces 

通过数据测试每个reduce完成的时间,修改reduce数量。将所有reduce完成任务的时间控制在一定范围内。

推测执行:ApplicationMaster 会通过任务完成的时间来判断是否启动该任务的副本任务,当一个任务完成后,会将这个任务的副本任务都kill 。这样会消耗性能 将mapreduce.map.speculative  ,hive.mapred.reduce.task.speculative.execution  ,

mapreduce.reduce.speculative 都设置为false  默认为true

动态分区

开启动态分区 hive.exec.dynamic.partition=true  默认是false   更多配置

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值