Zookeeper是Google的Chubby一个开源的实现是高有效和可靠的协同工作系统Zookeeper能够用来leader选举,配置信息维护等在一个分布式的环境中,我们需要一个Master实例或存储一些配置信息,确保文件写入的一致性等[1]
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,包含一个简单的原语集,是Hadoop和Hbase的重要组件。
说白了是hadoop的组件之一,用来管理hadoop。安装jsvc(利用tomcat方式):
进入tomcat下面的bin目录:
[root@tomcat ~]# cd /opt/tomcat/bin/
[root@tomcat bin]# tar xf commons-daemon-nativetargz
[root@tomcat bin]# cd commons-daemon-1015-native-src/unix/
[root@tomcat unix]# /configure --with-java=$JAVA_HOME
All done
Now you can issue "make"
[root@tomcat unix]# make
编译完成后,会在当前文件夹生成一个jsvc的文件,将它拷贝到/opt/tomcat/bin/下:
tomcat目录可自行设置
[root@tomcat unix]# cp jsvc /opt/tomcat/bin/
安装jsvc(无tomcat方式,利用commons-daemon-nativetargz和commons-daemon-110jar)
将commons-daemon-nativetargz放到某个目录,这里放到/opt/jsvc
[root@localhost jsvc]# cd /opt/jsvc
[root@localhost jsvc]# ll
total 404
-rw-r--r-- 1 root root 25145 Aug 15 23:03 commons-daemon-110jar
drwxr-xr-x 4 root root 109 Aug 15 23:03 commons-daemon-110-native-src
-rw-r--r-- 1 root root 207125 Aug 15 23:03 commons-daemon-110-native-srctargz
-rwxr-xr-x 1 root root 174312 Aug 15 23:05 jsvc
解压commons-daemon-110-native-srctargz
[root@localhost jsvc]# tar -xvf commons-daemon-110-native-srctargz
commons-daemon-110-native-src/LICENSEtxt
commons-daemon-110-native-src/RELEASE-NOTEStxt
commons-daemon-110-native-src/NOTICEtxt
commons-daemon-110-native-src/README
commons-daemon-110-native-src/unix/
commons-daemon-110-native-src/unix/man/
commons-daemon-110-native-src/unix/native/
commons-daemon-110-native-src/unix/support/
commons-daemon-110-native-src/unix/configurein
commons-daemon-110-native-src/unix/INSTALLtxt
commons-daemon-110-native-src/unix/man/jsvc1xml
commons-daemon-110-native-src/unix/man/README
commons-daemon-110-native-src/unix/native/debugc
commons-daemon-110-native-src/unix/native/indentpro
commons-daemon-110-native-src/unix/native/locksh
commons-daemon-110-native-src/unix/native/helpc
commons-daemon-110-native-src/unix/native/replacec
commons-daemon-110-native-src/unix/native/javac
commons-daemon-110-native-src/unix/native/replaceh
commons-daemon-110-native-src/unix/native/helph
commons-daemon-110-native-src/unix/native/signalsc
commons-daemon-110-native-src/unix/native/jsvc-unixc
commons-daemon-110-native-src/unix/native/locationh
commons-daemon-110-native-src/unix/native/locksc
commons-daemon-110-native-src/unix/native/homeh
commons-daemon-110-native-src/unix/native/debugh
commons-daemon-110-native-src/unix/native/javah
commons-daemon-110-native-src/unix/native/versionh
commons-daemon-110-native-src/unix/native/argumentsh
commons-daemon-110-native-src/unix/native/dsoh
commons-daemon-110-native-src/unix/native/homec
commons-daemon-110-native-src/unix/native/Makefilein
commons-daemon-110-native-src/unix/native/locationc
commons-daemon-110-native-src/unix/native/signalsh
commons-daemon-110-native-src/unix/native/dso-dlfcnc
commons-daemon-110-native-src/unix/native/dso-dyldc
commons-daemon-110-native-src/unix/native/jsvch
commons-daemon-110-native-src/unix/native/argumentsc
commons-daemon-110-native-src/unix/Makedefsin
commons-daemon-110-native-src/unix/support/configguess
commons-daemon-110-native-src/unix/support/apsupportm4
commons-daemon-110-native-src/unix/support/configsub
commons-daemon-110-native-src/unix/support/apfunctionsm4
commons-daemon-110-native-src/unix/support/apjavam4
commons-daemon-110-native-src/unix/Makefilein
commons-daemon-110-native-src/unix/configure
commons-daemon-110-native-src/unix/man/fetchsh
commons-daemon-110-native-src/unix/support/mkdistsh
commons-daemon-110-native-src/unix/support/installsh
commons-daemon-110-native-src/unix/support/buildconfsh
commons-daemon-110-native-src/windows/
commons-daemon-110-native-src/windows/apps/
commons-daemon-110-native-src/windows/apps/prunmgr/
commons-daemon-110-native-src/windows/apps/prunsrv/
commons-daemon-110-native-src/windows/include/
commons-daemon-110-native-src/windows/resources/
commons-daemon-110-native-src/windows/xdocs/
commons-daemon-110-native-src/windows/src/
commons-daemon-110-native-src/windows/apps/prunmgr/prunmgrc
commons-daemon-110-native-src/windows/apps/prunmgr/Makefile
commons-daemon-110-native-src/windows/apps/prunmgr/prunmgrmanifest
commons-daemon-110-native-src/windows/apps/prunmgr/prunmgrh
commons-daemon-110-native-src/windows/apps/prunsrv/prunsrvmanifest
commons-daemon-110-native-src/windows/apps/prunsrv/Makefile
commons-daemon-110-native-src/windows/apps/prunsrv/prunsrvc
commons-daemon-110-native-src/windows/apps/prunsrv/prunsrvh
commons-daemon-110-native-src/windows/include/consoleh
commons-daemon-110-native-src/windows/include/cmdlineh
commons-daemon-110-native-src/windows/include/apxwinh
commons-daemon-110-native-src/windows/include/Makefileinc
commons-daemon-110-native-src/windows/include/javajnih
commons-daemon-110-native-src/windows/include/guih
commons-daemon-110-native-src/windows/include/handlesh
commons-daemon-110-native-src/windows/include/serviceh
commons-daemon-110-native-src/windows/include/registryh
commons-daemon-110-native-src/windows/include/logh
commons-daemon-110-native-src/windows/include/rprocessh
commons-daemon-110-native-src/windows/resources/licensertf
commons-daemon-110-native-src/windows/xdocs/indexxml
commons-daemon-110-native-src/windows/src/javajnic
commons-daemon-110-native-src/windows/src/mclibh
commons-daemon-110-native-src/windows/src/consolec
commons-daemon-110-native-src/windows/src/servicec
commons-daemon-110-native-src/windows/src/handlesc
commons-daemon-110-native-src/windows/src/utilsc
commons-daemon-110-native-src/windows/src/registryc
commons-daemon-110-native-src/windows/src/mclibc
commons-daemon-110-native-src/windows/src/privateh
commons-daemon-110-native-src/windows/src/cmdlinec
commons-daemon-110-native-src/windows/src/guic
commons-daemon-110-native-src/windows/src/rprocessc
commons-daemon-110-native-src/windows/src/logc
commons-daemon-110-native-src/windows/README
commons-daemon-110-native-src/windows/apps/prunmgr/prunmgrrc
commons-daemon-110-native-src/windows/apps/prunsrv/prunsrvrc
commons-daemon-110-native-src/windows/resources/susersbmp
commons-daemon-110-native-src/windows/resources/commonsbmp
commons-daemon-110-native-src/windows/resources/procrunsico
commons-daemon-110-native-src/windows/resources/procrunrico
commons-daemon-110-native-src/windows/resources/procrunwico
[root@localhost jsvc]# ls
commons-daemon-110jar commons-daemon-110-native-src commons-daemon-110-native-srctargz
进入commons-daemon-110-native-src/unix目录
[root@localhost jsvc]# cd src
[root@localhost commons-daemon-110-native-src]# ls
LICENSEtxt NOTICEtxt README RELEASE-NOTEStxt unix windows
[root@localhost commons-daemon-110-native-src]# cd unix
[root@localhost unix]# ls
configure configurein INSTALLtxt Makedefsin Makefilein man native support
查找当前环境java_home目录
[root@localhost unix]# find / -name java
/etc/pki/ca-trust/extracted/java
/etc/pki/java
/etc/alternatives/java
/var/lib/alternatives/java
/usr/bin/java
/usr/local/zookeeper-3412/contrib/loggraph/src/java
/usr/local/zookeeper-3412/contrib/fatjar/src/java
/usr/local/zookeeper-3412/contrib/ZooInspector/src/java
/usr/local/zookeeper-3412/recipes/election/src/java
/usr/local/zookeeper-3412/recipes/queue/src/java
/usr/local/zookeeper-3412/recipes/lock/src/java
/usr/local/zookeeper-3412/src/contrib/rest/src/java
/usr/local/zookeeper-3412/src/contrib/loggraph/src/java
/usr/local/zookeeper-3412/src/contrib/zooinspector/src/java
/usr/local/zookeeper-3412/src/contrib/fatjar/src/java
/usr/local/zookeeper-3412/src/recipes/election/src/java
/usr/local/zookeeper-3412/src/recipes/queue/src/java
/usr/local/zookeeper-3412/src/recipes/lock/src/java
/usr/local/zookeeper-3412/src/java
/usr/java
/usr/java/jdk180_171-amd64/bin/java
/usr/java/jdk180_171-amd64/jre/bin/java
检查java环境是否正确
[root@localhost unix]# /configure --with-java=/usr/java/jdk180_171-amd64
Current host
checking build system type x86_64-pc-linux-gnu
checking host system type x86_64-pc-linux-gnu
checking cached host system type ok
C-Language compilation tools
checking for gcc gcc
checking whether the C compiler works yes
checking for C compiler default output file name aout
checking for suffix of executables
checking whether we are cross compiling no
checking for suffix of object files o
checking whether we are using the GNU C compiler yes
checking whether gcc accepts -g yes
checking for gcc option to accept ISO C89 none needed
checking for ranlib ranlib
checking for strip strip
Host support
checking C flags dependant on host system type ok
Java compilation tools
checking JAVA_HOME /usr/java/jdk180_171-amd64
checking for JDK os include directory linux
gcc flags added
checking how to run the C preprocessor gcc -E
checking for grep that handles long lines and -e /usr/bin/grep
checking for egrep /usr/bin/grep -E
checking for ANSI C header files yes
checking for sys/typesh yes
checking for sys/stath yes
checking for stdlibh yes
checking for stringh yes
checking for memoryh yes
checking for stringsh yes
checking for inttypesh yes
checking for stdinth yes
checking for unistdh yes
checking sys/capabilityh usability no
checking sys/capabilityh presence no
checking for sys/capabilityh no
configure: WARNING: cannot find headers for libcap
Writing output files
configure: creating /configstatus
configstatus: creating Makefile
configstatus: creating Makedefs
configstatus: creating native/Makefile
All done
Now you can issue "make"
输入make命令进行编译
[root@localhost unix]# make
(cd native; make all)
make[1]: Entering directory `/opt/jsvc/commons-daemon-110-native-src/unix/native'
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes -I/usr/java/jdk180_171-amd64/include -I/usr/java/jdk180_171-amd64/include/linux -c jsvc-unixc -o jsvc-unixo
jsvc-unixc: In function ‘run_controller’:
jsvc-unixc:1304:20: warning: assignment from incompatible pointer type [enabled by default]
actsa_handler = controller;
^
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes -I/usr/java/jdk180_171-amd64/include -I/usr/java/jdk180_171-amd64/include/linux -c argumentsc -o argumentso
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes -I/usr/java/jdk180_171-amd64/include -I/usr/java/jdk180_171-amd64/include/linux -c debugc -o debugo
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes -I/usr/java/jdk180_171-amd64/include -I/usr/java/jdk180_171-amd64/include/linux -c dso-dlfcnc -o dso-dlfcno
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes -I/usr/java/jdk180_171-amd64/include -I/usr/java/jdk180_171-amd64/include/linux -c dso-dyldc -o dso-dyldo
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes -I/usr/java/jdk180_171-amd64/include -I/usr/java/jdk180_171-amd64/include/linux -c helpc -o helpo
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes -I/usr/java/jdk180_171-amd64/include -I/usr/java/jdk180_171-amd64/include/linux -c homec -o homeo
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes -I/usr/java/jdk180_171-amd64/include -I/usr/java/jdk180_171-amd64/include/linux -c javac -o javao
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes -I/usr/java/jdk180_171-amd64/include -I/usr/java/jdk180_171-amd64/include/linux -c locationc -o locationo
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes -I/usr/java/jdk180_171-amd64/include -I/usr/java/jdk180_171-amd64/include/linux -c replacec -o replaceo
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes -I/usr/java/jdk180_171-amd64/include -I/usr/java/jdk180_171-amd64/include/linux -c locksc -o lockso
gcc -g -O2 -DOS_LINUX -DDSO_DLFCN -DCPU=\"amd64\" -Wall -Wstrict-prototypes -I/usr/java/jdk180_171-amd64/include -I/usr/java/jdk180_171-amd64/include/linux -c signalsc -o signalso
ar cr libservicea argumentso debugo dso-dlfcno dso-dyldo helpo homeo javao locationo replaceo lockso signalso
ranlib libservicea
gcc jsvc-unixo libservicea -ldl -lpthread -o /jsvc
make[1]: Leaving directory `/opt/jsvc/commons-daemon-110-native-src/unix/native'
编译完成,查看目录会生成jsvc文件,将jsvc拷贝到上级目录
[root@localhost unix]# ls
configlog confignice configstatus configure configurein INSTALLtxt jsvc Makedefs Makedefsin Makefile Makefilein man native support
[root@localhost unix]# cp jsvc //java 是什么语言写的
JAVA中就虚拟机是其它语言开发的,用的是C语言+汇编语言 基于此之上就是JAVA本身了 虚拟机只起到解析作用
另外,JAVA并不比C语言慢,说JAVA慢一般是九十年代那时候的JAVA, 而现在 在一段优秀的JAVA程序和C程序执行效率上来比较是没有多大差距的 并且现在JAVA已经可以像C语言那样,直接编译为可执行文件(不用虚拟机,跨平台为代价)了
不知道你看过 卓越编程之道二(运用底层思维编写高级代码) 没有,那里面详细的讲述了高级语言从编写到编译执行的过程,通过目标文件的反汇编对比,发现C,C++,JAVA,dephi等语言在同等质量下的目标文件长度上基本上没多大区别,一门语言的运行速度快慢,与你编写代码过程中是否符合编译器规则息息相关。 有空你可以去看看这本书。
glusterfs 是什么语言写的
使用opencv需要编译源码,得到库文件。可以用cmake构建项目后编译,也可以直接用官方提供的编译好的版本。
官方提供的编译库一般只是标准版本,没有附加某些库,比如tbb等,要想让opencv使用tbb等库,就只能自己构建项目后编译。
当然,一般使用的话,用官方提供的库即可。OpenCV231版本就提供编译好的库,可以直接设置使用。
不过有人大费周折为他建立了一个类似于“关于 Chuck Norris 的事实”这样的网站,这倒是件不同寻常的事。这是因为 Jeff Dean 是一位软件工程师
zookeeper是什么语言写的 本文是Jason Wilder对于常见的服务发现项目 Zookeeper , Doozer , Etcd 所写的一篇博客,其原文地址如下: Open-Source Service Discovery 。
服务发现是大多数分布式系统以及面向服务架构(SOA)的一个核心组成部分。这个难题,简单来说,可以认为是:当一项服务存在于多个主机节点上时,client端如何决策获取相应正确的IP和port。
在传统情况下,当出现服务存在于多个主机节点上时,都会使用静态配置的方法来实现服务信息的注册。但是当大型系统中,需要部署更多服务的时候,事情就显得复杂得多。在一个实时的系统中,由于自动或者人工的服务扩展,或者服务的新添加部署,还有主机的宕机或者被替换,服务的location信息可能会很频繁的变化。
在这样的场景下,为了避免不必要的服务中断,动态的服务注册和发现就显得尤为重要。
关于服务发现的话题,已经很多次被人所提及,而且也的确不断的在发展。现在,笔者介绍一下该领域内一些open-source或者被经常被世人广泛讨论的解决方案,尝试理解它们到底是如何工作的。特别的是,我们会较为专注于每一个解决方案的一致性算法,到底是强一致性,还是弱一致性;运行时依赖;client的集成选择;以后最后这些特性的折中情况。
本文首先从几个强一致性的项目于开始,比如Zookeeper,Doozer,Etcd,这些项目主要用于服务间的协调,同时又可用于服务的注册。
随后,本文将讨论一些在服务注册以及发现方面比较有意思的项目,比如:Airbnb的SmartStack,Netflix的Eureka,Bitly的NSQ,Serf,Spotify and DNS,最后是SkyDNS。
问题陈述
在定位服务的时候,其实会有两个方面的问题:服务注册(Service Registration)和服务发现(Service Discovery)。
服务注册—— 一个服务将其位置信息在中心注册节点注册的过程。该服务一般会将它的主机IP地址以及端口号进行注册,有时也会有服务访问的认证信息,使用协议,版本号,以及关于环境的一些细节信息。
服务发现—— client端的应用实例查询中心注册节点以获知服务位置的过程。
每一个服务的服务注册以及服务发现,都需要考虑一些关于开发以及运营方面的问题:
监控—— 当一个已注册完毕的服务失效的时候,如何处理。一些情况下,在一个设定的超时定时(timeout)后,该服务立即被一个其他的进程在中心注册节点处注销。这种情况下,服务通常需要执行一个心跳机制,来确保自身的存活状态;而客户端必然需要能够可靠处理失效的服务。
负载均衡—— 如果多个相同地位的服务都注册完毕,如何在这些服务之间均衡所有client的请求负载?如果有一个master节点的话,是否可以正确处理client访问的服务的位置。
集成方式—— 信息注册节点是否需要提供一些语言绑定的支持,比如说,只支持Java?集成的过程是否需要将注册过程以及发现过程的代码嵌入到你的应用程序中,或者使用一个类似于集成助手的进程?
运行时依赖—— 是否需要JVM,ruby或者其他在你的环境中并不兼容的运行时?
可用性考虑—— 如果系统失去一个节点的话,是否还能正常工作?系统是否可以实时更新或升级,而不造成任何系统的瘫痪?既然集群的信息注册节点是架构中的中心部分,那该模块是否会存在单点故障问题?
强一致性的Registries
首先介绍的三个服务注册系统都采用了强一致性协议,实际上为达到通用的效果,使用了一致性的数据存储。尽管我们把它们看作服务的注册系统,其实它们还可以用于协调服务来协助leader选举,以及在一个分布式clients的集合中做centralized locking。
Zookeeper
Zookeeper是一个集中式的服务,该服务可以维护服务配置信息,命名空间,提供分布式的同步,以及提供组化服务。Zookeeper是由Java语言实现,实现了强一致性(CP),并且是使用 Zab协议 在ensemble集群之间协调服务信息的变化。
Zookeeper在ensemble集群中运行3个,5个或者7个成员。众多client端为了可以访问ensemble,需要使用绑定特定的语言。这种访问形式被显性的嵌入到了client的应用实例以及服务中。
服务注册的实现主要是通过命令空间(namespace)下的 ephemeral nodes 。ephemeral nodes只有在client建立连接后才存在。当client所在节点启动之后,该client端会使用一个后台进程获取client的位置信息,并完成自身的注册。如果该client失效或者失去连接的时候,该ephemeral node就从树中消息。
服务发现是通过列举以及查看具体服务的命名空间来完成的。Client端收到目前所有注册服务的信息,无论一个服务是否不可用或者系统新添加了一个同类的服务。Client端同时也需要自行处理所有的负载均衡工作,以及服务的失效工作。
Zookeeper的API用起来可能并没有那么方便,因为语言的绑定之间可能会造成一些细小的差异。如果使用的是基于JVM的语言的话, Curator Service Discovery Extension 可能会对你有帮助。
由于Zookeeper是一个CP强一致性的系统,因此当网络分区(Partition)出故障的时候,你的部分系统可能将出出现不能注册的情况,也可能出现不能找到已存在的注册信息,即使它们可能在Partition出现期间仍然正常工作。特殊的是,在任何一个non-quorum端,任何读写都会返回一个错误信息。
Doozer
Doozer是一个一致的分布式数据存储系统,Go语言实现,通过 Paxos算法 来实现共识的强一致性系统。这个项目开展了数年之后,停滞了一段时间,而且现在也关闭了一些fork数,使得fork数降至160 。不幸的是,现在很难知道该项目的实际发展状态,以及它是否适合使用于生产环境。
Doozer在集群中运行3,5或者7个节点。和Zookeeper类似,Client端为了访问集群,需要在自身的应用或者服务中使用特殊的语言绑定。
Doozer的服务注册就没有Zookeeper这么直接,因为Doozer没有那些ephemeral node的概念。一个服务可以在一条路径下注册自己,如果该服务不可用的话,它也不会自动地被移除。
现有很多种方式来解决这样的问题。一个选择是给注册进程添加一个时间戳和心跳机制,随后在服务发现进程中处理那些超时的路径,也就是注册的服务信息,当然也可以通过另外一个清理进程来实现。
服务发现和Zookeeper很类似,Doozer可以罗列出指定路径下的所有入口,随后可以等待该路径下的任意改动。如果你在注册期间使用一个时间戳和心跳,你就可以在服务发现期间忽略或者删除任何过期的入口,也就是服务信息。
和Zookeeper一样,Doozer是一个CP强一致性系统,当发生网络分区故障时,会导致同样的后果。
Etcd
Etcd 是一个高可用的K-V存储系统,主要应用于共享配置、服务发现等场景。Etcd可以说是被Zookeeper和Doozer催生而出。整个系统使用Go语言实现,使用Raft算法来实现选举一致,同时又具有一个基于>1、torm集群中包含两类节点:主控节点(Master Node)和工作节点(Work Node)。其分别对应的角色如下:
主控节点(Master Node)上运行一个被称为Nimbus的后台程序,它负责在Storm集群内分发代码,分配任务给工作机器,并且负责监控集群运行状态。Nimbus的作用类似于Hadoop中JobTracker的角色。
每个工作节点(Work Node)上运行一个被称为Supervisor的后台程序。Supervisor负责监听从Nimbus分配给它执行的任务,据此启动或停止执行任务的工作进程。每一个工作进程执行一个Topology的子集;一个运行中的Topology由分布在不同工作节点上的多个工作进程组成。
Nimbus和Supervisor节点之间所有的协调工作是通过Zookeeper集群来实现的。此外,Nimbus和Supervisor进程都是快速失败(fail-fast)和无状态(stateless)的;Storm集群所有的状态要么在Zookeeper集群中,要么存储在本地磁盘上。这意味着你可以用kill -9来杀死Nimbus和Supervisor进程,它们在重启后可以继续工作。这个设计使得Storm集群拥有不可思议的稳定性。
如何安装部署Storm集群
这一章节将详细描述如何搭建一个Storm集群。下面是接下来需要依次完成的安装步骤:•搭建Zookeeper集群;•安装Storm依赖库;•下载并解压Storm发布版本;•修改stormyaml配置文件;•启动Storm各个后台进程。
21 搭建Zookeeper集群
Storm使用Zookeeper协调集群,由于Zookeeper并不用于消息传递,所以Storm给Zookeeper带来的压力相当低。大多数情况下,单个节点的Zookeeper集群足够胜任,不过为了确保故障恢复或者部署大规模Storm集群,可能需要更大规模节点的Zookeeper集群(对于Zookeeper集群的话,官方推荐的最小节点数为3个)。在Zookeeper集群的每台机器上完成以下安装部署步骤:
1)下载安装Java JDK,官方下载链接为javasuncom/javase/downloads/indexjsp,JDK版本为JDK 6或以上。
2)根据Zookeeper集群的负载情况,合理设置Java堆大小,尽可能避免发生swap,导致Zookeeper性能下降。保守期间,4GB内存的机器可以为Zookeeper分配3GB最大堆空间。
3)下载后解压安装Zookeeper包,官方下载链接为hadoopapacheorg/zookeeper/releaseshtml。
4)根据Zookeeper集群节点情况,创建如下格式的Zookeeper配置文件zoocfg:tickTime=2000dataDir=/var/zookeeper/clientPort=2181initLimit=5syncLimit=2server1=zoo1:2888:3888server2=zoo2:2888:3888server3=zoo3:2888:3888
其中,dataDir指定Zookeeper的数据文件目录;其中serverid=host:port:port,id是为每个Zookeeper节点的编号,保存在dataDir目录下的myid文件中,zoo1~zoo3表示各个Zookeeper节点的hostname,第一个port是用于连接leader的端口,第二个port是用于leader选举的端口。
5)在dataDir目录下创建myid文件,文件中只包含一行,且内容为该节点对应的serverid中的id编号。
6)启动Zookeeper服务:
java -cp zookeeperjar:lib/log4j-1215jar:conf \ orgapachezookeeperserverquorumQuorumPeerMain zoocfg
也可以通过bin/zkServersh脚本启动Zookeeper服务。
7)通过Zookeeper客户端测试服务是否可用:•Java客户端下,执行如下命令:
java -cp zookeeperjar:src/java/lib/log4j-1215jar:conf:src/java/lib/jline-0994jar \ orgapachezookeeperZooKeeperMain -server 127001:2181
也可以通过bin/zkClish脚本启动Zookeeper Java客户端。•C客户端下,进入src/c目录下,编译单线程或多线程客户端:
/configuremake cli_stmake cli_mt
运行进入C客户端:
cli_st 127001:2181cli_mt 127001:2181
至此,完成了Zookeeper集群的部署与启动。
3、向集群提交任务
1)启动Storm Topology:
storm jar allmycodejar orgmeMyTopology arg1 arg2 arg3
其中,allmycodejar是包含Topology实现代码的jar包,orgmeMyTopology的main方法是Topology的入口,arg1、arg2和arg3为orgmeMyTopology执行时需要传入的参数。
2)停止Storm Topology:
storm kill {toponame}
其中,{toponame}为Topology提交到Storm集群时指定的Topology任务名称。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)