一、配置文件 (全局有效)node
二、命令行参数(对 hive 启动实例有效)apache
三、参数声明 (对 hive 的链接 session 有效)缓存
Hive 的配置文件包括:session
A. 用户自定义配置文件:$HIVE_CONF_DIR/hive-site.xmlapp
B. 默认配置文件:$HIVE_CONF_DIR/hive-default.xml负载均衡
用户自定义配置会覆盖默认配置。oop
另外,Hive 也会读入 Hadoop 的配置,由于 Hive 是做为 Hadoop 的客户端启动的,Hive 的配 置会覆盖 Hadoop 的配置。优化
配置文件的设定对本机启动的全部 Hive 进程都有效。spa
启动 Hive(客户端或 Server 方式)时,能够在命令行添加-hiveconf param=value 来设定参数,这一设定对本次启动的 session(对于 server 方式启动,则是全部请求的 session)有效。命令行
bin/hive -hiveconf hive.root.logger=INFO,console
能够在 HQL 中使用 SET 关键字设定参数
set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.parallel=true; set hive.exec.parallel.thread.number=8;
map join 概念:将其中作链接的小表(全量数据)分发到全部 MapTask 端进行 Join,从 而避免了 reduceTask,前提要求是内存足以装下该全量数据
set hive.auto.convert.join=true; //设置 MapJoin 优化自动开启 set hive.mapjoin.smalltable.filesize=25000000 //设置小表不超过多大时开启 mapjoin 优化
set mapreduce.input.fileinputformat.split.maxsize=20000000; set mapreduce.input.fileinputformat.split.minsize.per.node=10000000; set mapreduce.input.fileinputformat.split.minsize.per.rack=10000000;
1). 将大表放后头
Hive假定查询中最后的一个表是大表。它会将其它表缓存起来,而后扫描最后那个表。
所以一般须要将小表放前面,或者标记哪张表是大表:/*streamtable(table_name) */
2). 使用相同的链接键
当对3个或者更多个表进行join链接时,若是每一个on子句都使用相同的链接键的话,那么只会产生一个MapReduce job。
3). 尽可能尽早地过滤数据
减小每一个阶段的数据量,对于分区表要加分区,同时只选择须要使用到的字段。
4). 尽可能原子化操做
尽可能避免一个SQL包含复杂逻辑,可使用中间表来完成复杂的逻辑
通常状况下,Limit语句仍是须要执行整个查询语句,而后再返回部分结果。
有一个配置属性能够开启,避免这种状况---对数据源进行抽样
hive.limit.optimize.enable=true --- 开启对数据源进行采样的功能 hive.limit.row.max.size --- 设置最小的采样容量 hive.limit.optimize.limit.file --- 设置最大的采样样本数
set mapreduce.job.name=${fileName}_0; --做业名称
set mapreduce.job.priorite=NORMAL; --做业优先级
set mapreduce.job.queuename=default; --做业队列
--负载均衡
set hive.map.aggr = true; --是否在map端聚合
set hive.groupby.skewindata=true; --不支持多列剔重
set hive.groupby.mapaggr.checkinterval=100000; --在 Map 端进行聚合操做的条目数目
--压缩设置
set mapred.compress.map.output = true; --对map任务输出进行压缩
set mapred.output.compress = true; --压缩输出
set hive.exec.compress.output = true; --控制hive的查询结果输出是否进行压缩
--中间过程压缩设置
set hive.exec.compress.intermediate=true; --控制hive的查询中间结果是否进行压缩,同上条配置,默认不压缩false;
set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
--输入设置
set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; --表示执行前进行小文件合并
set mapred.max.split.size = 256000000; --决定每一个map处理的最大的文件大小,单位为B
set mapred.min.split.size.per.node = 256000000; --节点中能够处理的最小的文件大小
set mapred.min.split.size.per.rack = 256000000; --机架中能够处理的最小的文件大小
--输出设置
set hive.merge.mapfiles = true; --合并map端输出的结果
set hive.merge.mapredfiles = true; --合并reduce端输出的结果
set hive.merge.size.per.task = 256000000; --merge job后每一个文件的目标大小
set hive.merge.smallfiles.avgsize = 256000000;
--reduce数量
set mapred.reduce.tasks= 300;
set hive.exec.reducers.bytes.per.reducer = 5120000000;
--并行设置
set hive.exec.parallel = true;
set hive.exec.parallel.thread.number = 8;
--内存相关设置
set mapreduce.map.memory.mb=8096;
set mapreduce.reduce.memory.mb=10144;
--开启动态分区功能
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.created.files=10000;
set hive.exec.max.dynamic.partitions=10000;
set hive.exec.max.dynamic.partitions.pernode=10000;
--mapjoin设置
set hive.auto.convert.join=true;
set hive.auto.convert.join.noconditionaltask=true;
set hive.auto.convert.join.noconditionaltask.size=10000000;
set hive.mapjoin.smalltable.filesize = 10240000;
-- 开启严格模式set hive.marped.mode=strict;