1、表的优化
在表的优化中第一点:当数据量比较大的时候常用的手段就是拆分比表,大表拆小表,分区表,临时表,外部表
小表和大表join,要把数据量小的表放在join的左边,先进行缓存,这样减少表join的时候可以减少内存的消耗量
2、数据倾斜
数据倾斜产生的原因为分区之后某一个reduce运算的数量比较小,而某一个reduce的数量比较大的时候,造成两个reduce处理数据不平等
合理设置map数量
总结:可以影响map数量的因素有哪些?
1、在input文件夹中,每一个文件就是一个map,input文件的数量,input文件的大小
在MR任务中一个切片就是一个map任务
设置切片大小:在hadoop中
FileInputFormat.setMaxInputSplitSize(job, size);
FileInputFormat.setMinInputSplitSize(job, size);
设置reduce的个数:
set mapreduce.job.reduces
根据业务自定义分区规则
3、并行执行
并行执行与Java多行程的异步和同步概念上差不多,在MR运行任务中,存在很多的MR任务可以执行。有些MR任务和下一个MR任务存在着依赖关系,但是有些MR任务没有依赖关系,例如:存在依赖关系的MR它的输出就是下一个MR任务的输入。对于没有依赖关系的MR任务,就可以使用并行执行,在同一时间运行多个MR任务。这样在运行的过程中效率就会得到提升
可以通过以下参数进行设置:
set hive.exec.parallel=true ; // 开启任务并行执行
设置多少个任务可以同时执行
set hive.exec.parallel.thread.number=8; //默认值为8个任务可以同时运行
4、严格执行
Hive中提供有严格模式,为了防止一些查询,出现不好的影响,例如笛卡尔积,在严格模式下是不能运行的
<property>
<name>hive.mapred.mode</name>
<value>strict</value>
<description>
The mode in which the Hive operations are being performed.
In strict mode, some risky queries are not allowed to run. They include:
Cartesian Product.
No partition being picked up for a query.
Comparing bigints and strings.
Comparing bigints and doubles.
Orderby without limit.
</description>
</property>
默认值为非严格模式 nonstrict
开启严格模式 :strict
开启了严格模式,会对查询语句进行一些限制:
1、对于分区表,必须存在where语句对分区字段进行条件过滤,否则,不允许执行该查询
2、对于使用order by 的语句必须使用limit进行限定,由于order by之后所有的数据都会被分到一个reduce中,那样reduce操作单的数据量太多,可能时间过长卡死。所以为了防止reduce时间过长,在order by的时候必须给定limit减少reduce处理的数据量
3、 限制了笛卡儿积的查询 .主要在多表join中会出现。笛卡儿积的出现会造成性能极大的消耗
3.5 JVM重用
在hive执行计算任务的时候,会把的执行计划上传到yarn集群中进行提交,运行MR任务。每次进行任务的运行的时候都会开启一个JVM进程运行的MR任务。如果提交任务频繁过多就会造成JVM频繁的开启和关闭。在JVM开启和关闭的过程中会造成大量的资源浪费
在处理小文件的时候,由于map任务较多。所以JVM会频繁的开启和关闭。所以对于小文件的处理优化,主要减少JVM开启的次数
在 mapred-default.xml配置文件中有如下参数
<property>
<name>mapreduce.job.jvm.numtasks</name>
<value>10</value>
<description>How many tasks to run per jvm. If set to -1, there is
no limit.
</description>
</property>
也可以在hive中临时设置JVM重用任务的运行数量
set mapreduce.job.jvm.numtasks
3.6 推测执行
由于集群中的资源分配不均等,或者每个集群中节点的硬件性能,会导致某个任务运行的时间快或者某个任务运行的时间慢,或者某个任务在运行的时候直接卡死了
为了防止某些任务,在运行过程中,拖慢了整个MR任务的进度。在运行慢的任务节点上开启相同的任务,如果时间比原来的任务运行的快则直接输出推测运行的任务
设置开启推测执行的参数:
<property>
<name>mapreduce.map.speculative</name>
<value>true</value>
<description>If true, then multiple instances of some map tasks
may be executed in parallel.</description>
</property>
在hadoop中默认开启推测执行。推测执行不是说一卡死就开启任务必须运行%5以上才会开启推测执行
在hive中通过set参数也可以进行设置
set mapreduce.map.speculative=true
默认值为true
推测执行分为map端的推测执行以及reduce端的推测执行
<property>
<name>mapreduce.reduce.speculative</name>
<value>true</value>
<description>If true, then multiple instances of some reduce tasks
may be executed in parallel.</description>
</property>
3.7 执行计划
Hive中提供的可以查看Hql语句的执行计划,在执行计划中会生成抽象语法树,在语法树中会显示HQL语句之间的依赖关系以及执行过程。通过这些执行的过程和依赖可以对HQL语句进行优化
一般来说都会把复杂语句简单化处理。例如多表的Join