概要
我们平时在使用hive执行一些SQL任务时。经常会遇到执行速度很慢,数据倾斜,资源不够用等问题。那是因为我们没有合理的使用hive。hive 的主要配置文件为 conf 中 hive-site.xml,里面包含许多配置参数,灵活的根据业务进行相关的参数配置,可以解决以上问题。下面将介绍hive的全部参数的意义以及如何配置。重要的会标红。
hive参数大全
设置一些基本参数,让hive使用起来更便捷
1、让提示符显示当前库:
hive>set hive.cli.print.current.db=true;
2.显示查询结果时显示字段名称:
hive>set hive.cli.print.header=true;
但是这样设置只对当前会话有效,重启hive会话后就失效,解决办法:在linux的当前用户目录中,编辑一个.hiverc文件,将参数写入其中:
vi .hiverc
set hive.cli.print.header=true;
set hive.cli.print.current.db=true;
关于是否本地运行的参数
hive.exec.mode.local.auto
决定 Hive 是否应该自动地根据输入文件大小,在本地运行(在GateWay运行)
hive.exec.mode.local.auto.inputbytes.max
如果 hive.exec.mode.local.auto 为 true,当输入文件大小小于此阈值时可以自动在本地模式运行,默认是 128兆。
134217728L
hive.exec.mode.local.auto.tasks.max
如果 hive.exec.mode.local.auto 为 true,当 Hive Tasks(Hadoop Jobs)小于此阈值时,可以自动在本地模式运行。
默认值:4
hive.mapred.local.mem
Mapper/Reducer 在本地模式的最大内存量,以字节为单位,0为不限制。
关于文件个数和合并的参数
hive.merge.mapfiles
在只有map的作业结束时合并小文件,默认开启true
hive.merge.mapredfiles:
在一个map/reduce作业结束后合并小文件,
默认不开启false
hive.merge.size.per.task:
作业结束时合并文件的大小,默认256MB;
hive.merge.smallfiles.avgsize:
在作业输出文件小于该值时,起一个额外的map/reduce作业将小文件合并为大文件,小文件的基本阈值,设置大点可以减少小文件个数,注意:需要mapfiles和mapredfiles为true, 默认值是16MB;
mapred.reduce.tasks:
每个作业的reduce任务数,默认是hadoop client的配置1个;
hive.exec.reducers.bytes.per.reducer:
每个reducer的大小,
默认是1G,输入文件如果是10G,那么就会起10个reducer;
hive.exec.reducers.max:
reducer的最大个数,如果在mapred.reduce.tasks设置为负值,那么hive将取该值作为reducers的最大可能值。当然还要依赖(输入文件大小/hive.exec.reducers.bytes.per.reducer)所得出的大小,取其小值作为reducer的个数,
hive默认是999;
hive.exec.max.created.files:
一个mapreduce作业能创建的HDFS文件最大数,默认是100000(十万);
关于SQL优化的参数
hive.exec.parallel
hive的执行job是否并行执行,默认不开启false,
在很多操作如join时,子查询之间并无关联可独立运行,这种情况下开启并行运算可以大大加速。
hive.exec.parallel.thread.number
并行运算开启时,允许多少作业同时计算,默认是8
hive.mergejob.maponly:
试图生成一个只有map的任务去做merge,前提是支持CombineHiveInputFormat,默认开启true;
hive.auto.convert.join:
根据输入文件的大小决定是否将普通join转换为mapjoin的一种优化,默认不开启false
hive.mapjoin.smalltable.filesize:
输入表文件的mapjoin阈值,如果输入文件的大小小于该值,则试图将普通join转化为mapjoin,
默认25MB;
hive.groupby.skewindata
决定 group by 操作是否支持倾斜的数据。 默认值false
hive.default.fileformat
Hive 默认的输出文件格式,与创建表时所指定的相同,可选项为 'TextFile' 、 'SequenceFile' 或者 'RCFile'。
默认值 TextFile'
hive.mapred.mode
Map/Redure 模式,如果设置为 strict,将不允许笛卡尔积。
默认值 'nonstrict'
hive.exec.dynamic.partition
是否打开动态分区。 默认 false
hive.exec.dynamic.partition.mode
打开动态分区后动态分区的模式,有 strict 和 nonstrict 两个值可选,strict 要求至少包含一个静态分区列,nonstrict 无此要求。
hive.exec.max.dynamic.partitions
所允许的最大的动态分区的个数。 默认值1000
hive.exec.max.dynamic.partitions.pernode
单个 reduce 结点所允许的最大的动态分区的个数。 默认值 100
关于数据倾斜于资源配置的参数
hive.optimize.skewjoin
是否优化数据倾斜的 Join,对于倾斜的 Join 会开启新的 Map/Reduce Job 处理。 默认值 false
hive.join.cache.size:
在做表join时缓存在内存中的行数,默认25000;
hive.mapjoin.bucket.cache.size:
mapjoin时内存cache的每个key要存储多少个value,默认100;
hive.skewjoin.key
倾斜键数目阈值,超过此值则判定为一个倾斜的 Join 查询。 默认值 1000000
hive.exec.dynamic.partition:
在DML/DDL中是否支持动态分区,默认false
hive.skewjoin.mapjoin.map.tasks
处理数据倾斜的 Map Join 的 Map 数上限。 10000
hive.skewjoin.mapjoin.min.split
处理数据倾斜的 Map Join 的最小数据切分大小,以字节为单位,默认为32M。 33554432
mapred.min.split.size
Map Reduce Job 的最小输入切分大小,与 Hadoop Client 使用相同的配置。 默认值 1
hive.mergejob.maponly
是否启用 Map Only 的合并 Job。 默认值 true
hive.mapjoin.maxsize
Map Join 所处理的最大的行数。超过此行数,Map Join进程会异常退出。 默认值1000000
压缩参数
hive.exec.compress.output:
控制hive的查询结果输出是否进行压缩,压缩方式在hadoop的mapred.output.compress中配置, 默认不压缩false;
hive.exec.compress.intermediate:
控制hive的查询中间结果是否进行压缩,同上条配置,默认不压缩false;
Job输出结果是否压缩
mapred.output.compress
是否压缩,默认值false。
mapred.output.compression.type
压缩类型,有NONE, RECORD和BLOCK,默认值RECORD。
mapred.output.compression.codec
压缩算法,默认值org.apache.hadoop.io.compress.DefaultCodec。
map task输出是否压缩
mapred.compress.map.output
是否压缩,默认值false
mapred.map.output.compression.codec
压缩算法,默认值org.apache.hadoop.io.compress.DefaultCodec
hive进入外部jar包
hive需要引入包时?该怎么引入?
一、hive-site.xml中的hive.aux.jars.path
此配置项对于hive server有效,但是是不会作用到hive shell.也就是说即使你在hive节点上配置了这一项,但是对于hive shell来说是无效的(为什么会这样?难道不是服务器配置了,所有的hive shell都能生效吗?搞不懂)。但是在hive-site.xml的模板文件中找不到hive.aux.jars.path的配置,是不是hive正慢慢改变用户放弃配置此属性呢?
注意:1,目前只支持file://也就是本地文件,暂不支持HDFS,也不支持文件夹。2,多个文件使用逗号分隔。3,不能换行。
案例:
<property>
<name>hive.aux.jars.path</name>
<value>file:///usr/local/service/hive/auxlib/hive-hcatalog-core-2.1.1.jar,file:///usr/local/service/hive/auxlib/hive-hcatalog-pig-adapter-2.1.1.jar,file:///usr/local/service/hive/auxlib/hive-hcatalog-server-extensions-2.1.1.jar,file:///usr/local/service/hive/auxlib/hive-hcatalog-streaming-2.1.1.jar,file:///usr/local/service/hive/auxlib/json-serde-1.3-jar-with-dependencies.jar</value>
</property>
二、hive-env.sh中的HIVE.AUX.JARS.PATH
hive-env.sh中的HIVE.AUX.JARS.PATH对服务器无效,仅对当前hive shell有效,不同的hive shell相互不影响,每个hive shell都需要配置,可以配置成文件夹形式。
注意:1,根据hive启动脚本,此属性应该也只支持file://也就是本地文件,暂不支持HDFS,没有做验证。2,此配置可以配置文件,也可以配置成文件夹,建议配置成文件夹。
可以使用如下配置:export HIVE_AUX_JARS_PATH=$HIVE_HOME/lib
三、使用add jar
使用add jar应该也对服务器无效,仅对当前hive shell有效(没验证过),add jar 建议制定一个HDFS路径,jar包上传到HDFS上,这样比较方便。如果指定是本地路径,则需要确保每个hive shell节点上的对应位置上都放置了需要的jar包,这样操作起来比较麻烦。
可以使用如下命令:
add jar hdfs://ip:9000/user/hive/share/HiveUdf.jar;
delete jar hdfs://ip:9000/user/hadoop/share/HiveUdf.jar;
扫一扫加入大数据公众号和技术交流群,了解更多大数据技术,还有免费资料等你哦
扫一扫加入大数据公众号和技术交流群,了解更多大数据技术,还有免费资料等你哦
扫一扫加入大数据公众号和技术交流群,了解更多大数据技术,还有免费资料等你哦