HSQL
转载:https://www.fangxuan.win/2018/08/09/hive-%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98/
-
按照时间分区的hive表,查询时要加上时间限制,默认从所有数据进行遍历
-
事实上“把小表放在前面做关联可以提高效率”这种说法是错误的。正确的说法应该是“把重复关联键少的表放在join前面做关联可以提高join的效率。” https://blog.csdn.net/qq_26442553/article/details/80865014
-
使用同一个连接键,当对三个或者更多个表进行join的话,只会产生一个mapreduce任务,如果join的条件各不相同,那么mapreduce任务的数目应该和join的个数相同。
-
尽早的过滤数据
-
用insert into代替union all。如果union all的部分个数大于2,或者每个union部分数据量大,应该拆成多个insert into 语句,实际测试过程中,执行时间能提升50%
-
limit,Limit语句还是需要执行整个查询语句,然后再返回部分结果。开启以下属性,可直接对数据进行采样:
hive.limit.optimize.enable=true//开启对数据源进行采样的功能 hive.limit.row.max.size //设置最小的采样容量 hive.limit.optimize.limit.file //设置最大的采样样本数
-
hive是串行执行的,如果数据互不依赖,可以通过以下配置设置并行:
set hive.exec.parallel=true //可以开启并发执行。 set hive.exec.parallel.thread.number=16; //同一个sql允许最大并行度,默认为8。
-
map优化,map的数量是由input的文件总个数,input的文件大小,集群设置的文件块大小共同决定的
1)减少map数量//场景,input的文件很小,很多 //属性设置 set mapreduce.input.fileinputformat.split.minsize.per.node=104857600; //创建节点本地分区的最小数据字节数,否则数据将合并到机架级别。默认值:0 set mapreduce.input.fileinputformat.split.minsize.per.rack=104857600; //创建机架本地分区的最小数据字节数,否则数据将合并到全局级别。默认值:0 set mapreduce.input.fileinputformat.split.maxsize=268435456; //单位为B,设置最大分片大小默认为dfs.blocksize //前面三个参数确定合并文件块的大小,大于文件块大小大于256m的,按照256m来分隔,小于256m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的)进行合并。
2)增加map数量
```
//场景,input的文件很大,任务很慢
//属性设置
set mapreduce.input.fileinputformat.split.maxsize=更大值;
//由于mapreduce中没有办法直接控制map数量,所以只能曲线救国,通过设置每个map中处理的数据量进行设置。(默认为 dfs.blocksize)
```
-
reduce优化,
//Hive将自动确定reduce的数量,reduce个数 = InputFileSize / bytes per reducer,所以通过设置,曲线救国 set hive.exec.reducers.bytes.per.reducer = 256000000;//设置每一个 reducer 的平均负载字节数 在Hive 0.14.0及更早版本中的默认值为1GB,即,如果输入大小为10 GB,则将使用10个reducer。 在Hive 0.14.0及更高版本中,默认值为256 MB,即,如果输入大小为1 GB,则将使用4个reducer。
-
解决数据倾斜
1)、sql脚本原因,尽量在map段执行combine,增加reducer数量,避免COUNT这种”全聚合(full aggregates)“
2)、无效ID在关联时的数据倾斜问题,解决办法,比如针对id为null的情况,把空值的 key 变成一个字符串加上随机数
3)、不同数据类型关联产生的倾斜问题,比如两张表进行主键关联,表A的主键id是32位字符串类型,表B的主键id是bigint类型,在关联时会将表A的主键转为数值类型,做 hash 来分配 Reduce。这样表1的数据都到一个 Reduce 上了
4)、数据倾斜其他解决方案set hive.groupby.skewindata=true;这是通用的算法优化,但算法优化有时不能适应特定业务背景,开发人员了解业务,了解数据,可以通过业务逻辑精确有效的解决数据倾斜问题。 在使用SUM,COUNT,MAX,MIN等UDAF函数时,不怕数据倾斜问题,Hadoop在Map端的汇总合并优化过,使数据倾斜不成问题
网友评论