sqoop数据倾斜_大数据Hive如何优化?

4e7f112abeb6028dc322b3b2d36c9658.png 01、Mapjoin默认打开,不要关闭

如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join,即:在Reduce阶段完成join。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。

4e7f112abeb6028dc322b3b2d36c9658.png 02、行列过滤方面进行优化

列处理:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用SELECT *。

行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤。

Join用时多  可以先过滤再join

4e7f112abeb6028dc322b3b2d36c9658.png 03、合理的配置JVM重用方式

JVM重用是Hadoop调优参数的内容,其对Hive的性能具有非常大的影响,特别是对于很难避免小文件的场景或task特别多的场景,这类场景大多数执行时间都很短。

Hadoop的默认配置通常是使用派生JVM来执行map和Reduce任务的。这时JVM的启动过程可能会造成相当大的开销,尤其是执行的job包含有成百上千task任务的情况。JVM重用可以使得JVM实例在同一个job中重新使用N次。N的值可以在Hadoop的mapred-site.xml文件中进行配置。通常在10-20之间,具体多少需要根据具体业务场景测试得出。

<property>  <name>mapreduce.job.jvm.numtasksname>  <value>10value>  <description>How many tasks to run per   jvm. If set to -1, there is no limit.  description>property>

这个功能的缺点是,开启JVM重用将一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。如果某个“不平衡的”job中有某几个reduce task执行的时间要比其他Reduce task消耗的时间多的多的话,那么保留的插槽就会一直空闲着却无法被其他的job使用,直到所有的task都结束了才会释放。

4e7f112abeb6028dc322b3b2d36c9658.png 04、开启map端combiner优化

前提条件是不影响最终业务逻辑,开启的设置如下:

set hive.map.aggr=true;
4e7f112abeb6028dc322b3b2d36c9658.png 05、采用分区技术的方式优化

创建分区、分桶表(通常按天、按小时、按月)

4e7f112abeb6028dc322b3b2d36c9658.png 06、合理设置Map数方式优化
mapred.min.split.size:#指的是数据的最小分割单元大小;min的默认值是1B
mapred.max.split.size#指的是数据的最大分割单元大小;max的默认值是256MB

通过调整max可以起到调整map数的作用,减小max可以增加map数,增大max可以减少map数。

需要提醒的是,直接调整mapred.map.tasks这个参数是没有效果的。

4e7f112abeb6028dc322b3b2d36c9658.png 07、合理设置Reduce数方式优化

Reduce个数并不是越多越好

(1)过多的启动和初始化Reduce也会消耗时间和资源;

(2)另外,有多少个Reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;

在设置Reduce个数的时候也需要考虑这两个原则:处理大数据量利用合适的Reduce数;使单个Reduce任务处理数据量大小要合适

4e7f112abeb6028dc322b3b2d36c9658.png 08、从小文件解决方向优化

小文件是如何产生的?

(1)动态分区插入数据,产生大量的小文件,从而导致map数量剧增;

(2)reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的);

(3)数据源本身就包含大量的小文件。

小文件解决方案:

减少开启maptask个数

(1)在Map执行前合并小文件,减少Map数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat没有对小文件合并功能。

(2)merge

// 输出合并小文件

SET hive.merge.mapfiles = true;默认true,在map-only任务结束时合并小文件(sqoop底层也是用这个),可以将执行完的任务产生的小文件,进行合并。将小于16m的文件合并到256m.
SET hive.merge.mapredfiles = true;默认false,在map-reduce任务结束时合并小文件
SET hive.merge.size.per.task = 268435456;默认256M
SET hive.merge.smallfiles.avgsize = 16777216;当输出文件的平均大小小于16m该值时,启动一个独立的map-reduce任务进行文件merge

(3)开启JVM重用

set mapreduce.job.jvm.numtasks=10
4e7f112abeb6028dc322b3b2d36c9658.png 09、采用压缩方式优化

采用压缩方式:  lzo 或 snappy

设置map端输出、中间结果压缩。(不完全是解决数据倾斜的问题,但是减少了IO读写和网络传输,能提高很多效率)

set hive.exec.compress.intermediate=true --启用中间数据压缩set mapreduce.map.output.compress=true --启用最终数据压缩set mapreduce.map.outout.compress.codec=…; --设置压缩方式
4e7f112abeb6028dc322b3b2d36c9658.png 10、其它优化方式

(1)采用列式存储 orc parquet;

(2)采用tez引擎或者spark引擎;

(3)设置非严格模式;

(4)Fetch抓取;

(5)空key过滤、空key转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值