Zookeeper开源客户端框架Curator的使用
CuratorFramework
Curator框架提供了一套高级的API, 简化了ZooKeeper的操作。
话不多说,看代码
- package com.donews.data.util
- import java.util.concurrent.TimeUnit
- import kafka.common.TopicAndPartition
- import org.apache.curator.framework.CuratorFrameworkFactory
- import org.apache.curator.framework.recipes.locks.InterProcessMutex
- import org.apache.curator.framework.recipes.nodes.PersistentEphemeralNode
- import org.apache.curator.retry.ExponentialBackoffRetry
- import org.apache.zookeeper.CreateMode
- import org.slf4j.LoggerFactory
- import java.util.{List => JList}
- import com.donews.data.Config
- import scala.collection.JavaConversions._
- /**
- * Created by reynold on 17-3-20.
- */
- object ZookeeperHelper {
- val LOG = LoggerFactory.getLogger(ZookeeperHelper.getClass)
- val client = {
- val client = CuratorFrameworkFactory
- .builder
- .connectString(Config.ZOOKEEPER_CONNECT)
- .retryPolicy(new ExponentialBackoffRetry(1000, 3))
- .namespace("reynold")
- .build()
- client.start()
- client
- }
//传入path,将path上锁- def lock(path: String)(body: => Unit) {
- val lock = new InterProcessMutex(client, path)
- lock.acquire()
- try {
- body
- } finally {
- lock.release()
- }
- }
//将路径上锁然后执行body里面的程序- def tryDo(path: String)(body: => Unit): Boolean = {
- val lock = new InterProcessMutex(client, path)
- if (!lock.acquire(10, TimeUnit.SECONDS)) {
- LOG.info(s"不能获得锁 {$path},已经有任务在运行,本次任务退出")
- return false
- }
- try {
- LOG.info("获准运行")
- body
- true
- } finally {
- lock.release()
- LOG.info(s"释放锁 {$path}")
- }
- }
- //zookeeper创建路径
- def ensurePathExists(path: String): Unit = {
- if (client.checkExists().forPath(path) == null) {
- client.create().creatingParentsIfNeeded().forPath(path)
- }
- }
- //zookeeper加载offset的方法
- def loadOffsets(topicSet: Set[String], defaultOffset: Map[TopicAndPartition, Long]): Map[TopicAndPartition, Long] = {
- val kafkaOffsetPath = s"/kafkaOffsets"
- ensurePathExists(kafkaOffsetPath)
- val offsets = for {
- //t就是路径webstatistic/kafkaOffsets下面的子目录遍历
- t <- client.getChildren.forPath(kafkaOffsetPath)
- if topicSet.contains(t)
- //p就是新路径 /reynold/kafkaOffsets/donews_website
- p <- client.getChildren.forPath(s"$kafkaOffsetPath/$t")
- } yield {
- //遍历路径下面的partition中的offset
- val data = client.getData.forPath(s"$kafkaOffsetPath/$t/$p")
- //将data变成Long类型
- val offset = java.lang.Long.valueOf(new String(data)).toLong
- (TopicAndPartition(t, Integer.parseInt(p)), offset)
- }
- defaultOffset ++ offsets.toMap
- }
- //zookeeper存储offset的方法
- def storeOffsets(offsets: Map[TopicAndPartition, Long]): Unit = {
- val kafkaOffsetPath = s"/kafkaOffsets"
- if (client.checkExists().forPath(kafkaOffsetPath) == null) {
- client.create().creatingParentsIfNeeded().forPath(kafkaOffsetPath)
- }
- for ((tp, offset) <- offsets) {
- val data = String.valueOf(offset).getBytes
- val path = s"$kafkaOffsetPath/${tp.topic}/${tp.partition}"
- ensurePathExists(path)
- client.setData().forPath(path, data)
- }
- }
- def main(args: Array[String]) {
- // println(Config.ZOOKEEPER_CONNECT)
- // tryDo("/locks/test"){
- // println("hello world")
- // }
- // val n=new PersistentEphemeralNode(client,PersistentEphemeralNode.Mode.EPHEMERAL,"/appstatistic/test","hello".getBytes)
- // n.start()
- // client.setData().forPath("/appstatistic/test","xxx".getBytes)
- // val kafkaParams = Map[String, String](
- // "metadata.broker.list" -> "spark-slave03:9092,spark-slave04:9092,spark-slave05:9092"
- // )
- // val kafka = new KafkaClusterHelper(kafkaParams)
- // val offsets = kafka.getFromOffsets(kafkaParams, Set("donews"))
- // println(offsets)
- // storeOffsets(offsets)
- loadOffsets(Set("donews"), Map()).foreach(println(_))
- // val done=tryDo("/appstatistic/batchMainx") {
- // println("it works")
- // Thread.sleep(1000L*35)
- // }
- // println(done)
- }
- }
Zookeeper开源客户端框架Curator的使用的更多相关文章
- Zookeeper开源客户端框架Curator简介
Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...
- Zookeeper开源客户端框架Curator简介[转]
Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...
- zookeeper开源客户端curator
zookeeper的原生api相对来说比较繁琐,比如:对节点添加监听事件,当监听触发后,我们需要再次手动添加监听,否则监听只生效一次:再比如,断线重连也需要我们手动代码来判断处理等等.对于curato ...
- 八:Zookeeper开源客户端Curator的api测试
curator是Netflix公司开源的一套ZooKeeper客户端,Curator解决了很多ZooKeeper客户端非常底层的细节开发工作.包括连接重连,反复注册Watcher等.实现了Fluent ...
- Zookeeper开源客户端Curator之创建会话
前面Zookeeper的链接使用的都是其提供的原生代码,实际开发过程中非常底层的细节开发工作如连接重连,反复注册等耗费开发人员大量的工作精力并且重复工作.而开源客户端Curator的出现解决了该类问题 ...
- Zookeeper开源客户端Curator的使用
开源zk客户端-Curator 创建会话: RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3); CuratorFramewor ...
- Zookeeper开源客户端Curator之事件监听详解
Curator对Zookeeper典型场景之事件监听进行封装,提供了使用参考.这篇博文笔者带领大家了解一下Curator的实现方式. 引入依赖 对于Curator封装Zookeeper的典型场景使用都 ...
- 七:zooKeeper开源客户端ZkClient的api测试
ZkClient是Gitthub上一个开源的ZooKeeper客户端.ZKClient在ZooKeeper原生API接口之上进行了包装,是一个更加易用的ZooKeeper客户端.同时ZKClient在 ...
- ZooKeeper(3.4.5) - 开源客户端 Curator(2.7.0) 的简单示例
一.创建会话 1. 创建会话 package com.huey.dream.demo; import org.apache.curator.framework.CuratorFramework; im ...
随机推荐
- Linux 杀掉所有Java进程
ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs kill -9 管道符"|"用来隔开两个命令,管道符左 ...
- 设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 ...
- gbdt在回归方面的基本原理以及实例并且可以做分类
对书法的热爱,和编译器打数学公式很艰难,就这样的正例自己学过的东西,明天更新gbdt在分类方面的应用. 结论,如果要用一个常量来预测y,用log(sum(y)/sum(1-y))是一个最佳的选择. 本 ...
- Julia1.x安装
删除julia-1.0 $ jupyter kernelspec list Available kernels: julia-1.0 /Users/keke.zhaokk/Library/Jupyte ...
- 年近30的Java程序员为了达到月入三万的目标,都做了哪些准备?
1.我觉得像我这般年纪的(29岁),有相对扎实技术功底的(就不自谦了),对赚钱有着强烈欲望的程序员,应该定一个切实的小目标——五年内月入三万! 之所以要定这个目标,最主要的原因是老婆的批评刺痛了我—— ...
- PYTHON深度学习6.2RNN循环网络
#简单的循环网络 #-*-coding:utf-8 -*- from keras.datasets import imdbfrom keras.preprocessing import sequenc ...
- P2P平台疯狂爆雷后,你的生活受到影响了吗?
最近这段时间P2P爆雷的新闻和报道一直占据着各大财经和科技媒体的重要位置.而据网贷之家数据显示,截至2018年7月底,P2P网贷行业累计平台数量达到6385家(含停业及问题平台),其中问题平台累计为2 ...
- Python(os和sys)使用
Python(os和sys)理解 os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口; sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时 ...
- 37)智能指针(就是自动delete空间)
1)问题引入: 在java或者在C++中,一旦你new一个东西,那么必然有一个delete与之对应,比如: int main() { int* p= new int(): *p=: delete p: ...
- 14 微服务电商【黑马乐优商城】:day01-springboot(Thymeleaf快速入门)
本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) :day01-springboot(Thyme ...