Hive配置

刘超 18天前 ⋅ 5568 阅读   编辑

f目录

  1、查看有那些配置

  2、常用配置项
    2.1 llap
    2.2
    2.3 超时
    2.4 调优
      a、执行引擎
      b、mapjoin
      c、groupby
      d、合并小文件
      e、控制map、reduce数
      f、分区裁剪、列裁剪
      g、存储格式

 

一、查看有那些配置

  进入hive命令行,即可查看所有已存在的配置

set

  

二、下面列出一些常用配置项

分类 参数名 默认值 描述
hdp apache cdh 单个参数描述 一组参数描述
       
  hive.insert.into.multilevel.dirs     限制SQL中指定存放结果文件不存在的目录的深度不能大于1
CDH专有配置
  hive.optimize.index.filter true   是否自动构建索引
hive.fetch.task.conversion 参数值只能是minimal和more
1、在minimal下,执行select * ,limit,filter在一个表所属的分区表上操作,都跑任务
2、在more模式下,运行select,filter,limit,都是运行数据的fetch,不跑mr应用
hive.ddl.output.format hive的ddl语句的输出格式,默认是text,纯文本,还有json格式,这个是0.90以后才出的新配置
hive.exec.script.wrapper hive调用脚本时的包装器,默认是null,如果设置为python的话,那么在做脚本调用操作时语句会变为python,null的话就是直接执行
hive.exec.plan hive执行计划的文件路径,默认是null,会在运行时自动设置,形如hdfs://xxxx/xxx/xx
hive.exec.scratchdir

HDFS路径,用于存储不同 map/reduce 阶段的执行计划和这些阶段的中间输出结果,默认是/tmp//hive,我们实际一般会按组区分,然后组内自建一个tmp目录存储

hive.exec.submitviachild 在非local模式下,决定hive是否要在独立的jvm中执行map/reduce;默认是false,也就是说默认map/reduce的作业是在hive的jvm上去提交的,该参数为false,可能使hive建立hbase外表导致ZooKeeper连接数增加
hive.exec.script.maxerrsize 当用户调用transform或者map或者reduce执行脚本时,最大的序列化错误数,默认100000,一般也不用修改
  hive.exec.compress.output
    一个查询的最后一个map/reduce任务输出是否被压缩的标志,默认为false,但是一般会开启为true,好处的话,节省空间不说,在不考虑cpu压力的时候会提高io
  hive.exec.compress.intermediate     在一个查询的中间的map/reduce任务输出是否要被压缩,默认false
  hive.jar.path
    当使用独立的jvm提交作业时,hive_cli.jar所在的位置,无默认值
  hive.aux.jars.path
    当用户自定义了UDF或者SerDe,这些插件的jar都要放到这个目录下,无默认值
  hive.join.emit.interval     在发出join结果之前对join最右操作缓存多少行的设定,默认1000;hive jira里有个对该值设置太小的bugfix
  hive.map.aggr.hash.percentmemory     map端聚合时hash表所占用的内存比例,默认0.5,这个在map端聚合开启后使用
  hive.default.fileformat     CREATE TABLE语句的默认文件格式,默认TextFile,其他可选的有SequenceFile、RCFile还有Orc
  hive.merge.mapfiles
    在只有map的作业结束时合并小文件,默认开启true
  hive.merge.mapredfiles     在一个map/reduce作业结束后合并小文件,默认不开启false
  hive.merge.size.per.task
    作业结束时合并文件的大小,默认256MB
  hive.merge.smallfiles.avgsize
  16MB 在作业输出文件小于该值时,起一个额外的map/reduce作业将小文件合并为大文件,小文件的基本阈值,设置大点可以减少小文件个数,需要mapfiles和mapredfiles为true
  hive.fileformat.check
  true 加载数据文件时是否校验文件格式
  hive.mapred.local.mem     本地模式时,map/reduce的内存使用量,默认是0,就是无限制
 
  hive.join.cache.size     在做表join时缓存在内存中的行数,默认25000
  hive.mapjoin.bucket.cache.size     mapjoin时内存cache的每个key要存储多少个value,默认100
  hive.optimize.skewjoin     是否开启数据倾斜的join优化,默认不开启false
  hive.skewjoin.key     判断数据倾斜的阈值,如果在join中发现同样的key超过该值则认为是该key是倾斜的join key,默认是100000
  hive.skewjoin.mapjoin.map.tasks     在数据倾斜join时map join的map数控制,默认是10000
  hive.skewjoin.mapjoin.min.split     数据倾斜join时map join的map任务的最小split大小,默认是33554432,该参数要结合上面的参数共同使用来进行细粒度的控制
  hive.mapred.mode     hive操作执行时的模式,默认是nonstrict非严格模式,如果是strict模式,很多有风险的查询会被禁止运行,比如笛卡尔积的join和动态分区
  hive.exec.script.maxerrsize     一个map/reduce任务允许打印到标准错误里的最大字节数,为了防止脚本把分区日志填满,默认是100000
  hive.exec.script.allow.partial.consumption     hive是否允许脚本不从标准输入中读取任何内容就成功退出,默认关闭false
  hive.script.operator.id.env.var     在用户使用transform函数做自定义map/reduce时,存储唯一的脚本标识的环境变量的名字,默认HIVE_SCRIPT_OPERATOR_ID
  hive.exec.compress.output     控制hive的查询结果输出是否进行压缩,压缩方式在hadoop的mapred.output.compress中配置,默认不压缩false
  hive.exec.compress.intermediate     控制hive的查询中间结果是否进行压缩,同上条配置,默认不压缩false
  hive.exec.parallel     hive的执行job是否并行执行,默认不开启false,在很多操作如join时,子查询之间并无关联可独立运行,这种情况下开启并行运算可以大大加速
  hvie.exec.parallel.thread.number     并行运算开启时,允许多少作业同时计算,默认是8
  hive.exec.rowoffset     是否提供行偏移量的虚拟列,默认是false不提供,Hive有两个虚拟列:一个是INPUT__FILE__NAME,表示输入文件的路径,另外一个是BLOCK__OFFSET__INSIDE__FILE,表示记录在文件中的块偏移量,这对排查出现不符合预期或者null结果的查询是很有帮助的
  hive.task.progress     控制hive是否在执行过程中周期性的更新任务进度计数器,开启这个配置可以帮助job tracker更好的监控任务的执行情况,但是会带来一定的性能损耗,当动态分区标志hive.exec.dynamic.partition开启时,本配置自动开启
  hive.exec.pre.hooks     执行前置条件,一个用逗号分隔开的实现了org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext接口的java class列表,配置了该配置后,每个hive任务执行前都要执行这个执行前钩子,默认是空
  hive.exec.post.hooks     同上,执行后钩子,默认是空
  hive.execution.mode
  container/none  
llap Unable to instantiate class with 1 arguments org.apache.hadoop.hive.ql.exec.tez.HiveSplitGenerator这类错误可以这组参数
  hive.llap.execution.mode
  none  
  hive.llap.client.consistent.splits
  true/false  
     
serialization.null.format \N   hive底层是用\N来表示null的
外表  
  phoenix
  hive.server2.async.exec.wait.queue.size 100   org.apache.hadoop.hive.conf.LoopingByteArrayInputStream@1573f9fc
  mapred.queue.default.acl-administer-jobs *    
  hbase.ipc.server.callqueue.read.ratio 0    
  hbase.ipc.server.callqueue.handler.factor 0.1    
  hbase.ipc.server.callqueue.scan.ratio     0
  ipc.server.listen.queue.size 128    
  hive.server2.map.fair.scheduler.queue true    
动态分区        
 

hive.exec.max.dynamic.partitions

     
 

hive.exec.max.dynamic.partitions.pernode

     
超时        
  hive.server2.session.check.interval 3000   The check interval for session/operation timeout, which can be disabled by setting to zero or negative value.
  hive.server2.idle.session.timeout 0   Session will be closed when it's not accessed for this duration, which can be disabled by setting to zero or negative value.
  hive.server2.idle.operation.timeout 0   Operation will be closed when it's not accessed for this duration of time, which can be disabled by setting to zero value. With positive value, it's checked for operations in terminal state only (FINISHED, CANCELED, CLOSED, ERROR). With negative value, it's checked for all of the operations regardless of state.
显示列名        
  hive.cli.print.header      
调优
执行引擎
  hive.execution.engine mr、tez、spark   hive执行引擎
  TEZ执行引擎TEZ调优参数
  Heap Space;报类似Hive Query in Tez Reducer fails with "java.lang.OutOfMemoryError: Java heap space" at Shuffle fetcher异常可调这组参数
  hive.tez.auto.reducer.parallelism true  
  hive.tez.container.max.java.heap.fraction 0.8  
  hive.tez.container.size 2048  
  cpu核数
  hive.tez.cpu.vcores -1   当hive.tez.cpu.vcores设置小于1时,将被mapreduce.map.cpu.vcores值覆盖
相关参数
mapreduce.map.cpu.vcores
mapreduce.reduce.cpu.vcores
yarn.scheduler.minimum-allocation-vcores

 
  hive.tez.enable.memory.manager true  
  hive.tez.exec.inplace.progress true  
  hive.tez.exec.print.summary false  
  hive.tez.input.format org.apache.hadoop.hive.ql.io.HiveInputFormat  
  hive.tez.java.opts -server -Djava.net.preferIPv4Stack=true -XX:NewRatio=8 -XX:+UseNUMA -XX:+UseG1GC -XX:+ResizeTLAB -XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps  
  hive.tez.log.level
  hive.tez.min.partition.factor 0.25  
  hive.tez.max.partition.factor 2.0  
  hive.tez.smb.number.waves 0.5  
  hive.tez.task.scale.memory.reserve-fraction.min 0.3  
  hive.tez.task.scale.memory.reserve.fraction= -1.0  
  hive.tez.task.scale.memory.reserve.fraction.max 0.5  
  hive.server2.tez.default.queues default  
  hive.server2.tez.initialize.default.sessions false  
  hive.server2.tez.sessions.per.default.queue 1  
  hive.merge.tezfiles false  
  hive.in.tez.test false  
  hive.convert.join.bucket.mapjoin.tez false  
 
  队列
  mapreduce.job.queuename default 如果执行引擎是mapreduce,通过该参数指定队列
set mapreduce.job.queuename=queue3;
  hive.server2.tez.default.queues default 如果执行引擎是tez,通过该参数指定队列
set hive.server2.tez.default.queues=market;
mapjoin 案例
hive.auto.convert.join true   是否自动转换为mapjoin,其值是true/false  
hive.mapjoin.maxsize      
hive.mapjoin.localtask.max.memory.usage      
hive.skewjoin.mapjoin.map.tasks      
hive.mapjoin.smalltable.filesize 25000000,即25M 小表的最大文件大小 1、执行一个本地任务(mapreduce local task)将小表转成hashtable并序列化为文件再压缩,随后这些hashtable文件会被上传到Hadoop缓存,提供给各个mapjoin使用
2、一个大表顺序关联3个小表a(10M), b(8M),c(12M),如果hive.auto.convert.join.noconditionaltask.size的值:
1. 小于18M,则无法合并mapjoin,必须执行3个mapjoin;
2. 大于18M小于30M,则可以合并a和b表的mapjoin,所以只需要执行2个mapjoin;
3. 大于30M,则可以将3个mapjoin都合并为1个。
之所以要合并是因为每个mapjoin都要执行一次map,需要读写一次数据,所以多个mapjoin就要做多次的数据读写,合并mapjoin后只用读写一次,自然能大大加快速度。但是执行map是内存大小是有限制的,在一次map里对多个小表做mapjoin就必须把多个小表都加入内存,为了防止内存溢出,所以加了hive.auto.convert.join.noconditionaltask.size参数来做限制。不过,这个值只是限制输入的表文件的大小,并不代表实际mapjoin时hashtable的大小。
3、如果我们的localtask的内存使用超过阀值,任务会直接失败
4、用作join的关联字段的字段类型最好要一致。我就碰到一个诡异的问题,执行mapjoin 的local task时一直卡住,40万行的小表处理了好几个小时,正常情况下应该几秒钟就完成了。查了好久原因,结果原来是做join的关联字段的类型不一致,一边是int, 一边是string,hive解释计划里显示它们都会被转成double再来join。我把字段类型改为一致的,瞬间就快了。照理说就算转成double也不该这么慢

hive.mapjoin.cache.numrows
  25000 mapjoin 存在内存里的数据量
hive.mapjoin.followby.gby.localtask.max.memory.usage   0.55 map joingroup by 操作时,可以使用多大的内存来存储数据,如果数据太大,则不会保存在内存里
hive.mapjoin.bucket.cache.size
  0.90 将小表转成hashtable的本地任务的最大内存使用率,默认0.9
hive.auto.convert.join.noconditionaltask true   是否将多个mapjoin合并为一个
hive.auto.convert.join.noconditionaltask.size 1500MB   多个mapjoin转换为1个时,所有小表的文件大小总和的最大值
 hive.mapjoin.followby.gby.localtask.max.memory.usage 如果mapjoin后面紧跟着一个group by任务,这种情况下 本地任务的最大内存使用率,默认是0.55
hive.mapjoin.check.memory.rows
localtask每处理完多少行,就执行内存检查。默认为100000
groupby 案例
  hive.map.aggr true map端聚合是否开启,默认开启
  hive.groupby.mapaggr.checkinterval
100000 map端做聚合时,group by 的key所允许的数据行数,超过该值则进行分拆
  hive.groupby.skewindata false group by操作是否允许数据倾斜,默认是false,当设置为true时,执行计划会生成两个map/reduce作业,第一个MR中会将map的结果随机分布到reduce中,达到负载均衡的目的来解决数据倾斜
合并小文件  
控制map数  
  mapred.map.tasks
  mapred.max.split.size
mapreduce.input.fileinputformat.split.maxsize
  mapred.min.split.size.per.node
mapreduce.input.fileinputformat.split.minsize.per.node
  mapred.min.split.size.per.rack
mapreduce.input.fileinputformat.split.minsize.per.rack
  mapreduce.input.fileinputformat.split.minsize
1
  hive.hadoop.supports.splittable.combineinputformat true 仅对text格式有效,对orc等格式无效
  hive.input.format org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
控制reduce数  
  mapred.reduce.tasks 1   每个作业的reduce任务数,默认是hadoop client的配置1个

参数1hive.exec.reducers.bytes.per.reducer(默认为8M)

参数2 hive.exec.reducers.max(默认为999

计算reducer数的公式

N=min(参数2,总输入数据量/参数1)

hive.exec.reducers.bytes.per.reducer

67108864(8M)

每个reducer的大小,默认是8M,输入文件如果是80M,那么就会起10个reducer
hive.exec.reducers.max reducer的最大个数,如果在mapred.reduce.tasks设置为负值,那么hive将取该值作为reducers的最大可能值。当然还要依赖(输入文件大小/hive.exec.reducers.bytes.per.reducer)所得出的大小,取其小值作为reducer的个数,hive默认是999
列裁剪 hive.optimize.cp true 开启列裁剪  
分区剪裁 hive.optimize.pruner   true 开启分区剪裁
  hive.partition.pruning
    在编译器发现一个query语句中使用分区表然而未提供任何分区谓词做查询时,抛出一个错误从而保护分区表,默认是nonstrict;
  hive.tez.dynamic.partition.pruning true    
  hive.tez.dynamic.partition.pruning.max.data.size 104857600    
  hive.tez.dynamic.partition.pruning.max.event.size 1048576    
hive.stats.autogather true   如果通过INSERT OVERWRITE的方式插入数据,那么Hive会自动将该表或分区的统计信息更新到元数据
hive.compute.query.using.stats
true    
谓词下推 hive.optimize.ppd true    
  hive.optimize.ppd.storage     谓词下推开启时,谓词是否下推到存储handler,默认开启,在谓词下推关闭时不起作用  
  hive.ppd.recognizetransivity     在等值join条件下是否产地重复的谓词过滤器,默认开启  
存储格式        
ORC格式
hive.exec.orc.memory.pool   5 在写文件时,heap的最大值  
hive.exec.orc.default.stripe.size   256M(0.13.0),64M(0.14.0) 默认的stripe大小  
hive.exec.orc.default.block.size   256M 默认数据块大小  
hive.exec.orc.default.row.index.stride   10000 strip默认的行数  
hive.exec.orc.default.buffer.size   256K 默认的缓存区大小  
hive.exec.orc.default.compress   ZLIB 默认的压缩方式  
hive.exec.orc.encoding.strategy   SPEED 写数据默认的编码策略,有两种SPEED和Compression  
hive.orc.cache.stripe.details.size   10000 每个stripe可以缓存的大小  
hive.orc.compute.splits.num.threads
  10 并行度  
hive.exec.orc.split.strategy   HYBRID 拆分策略:BI(不从HDFS中读取数据,进行与拆分)、ETL(在拆分前,读取文件footer)、HYBRID(如果文件小于预期的mapper数量,读取所有文件的footer,在平均文件大小小于HDFS默认大小的情况下,每个文件生成一个分区),ORC文件具体介绍  
hive.exec.orc.zerocopy   true 是否使用零复制来读取数据  
hive.exec.orc.compression.strategy   SPEED 写数据的压缩格式,有SPEED和COMPRESSIONS  
hive.orc.row.index.stride.dictionary.check   true  

 


注意:本文归作者所有,未经作者允许,不得转载

全部评论: 0

    我有话说: