Hive(一)调优

Hive-调优

HiveQL是一种声明式语言,用户会提交声明式的查询,而Hive会将其转化为MapReduce job。

  • Hive-1 使用Explain(解析Hive如何转化为MapReduce)

     一个Hive任务包含有一个或多个stage,不同的stage之间会存在着依赖关系。一个stage可以是一个MapReduce,也可以是【抽样、合并、limit限制】
    
  • Hive-2 使用Explain Extended(产生更多的输出信息)

  • Hive-3 限制调整

     在很多情况下,limit语句还是需要执行整个查询语句,然后再返回部分结果。为了避免这种情况,Hive中可以开启一个配置,使用limit语句时对源数据进行抽样。
     
     	hive.limit.optimize.enable
     	true
     	Whther to enable to optimization to try a smaller subset of data for simple limit first
     
     hive.limit.optimize.enable这个属性设置为true后,那么还有两个参数可以空值这个操作[hive.limit.row.max.size/hive.limit.optimize.limit.file]
     
     	hive.limit.row.max.size
     	100000
     	When trying a smaller subset of data for simple limit,how much size we need to guarantee each row to have at least.
     
     
     	hive.limit.optimize.limit.file
     	10
     	When trying a smaller subset of data for simple limit,maximum number of files we can sample.
     
     但是,任意的一个需要reduce步骤的查询,join/group by和聚合函数的大多数调用,将会产生很不同的结果。
    
  • Hive-4 Join优化(6.4.2/6.4.9)

     将最大的表放在最右边。
     如果所有表中有一个表足够的小,是可以完成载入到内存中的,那么这时Hive可以执行一个map-side Join,这样可以减少reduce过程,有时甚至可以减少某些map task任务。
     有时候即使某些表不适合载入内存也可以使用mapJoin,因为减少reduce阶段可能比将不太大的表分发到每个map task中会带来更多的好处。
    
  • Hive-5 本地模式

     大多数的Hadoop Job是需要Hadoop提供的完整的可扩展性来处理大数据集的。
     不过,有时Hive的输入数据量数非常小的。
     在这种情况下,为查询触发执行任务的时间消耗可能会比实际job的执行时间要多得多。
     对于大多数这种情况,Hive可以通过本地模式在单台机器上(或某些时候在单个进程中)处理所有的任务。对于小的数据集执行时间明显缩短。
     1、临时启用本地模式
     2、用户可以通过设置属性hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个优化。
     	通常用户可以将这个配置写入$HOME/.hiverc文件中
     	如果希望对所有用户都使用这个配置,那么可以将这个配置项增加到$HIVE_HOME/conf/hive-site.xml文件中
     		
     			hive.exec.mode.local.auto
     			true
     			let hive determine whether to run in local mode automatically
     		
    
  • Hive-6 并行执行

     Hive会将一个查询转化成一个或多个饥饿段,这样的饥饿段可以是MapReduce阶段、抽样阶段、合并阶段、limit阶段,或者Hive执行过程中可能需要的其他阶段。
     默认情况下,Hive一次只会执行一个阶段,不过,某个特定的job可能包含多个阶段,而这些阶段可能并非完全互相依赖的,也就是有些阶段可以并行执行的。
     通过设置参数[hive.exec.parallel值为true,就可以开启并发执行。]
     不过,在共享集群中,需要注意,如果job中并行执行的阶段增多,那么集群利用率就会增加。
     	
     		hive.exec.parallel
     		true
     		Whether to execute jobs in parallel
     	
    
  • Hive-7 严格模式

     Hive提供一个严格模式,可以防止用户执行那些产生意想不到的不好的影响的查询。
     	[hive.mapred.mode]值为strict可以禁止3种类型的查询。
     	1、对于分区表,除非where语句中含有分区字段过滤条件来限制数据范围,否则不允许执行。换句话说,就是用户不允许扫描所有分区。
     	   进行这个限制的原因是,通常分区表都拥有非常大的数据集,而且数据增加迅速。没有进行分区限制的查询可能会消耗令人不可接受的巨大资源处理这个表。
     	2、对于使用了order by语句的查询,要求必须使用limit语句。因为order by为了执行排序过程会将所有的结果数据分发到同一个reducer中进行处理,
     	   强制要求用户增加limit语句可以防止reducer额外执行很长一段时间。
     	3、限制笛卡儿积的查询。
     	   对关系型数据非常了解的用户可能期望在执行join查询的时候不使用on语句而是使用where语句,这阿姨那个关系型数据库的执行优化器就可以高效
     	   地将where语句转化成那个on语句。不幸的是,hive并不会执行这种优化,因此,如果表足够大,那么这个查询就会出现不可控的情况。
    
  • Hive-8 调整mapper和reducer个数

     Hive通过将查询划分成一个或者多个MapReduce任务达到并行的目的。每个任务都可能具有多个mapper和reducer任务,其中至少有一些是可以并行执行的。
     确定最佳的mapper个数和reducer个数取决于多个变量,例如输入的数据量大小以及对这些数据执行的操作类型等。
     保持平衡性是有必要的,如果有太多的mapper或reducer任务,就会导致启动阶段、调度和运行job过程中产生过多的开销;而如果设置的数量太少,那么就可能没有充分利用好集群内在的并行性。
     Hive是按照输入的数据量大小来确定reducer个数的,可以通过dfs -count命令来计算输入量大小,类似du -s,计算指定目录下所有数据的总大小。
     hive.exec.reducers.bytes.per.reducer的默认值是1GB。
     默认值通常情况下是比较合适的,但是有些情况查询的map阶段会产生比实际输入数据量多的数据,如果map阶段产生的数据量非常多,那么根据输入的数据量大小来确定reducer个数就少了。
     同样,map阶段可能会过滤输入数据集中很大一部分的数据,而这时可能需要很少量的reducer就满足计算了。
     进行验证的方式是将reducer个数设置为固定的值,而无需Hive来计算得到这个值。可以通过设置mapred.reduce.tasks的值来确定是使用较多还是较少的reducer来执行。
     Hadoop需要几秒来启动和调度map和reduce任务,进行性能测试的时候,要考虑这些影响因子,特别是job比较小的时候。
     当在共享集群上处理大任务时,为了空值资源利用情况,属性hive.exec.reducers.max就很重要,一个Hadoop集群可以提供的map和reduce资源个数是固定的。
     某个大job可能就消耗完所有插槽,从而导致其它job无法执行,通过hive.exec.reducers.max可以阻止某个查询消耗太多的reducer资源。
     有必要将这个属性配置到$HIVE_HOME/conf/hive-site.xml文件中,对这个属性值大小的一个计算公式如下:
     	集群总reduce槽位个数 * 1.5 / 执行中的查询的平均个数
     	1.5倍数是要给经验系数,用于防止未充分利用集群得情况。
    
  • Hive-9 JVM重用

     JVM重用是Hadoop调优参数的内容,其对Hive的性能具有非常大的影响,特别是对于很难避免的小文件的场景活task特别多的场景,大多数是执行时间很多的场景。
     Hadoop的默认配置通常是使用派生JVM来执行map和reduce任务的。
     这时JVM的启动过程可能会造成相当大的开销,尤其是执行的job包含有成百上千个task'任务的情况。
     JVM重用可以使得JVM实例在同一个job中重新使用N次,N的值可以在Hadoop的mapred-site.xml文件中进行设置:
     	
     		mapred.job.reuse.jvm.num.tasks
     		10
     		How many tasks to run per jvm.If set to -1 , there is no limit.
     	
     这个功能的一个缺点是,开启JVM重用将会一直占用使用到的task插槽,以便进行重用,直到任务完成后才能释放。
     如果某个“不平衡的”的job中某几个reduce task执行的时间要比其它reduce task消耗的时间多得多的花,那么保留的插槽就会一直空闲着却无法被其它的job使用,直到所有task结数才会释放。
    
  • Hive-10 索引

     索引可以用来加快含有group by语句的查询的计算速度。bitmap索引一般在指定的列排重后的值比较小时进行使用。
    
  • Hive-11 动态分区调整

     动态分区insert语句可以通过简单的select语句向分区表中创建很多新的分区。
     Hive可以通过配置限制动态分区插入允许创建的分区数在1000个左右,虽然太多的分区对表来说不好,不过通常将这个值设置的更大以便这些查询执行。
     首先,通常在hive-site.xml配置文件中设置动态分区模式为严格模式,开启严格模式的时候,必须保证至少有一个分区是静态的
     	
     		hive.exec.dynamic.partiton.mode
     		strict
     		In strict mode, the user must specify at least one static partition in case the user accidentally overwrites all partitions.
     	
     然后,可以增加一些相关的属性信息,例如通过如下属性来限制查询可以创建的最大动态分区个数:
     	
     		hive.exec.max.dynamic.partitions
     		300000
     		Maximum number of dynamic partitions allowed to be created in total.
     	
     	
     		hive.exec.max.dynamic.partitions.pernode
     		10000
     		Maximum number of dynamic partitions allowed to be created in each mapper/reducer node.
     	
     还有一个配置是来控制datanode上一次可以打开的文件的个数,这个参数必须设置在datenode的$HADOOP_HOME/conf/hdfs-site.xml配置文件中。
     在Hadoop v0.20.2版本中,更改这个属性值默认值是256,但是这个值过大过小都会影响线程数和资源数
     
     	dfs.datanode.max.xcievers
     	8192
     
    
  • Hive-12 推测执行

     推测执行是Hadoop中的一个功能,其可以触发执行一些重复的任务。尽管这样会因为对重复的数据进行计算而导致消耗更多的计算资源,
     不过这个功能的目标是通过加快获取单个task的结果以及进行侦测将执行慢的TaskTracker加入到黑名单的方式来提高整体的任务执行效率。
     Hadoop的推测执行功能由$HADOOP_HOME/conf/mapred-site.xml文件中的如下2个配置项控制着:
     	
     		mapred.map.tasks.speculative.execution
     		true
     		If true,then multiple instances of some map tasks may be executed in parallel.
     	
     	
     		mapred.reduce.tasks.speculative.execution
     		true
     		If true,then multiple instances of some reduce takes may be executed in parallel.
     	
     不过,Hive本身也提供了配置项来控制reduce-side的推测执行:
     	
     		hive.mapred.reduce.tasks.speculative.execution
     		true
     		Whether speculative execution for reducers should by turned on.
     	
     关于调优这些推测执行变量,还很难给一个具体的建议。
     如果用户对于运行时的偏差非常敏感的话,那么可以将这些功能关闭掉。
     如果用户因为输入数据量非常大而需要执行长时间的map或者reduce task的话,那么启动推测执行造成的浪费是非常巨大的。
    
  • Hive-13 单个MapReduce中多个group by

     另一个特别的优化试图将查询中的多个group by操作组装到单个mapreduce任务中。如果想启动这个优化,那么需要一组常用的Group by键:
     	
     		hive.multigroupby.singlemr
     		false
     		Whether to optimize multi group by query to generate single M/R job plan.If the multi group by query
     					 has common group by keys,it will be optimized to generate single M/R job.
     	
    
  • Hive-14 虚拟列

     Hive提供了2种虚拟列:一种用于将要进行划分的输入文件名,另一种用于文件中的块内偏移量。
     当Hive产生了非预期的或null的返回结果时,可以通过这些虚拟列诊断查询。
     通过查询这些“字段”,用户可以查看到哪个文件甚至哪行数据导致出现问题:
     	hive> set hive.exec.rowoffset = true;
     第三种虚拟列提供了文件的行偏移量,这个需要通过如下参数显示地启用:
     	
     		hive.exec.rowoffset
     		true
     		Whether to provide the row offset virtual column
     	
     	这样设置后就可以在类似于如下地查询中使用了。
    

你可能感兴趣的:(Hive,数据仓库,调优)