如何:优化Hive ZooKeeper Lock Manager实施

养蜂人 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 类之间转换,java中类对象之间的类型转换

类似于基本数据类型之间的强制类型转换。存在继承关系的父类对象和子类对象之间也可以在一定条件之下相互转换。这种转换需要遵守以下原则:1.子类对象可以被视为是其父类的一个对象2.父类对象不能被当作是某一个子类的对象。3.如果一个方法的形式参数定义的是父类对…

重载和重写以及重写的权限问题

简单说重载是发生在一个类中 重写是发生在子父类中的继承情况中 重载Overloading 方法重载是让类以统一的方式处理不同类型数据的一种手段。具有同名函数同时存在,具有不同参数类型/个数。重载overloading是一个类中多态兴的一种表现。 java的方法重载,就…

《图解HTTP》第1章 了解Web及网络基础

《图解HTTP》第1章 了解Web及网络基础 1. 使用 HTTP 协议访问 Web1.1 网络基础 TCP/IP1.2 TCP/IP 协议族1.2.1 TCP/IP 的分层管理 1. 使用 HTTP 协议访问 Web Web 使用一种名为 HTTP(HyperText Transfer Protocol,超文本传输协议) 的协议作为…

JBoss Forge NetBeans集成–入门

JBoss Forge是构建基于Maven的Java EE项目的最快方法。 因此,它已经具有了令人敬畏的功能,使您作为开发人员的生活更加轻松。 在大多数情况下,使用Forge的人们可能会对创建Web应用程序感兴趣。 有很多入门Forge基础的方法。 您可以查看quick…

java版本的getorcreate,getOrCreate for java-rest-api neo4j失敗

我有一個簡單的關係測試,我試圖運行使用Rest API創建一個獨特的節點(java-rest-binding)https://github.com/neo4j/java-rest-binding但不幸的是我被困在某些東西上,這裏是細節:(非唯一的節點和關係工作完全正常,與這一點&#xf…

Nifty JUnit:在方法和类级别上使用规则

如Nifty JUnit:使用临时文件一文中所示 ,可以在JUnit测试中使用Rule ,这是方法级别的规则。 在此示例中,我想显示ClassRule用于类级别规则的变体。 方法规则 Rule在测试类的每个测试方法(就像Before )之前…

SQL语法的重要知识点总结

好几年没写SQL语句了。现在到了新的team,需要用到数据库。作为QA的话时常需要使用客户端工具连接到数据库中找寻或修改数据。这么长时间没使用,一些SQL的使用技巧都忘得差不多了。晚上看了一些资料,花了1个多小时又捡起了曾经的知识。现在总结…

java语法定制混淆,由撇号混淆的textpad语法高亮显示

我想知道在textpad的语法文件中放置什么来修复问题,例如,在html文件中,你正在写一个段落,而撇号会创建语法高亮,直到下一个aspostrophe .例如:Hi, I m an example.lol text here placeholder lorem ipsum I…

您需要了解的有关默认方法的所有信息

因此,默认方法是……昨天的新闻,对不对? 是的,但是使用一年后,积累了很多事实,我想将这些事实收集在一个地方,供刚开始使用它们的开发人员使用。 甚至有经验的人都可以找到他们不知道的一两个细…

RAC+ASM在单机上恢复的过程

IT168技术文档】网上也有类似的例子,但不尽详细,也没多花心思解释流程及原因,可能对初试者不太解惑。有感于此,故认真整理了恢复步骤即操作流程,望有助于同行朋友。 环境:正式环境是IBM4IBM5(RAC)&#xf…

php event_base_new,php event拓展基本使用

php event拓展基本使用2019-02-04 22:02:28(527)1. 确定io复用类型(select/poll/epoll)php$cfg new EventConfig();$cfg->avoidMethod("select");$cfg->avoidMethod("epoll");$base new EventBase($cfg);$sig Event::signal($base, SIGTERM, func…

OSGi服务测试助手:ServiceRegistrationRule

OSGi服务测试可以有效避免与悬挂的服务引用有关的问题。 就像我在写简单服务贡献验证中所承诺的那样,这次我引入了一个JUnit规则 ,该规则有助于测试组件之间的交互。 OSGi服务测试组件交互 假设我们有一个服务,该服务通知根据whiteboard-pat…

php 在函数里打开链接,JavaScript中打开链接的几种方法介绍

如何使用JavaScript打开链接?本篇文章我们就来看看使用JavaScript打开链接的几种方法介绍。我们先来看一段代码使用Javascript实现打开链接,需要在location.href中替换要打开的链接的URL。location.href http://www.php.cn/blog.html;通过上述代码我们可…

三代基因组测序技术原理简介

考虑到cnblog不适合基因组领域这种类型的文章, 最终,我自己开通了公众号:碱基矿工,欢迎感兴趣的同学关注! 也可以关注我的知乎:https://www.zhihu.com/people/yellowtree/activities 2018年1月修改&#x…

Java并发教程–锁定:显式锁定

1.简介 在许多情况下,使用隐式锁定就足够了。 有时,我们将需要更复杂的功能。 在这种情况下, java.util.concurrent.locks包为我们提供了锁定对象。 当涉及到内存同步时,这些锁的内部机制与隐式锁相同。 区别在于显式锁提供了其他…

POJ 1422 Air Raid (最小路径覆盖)

题意 给定一个有向图&#xff0c;在这个图上的某些点上放伞兵&#xff0c;可以使伞兵可以走到图上所有的点。且每个点只被一个伞兵走一次。问至少放多少伞兵。 思路 裸的最小路径覆盖。 最小路径覆盖 【路径覆盖】在一个有向图G(V, E<u,v>)中&#xff0c;路径覆盖就是在图…

自编码网络粒子群matlab,粒子群算法优化BP

这是数据1999 1611 1746 1277 753 323 229 7.10561325 1064 1414 1026 430 191 153 24.54521125 839 1197 857 301 168 139 …

在非托管对象中使用Spring托管Bean

即使我们想使用现有的最佳和最新技术&#xff0c;我们也必须处理遗留代码。 想象一下&#xff0c;新代码是用Spring框架的最新技术编写的&#xff0c;而旧代码根本不是用Spring编写的。 然后在非托管Spring对象中使用Spring托管Bean是我们必须处理的模式之一。 遗留代码具有非托…

lda php,主题模型︱几款新主题模型——SentenceLDA、CopulaLDA、TWE简析与实现

[导读]百度最近开源了一个新的关于主题模型的项目。文档主题推断工具、语义匹配计算工具以及基于工业级语料训练的三种主题模型&#xff1a;LatentDirichlet Allocation(LDA)、SentenceLDA 和Topical Word Embedding(TWE)。一、Familia简介帮Familia&#xff0c;打个小广告~ F…

Spring项目中的Netflix Archaius属性

Archaius基础 Netflix Archaius是用于管理应用程序配置的库。 考虑一个属性文件“ sample.properties”&#xff0c;其中包含一个名为“ myprop”的属性&#xff1a; mypropmyprop_value_default这是使用Archaius加载文件的方式&#xff1a; ConfigurationManager.loadCascad…