通俗解释:在执行hive sql的时候 能不跑MapReduce程序尽量不跑MapReduce程序。
直接针对表所对应的文件进行操作
fetch默认是开启的。hive.fetch.task.conversion=more
在下述三种情况下 sql 不执行MapReduce程序 直接针对文件操作。
hivesql--->mapreduce--->yarn--->hdfs 集群模式执行sql
hivesql--->mapreduce--->local --->hdfs 本地模式执行sql
Q:MapReduce是如何决定以何种模式执行的?yarn?local?
mapreduce.framework.name
yarn
conf.set("mapreduce.framework.name","local")
在hive中 有个参数 是否智能切换本地模式运行
hive.exec.mode.local.auto 默认为false 意味着所有的MapReduce都是yarn运行的
如果设置为true hive会根据下述三个条件是否满足 来决定执行什么模式
1、整个输入数据量 小于128M
2、整个maptask 小于4
3、整个reducetask 1 或者是 0
1)设置自动选择 mapjoin
set hive.auto.convert.join = true; 默认为 true
(2)大表小表的阈值设置:
set hive.mapjoin.smalltable.filesize= 25000000;
空key过滤
空key转换
最好拼接随机数 避免产生新的问题:数据倾斜
想怎么join 就怎么join 注意控制小表的阈值条件 hive会自动识别 尝试转换map join 提高性能
注意事项:如果分组的字段中某个值过多 可能会导致数据倾斜问题的产生
后果:倾斜的数据处理迟迟不结束 导致整个mr程序不结束
解决:开始hive数据倾斜时候的负载均衡参数 底层会打散数据 通过两个mr来执行
set hive.groupby.skewindata = true;
#大文件处理场景
直接修改hdfs block size=512M 1G
block size==split size maptask个数
#小文件处理场景
1k,1k,1k
在上传hdfs之前 本地系统进行合并: java IO---->大文件(block size)
在上传的时候合并:hadoop fs -appendToFile 把多个文件追加到一个文件中 (block size)
在上传之后合并:hadoop archive、MapReduce程序预处理
reducetask个数调整
(1)每个 Reduce 处理的数据量默认是 256MB
hive.exec.reducers.bytes.per.reducer=256123456
(2)每个任务最大的 reduce 数,默认为 1009
hive.exec.reducers.max=1009
(3)mapreduce.job.reduces
该值默认为-1,由 hive 自己根据任务情况进行判断。
mapreduce.job.reduces这个参数为-1 表示hive会根据1)2)两个条件来评估启动多少个reducetask
如果mapreduce.job.reduces 被用户设置 设置为几 reducetask个数就为几
你设置的不一定生效 某些场景下 hive会根据sql自己改变。
比如:在order by全局排序的时候 为了满足执行成功 只会启动一个reducetask。
帮助去查询所写 sql 通过几个阶段stage完成的 以及每个阶段之间的依赖关系
对于有些复杂的sql 帮助排除sql逻辑编写是否有误
EXPLAIN sql语句
hive中sql会转换成多个不同的阶段stage完成。如果某些阶段直接没有依赖关系 可以开启并行执行 提高运行效率
默认情况下 hive一次只会执行一个。
set hive.exec.parallel=true; //打开任务并行执行
set hive.exec.parallel.thread.number=16;//指定并行度
默认情况下 hive是非严格模式的 所有sql只要语法正确都可以执行
但是为了避免某些sql造成意想不到的影响 hive提供了所谓的严格模式
在严格模式下:如下3中情况决定禁止执行的
A:分区表必须加上分区字段过滤
B:orderby语句必须加上limit限制
C:禁止笛卡尔积查询操作
hive.mapred.mode = strict|nonstrict
MapReduce中每个task都是jvm进程实例。
默认是一个jvm运行一个task.
可以开启重用机制 一个jvm运行多个task.
set mapred.job.reuse.jvm.num.tasks=10;
找出拖后腿的task 为其启动备份task 处理同一份任务 谁先处理完 谁的结果作为最终结果
hive默认也是开启的。