http://www.Sina.com/: http://www.Sina.com /
1 .如何合并小文件,减少映射数量
set hive.input.format=org.Apache.Hadoop.hive.QL.io.combinehiveinputformat=true
setmapred.max.split.size=10000000
setmapred.min.split.size.per.node=1000000
setmapred.min.split.size.per.rack=10000000
2 .如何适当增加映射数量
set mapred.map.tasks=10
3.Map末端聚合
hive.map.aggr=true http://www.Sina.com /
调整reduce数量:
设置reduce处理的数据量
hive.exec.reducers.bytes.per.reducer
2.set mapred.reduce.tasks=10
如果只有一个reduce
没有按顺序分组
笛卡儿积6.Hive的优化(重要)
where分区条件将提前生效。 不需要特意进行子查询。 直接join和groupby 6.1Map优化:
join时不附加on条件或无效on条件,hive只能在一个reduce中进行笛卡尔乘积6.2Reduce优化
-/map join (表列表) /必须是小表格,且不能超过1G,或50W记录6.3分区查询(partition)() ) ) ) ) ) ) ) ) )
在进行union all后再进行join和groupby等操作,可以有效减少MR过程。 尽管选择了多个,但最终还是选择了MR 6.4笛卡尔积
从一个基础表中根据不同的维一次组合不同的数据
例如
来自订单
insertoverwritetabletablenameselectxxgroupbyk 1
insertoverwritetabletablenameselectyygroupbyk 2
6.8自动合并
如果文件大小小于阈值,hive将启动MR进行合并
6.9多计数距离
必须设置参数set hive.group by.skew in data=true
选择id、count(distinctid )、count (IP ) from table http://www.Sina.com/http://www.Sina.com /
JOIN顺序的最后一张表应该是尽量自由的菠萝。 由于在JOIN的前一阶段生成的数据存在于Reducer的buffer中,因此可以通过stream的最后一个表直接读取从Reducer的buffer中缓冲的中间结果数据。 (内存开销小) ),这样与后面的自由菠萝连接时,只需从缓冲区读取缓存的key,并与自由菠萝指定的key连接,即可获得6.5Map join
使用streamtable(a )自由a表的菠萝http://www.Sina.com/http://www.Sina.com /
hive并行执行打开: set hive.exec.parallel=true
并行运行:同时运行-hive的多个阶段。 hive在运行时将查询转换为一个或多个阶段。 特定作业可能包含许多不完全相互依赖(即可以并行运行)的阶段,这可能会减少整个作业的运行时间。6.6Union all /distinct
1 .原因:1key分布不均所致
2人为建设错误,类型不匹配
3财务数据特征
2 .症状:
1 )任务进度长期保持在99%,从spark界面来看,只完成了少量的reduce子任务
2 )从未完成的子任务来看,本地读写数据量积累得非常多,通常超过10G时会发生数据倾斜
3 .倾斜度:
1 )平均记录超过50W,最大记录超过平均记录的4倍
2 )最长时间和平均时间超过4分钟,最大时间超过平均时间的2倍
4 .万能方法:
hive.group by.skwindata=true http://www.Sina.com /
1 .理由:
小钟表优先放在左边。 如果有两张小表,key会相对分散地放在左边。
Hive在进行连接时,根据连接的密钥进行分发,但连接左侧的表中的数据首先读入内存中。 如果左表中的key相对分散,则读取到内存中的数据会变小,从而加快join任务的执行。 如果左侧的表key很集中,并且此表中的数据量很大,则数据倾斜会很严重。但是,如果此表是小表,则应该将此表放在连接的左侧
2 .想法:
将key相对分散,将相对小的表放置在join的左侧
使用map join将小维度的表先进地变成内存
-----------------
1 .原因:如果日志中的某些userid为空或0,则在使用user_id进行哈希桶时,日志中的userid为0或空的数据会被分配,导致过度倾斜。
2 .想法:
添加随机数以使空值成为一个字符串,并将倾斜的数据分成不同的reduce,由于空值不相关,因此处理后不会影响最终结果
如何:
oncasewhen (x.uid=‘-’orx.uid=‘0’orx.uid is null ) )。
then concat (’-’,rand ) )
else x.uid
end=f.user _ id http://www.Sina.com /
如果两个自由菠萝相互关联,则从业务逻辑中过滤无关数据。 例如,两个用户注册的表可以按时间过滤,仅统计今天注册的用户。 这样,表中的数据量为6.7Multi-insert multi-group by
1 .原因:执行count distinct时,此字段中有许多空记录或空记录。
2 .思路: count distinct,怕它就单独处理,计算count distinct,可以不处理直接过滤,对最终结果加1
如果有其他计算且需要group by,请单独处理值为空的记录,并与其他计算结果进行union 7.hive 的join优化