1.zookeeper watcher(监听机制)
watch机制是zookeeper自动监控某一个znode节点的生死和状态变化(节点创建,节点删除,节点改变,子节点改变);如果监控的事件发生了会触发执行行为;
提供了分布式数据发布和订阅功能,一对多的订阅关系
watch机制有三个过程:客户端向服务器注册watcher;服务端事件发生触发watcher;客户端回调watcher得到触发事件情况
2.watcher机制的特点:
a:一次性触发(命令行)
事件发生触发监听,一个watcher event就会被发送到设置监听的客户端,这种效果是一次性的,后续再次发生同样的事件,不会再次触发。
b.事件封装
ZooKeeper使用WatchedEvent对象来封装服务端事件并传递。
WatchedEvent包含了每一个事件的三个基本属性:
通知状态(keeperState),事件类型(EventType)和节点路径(path)
c:event异步发送
watcher的通知事件从服务端发送到客户端是异步的。
d:先注册再触发
Zookeeper中的watch机制,必须客户端先去服务端注册监听,这样事件发送才会触发监听,通知给客户端。
4.zookeeper JavaAPI操作
a:原生的
b:curator框架:curator-framework:对底层zookeeper的api的封装
curator-reclipes:封装了一些高级特性:擦车事件监听选举分布式锁,分布式计数器
引入maven依赖
```javaorg.apache.curator curator-framework2.12.0 org.apache.curator curator-recipes2.12.0 com.google.collections google-collections1.0 junit junitRELEASE org.slf4j slf4j-simple1.7.25 org.apache.maven.plugins maven-compiler-plugin3.2 1.8 1.8 UTF-8
节点操作代码:
```java
```java
package com.hlzq.zookeeper;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.Curatorframework;
import org.apache.curator.framework.CuratorframeworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.nio.charset.StandardCharsets;
import java.util.List;
public class Demo1Zooke {
private Curatorframework client=null;
@Before //单元测试前先执行before里的代码
public void init(){
//1.定制重试
ExponentialBackoffRetry retry = new ExponentialBackoffRetry(1000, 3);
//2.获取客户
String cli="node1:2181,node2:2181,node3:2181";
client = CuratorframeworkFactory.newClient(cli, retry);
//3.启动客户端
client.start();
}
@After
public void clos(){
//5.关闭连接
client.close();
}
//1.创建znode节点
@Test
public void test1CreatZnode() throws Exception {
//1.定制重试策略
RetryPolicy backoffRetry = new ExponentialBackoffRetry(1000, 3);//多态
//2.获取客户端对象
String server_list="node1:2181,node2:2181,node3:2181";//192.168.88.161:2181,192.168.88.162:2181,192.168.88.163:2181可以用
Curatorframework client = CuratorframeworkFactory.newClient(server_list, backoffRetry);
//3.启动客户端
client.start();
//4.创建节点
// 4.1 client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT)//创建永久节点
// .forPath("/aaa/bbb/cccc","null".getBytes());//withmode什么类型节点,forpath路径
// 4.2 client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT_SEQUENTIAL)//创建永久序列化节点
// .forPath("/app1/bbb/cccc");//withmode什么类型节点,forpath路径
// 4.3 client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL)//创建临时节点;client.close()关闭后临时节点消失
// .forPath("/appale");//withmode什么类型节点,forpath路径
client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL_SEQUENTIAL)//创建临时序列化节点;client.close()关闭后临时节点消失
.forPath("/appale");//withmode什么类型节点,forpath路径
//CreateMode.PERSISTENT
//GetACLBuilder acl = client.getACL();
//System.out.println(acl);
//5.关闭连接
//client.close();
}
@Test
//删除节点
public void test2Delter() throws Exception {
//4.删除节点
client.delete().deletingChildrenIfNeeded().forPath("/app1");//递归删除deletingChildrenIfNeeded()
}
@Test
//修改值
public void test3change() throws Exception {
client.setData().forPath("/as","{pory:3602}".getBytes());
}
@Test
//获取值
public void test4getZnode() throws Exception {
byte[] bytes = client.getData().forPath("/as");
System.out.println(new String(bytes));
List strings = client.getChildren().forPath("/as");
System.out.println(strings);
}
}
当你get获取没有数据的节点时,会得到一个IP地址
watch机制Java代码实现:
5.zookeeper选举机制:
5.1zookeeper集群的角色:follower leader observer(观察者)
5.2 zookeeper监听机制:通过向某一节点注册提供监听能力,当节点发生某些改变(添加,删除,修改)触发watcher,得到触发事件。
5.3zookeeper的选举机制:
第一种:第一次启动,第二种lead挂了
zookeeper默认的算法:fastleaderelection,采用投票数大于半数则胜出
服务器id:myid服务器编号越大权重越大。
选举状态:looking竞选状态;follower 随从同步leader;observer观察者不参与投票 ;leading领导者;
数据id:version越大数据越新权重越大;
逻辑时钟:投票次数
第一次和myid还有启动顺序有关;
非全新选举(leader宕机):剩余主机不过半,否则挂掉不能正常工作;
数据的新旧:mzxid相同
mzxid不相等时:
二.大数据导论和Hadoop
2.1大数据:海量数据的存储和计算
2.2特点:大 ,种类多, 价值密度低,快,信(数据质量)
2.3大数据的分析步骤:需求分析 --》数据收集–》数据处理–》数据分析–》数据展现–》报告撰写
2.4Hadoop介绍:Java开源框架包含hdfs(分布式文件系统)mapreduce(分布式运算)yarn(作业调度和集群资源管理)
扩展能力强,成本低 ,高效,可靠
1.0只有MapReduce和hdfs;2.0
2.5Hadoop架构
高可用集群
最完美
2.5Hadoop安装搭建
1.
2.环境准备:
重新编译hadoop
上传,安装,更改配置文件:
vim core-site.xml
在该文件中的标签中添加以下配置,
在这里添加配置
cd /export/server/hadoop-2.7.5/etc/hadoop
vim core-site.xml
配置内容如下:
fs.defaultFS hdfs://node1:8020 hadoop.tmp.dir /export/server/hadoop-2.7.5/hadoopDatas/tempDatas io.file.buffer.size 4096 fs.trash.interval 10080
配置 hdfs-site.xml
配置一下内容
dfs.namenode.secondary.http-address node2:50090 dfs.namenode.http-address node1:50070 dfs.namenode.name.dir file:///export/server/hadoop-2.7.5/hadoopDatas/namenodeDatas dfs.datanode.data.dir file:///export/server/hadoop-2.7.5/hadoopDatas/datanodeDatas dfs.namenode.edits.dir file:///export/server/hadoop-2.7.5/hadoopDatas/nn/edits dfs.namenode.checkpoint.dir file:///export/server/hadoop-2.7.5/hadoopDatas/snn/name dfs.namenode.checkpoint.edits.dir file:///export/server/hadoop-2.7.5/hadoopDatas/dfs/snn/edits dfs.replication 3 dfs.permissions false dfs.blocksize 134217728
配置 mapred-site.xml
在这里添加配置 vim mapred-site.xml 配置一下内容:mapreduce.framework.name yarn mapreduce.job.ubertask.enable true mapreduce.jobhistory.address node1:10020 mapreduce.jobhistory.webapp.address node1:19888
配置mapred-env.sh
vim mapred-env.sh export JAVA_HOME=/export/server/jdk1.8.0_241
配置 yarn-site.xml
vim yarn-site.xml
添加以下配置:
yarn.resourcemanager.hostname node1 yarn.nodemanager.aux-services mapreduce_shuffle yarn.log-aggregation-enable true yarn.log-aggregation.retain-seconds 604800 yarn.nodemanager.resource.memory-mb 2048 yarn.scheduler.minimum-allocation-mb 2048 yarn.nodemanager.vmem-pmem-ratio 2.1
配置 slaves
vim slaves
删除slaves中的localhost,然后添加以下内容:
node1 node2 node3
5.目录创建
创建Hadoop所需目录
mkdir -p /export/server/hadoop-2.7.5/hadoopDatas/tempDatas mkdir -p /export/server/hadoop-2.7.5/hadoopDatas/namenodeDatas mkdir -p /export/server/hadoop-2.7.5/hadoopDatas/datanodeDatas mkdir -p /export/server/hadoop-2.7.5/hadoopDatas/nn/edits mkdir -p /export/server/hadoop-2.7.5/hadoopDatas/snn/name mkdir -p /export/server/hadoop-2.7.5/hadoopDatas/dfs/snn/edits
6.文件分发
将配置好的Hadoop目录分发到node2和node3主机。
scp -r /export/server/hadoop-2.7.5/ node2:/export/server/ scp -r /export/server/hadoop-2.7.5/ node3:/export/server/
- 配置Hadoop的环境变量
注意,三台机器都需要执行以下命令
vim /etc/profile
添加以下内容:
export HADOOP_HOME=/export/server/hadoop-2.7.5 export PATH=:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
配置完成之后生效
source /etc/profile
- 启动集群
8.1 启动方式
要启动Hadoop集群,需要启动HDFS和YARN两个集群。
注意:首次启动HDFS时,必须对其进行格式化操作。本质上是一些清理和准备工作,因为此时的HDFS在物理上还是不存在的。
在node1上执行格式化指令
hadoop namenode -format
方式1-单节点逐个启动
在node1主机上使用以下命令启动HDFS NameNode:
hadoop-daemon.sh start namenode
在node1、node2、node3三台主机上,分别使用以下命令启动HDFS DataNode:
hadoop-daemon.sh start datanode
在node1主机上使用以下命令启动YARN ResourceManager:
yarn-daemon.sh start resourcemanager
在node1、node2、node3三台主机上使用以下命令启动YARN nodemanager:
yarn-daemon.sh start nodemanager
以上脚本位于/export/server/hadoop-2.7.5/sbin目录下。如果想要停止某个节点上某个角色,只需要把命令中的start改为stop即可。
8.2 方式2-脚本一键启动
启动HDFS
start-dfs.sh
启动Yarn
start-yarn.sh
启动历史任务服务进程
mr-jobhistory-daemon.sh start historyserver
8.3 方式3-全部一键启动
启动HDFS和Yarn
start-all.sh
9.停止集群:stop-dfs.sh、stop-yarn.sh、mr-jobhistory-daemon.sh stophistoryserver
10. 集群的页面访问
10.1IP访问
一旦Hadoop集群启动并运行,可以通过web-ui进行集群查看,如下所述:
查看NameNode页面地址:
http://192.168.88.161:50070/
查看Yarn集群页面地址:
http://192.168.88.161:8088/cluster
查看MapReduce历史任务页面地址:
http://192.168.88.161:19888/jobhistory
10.2主机名访问
请注意,以上的访问地址只能使用IP地址,如果想要使用主机名,则对Windows进行配置。
配置方式:
1、打开Windows的C:WindowsSystem32driversetc目录下hosts文件
2、在hosts文件中添加以下域名映射
192.168.88.161 node1 node1.itcast.cn
192.168.88.162 node2 node2.itcast.cn
192.168.88.163 node3 node3.itcast.cn
配置完之后,可以将以上地址中的IP替换为主机名即可访问,如果还不能访问,则需要重启Windows电脑,比如访问NameNode,可以使用http://node1:50070/ 。
11.hadoop上传文件
命令 hadoop fs -put 文件名 /



