Hive --------- hive 的优化

版权声明:个人原创,转载请标注! https://blog.csdn.net/Z_Date/article/details/83997844

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

猜你喜欢

转载自blog.csdn.net/Z_Date/article/details/83997844