如何:优化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,一经查实,立即删除!

相关文章

《图解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…

SQL语法的重要知识点总结

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

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

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

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包为我们提供了锁定对象。 当涉及到内存同步时,这些锁的内部机制与隐式锁相同。 区别在于显式锁提供了其他…

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

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

最短路径问题matlab作图,[MATLAB基础] matlab最短路径的输出问题,用了递归,但程序出错了,请大虾指点...

matlab最短路径的输出问题,用了递归,但程序出错了,请大虾指点 程序如下function shortestpath(w,p,q)c->;l;f;tsize(w);mt(1,1);azeros(m,m);vw;for k1:mfor i1:mfor j1:mb[w(i,j),w(i,k)w(k,j)];w(i,j)min(b);if w(i,j)~v(i,j)a(i,j)k;%a(i,j)10*a(i,j)k;vw;endendendendw;…

快速浏览JAX-RS请求与方法匹配

在本文中,我们来看一下JAX-RS中与资源方法匹配的HTTP请求 。 它是JAX-RS的最基本功能之一。 通常,使用JAX-RS API的开发人员不会接触(或真正不需要知道) 匹配过程的细节,请放心,由于我们的RESTful&#xff…

$stat php,php stat函数怎么用

php stat函数用于返回关于文件的信息,其语法是fstat(file),参数file必需,指规定要检查的文件。php stat函数怎么用?定义和用法stat() 函数返回关于文件的信息。语法fstat(file)参数file必需。规定要检查的文件。说明获取由 file 指…

Apache Cassandra和低延迟应用程序

介绍 多年来, Grid Dynamics拥有许多与NoSQL相关的项目,尤其是Apache Cassandra。 在这篇文章中,我们要讨论一个给我们带来挑战的项目,而我们在该项目中试图回答的问题今天也仍然适用。 数字营销和在线广告在2012年很受欢迎&…

Java十大简单性能优化

关于“ web scale ”这个流行词有很多炒作,人们花了很多时间来重新组织他们的应用程序体系结构,以使其系统“规模化”。 但是什么是扩展,我们如何确保可以扩展? 缩放的不同方面 上面提到的炒作主要是关于扩展负载 ,即…

php在苹果手机上传不了图片大小,ThinkPHP后台上传图片无默认尺寸解决方法

原标题:ThinkPHP后台上传图片无默认尺寸解决方法随着网站移动端的日益普及,对后台数据的兼容性要求也越来越高。后台数据涵盖范围不断扩大的同时,使得程序处理能力也必须逐步提高。使用ThinkPHP进行长沙网站开发时,后台kindeditor…

宝塔php gd库,宝塔面板安装 EasyImag – 一款最简单图床的安装体验

近日闲逛,发现了一款图床,一款开箱即食的简单图床程序。因为没有数据库所以安装起来也是异常简单,我们看看功能:支持设置图片质量支持仅登录后上传支持QQ截图,剪切板上传支持在线管理(增删改查)支持上传图片转换为指定…

批准Oracle IDM中的特定Web服务

关于Web服务端点的快速发布,OIM和SOA在与批准有关的场景中使用了Web服务端点- 基本内容,但对于初学者可能有用 。 Oracle IDM与SOA套件集成并利用其提供与批准相关的功能(说实话,SOA相当丰富,并且也被用作Web服务连接…

Oracle15001,Oracle11gR2RAC环境DBCA创建数据库报错ORA-15055ORA-15001

在Oracle 11gR2 GridInfrastructure和Database软件安装完成之后,执行DBCA创建数据库到30%的时候报如下错误,点击OK后提示忽略并问题现象:在Oracle 11gR2 GridInfrastructure和Database软件安装完成之后,执行DBCA创建数据库到30%的时候报如下错…

针对新手的Java EE7和Maven项目–第8部分

第1部分 , 第2部分 , 第3部分 , 第4部分 , 第5部分 , 第6部分 , 第7部分 第8部分 自上一篇文章以来,这一系列教程已经有很长时间了。 是时候恢复并在我们的简单项目中添加新功能了。 正…

玩Weld-Probe –一站式查看CDI的所有方面

焊接3.0.0.Alpha4被释放 ,而我一直坐在在DevConf.CZ一间会议室。 Jozef Hartinger( jozefhartinger )或多或少地在几分钟前告诉我有关此最新版本的新功能的信息。 有一个特别的功能真正引起了我的注意,它是新的焊接探针机制。 什…

linux cmake装在自己目录下,如何在Linux下安装cmake

全部展开OpenCV 2.2和更高版本需要使用Cmake生成生成文件,因此需要先安装cmake. 还有其他需要先安装cmake的软件1. 在Linux环境中打开Web浏览器,输入URL:mac cmake gui,找到最新版本的位置. 通常,发布了两个版本的开源软件: “源分…