当前位置: 首页 > news >正文

imapal sql优化之hint

Query Hints in Impala SELECT Statements | 5.11.x | Cloudera Documentation

 /* SHUFFLE*/和 /* BROADCAST*/主要是用来join语句

表1  odsrmicdata.zhimou_audit_info 614M

表2 odsrmicdata.zhimou_info_compress_check 165M

此时两个表join,将小表广播

explain

select a1.* from odsrmicdata.zhimou_audit_info a1

join odsrmicdata.zhimou_info_compress_check a2

on a1.id =a2.id

34359738368/1024/1024/1024=32G 额我也不知道为啥这么大。忽略。

如果我此时不想广播呢?因为广播占用内存较多,对实时性要求不高。

BROADCAST_BYTES_LIMIT    34359738368

1.设置广播阈值 set BROADCAST_BYTES_LIMIT=34359738=30M 缩小100倍

这样可以,但是问题在于这个sql我想节约内存,下个sql我想查的快,需要反复的调节大小,比较麻烦

2.使用hint,就是提示impala 我这个sql希望用什么方式join。

explain

select a1.* from odsrmicdata.zhimou_audit_info a1

join [shuffle] odsrmicdata.zhimou_info_compress_check a2

on a1.id =a2.id

explain

select a1.* from odsrmicdata.zhimou_audit_info a1

join /* +SHUFFLE */ odsrmicdata.zhimou_info_compress_check a2

on a1.id =a2.id

explain

select a1.* from odsrmicdata.zhimou_audit_info a1

join -- +shuffle

odsrmicdata.zhimou_info_compress_check a2

on a1.id =a2.id

三种都可以

 

这种就比较方便了,我们继续看下hint还有哪些用法?

SELECT STRAIGHT_JOIN select_list FROM
join_left_hand_table
  JOIN [{ /* +BROADCAST */ | /* +SHUFFLE */ }]
join_right_hand_table
remainder_of_query;

join的时候可以指定 广播BROADCAST 和SHUFFLE 上面已经说了。

INSERT insert_clauses
  [{ /* +SHUFFLE */ | /* +NOSHUFFLE */ }]
  [/* +CLUSTERED */]
  SELECT remainder_of_query;

insert的时候可以指定SHUFFLE /NOSHUFFLE/CLUSTERED

SELECT select_list FROM
table_ref
  /* +{SCHEDULE_CACHE_LOCAL | SCHEDULE_DISK_LOCAL | SCHEDULE_REMOTE}
    [,RANDOM_REPLICA] */
remainder_of_query;

select的时候可以指定SCHEDULE_CACHE_LOCAL/SCHEDULE_DISK_LOCAL/SCHEDULE_REMOTE/RANDOM_REPLICA

注意 

1.STRAIGHT_JOIN / DISTINCT / ALL关键词会导致 hint失效

2.为了减少使用hints 尽量多使用compute stats

Hints for join queries:

使用shuffle 是一般用于大表和大表之间的关联

使用broadcast用于大表和小表之间的关联,一般是impala的默认方式

 /* SHUFFLE*/和 /* NOSHUFFLE*/ 主要是用来insert语句

Hints for INSERT ... SELECT queries:

对于insert...select这种类型querysql,我们可以通过hint去微调impala的整体操作和资源使用(这里一般指的是impala的parquet分区表?)

/* +SHUFFLE */

会在写数据前增加一个协调的节点,这个节点专门用来写数据到目标表。

比如insert into a select * from b   b是分区表 a也是分区表,加了这个就是把b的一个分区的数据拉到协调节点输出到a 然后再拉一个分区。

如果表是非分区表或者所有分区都是常量,这个hint会在协调节点将所有数据写出

1.涉及多个节点的数据传输

2.减少资源的使用量,最终形成的文件数量减少

/* +NOSHUFFLE */

在插入到分区表之前不添加 Exchange 节点,并禁用重新分区。因此,所选执行计划可能是总体上更快,但也可能会生成大量小数据文件或超出容量限制,从而导致作失败

impala自动使用/* +SHUFFLE */作为默认项,如果select语句中包含了原表的所有列,并且没有compute column stats

直接来实战吧 

insert overwrite table cc_test.multi_join_impala

select *

from cc_test.multi_join;

insert overwrite table cc_test.multi_join_impala /* +NOSHUFFLE */

select *

from cc_test.multi_join;

insert overwrite table cc_test.multi_join_impala /* +SHUFFLE */

select *

from cc_test.multi_join;

很明显看到shuffle插入的时候多了一个步骤exchange就是把不同节点数据转移到一个节点专门输出。通过查看内存使用情况,可以看到shuffle使用的内存确实比 noshuffle少,当然速度也会变慢(这里的节点数太少不明显,可以自己将文件数变多)

 /* CLUSTERED */和 /* NOCLUSTERED */

这两个感觉不出来具体的用处。

还有一些其他的hint有兴趣的自己学习

Query Hints in Impala SELECT Statements | 5.11.x | Cloudera Documentation

SQL Statements - Optimizer Hints - 《Apache Impala v3.x Documentation》 - 书栈网 · BookStack

相关文章:

  • 获取当前时间
  • Unity中Pico4开发 物体跟随手势模型进行移动
  • 解释 NestJS 的架构理念(例如,模块化、可扩展性、渐进式框架)
  • 使用 git subtree 方法将六个项目合并到一个仓库并保留提交记录
  • Ubuntu18.04搭建samda服务器
  • LXwhat-嘉立创
  • NetSuite 常用类型Item对应Account异同
  • react-transition-group 在 React 18 及以上版本中的兼容性问题
  • 团队协作的润滑剂——GitHub与协作流程
  • 软件测试应用技术(2) -- 软件评测师(十五)
  • ES6/ES11知识点 续五
  • 动手学深度学习12.1. 编译器和解释器-笔记练习(PyTorch)
  • 「Mac畅玩AIGC与多模态21」开发篇17 - 多字段判断与多路径分支工作流示例
  • Hello Robot 推出Stretch 3移动操作机器人 提升开源与可用性
  • 大搜车:借力 OB Cloud 实现经销商管理系统SRP的技术升级
  • 探索Hello Robot开源移动操作机器人Stretch 3的新技术亮点与市场定位
  • 蓝肽子序列--字符串+最长子序列的dp
  • 虚拟现实视频播放器 2.6.1 | 支持多种VR格式,提供沉浸式观看体验的媒体播放器
  • 在 Laravel 12 中实现 WebSocket 通信
  • Redis 7.0中5种新特性及实战应用
  • 默茨当选德国总理
  • 罗马尼亚临时总统博洛让任命普雷多尤为看守政府总理
  • 强沙尘暴压城近万名游客被困,敦煌如何用3小时跑赢12级狂风?
  • 黔西游船倾覆事故84名落水人员已全部找到,10人不幸遇难
  • 国家网信办举办在欧中资企业座谈会,就数据跨境流动等进行交流
  • 是否进行了及时有效处置?伤者情况如何?辽阳市相关负责人就饭店火灾事故答问