首页 > 编程知识 正文

hive统计字段的数量,hive数据倾斜原理及解决

时间:2023-05-06 04:32:15 阅读:22923 作者:1952

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优化

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。