使用split_size优化的ODPS SQL的场景

首先有两个大背景需要说明如下:
说明1:split_size,设定一个map的最大数据输入量,单位M,默认256M。用户可以通过控制这个变量,从而达到对map端输入的控制。设置语句:set odps.sql.mapper.split.size=256。一般在调整这个设置时,往往是发现一个map instance处理的数据行数太多。

说明2:小文件越多,需要instance资源也越多,MaxCompute对单个Instance可以处理的小文件数限制为120个,如此造成浪费资源,影响整体的执行性能(文件的大小小于块Block 64M的文件)。

场景一:单记录数据存储太少

原始Logview Detail:

可以发现Job只调起一个Map Instance,供处理了156M的数据,但这些数据共有5千多万的记录(单记录平均3个byte),花费了25分钟。
此外,从TimeLine看可以发现,整个Job耗费43分钟,map占用了超过60%的时间。故可对map进行优化。

优化手段:调小split_size为16M

优化之后的logview:

优化后,可以发现,Job调起了7个Map Instance,耗时4分钟;某一个Map处理了27M的数据,6百万记录。(这里可以看出set split_size只是向Job提出申请,单不会严格生效,Job还是会根据现有的资源情况等来调度Instance)因为Map的变多,Join和Reduce的instance也有增加。整个Job的执行时间也下降到7分钟。

场景二:用MapJoin实现笛卡尔积

原始logview:

可以发现,Job调起了4个Map,花费了3个小时没有跑完;查看详细Log,某一个Map因为笛卡尔的缘故,生成的数据量暴涨。
综合考虑,因为该语句使用Mapjoin生成笛卡尔积,再筛选符合条件的记录,两件事情都由map一次性完成,故对map进行优化。

策略调低split_size
优化后的logview:

优化后,可以看到,Job调度了38个map,单一map的生成数据量下降了,整体map阶段耗时也下降到37分钟。
回头追朔这个问题的根源,主要是因为使用mapjoin笛卡尔积的方式来实现udf条件关联的join,导致数据量暴涨。故使用这种方式来优化,看起来并不能从根本解决问题,故我们需要考虑更好的方式来实现类似逻辑。


本文作者:祎休

原文链接

本文为云栖社区原创内容,未经允许不得转载。

最新文章

  1. IOS 网络浅析-(十二 UIWebView简介)
  2. WPF系列 Path表示语法详解(Path之Data属性语法)
  3. Hibernate5.2关联关系之双向一对多(三)
  4. hdoj 1596 find the safest rode
  5. POJ3254Corn Fields(状态压缩DP入门)
  6. 【BZOJ】【1934】【SHOI 2007】Vote 善意的投票
  7. 数据库SQL Server与C#中数据类型的对应关系
  8. 在Ubuntu中设置中文输入法
  9. Constructor Prototype Pattern 原型模式(PHP示例)
  10. C#的FTP上传下载的实验
  11. 安卓---下拉刷新---上拉加载---解决导入library等自生成库文件失败的问题
  12. html基本标签与属性
  13. Python3 多线程编程(thread、threading模块)
  14. Autofac使用
  15. Sublime text 2/3 [Decode error - output not utf-8] 完美解决方法
  16. 《nginx - 基本操作/配置》
  17. dotnet 从入门到放弃的 500 篇文章合集
  18. 大数据处理框架之Strom: Storm----helloword
  19. 使用gdb和gdbserver调试Android C/C++程序
  20. Activity总结练习

热门文章

  1. windwos API 第七篇 分离路径,组合路径 _splitpath _makepath
  2. idea debug技巧
  3. 前缀数组O(n^3)做法
  4. js阻止冒泡和默认事件
  5. linear-gradient
  6. MyBatis配置文件(三)--typeAliases别名
  7. WPF 线程中异常导致程序崩溃
  8. HYSBZ 1015/BZOJ1015 星球大战starwar
  9. c++设计模式:代理模式
  10. php获取数据转换成json格式