qg777娱乐官网
service phone

农用化肥简介您当前的位置:qg777娱乐官网 > 农用化肥简介 >

农用化肥简介 Hive千亿级数据倾斜解决方案

时间:2021-07-18    点击量:

农用化肥简介

农用化肥简介

本文转载自微信公多号「五分钟学大数据」,作者园陌 。转载本文请有关五分钟学大数据公多号。

农用化肥简介

数据倾斜题目剖析

农用化肥简介

数据倾斜是分布式体系不可避免的题目,任何分布式体系都有几率发生数据倾斜,但有些幼友人在通俗做事中感知不是很清晰。这边要仔细本篇文章的标题—“千亿级数据”,为什么说千亿级,由于倘若一个义务的数据量只有几百万,它即使发生了数据倾斜,一切数据都跑到一台机器往实走,对于几百万的数据量,一台机器实走首来照样毫无压力的,这时数据倾斜对吾们感知不大,只有数据达到一个量级时,一台机器搪塞不了这么无数据,这时倘若发生数据倾斜,末了就很难算出效果。

农用化肥简介

因而就必要吾们对数据倾斜的题目进走优化,尽量避免或减轻数据倾斜带来的影响。

农用化肥简介

在解决数据倾斜题目之前,还要再挑一句:异国瓶颈时谈论优化,都是自寻懊丧。

农用化肥简介

行家想想,在map和reduce两个阶段中,最容易展现数据倾斜的就是reduce阶段,由于map到reduce会经过shuffle阶段,在shuffle中默认会遵命key进走hash,倘若相通的key过多,那么hash的效果就是大量相通的key进入到联相符个reduce中,导致数据倾斜。

农用化肥简介

那么有异国能够在map阶段就发生数据倾斜呢,是有这栽能够的。

农用化肥简介

一个义务中,数据文件在进入map阶段之前会进走切分,默认是128M一个数据块,但是倘若当对文件操纵GZIP压缩等不声援文件分割操作的压缩手段时,MR义务读取压缩后的文件时,是对它切分不了的,该压缩文件只会被一个义务所读取,倘若有一个超大的不可切分的压缩文件被一个map读取时,就会发生map阶段的数据倾斜。

农用化肥简介

因而,从内心上来说,发生数据倾斜的因为有两栽:一是义务中必要处理大量相通的key的数据。二是义务读取不可分割的大文件。

农用化肥简介

数据倾斜解决方案

农用化肥简介

MapReduce和Spark中的数据倾斜解决方案原理都是相通的农用化肥简介,以下商议Hive操纵MapReduce引擎引发的数据倾斜,Spark数据倾斜也能够此为参照。

农用化肥简介

1. 空值引发的数据倾斜

农用化肥简介

实际营业中有些大量的null值或者一些有时义的数据参与到计算作业中,外中有大量的null值,倘若外之间进走join操作,就会有shuffle产生,如许一切的null值都会被分配到一个reduce中,必然产生数据倾斜。

农用化肥简介

之前有幼友人问,倘若A、B两外join操作,倘若A外中必要join的字段为null,但是B外中必要join的字段不为null,这两个字段根本就join不上啊,为什么还会放到一个reduce中呢?

农用化肥简介

这边吾们必要清晰一个概念,数据放到联相符个reduce中的因为不是由于字段能不克join上,而是由于shuffle阶段的hash操作,只要key的hash效果是相通的,它们就会被拉到联相符个reduce中。

农用化肥简介

解决方案:

农用化肥简介

第一栽:能够直接不让null值参与join操作,即不让null值有shuffle阶段

农用化肥简介
SELECT * FROM log a  JOIN users b  ON a.user_id IS NOT NULL   AND a.user_id = b.user_id UNION ALL SELECT * FROM log a WHERE a.user_id IS NULL; 
农用化肥简介

第二栽:由于null值参与shuffle时的hash效果是相通的,那么吾们能够给null值随机赋值,如许它们的hash效果就纷歧样,就会进到差别的reduce中:

农用化肥简介
SELECT * FROM log a  LEFT JOIN users b ON CASE     WHEN a.user_id IS NULL THEN concat('hive_', rand())    ELSE a.user_id   END = b.user_id; 
农用化肥简介

2. 差别数据类型引发的数据倾斜

农用化肥简介

对于两个外join,外a中必要join的字段key为int,外b中key字段既有string类型也有int类型。当遵命key进走两个外的join操作时,默认的Hash操作会按int型的id来进走分配,如许一切的string类型都被分配成联相符个id,效果就是一切的string类型的字段进入到一个reduce中,引发数据倾斜。

农用化肥简介

解决方案:

农用化肥简介

倘若key字段既有string类型也有int类型,默认的hash就都会按int类型来分配,那吾们直接把int类型都转为string就益了,如许key字段都为string,hash时就遵命string类型分配了:

农用化肥简介
SELECT * FROM users a  LEFT JOIN logs b ON a.usr_id = CAST(b.user_id AS string); 
农用化肥简介

3. 不可拆分大文件引发的数据倾斜农用化肥简介

农用化肥简介

当集群的数据量添长到肯定周围,有些数据必要归档或者转储,这时候往往会对数据进走压缩;当对文件操纵GZIP压缩等不声援文件分割操作的压缩手段,在日后有作业涉及读取压缩后的文件时,该压缩文件只会被一个义务所读取。倘若该压缩文件很大,则处理该文件的Map必要消耗的时间会远多于读取清淡文件的Map时间,该Map义务会成为作业运走的瓶颈。这栽情况也就是Map读取文件的数据倾斜。

农用化肥简介

解决方案:

农用化肥简介

这栽数据倾斜题目异国什么益的解决方案,只能将操纵GZIP压缩等不声援文件分割的文件转为bzip和zip等声援文件分割的压缩手段。

农用化肥简介

因而,吾们在对文件进走压缩时,为避免因不可拆分大文件而引发数据读取的倾斜,在数据压缩的时候能够采用bzip2和Zip等声援文件分割的压缩算法。

农用化肥简介

4. 数据膨大引发的数据倾斜

农用化肥简介

在多维聚相符计算时,倘若进走分组聚相符的字段过多,如下:

农用化肥简介

select a,b,c,count(1)from log group by a,b,c with rollup;

农用化肥简介

注:对于末了的with rollup关键字不清新行家用过没,with rollup是用来在分组统计数据的基础上再进走统计汇总,即用来得到group by的汇总新闻。

农用化肥简介

倘若上面的log外的数据量很大,并且Map端的聚相符不克很益地首到数据压缩的情况下,会导致Map端产出的数据急速膨大,这栽情况容易导致作业内存溢出的变态。倘若log外含有数据倾斜key,会添剧Shuffle过程的数据倾斜。

农用化肥简介

解决方案:

农用化肥简介

能够拆分上面的sql,将with rollup拆分成如下几个sql:

农用化肥简介
SELECT a, b, c, COUNT(1) FROM log GROUP BY a, b, c;  SELECT a, b, NULL, COUNT(1) FROM log GROUP BY a, b;  SELECT a, NULL, NULL, COUNT(1) FROM log GROUP BY a;  SELECT NULL, NULL, NULL, COUNT(1) FROM log; 
农用化肥简介

但是,上面这栽手段不太益,由于现在是对3个字段进走分组聚相符农用化肥简介,那倘若是5个或者10个字段呢,那么必要拆解的SQL语句会更多。

农用化肥简介

在Hive中能够经历参数 hive.new.job.grouping.set.cardinality 配置的手段自动限制作业的拆解,该参数默认值是30。外示针对grouping sets/rollups/cubes这类多维聚相符的操作,倘若末了拆解的键组相符大于该值,会启用新的义务往处理大于该值之外的组相符。倘若在处理数据时,某个分组聚相符的列有较大的倾斜,能够正当调幼该值。

农用化肥简介

5. 外连接时引发的数据倾斜

农用化肥简介

两外进走清淡的repartition join时,倘若外连接的键存在倾斜,那么在 Shuffle 阶段必然会引首数据倾斜。

农用化肥简介

解决方案:

农用化肥简介

清淡做法是将倾斜的数据存到分布式缓存中,分发到各个Map义务所在节点。在Map阶段完善join操作,即MapJoin,这避免了 Shuffle,从而避免了数据倾斜。

农用化肥简介

MapJoin是Hive的一栽优化操作,其适用于幼外JOIN大外的场景,由于外的JOIN操作是在Map端且在内存进走的,因而其并不必要启动Reduce义务也就不必要经过shuffle阶段,从而能在肯定水平上撙节资源挑高JOIN效果。

农用化肥简介

在Hive 0.11版本之前,倘若想在Map阶段完善join操作,必须操纵MAPJOIN来标记表现地启动该优化操作,由于其必要将幼外添载进内存因而要仔细幼外的大幼。

农用化肥简介

如将a外放到Map端内存中实走,在Hive 0.11版本之前必要如许写:

农用化肥简介
select /* +mapjoin(a) */ a.id , a.name, b.age  from a join b  on a.id = b.id; 
农用化肥简介

倘若想将多个外放到Map端内存中,只需在mapjoin()中写多个外名称即可,用逗号分隔,如将a外和c外放到Map端内存中,则 /* +mapjoin(a,c) */ 。

农用化肥简介

在Hive 0.11版本及之后,Hive默认启动该优化,也就是不在必要表现的操纵MAPJOIN标记,其会在必要的时候触发该优化操作将清淡JOIN转换成MapJoin,能够经历以下两个属性来竖立该优化的触发时机:

农用化肥简介

hive.auto.convert.join=true 默认值为true,自动开启MAPJOIN优化。

农用化肥简介

hive.mapjoin.smalltable.filesize=2500000 默认值为2500000(25M),经历配置该属性来确定操纵该优化的外的大幼,倘若外的大幼幼于此值就会被添载进内存中。

农用化肥简介

仔细:操纵默认启动该优化的手段倘若展现莫名其妙的BUG(比如MAPJOIN并不首作用),就将以下两个属性置为fase手动操纵MAPJOIN标记来启动该优化:

农用化肥简介

hive.auto.convert.join=false (关闭自动MAPJOIN转换操作)

农用化肥简介

hive.ignore.mapjoin.hint=false (不无视MAPJOIN标记)

农用化肥简介

再挑一句:将外放到Map端内存时,倘若节点的内存很大,但照样展现内存溢出的情况,吾们能够经历这个参数 mapreduce.map.memory.mb 调节Map端内存的大幼。

农用化肥简介

6. 实在无法缩短量据量引发的数据倾斜

农用化肥简介

在一些操作中,吾们异国手段缩短量据量,如在操纵 collect_list 函数时:

农用化肥简介
select s_age,collect_list(s_score) list_score from student group by s_age 
农用化肥简介

collect_list:将分组中的某列转为一个数组返回。

农用化肥简介

在上述sql中,s_age倘若存在数据倾斜,当数据量大到肯定的数目,会导致处理倾斜的reduce义务产生内存溢出的变态。

农用化肥简介

注:collect_list输出一个数组,中间效果会放到内存中,因而倘若collect_list聚相符太无数据,会导致内存溢出。

农用化肥简介

有幼友人说这是 group by 分组引首的数据倾斜,能够开启hive.groupby.skewindata参数来优化。吾们接下来分析下:

农用化肥简介

开启该配置会将作业拆解成两个作业,第一个作业会尽能够将Map的数据平平分配到Reduce阶段,并在这个阶段实现数据的预聚相符,以缩短第二个作业处理的数据量;第二个作业在第一个作业处理的数据基础上进走效果的聚相符。

农用化肥简介

hive.groupby.skewindata的核心作用在于生成的第一个作业能够有效缩短量量。但是对于collect_list这类请求全量操作一切数据的中间效果的函数来说,清晰首不到作用,逆而由于引入新的作业增补了磁盘和网络I/O的义务,而导致性能变得更为矮下。

农用化肥简介

解决方案:

农用化肥简介

这类题目最直接的手段就是调整reduce所实走的内存大幼。

农用化肥简介

调整reduce的内存大幼操纵mapreduce.reduce.memory.mb这个配置农用化肥简介。

农用化肥简介 农用化肥简介

Powered by qg777娱乐官网 @2013-2021 RSS地图 HTML地图