VirtualBox+Centos6.4搭建Hadoop1.1.2分布式环境http://mvplee.iteye.com/blog/2233435
确保集群内服务器时间一致
解压文件
[root@hadoop1 local]# tar -zxvf zookeeper-3.4.5.tar.gz
配置home变量
[root@hadoop1 local]# more /etc/profile export ZOOKEEPER_HOME=/usr/local/zookeer-3.4.5 PATH=.:$HADOOP_HOME/bin:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH [root@hadoop1 local]# source /etc/profile
配置zookeeper配置文件,复制一副sample配置文件,对其进行修改
[root@hadoop1 conf]# pwd /usr/local/zookeeper-3.4.5/conf [root@hadoop1 conf]# mv zoo_sample.cfg zoo.cfg
文件内可以配置的参数有
1.tickTime:CS通信心跳时间 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。 tickTime=2000 2.initLimit:LF初始通信时限 集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。 initLimit=5 3.syncLimit:LF同步通信时限 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。 syncLimit=2 4.dataDir:数据文件目录 Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。 dataDir=/home/michael/opt/zookeeper/data 5.clientPort:客户端连接端口 客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。 clientPort=2181 6.服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口,选举端口) 这个配置项的书写格式比较特殊,规则如下: server.N=YYY:A:B
修改内容
[root@hadoop1 conf]# more zoo.cfg dataDir=/usr/local/zookeeper-3.4.5/data server.1=hadoop1:2888:3888 server.2=hadoop2:2888:3888 server.3=hadoop3:2888:3888
配置zookeeper节点
[root@hadoop1 zookeeper-3.4.5]# mkdir data [root@hadoop1 data]# vim myid [root@hadoop1 data]# more myid 0
把hadoop1上所配置的复制到hadoop2、hadoop3上
[root@hadoop1 zookeeper-3.4.5]# scp /etc/profile hadoop2:/etc/profile [root@hadoop1 zookeeper-3.4.5]# scp /etc/profile hadoop3:/etc/profile [root@hadoop1 zookeeper-3.4.5]# scp -r /usr/local/zookeeper-3.4.5 hadoop2:/usr/local/ [root@hadoop1 zookeeper-3.4.5]# scp -r /usr/local/zookeeper-3.4.5 hadoop3:/usr/local/
在hadoop2、hadoop3上修改zookeeper-3.4.5/conf/data/myid节点配置文件
在hadoop1上启动zookeeper
[root@hadoop1 bin]# pwd /usr/local/zookeeper-3.4.5/bin [root@hadoop1 bin]# zkServer.sh start JMX enabled by default Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
启动后会在目录下多出一个zookeeper.out文件,记录异常信息java.net.ConnectException:
[root@hadoop1 bin]# more zookeeper.out 2015-08-07 09:13:45,063 [myid:1] - WARN [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@368] - Cannot open channel to 2 at election address hadoop 2/192.168.56.22:3888 java.net.ConnectException: Connection refused 2015-08-07 09:14:36,271 [myid:1] - WARN [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@368] - Cannot open channel to 3 at election address hadoop 3/192.168.56.23:3888 java.net.ConnectException: Connection refused
原因是hadoop2、hadoop3还没启动,所以通信失败,启动hadoop2、hadoop3上的zookeeper
[root@hadoop2 bin]# zkServer.sh start [root@hadoop3 bin]# zkServer.sh start
zookeeper都启动会搞选举,查看选举结果
[root@hadoop1 bin]# zkServer.sh status JMX enabled by default Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg Mode: follower [root@hadoop2 bin]# zkServer.sh status JMX enabled by default Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg Mode: leader [root@hadoop3 bin]# zkServer.sh status JMX enabled by default Using config: /usr/local/zookeeper-3.4.5/bin/../conf/zoo.cfg Mode: follower
Zookeeper的JavaAPI操作
package example.zookeeper; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.List; import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.Stat; import org.junit.After; import org.junit.Before; import org.junit.Test; public class ZKClientTest { private static final String HOSTS = "hdp01:2181,hdp02:2181,hdp03:2181"; private static final int TIMEOUT = 2000; // latch.await()方法执行时,方法所在的线程会等待,当latch的count减为0时,才会唤醒等待的线程 private static final CountDownLatch LATCH = new CountDownLatch(1); private static ZooKeeper zkClient = null; @Before public void init() throws IOException, InterruptedException { zkClient = new ZooKeeper(HOSTS, TIMEOUT, new Watcher() { // 事件监听回调方法 public void process(WatchedEvent event) { if (LATCH.getCount() > 0 && event.getState() == KeeperState.SyncConnected) { System.out.println("KeeperState is SyncConnected"); LATCH.countDown(); } System.out.println("getType:" + event.getType()); System.out.println("getPath:" + event.getPath()); System.out.println("getState:" + event.getState()); // zkClient.getData("", true, null);//持续监听 } }); LATCH.await(); } @After public void destroy() throws InterruptedException { zkClient.close(); System.out.println("zkClient is closed"); } @Test public void testCreate() throws KeeperException, InterruptedException { // 参数1:要创建的节点的路径 // 参数2:节点的数据 // 参数3:节点的权限 // 参数4:节点的类型 String create = zkClient.create("/eclipse", "helloZK".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); System.out.println(create); } @Test public void testCreateChildren() throws KeeperException, InterruptedException { zkClient.create("/eclipse/ide1", "ide1".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); zkClient.create("/eclipse/ide2", "ide2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } @Test public void testGetChildren() throws KeeperException, InterruptedException { List<String> children = zkClient.getChildren("/eclipse", true); for (String string : children) { System.out.println(string); } } @Test public void testGetData() throws KeeperException, InterruptedException, UnsupportedEncodingException { // watch==true为使用new ZooKeeper()构造方法中的Watcher byte[] bytes = zkClient.getData("/eclipse", true, null); System.out.println(new String(bytes, "UTF-8")); } @Test public void testDelete() throws InterruptedException, KeeperException { // -1 删除任何节点的版本数据 zkClient.delete("/eclipse/ide", -1); } @Test public void testSetData() throws KeeperException, InterruptedException { // -1 任何节点的版本数据 zkClient.setData("/eclipse/ide1", "i'm a ide".getBytes(), -1); } @Test public void testExist() throws KeeperException, InterruptedException { Stat stat = zkClient.exists("/none", true); // 节点不存在Stat对象为null System.out.println(stat); } }
相关推荐
总结,Zookeeper 3.4.5是分布式协调服务的重要工具,它的强大功能和稳定性使其在各种分布式系统中得以广泛应用。理解并掌握Zookeeper的工作原理和使用方法,对于构建和维护大规模分布式系统具有重要的意义。
这个版本的Zookeeper支持多种客户端API,包括Java、C、Python等,方便各种语言的开发人员进行集成。 在实际应用中,Zookeeper被广泛用于如HBase、Kafka、YARN等分布式系统中,它们依赖Zookeeper来实现节点的发现、...
Zookeeper 3.4.5.jar是Zookeeper的一个特定版本的Java库,包含了该版本的所有功能和API,使得开发者能够方便地在Java应用中集成和利用Zookeeper的能力。 Zookeeper的核心功能包括命名服务、配置管理、集群同步、...
Apache ZooKeeper 是一个高度可靠的分布式协调系统,广泛应用于分布式环境中的命名服务、配置管理、集群管理、分布式锁和组服务等多个领域。在Zookeeper 3.4.5版本中,它继续提供了稳定且高效的解决方案,助力于大型...
总结来说,Zookeeper 3.4.5作为一款强大的分布式协调服务,其简洁的API、强大的一致性保证和广泛的生态系统使其成为构建分布式应用的关键组件。无论是在Windows还是Linux环境下,解压即用的绿色版都极大地简化了部署...
Zookeeper的强一致性模型使得它在分布式环境中能有效地处理状态变更和一致性问题。 "zookeeper-3.4.5-cdh5.9.3"这个版本可能包含以下部分: 1. **源代码**:提供Zookeeper的Java源码,开发者可以通过阅读源码来...
10. **Java API使用**:在Java应用中,你可以通过Apache ZooKeeper的Java API与ZooKeeper进行通信,实现分布式锁、队列、命名服务等功能。 ZooKeeper的使用涉及到许多高级特性,如选举算法、会话管理、原子操作等。...
客户端可以通过Java API、命令行工具(zkCli.sh)或者各种语言的客户端库与Zookeeper交互。 六、Zookeeper与CDH的整合 在CDH5.7.6中,Zookeeper不仅作为独立服务运行,还与其他组件如HBase、HDFS、YARN等紧密协作...
3. **新特性和API**:增加了新的API和命令,使得开发者能更方便地进行集群管理和监控。 4. **安全性增强**:提供了更好的权限控制和认证机制,增强了集群的安全性。 5. **故障恢复能力**:改进了故障检测和恢复机制...
Zookeeper 3.4.5是其一个稳定版本,包含了多项改进和优化,如增强的故障恢复机制、性能提升以及更完善的API等。Zookeeper的核心特性包括:原子性操作、顺序一致性、单例模式、分层命名空间和watch事件通知等。这些...
在3.4.10中,Zookeeper增强了客户端API,使其更加健壮和灵活,以适应不同的应用场景。同时,这个版本还对内存管理和数据存储进行了优化,降低了内存占用,提升了读写速度。此外,安全方面也得到了加强,支持了SASL...
5. **客户端连接**:应用可以通过Zookeeper的Java API或其他语言的客户端库连接到Zookeeper服务,进行数据的读写和监控。 Zookeeper的正确配置和使用对于实现大数据环境的高可用性和稳定性至关重要。理解其工作原理...
- 安装Zookeeper通常涉及下载最新稳定版的Zookeeper软件包,如`zookeeper-3.4.5.tar.gz`,然后解压缩至指定目录,如`/home/soft01/zookeeper`。 - 配置环境变量,通过编辑`/etc/profile`文件,添加`ZOOKEEPER_HOME...
4. 客户端API:ZooKeeper提供了多种语言的客户端库,如Java、C、Python等,使得各种语言的应用可以方便地与ZooKeeper交互。 5. 会话和心跳机制:ZooKeeper通过会话和心跳检测来确保客户端与服务器之间的连接状态,...
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、...