基于Zookeeper实现分布式爬虫监控
一、Zookeeper是什么啊?
我们来看一下,Zookeeper的定义:zookeeper是一个分布式的开源的协调服务框架,服务于分布式应用。 它暴露了一系列的原语操作服务,因此分布式应用能够基于这些服务,构建出更高级别的服务,比如同步,配置管理,分组和命名服务。zookeeper设计上易于编码,数据模型构建在我们熟悉的树形结构目录风格的文件系统中。zookeeper运行在Java中,同时支持Java和C 语言。
二、那么Zookeeper的基本架构与工作原理是啥样的呢?
Zookeeper 服务自身组成一个集群(2n+1个服务节点最多允许n个失效)。Zookeeper 服务有两个角色:一个是主节点(Leader),负责投票的发起和决议,更新系统状态;另一种是从节点(Follower),用于接收客户端请求并向客户端返回结果,在选主过程(即选择主节点的过程)中参与投票。主节点失效后,会在从节点中重新选举新的主节点。
zookeeper的数据结构与linux文件系统很类似,与Linux中的文件系统路径不同,Zookeeper中的路径必须是绝对路径,而且每条路径只有唯一的一种表示方式(/app1/p_3)。
三、如何构建Zookeeper集群?
安装Zookeeper的预备工作:
- Linux 系统3节点准备
- 配置主机名与IP地址映射
- 配置时钟同步
- 集群SSH密码登录
- 集群脚本开发
- JDK安装
我们先来看看Zookeeper的分布式集群如何搭建:
- 下载解压
- 修改配置文件
- 同步Zookeeper安装目录
- 创建数据和日志目录
- 配置Zookeeper节点服务编号
- Zookeeper集群服务启停
3.1 下载并解压zookeeper
到官网(地址:http://Zookeeper.apache.org/releases.html# download)下载Zookeeper稳定版本的zookeeper-3.4.6.tar.gz安装包,然后上传至hadoop01 节点的/home/hadoop/app目录下并解压,具体操作如下所示。
#解压Zookeeper
[hadoop@hadoop01 app]$ tar -zxvf zookeeper-3.4.6.tar.gz
#创建Zookeeper软连接
[hadoop@hadoop01 app]$ ln -s zookeeper-3.4.6 zookeeper
3.2 修改zoo.cfg配置文件
在运行 Zookeeper 服务之前,需要新建一个配置文件。这个配置文件习惯上命名为zoo.cfg,并保存在conf子目录中,其核心内容如下所示。
[hadoop@hadoop01 app]$ cd zookeeper
[hadoop@hadoop01 zookeeper]$ cd conf/
[hadoop@hadoop01 conf]$ ls
configuration.xsl log4j.properties zoo.cfg zoo_sample.cfg
[hadoop@hadoop01 conf]$ vi zoo.cfg
#数据目录需要提前创建
dataDir=/home/hadoop/data/zookeeper/zkdata
#日志目录需要提前创建
dataLogDir=/home/hadoop/data/zookeeper/zkdatalog
#访问端口号
clientPort=2181
#server.每个节点服务编号=服务器ip地址:集群通信端口:选举端口
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888
3.3 同步zookeeper安装目录
使用scp命令将hadoop01节点的Zookeeper安装目录,整体同步到集群的hadoop02和hadoop03节点,具体操作如下所示。
[hadoop@hadoop01 app]$scp -r zookeeper-3.4.6 hadoop@hadoop02:/home/hadoop/app/
[hadoop@hadoop01 app]$scp -r zookeeper-3.4.6 hadoop@hadoop03:/home/hadoop/app/
然后分别在hadoop02和hadoop03节点上创建Zookeeper软连接,具体操作如下所示。
[hadoop@hadoop02 app]$ln -s zookeeper-3.4.6 zookeeper
[hadoop@hadoop03 app]$ ln -s zookeeper-3.4.6 zookeeper
3.4 创建数据和日志目录
在集群各个节点创建Zookeeper数据目录和日志目录,需要跟zoo.cfg配置文件保持一致,具体操作如下所示。
#创建Zookeeper数据目录
[hadoop@hadoop01 app]$mkdir -p /home/hadoop/data/zookeeper/zkdata
[hadoop@hadoop02 app]$mkdir -p /home/hadoop/data/zookeeper/zkdata
[hadoop@hadoop03 app]$mkdir -p /home/hadoop/data/zookeeper/zkdata
#创建Zookeeper日志目录
[hadoop@hadoop01 app] mkdir -p /home/hadoop/data/zookeeper/zkdatalog
[hadoop@hadoop02 app] mkdir -p /home/hadoop/data/zookeeper/zkdatalog
[hadoop@hadoop03 app] mkdir -p /home/hadoop/data/zookeeper/zkdatalog
3.5 创建各节点服务编号
分别在Zookeeper集群各个节点,进入/home/hadoop/data/zookeeper/zkdata目录,创建文件myid,然后分别输入服务编号,具体操作如下所示:
#hadoop01节点
[hadoop@hadoop01 zkdata]$ touch myid
[hadoop@hadoop01 zkdata]$ echo 1> myid
#hadoop02节点
[hadoop@hadoop02 zkdata]$ touch myid
[hadoop@hadoop02 zkdata]$ echo 2> myid
#hadoop03节点
[hadoop@hadoop03 zkdata]$ touch myid
[hadoop@hadoop03 zkdata]$ echo 3> myid
注意:每个节点服务编号的值是一个整形数字且不能重复
3.6 启动Zookeeper集群服务
在集群各个节点分别进入Zookeeper安装目录,然后使用如下命令启动Zookeeper服务。
[hadoop@hadoop01 zookeeper]$ bin/zkServer.sh start
[hadoop@hadoop02 zookeeper]$ bin/zkServer.sh start
[hadoop@hadoop03 zookeeper]$ bin/zkServer.sh start
Zookeeper集群启动一会之后,通过如下命令查看Zookeeper集群状态。
[hadoop@hadoop01 zookeeper]$ bin/zkServer.sh status
[hadoop@hadoop02 zookeeper]$ bin/zkServer.sh status
[hadoop@hadoop03 zookeeper]$ bin/zkServer.sh status
复制代码
如果在Zookeeper集群中,其中一个节点为leader领导者,另外两个节点是follower跟随者,说明Zookeeper集群安装部署成功。
四、简单了解一下Zookeeper Shell的操作
客户端连接zk服务
[hadoop@hadoop1 zookeeper]$ bin/zkCli.sh -server localhost:2181
查看znode根目录结构
[zk: localhost:2181(CONNECTED) 1] ls /
创建znode节点
[zk: localhost:2181(CONNECTED) 2] create /test helloworld
查看znode节点
[zk: localhost:2181(CONNECTED) 3] get /test
修改znode节点
[zk: localhost:2181(CONNECTED) 4] set /test zookeeper
[zk: localhost:2181(CONNECTED) 5] get /test
删除znode节点
[zk: localhost:2181(CONNECTED) 6] delete /test
五、本文重点来啦-->基于Zookeeper实现分布式爬虫监控
当我们需要采集一个网上书店的数据,为了提高爬虫效率,现在利用集群多节点并行爬取数据。由于使用集群多节点并行爬虫,难免会出现某些爬虫应用挂掉的状况,为了及时掌握集群节点爬虫应用是否正常运行,现在要求对集群的各爬虫应用进行监控。为了实现对集群各节点爬虫应用的监控,可以利用Zookeeper的监听机制来实现。首先通过Java开发一个监视器来监听Zookeeper的/spider持久节点,然后通过Java实现网上书店的爬虫应用,该应用会获取本地IP地址作为临时节点注册到Zookeeper的/spider节点,最后当集群各节点爬虫应用上线或者下线时都会触发监视器,从而可以精确掌握各爬虫应用的健康状况。
首先我们先引入项目依赖
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.1</version>
</dependency>
在这里,可能会出现
Error: Could not find or load main class com.bigdata.zookeeper.SpiderWatcher
不用慌,我们切换打包插件即可,打包插件如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.bigdata.zookeeper.StartSpider</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
爬虫代码:
一些爬虫效果be like:
接下来,对项目进行打包和运行
项目编译打包
命令:mvn clean package
启动Zookeeper集群
启动脚本:bin/zkServer.sh start
启动爬虫监控应用
启动命令:java -cp bigdata-1.0-SNAPSHOT.jar 包名+监控类名
启动爬虫应用
启动命令:java -cp bigdata-1.0-SNAPSHOT.jar 包名+爬虫类名
查看爬虫应用节点上下线
监视程序
拷贝包导其他节点
爬虫效果:
作者:陈惜时
链接:https://juejin.cn/post/7195857732846305341
来源:稀土掘金