什么是Hive数据倾斜问题
- 操作:join,group by,count distinct
- 现象:任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成;查看未完成的子任务,可以看到本地读写数据量积累非常大,通常超过10GB可以认定为发生数据倾斜。
- 原因:key分布不均匀
- 倾斜度衡量:平均记录数超过50w且最大记录数是超过平均记录数的4倍;最长时长比平均时长超过4分钟,且最大时长超过平均时长的2倍
Hive的典型操作时多表关联
查询
SELECT a.* FROM a JOIN b ON (a.id = b.id AND a.department = b.department)
1. 判断是否有数据倾斜
通过对表做group by key操作,取Top N,看表中是否有大量相同的Key
2.Reducer端数据倾斜
Hive查询底层是基于Hadoop的Map Reduce,如果一个Reducer要处理的数据量远多于其它Reducer要处理的数据量,那么就会产生Reducer端的数据倾斜。那么Reducer要处理的数据量是如何确定的呢?通常数据(KV数值对)Shuffle到某个Reducer是根据Key进行Hash然后对Reducer个数进行取模。那么Reducer端的优化包含三种做法
2.1 增加Reducer个数
set mapred.reduce.tasks=500; SELECT a.*,b.name FROM a JOIN b ON (a.id = b.id AND a.department = b.department);
2.2 空KEY过滤
有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发送到相同的reducer上,从而导致内存不够。此时我们应该仔细分析这些异常的key,很多情况下,这些key对应的数据是异常数据,我们需要在SQL语句中进行过滤。例如key对应的字段为空。
SELECT table_a.* , b.name FROM ( SELECT * FROM a WHERE id is not null )table_a JOIN b ON (table_a.id = b.id AND table_a.department = b.department)
2.3 空KEY转换
有时虽然某个key为空对应的数据很多,但是相应的数据不是异常数据,必须要包含在join的结果中,此时我们可以表a中key为空的字段赋一个随机的值,使得数据随机均匀地分不到不同的reducer上。例如:
select * from log a left outer join users b on case when a.user_id is null then concat(‘hive’,rand() ) else a.user_id end = b.user_id;
3 设置set hive.groupby.skewindata=true
这是通用的优化方法,对于group by或distinct设置set hive.groupby.skewindata=true
4. 大小表关联,大表和大表关联
4.1 大小表关联
将key相对分散,并且数据量小的表放在join的左边,这样可以有效减少内存溢出错误发生的几率;再进一步,可以使用mapjoin让小的维度表(1000条以下的记录条数)先进内存。在map端完成reduce
4.2 大表和大表关联
大表和大表关联:把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终结果。
4.3 大表和不小的表关联
使用map join解决数据倾斜的常景下小表关联大表的问题,但如果小表很大,怎么解决。这个使用的频率非常高,但如果小表很大,大到map join会出现bug或异常,这时就需要特别的处理。云瑞和玉玑提供了非常给力的解决方案。以下例子:
select * from log a left outer join members b on a.memberid = b.memberid
Members有600w+的记录,把members分发到所有的map上也是个不小的开销,而且map join不支持这么大的小表。如果用普通的join,又会碰到数据倾斜的问题。
解决方法:
select /*+mapjoin(x)*/* from log a left outer join ( select /*+mapjoin(c)*/d.* from (select distinct memberid from log ) c join members d on c.memberid = d.memberid )x on a.memberid = b.memberid
先根据log取所有的memberid,然后mapjoin 关联members取今天有日志的members的信息,然后在和log做mapjoin。
假如,log里memberid有上百万个,这就又回到原来map join问题。所幸,每日的会员uv不会太多,有交易的会员不会太多,有点击的会员不会太多,有佣金的会员不会太多等等。所以这个方法能解决很多场景下的数据倾斜问题。
参考:
http://www.dcharm.com/?p=32
http://janefucninax.blog.sohu.com/247717331.html
重点阅读:
http://sznmail.iteye.com/blog/1499789
http://sunyi514.github.io/2013/09/01/%E6%95%B0%E6%8D%AE%E4%BB%93%E5%BA%93%E4%B8%AD%E7%9A%84sql%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%EF%BC%88hive%E7%AF%87%EF%BC%89/
相关推荐
大数据Hive数据倾斜、Hive-SQL优化 在大数据处理中,Hive是一个非常重要的工具,然而在实际应用中,数据倾斜和性能优化问题经常会出现。为了解决这些问题,我们需要了解Hive的性能调优、数据模型设计、数据倾斜判断...
利用Hive进行复杂用户行为大数据分析及优化案例(全套视频+课件...14_Hive中的数据倾斜及解决方案-三种join方式 15_Hive中的数据倾斜及解决方案-group by 16_Hive中使用正则加载数据 17_Hive中使用Python脚本进行预处理
Hive优化案例、Hive数据处理模式、Hive常见问题与优化、Hive实践 Hive是一种基于Hadoop的数据仓库工具,用于对大规模数据进行处理和分析。在大数据时代,Hive的应用非常广泛,本文将从Hive优化案例、Hive数据处理...
2. 对于 group by 操作,如果出现数据倾斜,应当设置 set hive.groupby.mapaggr.checkinterval=100000;以增大分拆键对应的记录条数。 3. 对于 join 操作,如果出现数据倾斜,应当设置 set hive.skewjoin.key=100000;...
解决数据倾斜是 Hive 中一个非常重要的优化手段,影响着数据处理的速度和效率。可以通过合并小文件、增加 Map 数、增加 Reduce 数等方法来解决数据倾斜。 Hive 参数优化是一个非常复杂的过程,需要根据实际情况选择...
- **数据倾斜问题**:Hadoop处理大量数据时,数据倾斜是一个关键挑战。数据分布不均会导致某些Reduce任务过载,而其他任务则相对空闲,严重影响整体性能。 - **Job数量与效率**:Job数量较多时,作业运行效率较低...
1. **不怕数据多,就怕数据倾斜**:Hadoop擅长处理大量数据,但在处理过程中如果数据分布不均,则可能导致某些节点负载过重,从而影响整体处理效率。 2. **对jobs数量较多的任务运行效率较低**:当一个任务被分解成...
Hive优化方法 Hive是一个基于Hadoop的数据仓库工具,用于存储和处理大规模数据。然而,在Hive开发过程中,常见的性能问题之一是数据倾斜问题。...Hive优化方法可以有效解决数据倾斜问题,提高Hive的性能和效率。
压缩可以减小存储空间,数据倾斜优化是解决数据分布不均问题,Join优化涉及MapJOIN、BroadcastJOIN等,SubQuery优化则涉及到子查询的重写和执行顺序调整。 5. **OldWLC( Warehouse Load Coordinator)**: OldWLC...
- **手动分区**:通过对数据进行预处理,例如按照某个键进行分组,然后再加载到Hive表中,从而实现手动分区,减轻数据倾斜的影响。 通过上述方法,不仅可以提高Hive的查询性能,还能确保数据处理流程更加高效稳定。...
【Hive原理】 Hive是基于Hadoop平台的数据仓库解决方案,它主要解决了在大数据场景下,业务人员和数据科学...通过理解其原理、掌握SQL语法、优化技巧和解决数据倾斜问题,可以在大数据环境中高效地进行数据分析工作。
6. **数据倾斜**:在分布式环境中,数据不均匀分布可能导致某些节点负载过高,Hive提供了处理数据倾斜的策略。 7. **优化查询**:包括使用Hive的EXPLAIN命令理解查询执行计划,以及使用JOIN优化、减少笛卡尔积、...
总结了hive中数据处理发生的倾斜问题,不同的原因对应不同的解决方案,比较具体可实操的方法
然而,随着数据量的增加,Hive性能问题逐渐显现,如数据倾斜、负载不均衡等,严重影响了处理效率。以下是一些针对Hive性能优化的常见策略: 1. **开启Hive压缩**:压缩可以显著减少数据存储空间,加快读取速度。...
Hive性能优化是一个复杂的问题,它涉及到Hadoop的计算框架特性、数据倾斜问题、MapReduce作业初始化时间长、SUM、COUNT、MAX、MIN等UDAF函数的使用、COUNT(DISTINCT)函数的低效、数据分布不均、Job数多、MapReduce...
虚拟列可根据特定列值将数据分配到不同的桶中,而Skewed Join则处理数据倾斜问题,通过预处理将倾斜数据分散到多个分区或桶中。 3. **文件格式与数据压缩** 文件格式的选择(如TextFile、ORC、Parquet)对查询性能...
1. **解决数据倾斜**:数据倾斜是因为数据分布不均导致的,它会使得某些节点处理的数据量过大,降低系统效率。可以通过预处理数据、使用哈希分区等方式平衡数据分布。 2. **减少 Job 数**:尽量合并多个小任务为一...
总而言之,Hive性能优化涉及对HiveQL语句的逻辑层面优化,数据倾斜的处理,以及通过配置项对查询执行过程的底层优化。理解和掌握这些优化方法,可以大大提升Hive处理查询任务的效率,加快大数据分析的速度。
5. **Hive数据倾斜及其解决方案** - 数据倾斜是由于数据分布不均导致部分Reducer处理大量数据,降低效率。 - 解决方案包括优化分区策略、使用动态分区、自定义分区键等。 6. **Hive的三种自定义函数(UDF、UDTF、...