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的使用的更多相关文章

  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安装已编译好的FFmpeg,基于centos7

    1.访问https://johnvansickle.com/ffmpeg/ 2.下载地址:https://johnvansickle.com/ffmpeg/releases/ffmpeg-releas ...

  2. 【系统安装】如何在VMware软件中安装ghost格式的系统

    一.安装准备 1.系统虚拟环境软件:VMware软件(下载链接) 2.系统镜像制作软件:UltraISO[软碟通是光盘映像文件制作/编辑/转换工具](下载链接) 3.系统安装辅助软件:Win7PE(下 ...

  3. 分块&莫队模板

    最裸的莫队:https://www.luogu.org/problemnew/show/P1494 #include<bits/stdc++.h> #define ll long long ...

  4. Python笔记_第一篇_面向过程_第一部分_2.内存详解

    Python的很多教材中并没有讲内存方面的知识,但是内存的知识非常重要,对于计算机工作原理和方便理解编程语言是非常重要的,尤其是小白,因此需要把这一方面加上,能够更加深入的理解编程语言.这里引用了C语 ...

  5. Eclipse 常见Maven web项目

    我是从工作到现在一直用的IDEA,编程软件只要你会技术都没什么区别,只是熟与不熟. 1.下载eclipse软件 百度上搜索eclipse或者到官网https://www.eclipse.org/dow ...

  6. 吴裕雄--天生自然ShellX学习笔记:Shell 输入/输出重定向

    大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令通常将其输出写入到标准输出,默 ...

  7. one_day_one_linuxCmd---wget命令

    <坚持每天学习一个 linux 命令,今天我们来学习 wget 命令> Linux wget 是一个文件下载工具,它用在命令行下,使用也非常方便,不但体积小而且功能完善,并支持很多强大的功 ...

  8. usert

    usert类型 不是一个函数,而是一个语言构造器 usert后会不会释放内存 当usert的文件大于2044KB时才会释放内存,否则不释放内存

  9. python深度学习6.2

    Deep Learning with Python>第六章 6.2 理解循环神经网络(RNN) 神机喵算 2018.09.01 20:40 字数 2879 阅读 104评论 0喜欢 1 沉下心来 ...

  10. Linux-进程状态和system函数

    1.进程的5种状态 (1).就绪态. 这个进程当前所有运行条件就绪,只要得到CPU时间就能直接运行. (2).运行态 就绪态时得到了CPU就进入运行态开始运行. (3).僵尸态 进程已经结束但是父进程 ...