排序:
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 更多配置