• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >云计算 > [Hive]Hive数据倾斜(大表join大表),hivejoin

[Hive]Hive数据倾斜(大表join大表),hivejoin

作者:网友 字体:[增加 减小] 来源:互联网

本文主要包含hive join,hive left join,hive left outer join,hive left semi join,hive full join等服务器相关知识,网友希望可以进行参考

[Hive]Hive数据倾斜(大表join大表),hivejoin


业务背景

用户轨迹工程的性能瓶颈一直是etract_track_info,其中耗时大户主要在于trackinfo与pm_info进行左关联的环节,trackinfo与pm_info两张表均为GB级别,左关联代码块如下:

from trackinfo a 
left outer join pm_info b 
on (a.ext_field7 = b.id) 

使用以上代码块需要耗时1.5小时。

优化流程

第一次优化

考虑到pm_info表的id是bigint类型,trackinfo表的ext_field7是string类型,其关联时数据类型不一致,默认的hash操作会按bigint型的id进行分配,这样会导致所有string类型的ext_field7集中到一个reduce里面,因此,改为如下:

from trackinfo a 
left outer join pm_info b 
on (cast(a.ext_field7 as bigint) = b.id) 

改动为上面代码后,效果仍然不理想,耗时为1.5小时。

第二次优化

考虑到trackinfo表的ext_field7字段缺失率很高(为空、字段长度为零、字段填充了非整数)情况,做进行左关联时空字段的关联操作实际上没有意义,因此,如果左表关联字段ext_field7为无效字段,则不需要关联,因此,改为如下:

from trackinfo a 
left outer join pm_info b 
on (a.ext_field7 is not null 
and length(a.ext_field7) > 0 
and a.ext_field7 rlike '^[0-9]+$' 
and a.ext_field7 = b.id)

上面代码块的作用是,如果左表关联字段ext_field7为无效字段时(为空、字段长度为零、字段填充了非整数),不去关联右表,由于空字段左关联以后取到的右表字段仍然为null,所以不会影响结果。
改动为上面代码后,效果仍然不理想,耗时为50分钟。

第三次优化

想了很久,第二次优化效果效果不理想的原因,其实是在左关联中,虽然设置了左表关联字段为空不去关联右表,但是这样做,左表中未关联的记录(ext_field7为空)将会全部聚集在一个reduce中进行处理,体现为reduce进度长时间处在99%。
换一种思路,解决办法的突破点就在于如何把左表的未关联记录的key尽可能打散,因此可以这么做:若左表关联字段无效(为空、字段长度为零、字段填充了非整数),则在关联前将左表关联字段设置为一个随机数,再去关联右表,这么做的目的是即使是左表的未关联记录,它的key也分布得十分均匀

from trackinfo a 
left outer join pm_info b 
on (
    case when (a.ext_field7 is not null 
        and length(a.ext_field7) > 0 
        and a.ext_field7 rlike '^[0-9]+$') 
    then 
        cast(a.ext_field7 as bigint) 
    else 
        cast(ceiling(rand() * -65535) as bigint) 
    end = b.id
) 

第三次改动后,耗时从50分钟降为了1分钟32秒,效果显著!

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • [Hive]Hive数据倾斜(大表join大表),hivejoin
  • hive join详解,hivejoin
  • hive 优化的原则,hive优化原则

相关文章

  • 【解决】hive动态增加partitions不能超过100的问题,hivepartitions
  • CSR1000V在XenServer的安装和简单使用,csr1000vxenserver
  • R720 disable hyperthreading,r720hyperthreading
  • 【解决】 CentOS6.6安装CM5.4的问题,centos6.6cm5.4
  • Hadoop MapReduce编程的一些个人理解,hadoopmapreduce
  • HBase入门5(集群),hbase入门5集群
  • Hadoop自测题,hadoop
  • 一篇博文简单了解weka,博文简单weka
  • CDH5 hadoop-hive-habse单机版配置,hadoophivehbase
  • 分析MapReduce与Storm的异同,mapreducestorm

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • 【甘道夫】Spark1.3.0 Submitting Applications 官方文档精华摘要,spark1.3
    • Neutron数据库同步错误 NotImplementedError: No support for ALTER of constraints in SQLite dialect,sqlitealtertable
    • hadoop-2.6.0运行woudcount报错,hadoop运行wordcount
    • Spark源码分析之worker节点启动driver和executor
    • The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path,httpservlet
    • CMDBuild安装及webservice接口的获取,cmdbuildwebservice
    • spark core源码分析9 从简单例子看action操作,sparkcore
    • Linux快速配置svn库,Linux配置svn库
    • <转>云主机配置OpenStack使用spice的方法,openstackspice
    • CDH安装官方教程,cdh官方教程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有