Hive一直使用ZooKeeper作为分布式锁定管理器来支持HiveServer2中的并发。 基于ZooKeeper的锁管理器在小型环境中运行良好。 但是,随着越来越多的用户从HiveServer迁移到HiveServer2并开始创建大量并发会话,可能会出现问题。 主要问题是Hiveserver2和ZooKeeper之间打开的连接数一直在增加,直到从ZooKeeper服务器端达到连接限制为止。 此时,ZooKeeper开始拒绝新的连接,并且所有依赖ZooKeeper的流都变得不可用。 为了解决这个问题,已经开放了多个Hive JIRA(例如HIVE-4132,HIVE-5853和HIVE-8135等),并且最近通过HIVE-9119对其进行了修复。

让我们仔细看一下Hive中的ZooKeeperHiveLockManager实现,看看它为什么以前引起问题,以及我们如何解决它。

ZooKeeperLockManager使用简单的ZooKeeper API来实现分布式锁。 下面列出了它使用的协议。

希望获得共享锁的客户端应执行以下操作:

  1. 调用create()创建一个路径名称为“ _lockresource_ / lock-shared-”且设置了序列标志的节点。
  2. 在不设置监视标志的情况下,在节点上调用getChildren()。
  3. 如果不存在路径名称以“ lock-exclusive-”开头的子代,则客户端将获取该锁并退出。
  4. 否则,调用delete()来删除它们在步骤1中创建的节点,休眠一个预定义的时间段,然后通过执行步骤1直到达到最大重试次数来进行重试。

希望获得排他锁的客户应执行以下操作:

  1. 调用create()创建一个路径名称为“ _lockresource_ / lock-exclusive-”且已设置序列标志的节点。
  2. 在不设置监视标志的情况下,在节点上调用getChildren()。
  3. 如果没有序号比在步骤1中创建的节点低的子级,则客户端获取锁并退出。
  4. 否则,调用delete()来删除它们在步骤1中创建的节点,休眠一个预定义的时间段,然后通过执行步骤1直到达到最大重试次数来进行重试。

希望释放锁的客户端应该只删除他们在步骤1中创建的节点。此外,如果所有子节点都已删除,则也要删除父节点。

上面的锁定和解锁协议非常简单明了。 但是,该协议的先前实现未正确使用ZooKeeper客户端。 对于每个Hive查询,都会创建一个新的ZooKeeper客户端实例来获取和释放锁。 这给ZooKeeper服务器处理新的连接带来了很多开销。 另外,在多会话环境中,如果并发查询太多,很容易达到ZooKeeper服务器连接限制。 此外,当用户使用Hue进行Hive查询时,也会发生这种情况。 色相默认情况下不会关闭Hive查询,这意味着为该查询创建的ZooKeeper客户端永远不会关闭。 如果查询量很大,则可以很快达到ZooKeeper连接限制。

我们是否真的需要为每个查询创建一个新的ZooKeeper客户端? 我们发现没有必要。 从上面的讨论中,我们可以看到HiveServer2使用ZooKeeper客户端与ZooKeeper服务器进行通信,以便能够获取和释放锁。 主要工作量在ZooKeeper服务器端,而不是客户端。 一个HiveKeeper客户端可以由针对HiveServer2服务器的所有查询共享。 使用Singleton ZooKeeper客户端,可以消除处理连接的服务器开销。 Hue用户不再受ZooKeeper连接问题的困扰。

Singleton ZooKeeper客户端能够解决锁定管理问题。 但是,我们仍然需要直接使用ZooKeeper客户端来处理一些额外的事情,例如:

  • 初始连接:ZooKeeper客户端和服务器握手需要一些时间。 ZooKeeperHiveLockManager使用的同步方法调用(例如create(),getChildren(),delete())将在此握手尚未完成时引发异常。 在这种情况下,我们需要一个锁存器来控制ZooKeeper客户端何时开始向服务器发送方法调用。
  • 断开连接和故障转移:如果Singleton ZooKeeper客户端失去与服务器的连接,我们需要处理连接重试并将故障转移到集群中的另一台服务器。
  • 会话超时:如果发生连接会话超时,则需要关闭单例ZooKeeper客户端并重新创建。

Apache Curator是开源软件,能够透明地处理所有上述情况。 Curator是Netflix的ZooKeeper库,它提供了简化使用ZooKeeper的高级API-CuratorFramework。 通过在新的ZooKeeperHiveLockManager实现中使用单例CuratorFramework实例,我们不仅解决了ZooKeeper连接问题,而且使代码易于理解和维护。

感谢Hive开源社区将此修复程序包含在Apache Hive 1.1中。 最新的Hive 0.12和Hive 0.13版本以及即将发布的MapR Distribution的 Hive 1.0版本中也包含此修复程序。

参考文献:

  • ZooKeeper:http: //zookeeper.apache.org/
  • 策展人: http : //curator.apache.org/

相关的JIRAS:

  • HIVE-4132: https : //issues.apache.org/jira/browse/HIVE-4132
  • HIVE-5853: https : //issues.apache.org/jira/browse/HIVE-5853
  • HIVE-8135: https : //issues.apache.org/jira/browse/HIVE-8135
  • HIVE-9119: https ://issues.apache.org/jira/browse/HIVE-9119

翻译自: https://www.javacodegeeks.com/2015/02/refine-hive-zookeeper-lock-manager-implementation.html

如何:优化Hive ZooKeeper Lock Manager实施相关推荐

  1. 如何优化Hive SQL ??

    Hive作为大数据平台举足轻重的框架,以其稳定性和简单易用性也成为当前构建企业级数据仓库时使用最多的框架之一. 但是如果我们只局限于会使用Hive,而不考虑性能问题,就难搭建出一个完美的数仓,所以Hi ...

  2. 数据仓库中的SQL性能优化 - Hive篇

    一个Hive查询生成多个map reduce job,一个map reduce job又有map,reduce,spill,shuffle,sort等多个阶段,所以针对hive查询的优化可以大致分为针 ...

  3. oracle数据倾斜优化,Hive数据倾斜优化 - ericquan8的个人页面 - OSCHINA - 中文开源技术交流社区...

    数据倾斜成因:由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点.具体为某一个reduce接收到的数据是其他reduce的n倍,导致明显的木桶效应. 症状: 1,对表做select count ...

  4. 优化 Hive ETL 任务(参数篇)

    精选30+云产品,助力企业轻松上云!>>> 点击蓝色"大数据每日哔哔"关注我 加个"星标",第一时间获取大数据架构,实战经验 图片来源网络,点 ...

  5. SQL性能优化常见措施(Lock wait timeout exceeded)

    SQL性能优化常见措施 目 录 1.mysql中explain命令使用 2.mysql中mysqldumpslow的使用 3.mysql中修改my.ini配置文件记录日志 4.mysql中如何加索引 ...

  6. win10 绿色版gsql启动卡住_Win10优化软件Windows 10 Manager+MP3剪切合并大师 优化版

    资源共享 Windows 10 Manager Windows 10 Manager,Win10优化软件,香港Yamicsoft 公司开发的集微软Windows10的所有功能于一身的系统优化软件,包含 ...

  7. Java集群优化——dubbo+zookeeper构建高可用分布式集群

    为什么80%的码农都做不了架构师?>>>    不久前,我们讨论过Nginx+tomcat组成的集群,这已经是非常灵活的集群技术,但是当我们的系统遇到更大的瓶颈,全部应用的单点服务器 ...

  8. ibm tivoli_使用IBM Tivoli Access Manager实施密码到期提醒

    ibm tivoli 存档日期:2019年5月15日 | 上次更新时间:2007年3月26日 | 首次发布:2006年6月26日 公司的安全策略可能包括密码到期要求,例如密码到期提醒. 尽管IBM®T ...

  9. SQLServer组成:

    SQL Server DB Engine (Relational Engine),SQL语言用于向Engine描述问题. Algebrizer:代数器,检查语法,并将查询转换成内部表达式 Query ...

最新文章

  1. 你能用上降噪耳机,竟要感谢傅立叶变换?
  2. Windows 2012 R2 中 AD DS 部署
  3. 【转】 ASP.NET 3.5中使用新的ListView控件
  4. 23个 Git 最常用命令速查手册,值得收藏!
  5. 圈子 | 大数据分析汽车O2O的机会
  6. Web Components 上手指南
  7. mysql安装目录centos_CentOS mysql安装系统方法
  8. 用typescript完成倒计时_「2019 JSConf.Hawaii - Brie.Bunge」大规模应用 TypeScript
  9. JQuery获取浏览器窗口的可视区域高度和宽度,滚动条高度
  10. EXCEL VLOOKUP函数的使用(二)
  11. thinkphp6 task异步
  12. 计算机基础知识五笔,教你简单快速学习五笔打字
  13. 八大排序算法(C语言实现)
  14. C语言如何生成随机数
  15. xshell xftp下载
  16. 火星南极有水,会有生命吗?
  17. Linux基础命令---lp打印文件
  18. 膜拜!京东大牛彻底讲透Java多线程面试题,看完直怼阿里面试官,堪称吾辈楷模!
  19. R语言-坐标轴画法要旨
  20. #今日论文推荐# 陈天奇、王威廉等人推荐:ACL最佳论文奖得主给新入行研究者的一点建议

热门文章

  1. 《白鹿原》金句摘抄(六)
  2. 2019蓝桥杯省赛---java---C---5(最大降雨量)
  3. #{} vs ${}
  4. spingmvc 通过xml配置redis jedispol 有密码 通过xml配置redis中的 jedispool(有密码)
  5. 第6步 项目包结构
  6. java 新功能_Java 14的新功能
  7. 捡对象引流脚本 内容_对象和索引流
  8. packt_Packt发行的$ 5 Java编程书籍:精通Java 9,Java 9高性能
  9. apache spark_Apache Spark:更改架构之前必须解决的5个陷阱
  10. java 不同类型 映射_如何使用Java泛型映射不同的值类型