zookeeperservermainMain 这样是不是说明zookeeperservermain 好了

将Zookeeper集成到你的应用中
2047次浏览
首先,我们下载zookeeper-3.3.6.tar.gz,最好不要最新版本,新版本在jdk1.5下有问题。解压后在
zookeeper-3.3.6/contrib/fatjar目录下有一个zookeeper-3.3.6-fatjar.jar文件,我们用这个jar来写。
import java.io.F
import java.io.FileInputS
import java.io.FileNotFoundE
import java.io.FileOutputS
import java.io.IOE
import java.io.InputS
import java.io.OutputS
import java.lang.reflect.M
import java.util.P
public class ZKServerStart {
* 启动zookeeper服务
* @param zoocfg zoo.cfg文件的物理路径
* @param zooDataDir
zookeeper的data路径
* @throws Exception
public static void Run(String zoocfg, String zooDataDir) throws Exception {
//加载zoocfg配置文件
Properties prop = loadProperties(zoocfg);
//提取本机服务的server编号,这个my.id是默认的zoo.cfg里没有的,需要我们后加上,
//它的值就是当前节点的serverNum
String serverNum = prop.getProperty(&my.id&);
//提取zookeeper的客户端IP和端口,把IP和端口提取出来,方便我们的客户端API使用
Global.zkClientIp = prop.getProperty(&server.& + serverNum).split(&:&)[0];
Global.zkClientPort = Integer.parseInt(prop.getProperty(&clientPort&));
//myid文件的路径
String dataDir = zooDataDir + &/ZooData&;
//写入myid文件
writeMyid(dataDir, serverNum);
prop.setProperty(&dataDir&, dataDir);
//将dataDir保存到zoo.cfg
saveConfig(prop, zoocfg);
String[] config = {zoocfg};
Class&?& clazz = Class.forName(&org.apache.zookeeper.server.quorum.QuorumPeerMain&);
Method main = clazz.getMethod(&main&, String[].class);
//启动zookeeper
main.invoke(null, (Object)config);
* 保存zookeeper的配置文件
private static void saveConfig(Properties prop, String configFile) throws IOException {
OutputStream out = new FileOutputStream(configFile);
prop.store(out, null);
} finally {
if(out != null) out.close();
* 将server的编号写入myid文件
private static void writeMyid(String dataDir, String serverNum)
throws IOException, FileNotFoundException {
File dir = new File(dataDir);
if(!dir.exists()) dir.mkdirs();
File myid = new File(dataDir + &/myid&);
if(!myid.exists()) myid.createNewFile();
OutputStream out = new FileOutputStream(myid);
out.write(serverNum.getBytes());
} finally {
if(out != null) out.close();
* 加载zoocfg配置
private static Properties loadProperties(String zoocfg) throws FileNotFoundException, IOException {
Properties prop = new Properties();
InputStream is = new FileInputStream(zoocfg);
prop.load(is);
} finally {
if(is != null) is.close();
&注意,使用这个启动类来启动zookeeper的时候要放到线程中。例如,我们在Servlet的init()方法中启动:
import java.io.UnsupportedEncodingE
import java.net.URL;
import java.net.URLD
import javax.servlet.ServletE
import javax.servlet.http.HttpS
public class ZooServlet extends HttpServlet{
public void init() throws ServletException {
String zooConfig = this.getInitParameter(&ZooConfig&);
//找到WEB-INF的物理路径
final String webInfo = getWebInfPath();
//找到zoo.cfg的物理路径
final String configPath = webInfo + zooConfig.substring(1, zooConfig.length());
new Thread(new Runnable(){
public void run() {
//启动zookeeper服务
ZKServerStart.Run(configPath, webInfo);
} catch (Exception e) {
e.printStackTrace();
}}).start();
super.init();
private String getWebInfPath() {
URL url = this.getClass().getProtectionDomain().getCodeSource().getLocation();
String path = url.toString();
int index = path.indexOf(&WEB-INF&);
if (index == -1) {
index = path.indexOf(&classes&);
if (index == -1) {
index = path.indexOf(&bin&);
path = path.substring(0, index);
if (path.startsWith(&zip&)) {// 当class文件在war中时,此时返回zip:D:/...这样的路径
path = path.substring(4);
} else if (path.startsWith(&file&)) {// 当class文件在class文件中时,此时返回file:/D:/...这样的路径
path = path.substring(6);
} else if (path.startsWith(&jar&)) {// 当class文件在jar文件里面时,此时返回jar:file:/D:/...这样的路径
path = path.substring(10);
path = URLDecoder.decode(path, &UTF-8&);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
web.xml的配置:
&?xml version=&1.0& encoding=&UTF-8&?&
&web-app version=&2.4&
xmlns=&/xml/ns/j2ee&
xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xsi:schemaLocation=&/xml/ns/j2ee
/xml/ns/j2ee/web-app_2_4.xsd&&
&servlet-name&ZooServlet&/servlet-name&
&servlet-class&ZooServlet&/servlet-class&
&init-param&
&param-name&ZooConfig&/param-name&
&param-value&/WEB-INF/conf/zoo.cfg&/param-value&
&/init-param&
&load-on-startup&1&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&ZooServlet&/servlet-name&
&url-pattern&*.do&/url-pattern&
&/servlet-mapping&
&welcome-file-list&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
&/web-app&
这样,Servlet在初始化的时候就启动了zookeeper,同时将zookeeper的dataDir目录设置到WEB-INF/ZooData/下。同时我们还提取了zookeeper的当前节点的IP和客户端端口,方便在调用客户端API的地方使用。
最后看一下zoo.cfg配置
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
server.1=192.168.1.1:
server.2=192.168.1.2:
server.3=192.168.1.3:
这个my.id是后加的一个属性,用于记录当前节点的server编号,方便我们写入到myid文件中。
您可能也会对以下文章感兴趣
QQ : 341470
Friend Link
New Member关于用户 访问Hadoop集群问题是不是先连接zookeeper(就像hbase一样)?
本人Hadoop新人一枚,求解 用户 如何访问 Hadoop 集群(HA) 是先连接到 zookeeper吗就像hbase(HA)一样吗 我是看到这个
然后根据hbase我是这样想的是不是nameservice在zookeeper下创建一个znode然后namenode在znode下创建锁,如果那样用户先连zookeeper然后在找到active的namenode地址在调用,以上只是我的猜测,求各位指导。
HDFS不需要连接zookeeper。一般的使用情况是将nameservice的地址直接配置到客户端,直接连接。datanode的心跳检测是由nameservice完成,无需像HBase那样通过zookeeper;另外,HDFS2的单点问题解决也不是必须通过zookeeper,zookeeper只是nameservice failover进程监控的一种选择,真正上的元数据单点通过NFS或者QJM完成的。因此,zookeeper并非HDFS中必须出现的元素,所以是目前这种使用模式。
不是的,hdfs-site.xml里面有配几个nn的地址,连hdfs的时候会查找当前环境下的hdfs-site.xml,这个可以通过环境变量或者参数指定。然后hdfs client就会直接发rpc请求到active namenode了。目前只有yarn的ha是依赖了zk,当active resource manager出问题的时候,client才会fail over到其他一个由standby变成active的resource manager
已有帐号?
无法登录?
社交帐号登录[Zookeeper学习笔记之三]Zookeeper实例创建和会话建立的异步特性 - 推酷
[Zookeeper学习笔记之三]Zookeeper实例创建和会话建立的异步特性
为了说明问题,看个简单的代码,
import org.apache.zookeeper.*;
import java.io.IOE
import java.util.concurrent.CountDownL
import java.util.concurrent.ThreadLocalR
public class ZKApplication implements Watcher {
private static final int SESSION_TIMEOUT = 3000;
private volatile sta
private ZooK
private CountDownLatch connectedSignal = new CountDownLatch(1);
public void connect(String hosts) throws IOException, InterruptedException {
System.out.println(&Start to create the Zookeeper instance&);
zk = new ZooKeeper(hosts, SESSION_TIMEOUT, this);
new Thread(new Runnable() {
int count = 0;
public void run() {
while (count++ &= 1000) {
System.out.println(zk.getState());
Thread.currentThread().sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}).start();
} catch(IOException e) {
e.printStackTrace();
connectedSignal.await(); //Wait for the SyncConnected event occurs and process has been called, which will stop the waiting here. }
public void process(WatchedEvent event) { // Watcher interface
if (event.getState() == Event.KeeperState.SyncConnected) {
connectedSignal.countDown();
//connectedSignal.await() will no longer wait
public void create(String groupName) throws KeeperException,
InterruptedException {
String path = &/& + groupN
String createdPath = zk.create(path, null/*data*/, ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.EPHEMERAL); //The znode will be deleted upon the session is closed.
System.out.println(&Created & + createdPath);
public void close() throws InterruptedException {
zk.close();
public static void main(String[] args) throws Exception {
final ZKApplication createGroup = new ZKApplication();
String groupName = &zoo& + ThreadLocalRandom.current().nextInt();
createGroup.connect(Host.HOST);
createGroup.create(groupName);
createGroup.close();
&&& 上面的代码在Zookeeper没有启动的情况下,控制台输出1000次CONNECTING,也不退出,原因是已经发生了死锁问题。& 引发死锁问题的是同步闭锁connectedSignal的使用,代码中的含义是客户端在connect方法中发起链接,然后connect一直等待直到 Watcher的process被回调将闭锁计数置零,通常这个没有问题,可是当Zookeeper压根没有启动的时候,这个代码会陷入死锁:
死锁发生在客户端阻塞等待于connectedSignal的await方法上,发生阻塞说明connectedSignal的计数没有置零,没有置零说明process没有调用,因为Zookeeper没有启动,所以说process没有被调用是合理的。
代 码死锁于connectSignal的await方法上,那么意思是说,Zookeeper对象构造和会话建立过程应该是异步的,Zookeeper构造 方法返回后,另外一个会话创建线程会尝试建立会话,从代码的输出可以看出,会话状态一直是Connecting状态(试图创建会话,但尚未创建成功的状 态),Zookeeper的Javadoc清楚的说到Zookeeper实例和会话建立是异步的过程: Session establishment is asynchronous. This constructor will initiate connection to the server and return immediately - potentially (usually) before the session is fully established. The watcher argument specifies& the watcher that will be notified of any changes in state. This notification can come at any point before or after the constructor call has returned.
会 话建立的失败策略,比较直观的做法时当建立会话不成功时,第一时间通知客户,给客户以失败快速响应的机制。。。不过Zookeeper似乎采用另外一种策 略,连接不成功不告诉你,只有当调用Zookeeper的API时,才会真正的把连接未建立的异常抛给客户端,这么做的好处是在Zookeeper实例创 建但是由于连接不成功而处于Connecting状态时,如果在用户调用Zookeeper的API做具体的事情之前,Zookeeper恢复了,那么客 户端再调用Zookeeper的API进行操作时,跟Zookeeper一直处于健康的状态一样,这也体现了Zookeeper的高可用性。
会话的建立和会话的状态管理是在单独的线程中
了解了Zookeeper对象实例化和会话建立的异步性,一方面可以了解Zookeeper的设计策略,另一方面,也可以避免一些代码和同步策略导致的陷阱,比如代码中那样。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致zookeeper原理
zookeeper为了保证可靠性,不能用一台机器,而应该是一个集群
为了保证zookeeper集群数据能够一致,必须有一个拍板说了算的人,这就是leader,其他的是follower。
某一时刻集群里只能有且仅有一个leader。
leader可以执行增删改和查询操作,而follower只能进行查询操作。
所有的更新操作都会被转交给leader来处理,leader批准的任务,再发送给follower去执行来保证和leader的一致性。
由于网络是不稳定的,为了保证执行顺序的一致,所有的任务都会被赋予一个唯一的顺序的编号,一定是按照这个编号来执行任务,保证任务顺序的一致性。
那么什么时候leader可以认为一个客户端的请求可以算是处理成功了呢?
如果只有leader或少数机器来认可这个任务,则leader和这些少量机器如果挂掉,则选出来的新的leader并不知道之前批准过的这个任务,最终会违反数据的可靠性。
所以要求leader在批准一个任务之前应该保证集群里大部分的机器应该是知道这个提案的,这样即使自己挂掉,根据过半同意选出来的leader肯定是知道这个提案的。
而如果leader一定要等到所有follower都同一才执行提案也不好,因为知道有一个机器挂掉,leader就无法工作,也相当于单节点了,无法保证集群可靠性。
所以,只要过半同一leader就可以认为一个提案通过。
leader在收到客户端提交过来的任务后,会向集群中所有的follower发送提案等待follower的投票,follower们收到这个提议后,会进行投票,同意或者不同意,
leader会回收follower的投票,一旦受到过半的投票表示同意,则leader认为这个提案通过,再发送命令要求所有的follower都进行这个提案中的任务。
由于需要过半的机器同一才能执行任务,所以一旦集群中过半的机器挂掉,整个集群就无法工作了。
从而可以推导出:
zookeeper集群必须保证过半存活才能工作
zookeeper的集群中的机器数量最好应该是奇数个,因为需要过半存活集群才能工作,所以偶数个机器提供的集群可靠性其实和偶数-1个机器提供的集群可靠性是一样的。
leader选举的问题:
最开始集群启动时,会选择zid最小的机器作为leader。
当leader挂掉后,会通过过半投票选出具有最高任务编号的称为新的leader。
阅读(...) 评论()ZooKeeper完全分布式安装与配置
ZooKeeper介绍请见官网。
1.环境说明
在两台装有centos6.4(32位)的服务器上安装ZooKeeper,官网建议至少3个节点,资源有限,本次实验就2台了。
需要提前安装jdk,选择的版本是jdk-6u27-linux-i586.bin,地址:/s/1mgICcFA
2.配置主机名和ip映射的关系。
ZooKeeper集群所有的结点作为一个整体对分布式应用提供服务,因此需要各个节点实现互连,就要知道其他节点的主机和ip的映射关系。在每个节点上配置/etc/hosts文件,添加如下:
192.168.1.67 MasterServer
192.168.1.241 SlaveServer
3.安装ZooKeeper
1)下载ZooKeeper,建议选择稳定版,即stable的。
wget /zookeeper/stable/zookeeper-3.4.6.tar.gz
tar -zxvf zookeeper-3.4.6.tar.gz
3)修改/etc/profile,添加ZooKeeper路径&&
export ZOOKEEPER_HOME=/home/hadooper/hadoop/zookeeper-3.4.6
export PATH=$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf:$PATH
4)新建zoo.cfg并修改&&
cp conf/zoo_sample.cfg conf/zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/home/hadooper/hadoop/zookeeper-3.4.6/data
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to &0& to disable auto purge feature
#autopurge.purgeInterval=1
server.1=MasterServer:
server.2=SlaveServer:
参数说明:&&
①tickTime:心跳时间,毫秒为单位。
②initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒。
③syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 5*2000=10 秒。
④dataDir:存储内存中快照的位置。
⑤clientPort:监听客户端连接的端口
⑥server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
5)dataDir目录下创建myid文件,将内容设置为上⑥中的A值,用来标识不同的服务器。
4.远程复制安装文件
注:记得修改各节点的myid。&
scp -r zookeeper-3.3.4/ hadooper@SlaveServer:/home/hadooper/hadoop/
转载请注明:http://blog.csdn.net/hwwn2009/article/details/
5.测试ZooKeeper&&
1)各节点上启动&
[hadooper@MasterServer zookeeper-3.4.6]$ bin/zkServer.sh start
2)jps查看进程&&
30056 QuorumPeerMain
QuorumPeerMain是zookeeper进程,说明启动正常。
3)查看状态&&
[hadooper@MasterServer zookeeper-3.4.6]$ bin/zkServer.sh status
JMX enabled by default
Using config: /home/hadooper/hadoop/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower&
[hadooper@SlaveServer zookeeper-3.4.6]$ bin/zkServer.sh status
JMX enabled by default
Using config: /home/hadooper/hadoop/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader&
注:SlaveServer 为集群的leader。
4)停止ZooKeeper&&
[hadooper@MasterServer zookeeper-3.4.6]$ bin/zkServer.sh stop
转载请注明:http://blog.csdn.net/hwwn2009/article/details/
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

我要回帖

更多关于 main是不是关键字 的文章

 

随机推荐