1. 限制调整

  • LIMIT 语句是经常被用到的, 经常使用 CLI 的用户都会使用到, 不过很多情况下, LIMIT 语句还是需要执行整个查询语句, 然后在返回结果。
  • 这种情况下通常会造成浪费, 索引应该尽可能的避免出现这种情况.

Hive 可以通过配置属性相关属性, 当使用 LIMIT 语句时, 其可以对源数据进行抽样.

<property>
    <name>hive.limit.optimize.enable</name>
    <value>true</value>
    <destription>Whether to enable to optimization to try a smaller subset of data for simple LIMIT first</destription>
</property>
  • 一旦属性 hive.limit.optimize.enable 的值被设置为 true, 那么还有两个参数可以控制这个操作
  • hive.limit.row.max.size
  • hive.limit.optimize.limit.file
<property>
    <name>hive.limit.row.max.size</name>
    <value>100000</value>
    <destription>When trying a smaller subset of data for simple LIMIT</destription>
</property>
<property>
    <name>hive.limit.optimize.limit.file</name>
    <value>10</value>
    <description>When trying a smaller subset of data for simple LIMIT,maxmum number of files we can sample</description>
</property>

缺点:

有些输入中有用的数据永远不会被处理到, 例如像任意的一个需要reduce 步骤的查询, JOIN 和 GROUP BY 操作, 以及聚合函数的大多数调用,等等将会产生不同的结果。

2. hive 的运行模式:

2.1 本地模式:

  • 大多数的 Hadoop Job 是需要 Hadoop 提供的完整的扩展性来处理大数据集的, 不过有时 Hive 的输入数据量非常小。
  • 在这种情况下,为查询触发执行任务的时间消耗要可能会比实际 job 的执行消耗要多
  • 在面对这种情况下, Hive 可以通过本地模式来处理所有的任务。
hive> set oldjobtracket=${hiveconf:mapred.job.tracker}  ## 保留原模式
hive> set mapred.job.tracker=local;                     ## 置为本地模式
hive> set mapred.tmp.dir=/home/edward/tmp;              ## 设置 tmp 的文件位置
....                                                    ## HiveSQL
hive> set mapred.job.tracker=${oldjobtracket}           ## 置回属性

用户可以设置属性 hive.exec.mode.local.auto 的值为 true, 来让 Hive 自动启用这个优化, 通常用户可以将这个配置写在 $HOME/.hiverc 文件中

 如果希望所有用户都使用这个属性, 则可以将他配置到 hive-site.xml

<property>
<name>hive.exec.mode.local.auto</name>
<value>true</vlaue>
<description>
    Let hive determine whether to run in local mode automatically
</description>
</property>

2.2 并行模式

  • Hive 会将一个查询转化为一个或多个阶段。如 MapReduce 阶段, 抽样阶段, 合并阶段, limit 阶段, 或 Hive 执行的其他阶段。
  • 默认情况下, Hive 一次只能执行一个阶段, 不过特定的 job 可能包含众多的阶段, 通过配置属性, 可以使 job 阶段快速完成.
  • hive.exec.parallel=true
<property>
<name>hive.exec.parallel</name>
<value>true</value>
<description>
    Whether to execute jobs in parallel
</description>
</property>
2.2.1 调整 mapper 和 reducer 个数

Hive 通过将查询划分成一个或这多个 MapReduce 任务达到并行的目的。

每个任务都可能具有多个 mapper 和 reduce 任务,其中至少有一些是可以并行执行的。

  • Hive 是按照输入吧的数据量大小来确定reducer 个数的, 我们可以通过 dfs -count 命令来计算输入量的大小。
  • hive.exec.reducers.bytes.per.reducer 为每个reduce的接受的数据量,默认大小为 1G 。 通过调整 hive.exec.reducers.bytes.per.reducer 的接受的数据量来设置启用的 reduce 的个数.
  • 当在共享集群上处理大任务时, 为了控制资源利用情况, 属性 hive.exec.reduces.max 属性比较重要。hive.exec.reduces.max : reduce 的最大个数, 默认值为 999
2.2.2 JVM 重用
  • JVM 重用是 Hadoop 调优参数的内容, 其对 Hive 的性能具有非常大的影响, 特别是对于很难避免小文件的场景或 task 特别多的场景。
  • Hadoop 的默认配置通常是使用派生 JVM 来执行 map 和 reduce 任务的。这时对 JVM 的启动过程可能会造成相当大的开销。
  • JVM 重用可以使得JVM实例在同一个 job 中重新使用 N 次。
<property>
<name>mapred.job.reuse.jvm.num.tasks</name>
<value>10</value>
<description>How many tasks to run per jvm.</description>
</property>

3. hive常用的属性配置

hive.exec.max.created.files

说明:所有hive运行的map与reduce任务可以产生的文件的和
默认值:100000
  • hive.exec.dynamic.partition
说明:是否为自动分区
默认值:false
  • hive.mapred.reduce.tasks.speculative.execution
说明:是否打开推测执行
默认值:true
  • hive.input.format
说明:Hive默认的input format
默认值: org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
如果有问题可以使用org.apache.hadoop.hive.ql.io.HiveInputFormat
  • hive.exec.counters.pull.interval
说明:Hive与JobTracker拉取counter信息的时间
默认值:1000ms
  • hive.script.recordreader
说明:使用脚本时默认的读取类
默认值: org.apache.hadoop.hive.ql.exec.TextRecordReader
  • hive.script.recordwriter
说明:使用脚本时默认的数据写入类
默认值: org.apache.hadoop.hive.ql.exec.TextRecordWriter
  • hive.mapjoin.check.memory.rows
说明: 内存里可以存储数据的行数
默认值: 100000
  • hive.mapjoin.smalltable.filesize
说明:输入小表的文件大小的阀值,如果小于该值,就采用普通的join
默认值: 25000000
  • hive.auto.convert.join
说明:是不是依据输入文件的大小,将Join转成普通的Map Join
默认值: false
  • hive.mapjoin.followby.gby.localtask.max.memory.usage
说明:map join做group by 操作时,可以使用多大的内存来存储数据,如果数据太大,则不会保存在内存里
默认值:0.55
  • hive.mapjoin.localtask.max.memory.usage
说明:本地任务可以使用内存的百分比
默认值: 0.90
  • hive.heartbeat.interval
说明:在进行MapJoin与过滤操作时,发送心跳的时间
默认值1000
  • hive.merge.size.per.task
说明: 合并后文件的大小
默认值: 256000000
  • hive.mergejob.maponly
说明: 在只有Map任务的时候 合并输出结果
默认值: true
  • hive.merge.mapredfiles
默认值: 在作业结束的时候是否合并小文件
说明: false
  • hive.merge.mapfiles
说明:Map-Only Job是否合并小文件
默认值:true
  • hive.hwi.listen.host
说明:Hive UI 默认的host
默认值:0.0.0.0
  • hive.hwi.listen.port
说明:Ui监听端口
默认值:9999
  • hive.exec.parallel.thread.number
说明:hive可以并行处理Job的线程数
默认值:8
  • hive.exec.parallel
说明:是否并行提交任务
默认值:false
  • hive.exec.compress.output
说明:输出使用压缩
默认值: false
  • hive.mapred.mode
说明: MapReduce的操作的限制模式,操作的运行在该模式下没有什么限制
默认值: nonstrict
  • hive.join.cache.size
说明: join操作时,可以存在内存里的条数
默认值: 25000
  • hive.mapjoin.cache.numrows
说明: mapjoin 存在内存里的数据量
默认值:25000
  • hive.join.emit.interval
说明: 有连接时Hive在输出前,缓存的时间
默认值: 1000
  • hive.optimize.groupby
说明:在做分组统计时,是否使用bucket table
默认值: true
  • hive.fileformat.check
说明:是否检测文件输入格式
默认值:true
  • hive.metastore.client.connect.retry.delay
说明: client 连接失败时,retry的时间间隔
默认值:1秒
  • hive.metastore.client.socket.timeout
说明:  Client socket 的超时时间
默认值:20秒
  • mapred.reduce.tasks
默认值:-1
说明:每个任务reduce的默认值
 -1 代表自动根据作业的情况来设置reduce的值
  • hive.exec.reducers.bytes.per.reducer
默认值: 1000000000 (1G)
说明:每个reduce的接受的数据量
    如果送到reduce的数据为10G,那么将生成10个reduce任务
  • hive.exec.reducers.max
默认值:999
说明: reduce的最大个数
  • hive.exec.reducers.max
默认值:999
说明: reduce的最大个数
  • hive.metastore.warehouse.dir
默认值:/user/hive/warehouse
说明: 默认的数据库存放位置
  • hive.default.fileformat
默认值:TextFile
说明: 默认的fileformat
  • hive.map.aggr
默认值:true
说明: Map端聚合,相当于combiner
  • hive.exec.max.dynamic.partitions.pernode
默认值:100
说明:每个任务节点可以产生的最大的分区数
  • hive.exec.max.dynamic.partitions
默认值:1000
说明: 默认的可以创建的分区数
  • hive.metastore.server.max.threads
默认值:100000
说明: metastore默认的最大的处理线程数
  • hive.metastore.server.min.threads
默认值:200
说明: metastore默认的最小的处理线程数