CuratorFramework

Curator框架提供了一套高级的API, 简化了ZooKeeper的操作。

话不多说,看代码

  1. package com.donews.data.util
  2.  
  3. import java.util.concurrent.TimeUnit
  4.  
  5. import kafka.common.TopicAndPartition
  6. import org.apache.curator.framework.CuratorFrameworkFactory
  7. import org.apache.curator.framework.recipes.locks.InterProcessMutex
  8. import org.apache.curator.framework.recipes.nodes.PersistentEphemeralNode
  9. import org.apache.curator.retry.ExponentialBackoffRetry
  10. import org.apache.zookeeper.CreateMode
  11. import org.slf4j.LoggerFactory
  12. import java.util.{List => JList}
  13.  
  14. import com.donews.data.Config
  15.  
  16. import scala.collection.JavaConversions._
  17. /**
  18. * Created by reynold on 17-3-20.
  19. */
  20. object ZookeeperHelper {
  21. val LOG = LoggerFactory.getLogger(ZookeeperHelper.getClass)
  22. val client = {
  23. val client = CuratorFrameworkFactory
  24. .builder
  25. .connectString(Config.ZOOKEEPER_CONNECT)
  26. .retryPolicy(new ExponentialBackoffRetry(1000, 3))
  27. .namespace("reynold")
  28. .build()
  29. client.start()
  30. client
  31. }

  32. //传入path,将path上锁
  33. def lock(path: String)(body: => Unit) {
  34. val lock = new InterProcessMutex(client, path)
  35. lock.acquire()
  36. try {
  37. body
  38. } finally {
  39. lock.release()
  40. }
  41.  
  42. }

  43. //将路径上锁然后执行body里面的程序
  44. def tryDo(path: String)(body: => Unit): Boolean = {
  45. val lock = new InterProcessMutex(client, path)
  46. if (!lock.acquire(10, TimeUnit.SECONDS)) {
  47. LOG.info(s"不能获得锁 {$path},已经有任务在运行,本次任务退出")
  48. return false
  49. }
  50. try {
  51. LOG.info("获准运行")
  52. body
  53. true
  54. } finally {
  55. lock.release()
  56. LOG.info(s"释放锁 {$path}")
  57. }
  58.  
  59. }
  60.  
  61. //zookeeper创建路径
  62. def ensurePathExists(path: String): Unit = {
  63. if (client.checkExists().forPath(path) == null) {
  64. client.create().creatingParentsIfNeeded().forPath(path)
  65. }
  66. }
  67.  
  68. //zookeeper加载offset的方法
  69. def loadOffsets(topicSet: Set[String], defaultOffset: Map[TopicAndPartition, Long]): Map[TopicAndPartition, Long] = {
  70. val kafkaOffsetPath = s"/kafkaOffsets"
  71. ensurePathExists(kafkaOffsetPath)
  72. val offsets = for {
  73. //t就是路径webstatistic/kafkaOffsets下面的子目录遍历
  74. t <- client.getChildren.forPath(kafkaOffsetPath)
  75. if topicSet.contains(t)
  76. //p就是新路径 /reynold/kafkaOffsets/donews_website
  77. p <- client.getChildren.forPath(s"$kafkaOffsetPath/$t")
  78. } yield {
  79. //遍历路径下面的partition中的offset
  80. val data = client.getData.forPath(s"$kafkaOffsetPath/$t/$p")
  81. //将data变成Long类型
  82. val offset = java.lang.Long.valueOf(new String(data)).toLong
  83. (TopicAndPartition(t, Integer.parseInt(p)), offset)
  84. }
  85.  
  86. defaultOffset ++ offsets.toMap
  87. }
  88.  
  89. //zookeeper存储offset的方法
  90. def storeOffsets(offsets: Map[TopicAndPartition, Long]): Unit = {
  91. val kafkaOffsetPath = s"/kafkaOffsets"
  92. if (client.checkExists().forPath(kafkaOffsetPath) == null) {
  93. client.create().creatingParentsIfNeeded().forPath(kafkaOffsetPath)
  94. }
  95. for ((tp, offset) <- offsets) {
  96. val data = String.valueOf(offset).getBytes
  97. val path = s"$kafkaOffsetPath/${tp.topic}/${tp.partition}"
  98. ensurePathExists(path)
  99. client.setData().forPath(path, data)
  100. }
  101. }
  102.  
  103. def main(args: Array[String]) {
  104. // println(Config.ZOOKEEPER_CONNECT)
  105. // tryDo("/locks/test"){
  106. // println("hello world")
  107. // }
  108. // val n=new PersistentEphemeralNode(client,PersistentEphemeralNode.Mode.EPHEMERAL,"/appstatistic/test","hello".getBytes)
  109. // n.start()
  110. // client.setData().forPath("/appstatistic/test","xxx".getBytes)
  111. // val kafkaParams = Map[String, String](
  112. // "metadata.broker.list" -> "spark-slave03:9092,spark-slave04:9092,spark-slave05:9092"
  113. // )
  114. // val kafka = new KafkaClusterHelper(kafkaParams)
  115. // val offsets = kafka.getFromOffsets(kafkaParams, Set("donews"))
  116. // println(offsets)
  117. // storeOffsets(offsets)
  118. loadOffsets(Set("donews"), Map()).foreach(println(_))
  119. // val done=tryDo("/appstatistic/batchMainx") {
  120. // println("it works")
  121. // Thread.sleep(1000L*35)
  122. // }
  123. // println(done)
  124. }
  125. }

Zookeeper开源客户端框架Curator的使用的更多相关文章

  1. Zookeeper开源客户端框架Curator简介

    Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...

  2. Zookeeper开源客户端框架Curator简介[转]

    Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...

  3. zookeeper开源客户端curator

    zookeeper的原生api相对来说比较繁琐,比如:对节点添加监听事件,当监听触发后,我们需要再次手动添加监听,否则监听只生效一次:再比如,断线重连也需要我们手动代码来判断处理等等.对于curato ...

  4. 八:Zookeeper开源客户端Curator的api测试

    curator是Netflix公司开源的一套ZooKeeper客户端,Curator解决了很多ZooKeeper客户端非常底层的细节开发工作.包括连接重连,反复注册Watcher等.实现了Fluent ...

  5. Zookeeper开源客户端Curator之创建会话

    前面Zookeeper的链接使用的都是其提供的原生代码,实际开发过程中非常底层的细节开发工作如连接重连,反复注册等耗费开发人员大量的工作精力并且重复工作.而开源客户端Curator的出现解决了该类问题 ...

  6. Zookeeper开源客户端Curator的使用

    开源zk客户端-Curator 创建会话: RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3); CuratorFramewor ...

  7. Zookeeper开源客户端Curator之事件监听详解

    Curator对Zookeeper典型场景之事件监听进行封装,提供了使用参考.这篇博文笔者带领大家了解一下Curator的实现方式. 引入依赖 对于Curator封装Zookeeper的典型场景使用都 ...

  8. 七:zooKeeper开源客户端ZkClient的api测试

    ZkClient是Gitthub上一个开源的ZooKeeper客户端.ZKClient在ZooKeeper原生API接口之上进行了包装,是一个更加易用的ZooKeeper客户端.同时ZKClient在 ...

  9. ZooKeeper(3.4.5) - 开源客户端 Curator(2.7.0) 的简单示例

    一.创建会话 1. 创建会话 package com.huey.dream.demo; import org.apache.curator.framework.CuratorFramework; im ...

随机推荐

  1. Linux 杀掉所有Java进程

      ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs kill -9 管道符"|"用来隔开两个命令,管道符左 ...

  2. 设x,y是概率空间(Ω,F,P)上的拟可积随机变量,证明:X=Y a.e 当且仅当 xdp = ydp 对每个A∈F成立。Q: X=Y almost surely iff ∀A∈G∫AXdP=∫AYdP

    E{XE{Y|C}}=E{YE{X|C}} 现在有没有适合大学生用的搜题软件呢?  https://www.zhihu.com/question/51935291/answer/514312093   ...

  3. gbdt在回归方面的基本原理以及实例并且可以做分类

    对书法的热爱,和编译器打数学公式很艰难,就这样的正例自己学过的东西,明天更新gbdt在分类方面的应用. 结论,如果要用一个常量来预测y,用log(sum(y)/sum(1-y))是一个最佳的选择. 本 ...

  4. Julia1.x安装

    删除julia-1.0 $ jupyter kernelspec list Available kernels: julia-1.0 /Users/keke.zhaokk/Library/Jupyte ...

  5. 年近30的Java程序员为了达到月入三万的目标,都做了哪些准备?

    1.我觉得像我这般年纪的(29岁),有相对扎实技术功底的(就不自谦了),对赚钱有着强烈欲望的程序员,应该定一个切实的小目标——五年内月入三万! 之所以要定这个目标,最主要的原因是老婆的批评刺痛了我—— ...

  6. PYTHON深度学习6.2RNN循环网络

    #简单的循环网络 #-*-coding:utf-8 -*- from keras.datasets import imdbfrom keras.preprocessing import sequenc ...

  7. P2P平台疯狂爆雷后,你的生活受到影响了吗?

    最近这段时间P2P爆雷的新闻和报道一直占据着各大财经和科技媒体的重要位置.而据网贷之家数据显示,截至2018年7月底,P2P网贷行业累计平台数量达到6385家(含停业及问题平台),其中问题平台累计为2 ...

  8. Python(os和sys)使用

    Python(os和sys)理解 os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口; sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时 ...

  9. 37)智能指针(就是自动delete空间)

    1)问题引入: 在java或者在C++中,一旦你new一个东西,那么必然有一个delete与之对应,比如: int main() { int* p= new int(): *p=: delete p: ...

  10. 14 微服务电商【黑马乐优商城】:day01-springboot(Thymeleaf快速入门)

    本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) :day01-springboot(Thyme ...