1.Fetch抓取 :
目的:让hive sql 能不走MR 尽量不走MR
通过hive的参数来配置, 决定哪些sql可以不走MR:
set hive.fetch.task.conversion :
可选值: none | minimal | more 默认值 more
none: 如果配置了此值, 表示所有的查询操作, 都会执行MR
minimal : 如果配置了此操作, 执行查询 全部数据 和根据字段查询操作 和 limit , 可以不走MR 其他都走MR
more: 如果配置了此操作, 执行 查询全部数据, 根据字段查询, 简单的条件查询 以及 limit 都是可以不走MR的
此优化无需配置
2.本地模式:
目的:在执行MR的时候, 优先采用本地模式 (能走本地MR模式, 尽量走本地MR )
配置操作 :
set hive.exec.mode.local.auto=true; 默认值为false
判断在什么情况下走本地MR:
set hive.exec.mode.local.auto.inputbytes.max=134217728; 数据量的大小 128M
set hive.exec.mode.local.auto.input.files.max=4; 文件的个数
以上两个条件, 必须全部满足 才会走本地MR 否则都走yarn集群
请思考: 是否所有MR走本地都比走yarn集群效率高
肯定不对, 如果数据量比较少, 走本地要比走yarn 效率高一些, 当数据量比较大的时候, 走yarn的效率要比本地要高
因为本地模式是一种单进程模式
故: 此操作一般在测试环境下需要配置, 在生产环境下, 配不配已经没有太大的作用了
3.Join的优化 :
在进行多表操作的时候, 就会出现join
当大表 与 小表进行join的优化: 可以采用 map join 来实现
解决:
提升join的效率
可以解决join的数据倾斜的问题
弊端:
对内存消耗提升
如何配置呢?
set hive.auto.convert.join = true; 默认开启的
set hive.mapjoin.smalltable.filesize= 25000000; 约 25M
在编写sql的时候, 大表和小表放置位置是否有要求呢?
在hive 1.0以前老版本, 要求必须将小表放置在最前面才可以实施 , 在 1.0以后的版本中, hive为了简化操作, 不做此要求, 不用放置在什么位置上, hive自己会判断那个表是大表那个是小表
当大表和 大表 进行join 如何优化呢?
优化方案一