第94课:Hive性能调优之Mapper和Reducer设置、队列设置和并行执行、JVM重用和动态分区、Join调优等

为什么要队列设置???

因为Hadoop大数据生态系统上面会运行很多作业,为了更好的管理资源限制的要求Hadoop提出了队列,队列就是不同类型资源分配和使用的标签。

JVM重用

Hadoop的JVM是可以重用的,相当于spark的线程的重用。JVM 重用在有很多小文件的时候非常有用

hive> EXPLAIN select * from employeeforhaving;

OK

STAGE DEPENDENCIES:

  Stage-0 is a root stage

STAGE PLANS:

  Stage: Stage-0

    Fetch Operator

      limit: -1

      Processor Tree:

        TableScan

          alias: employeeforhaving

          Statistics: Num rows: 1 Data size: 182 Basic stats: COMPLETE Column stats: NONE

          Select Operator

            expressions: id (type: int), name (type: string), salary (type: string), address (type: string), gender (type: string)

            outputColumnNames: _col0, _col1, _col2, _col3, _col4

            Statistics: Num rows: 1 Data size: 182 Basic stats: COMPLETE Column stats: NONE

            ListSink


hive> EXPLAIN select * from users join ratings on users.userid=ratings.userid;

hive> EXPLAIN EXTENDED select * from users join ratings on users.userid=ratings.userid;

在hive1.2.1中,底层运行Mapper和Reducer的时候,Mapper的个数一般是由splits确定的,而Reducer的个数一般是1;一般调优是调Reducer的个数。

hive> set mapred.reduce.tasks=3;

hive>  select * from users join ratings on users.userid=ratings.userid limited 10;

set mapped.queue.name = default;

//Hive 在默认的情况下只会在同一时间执行一个Stage,但是我们可以通过设置hvie.exec.parallel为true来让可以并行的执行stage,从而更好的利用集群的计算资源,加快处理速度;

JVM的重用在Hive性能调优中非常重要,mapred.job.reuse.jvm.num.tasks =  10,也就是说在这个JVM中可以运行10个Mapper,例如运行10个Mapper;如果小文件比较多的话,会对性能有一倍左右的提升。

动态分区

set hive.exec.dynamic.partition=true;

set hive.exec.dynamic.partition.mode=nonstrict;

动态分区使用插入表达额数据的时候,作为分区的字段也是需要插入的。

Join调优

Hive的Join操作一般问题都是数据倾斜,尤其是在小表(较大)和大表关联的情况下,如果小表比较大,此时可以设置参数,对小表进行broadcast达到map端操作的目的,此时容易产生OOM,此外当小表比较大的时候,网络传小表的时候也是一个非常大的开销。例如说该小表1000w条记录,而大表10亿条记录,这个其实可以通过调整SQL语句解决。提取id和另外的表关联......

你可能感兴趣的:(Hive)