使用之前的数据库
执行语句
explain select count(*) from emp;
explain可以帮助我们看到有多少个任务
会出现下面的信息根标签,操作语法树等信息
根标签
操作语法树
之前在做日志分析的时候,创建表的语句,也有很多信息
依赖,是会构成有向无环图的, 根据有向无环图会按照顺序执行job。这样也会造成执行时间比较长,我们就需要做优化
优化一:大表拆小表
比如临时表、分区表、外部表。其中分区表:加载的表会更少,会直接加载到某个数据,不需要加载所有数据,提高检索速度。
优化二:sql语句
将复杂的语句,比如子查询简化拆分成多个简单的语句。
join和filter的使用,先过滤再join
优化三:合理设置map和reduce个数
reduce数目:可以通过参数设置,默认是一个
** hive中:set mapreduce.job.reduces=
** mapreduce编码中:job.setNumReduceTasks(tasks);
map的数目: 一个分片就是一个块,一个maptask,不可以通过参数去设置
在源码中有个计算方式,大体是:
** Math.max(minSize, Math.min(maxSize, blockSize));
minSize默认参数值是0M
maxSize默认参数值是256M
blockSize默认参数值128M
可以打开FileInputFormat类中的computeSplitSize的方法
修改块的大小是不可行的,因为集群投入生产,格式化后就不能再修改了,可以通过代码指定
** FileInputFormat.setMaxInputSplitSize(job, size);
** FileInputFormat.setMinInputSplitSize(job, size);
通过split的最大最小值来改变map任务数
优化四:开启并行执行
有多个job之间无依赖关系可以一起执行,充分利用资源,在工作中都会把它打开
hive.exec.parallel
设置同时运行的线程数,根据集群资源设置,默认是8
hive.exec.parallel.thread.number
优化五:jvm重用
mapreduce.job.jvm.numtasks默认是1,运行一个job会启动一个jvm上运行
用完就销毁,可以设置重用,节省资源,可以按照比例调整数目,会影响map任务,shuffer会有小幅度的下降
reduce影响不大,一般可以设置为3或5
还有一个推测执行(不建议使用,了解为主):
比如:运行十个map,十个reduce,等map结束后,等了一段时间后,九个执行reduce完毕,有一个还没结束,分布的数据量都是差不多的。推测执行:mapreduce会再重新开启一个跟这个一模一样的任务,,两个相同的任务完成同一件事,谁先完成,就会把另一个kill。缺点:会消耗更多的资源,一般不建议开启,有可能数据会重复写入,造成异常。
优化六:hive本地模式(了解为主)
hive的本地模式:hive.exec.mode.local.auto默认flase
hive底层运用的是hadoop集群,本地模式不会在集群所有机器上运行,会选择一台作为本地运行,一般处理小数据量级的
速度会很快
限制:job的输入数据不能大于128MB,map的个数不能超过4个,reduce的个数不能超过1个
优化七:
hive数据倾斜:在MR程序中由于某个key值分布不均匀,导致某个reduce运行