1. ZK的监控机制

1.1 监听数据的变化

 (1)监听一次

public class ChangeDataWacher {
public static void main(String[] args) throws Exception {
// 连接并获取zk客户端的对象
ZooKeeper zk = new ZooKeeper("feng01:2181,feng02:2181,feng03:2181", 2000, null);
zk.getData("/user", new Watcher() {
// 当事件触发时会执行这个方法
@Override
public void process(WatchedEvent event) {
System.out.println("事件的类型:"+"路径"+event.getPath());
}
}, null);
Thread.sleep(Integer.MAX_VALUE);
}
}

当在服务器上set  /user  hang(改变节点数据)会出现如下变化(只能监听一次,再次改变节点数据,监听不到)

 (2)多次监听

public class ChangeDataWacher {
public static void main(String[] args) throws Exception {
// 连接并获取zk客户端的对象
ZooKeeper zk = new ZooKeeper("feng01:2181,feng02:2181,feng03:2181", 2000, null);
zk.getData("/user", new Watcher() {
// 当事件触发时会执行这个方法
@Override
public void process(WatchedEvent event) {
try {
System.out.println("事件的类型:"+"路径"+event.getPath());
byte[] data = zk.getData("/user", this, null);
System.out.println(new String(data));
} catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
}
}, null);
Thread.sleep(Integer.MAX_VALUE);
}
}

1.2  监听节点的变化(getChildren)

public class ChangeNodeWacher {
public static void main(String[] args) throws Exception {
// 连接并获取zk客户端对象
ZooKeeper zk = new ZooKeeper("feng01:2181,feng02:2181,feng03:2181", 2000, null);
zk.getChildren("/user", new Watcher() {
// 当事件触发时,会执行此方法
@Override
public void process(WatchedEvent event) {
System.out.println("事件的类型是:"+event.getType()+"路径"+event.getPath());
try {
List<String> children = zk.getChildren("/user",this, null);
for (String node : children) {
System.out.println(node);
}
} catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
}
}, null);
Thread.sleep(Integer.MAX_VALUE);
}
}

当在zookeeper服务端增删节点时,如下

会出现如下监听情况

2. 动态感知服务上下线案例

 分布式服务端:

public class DistributeServer {
ZooKeeper zk = null;
// 所有server节点的父节点,要监控的节点
String parentPath = "/servers" ;
/**
* 初始化zk客户端对象
* @throws Exception
*/
public void init() throws Exception{
zk = new ZooKeeper("feng01:2181,feng02:2181,feng03:2181", 2000, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("zk客户端连接成功");
}
});
}
/**
* 向zk集群注册服务
* @param hostName
* @throws Exception
* @throws InterruptedException
*/
public void registerServer(String hostName) throws Exception, InterruptedException {
zk.create(parentPath+"/server", hostName.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
System.out.println(hostName+"上线了。。。。。");
}
/**
* 正在进行的服务任务
* @throws Exception
*/
public void service() throws Exception {
System.out.println("正在处理服务。。。。。。");
Thread.sleep(Integer.MAX_VALUE);
} public static void main(String[] args) throws Exception {
DistributeServer ds = new DistributeServer() ;
ds.init();
ds.registerServer(args[0]);
ds.service();
}
}

运行Run as----->Run Configuration。。。。(输入参数feng01),运行结果如下:

分布式客户端

public class DistributeClient {
ZooKeeper zk = null;
String parentPath = "/servers" ;
/**
* 初始化zk客户端对象
* @throws Exception
*/
public void init() throws Exception {
zk = new ZooKeeper("feng01:2181,feng02:2181,feng03:2181", 2000, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("zk客户端连接成功");
}
});
} public void getHost() throws Exception, InterruptedException {
zk.getChildren(parentPath, new Watcher() {
@Override
public void process(WatchedEvent event) {
List<String> list = new ArrayList<>();
try {
// 当节点发生变化时,重新获取子节点,并将子节点的值放入list
List<String> children = zk.getChildren(parentPath, this);
for (String node : children) {
byte[] data = zk.getData(parentPath+"/"+node, null, null);
list.add(new String(data));
}
// 获取子节点的值
System.out.println("正在服务的机器有:"+list);
} catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
}
});
Thread.sleep(Integer.MAX_VALUE);
} public static void main(String[] args) throws Exception {
DistributeClient client = new DistributeClient();
client.init();
client.getHost();
}
}

 3.hdp的高可用基本原理的工作流程

 原理图

可看博客   https://www.cnblogs.com/zsql/p/11560372.html

  在hadoop2.0中(在2.0以下是由一个namenode)通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。

 namenode是整个hdfs的核心,如果namenode出现单点故障了,那么整个hdfs文件系统也不能提供服务,所以hadoop2.x对hdfs提供了高可用的方案,即Hadoop HA。hdfs的高可用提供了两种方案,一种是基于QJM(Quorum Journal Manager)的,一种是基于NFS的,我们用的一般都是基于QJM的,所以这里也是讲基于QJM的高可用,高可用用来解决NameNode单点故障的问题。解决的方法是在HDFS集群中设置多个NameNode节点,但是多个namenode会产生如下问题:

(1)如何保证多个namenode的元数据一致

  这里以两台namenode机器为例,一台状态为active(活跃状态),另一台为standby状态(备用状态)。DataNode只会将心跳信息和Block汇报信息发给活跃的NameNode。为了保证两个namenode的数据同步,hadoop中引入了journalNode(JN, 日志管理系统)。若是直接在活跃的namenode中记录日志文件,其就必须提供下载服务,供standby状态的namenode进行下载,然后进行信息的同步,但这样无疑增加了active状态的namenode的工作压力,所以就有了JN。为了防止JN出现单点故障问题,其也是一个集群,当客户端进行相关操作时(如mkdir),该操作就会被记录到该日志文件管理系统中,处于standby状态的datanode就会将之下载下来,下载得到日志信息会被FsImage对象读取并序列化得到image文件,同时该镜像(image)文件会被定期发送给active的namenode,从而实现两者的元数据一致

  注意:有关JN

  journal系统和namenode的本地磁盘都会记录日志信息,因为写journal是网络传输,而本地磁盘更快更安全。namenode重启时,加载本地日志回复元数据也更快,JN主要是为了提供一个可靠的元数据同步渠道,好让standby namenode囊在active   namenode在挂掉后,也能成功取到元数据(standby只从JN中获取日志信息,原因主要是缓解namenode工作压力,如上所说)

(2)多个namenode如何进行状态切换(ZKFC

ZKFC(zk Failover Controller)是一个新组件,它是一个ZooKeeper客户端,其能监视和管理NameNode的状态。运行NameNode的每台机器也运行ZKFC

  • 运行状况监视

  ZKFC定期使用运行状况检查命令对其本地NameNode进行ping操作。只要NameNode及时响应健康状态,ZKFC就认为该节点是健康的。如果节点已崩溃,冻结或以其他方式进入不健康状态,则运行状况监视器会将其标记为运行状况不佳。

  •  ZooKeeper会话管理 :

  当本地NameNode运行正常时,ZKFC在ZooKeeper中保持会话打开。如果本地NameNode处于活动状态,它还拥有一个特殊的“锁定”znode。此锁使用ZooKeeper对“临时”节点的支持; 如果会话过期,将自动删除锁定节点。

  • 基于ZooKeeper的选举 :

  如果本地NameNode是健康的,并且ZKFC发现没有其他节点当前持有锁znode,它将自己尝试获取锁。如果成功,那么它“赢得了选举”,并负责运行故障转移以使其本地NameNode处于活动状态。故障转移过程类似于上述手动故障转移:首先,需对先前的活跃namenode进行隔离(防止出现脑裂的情况),然后本地NameNode转换为活动状态。

此处基于Zookeeper的选举需注意:    若将standby状态的namenode切换为活跃的namenode时,需要确保先前的活跃的namenode被杀死,在将standby状态的namenode切换为active前,其会向原先的机器发送kill 命令(kill -9 namenode(Pid)),确保原先活跃的namenode没在工作,否则两个namenode都处于活跃状态的话就会出现争抢共享资源的情况(脑裂

 4. HDFS-HA的配置详解

 4.0 说明:

自己总共使用虚拟机创建了4台机器feng01,feng02,feng03,feng04,各个机器的组件有无如下表(下面自己只配置HDFS HA)

 注意:  Datanode和nodemanage尽量配置在同一台机器(Nodemanage是用来处理任务(Task)的,而Task是用来处理的数据的,若是nodemanage需要处理的数据就在本地的datamanage中,本地处理效率高

4.1 前期准备(前面笔记有讲以下这些配置)

  • linux主机名   域名映射
  • ip配置  防火墙关闭
  • 集群的免密配置
  • 每个机器的免密配置
  • zk集群正常启动
  • hadoop的安装

4.2 修改hadoop中的core-site.xml文件 

<configuration>
<!-- 指定hdfs的nameservice为doit11 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://doit11/</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/myha/hdpdata/</value>
</property> <!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>doit01:2181,doit02:2181,doit03:2181</value>
</property>
</configuration>

4.3 修改hdfs-site.xml

<configuration>
<!--指定hdfs的nameservice为doit11,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>doit11</value>
</property>
<!-- doit11下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.doit11</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.doit11.nn1</name>
<value>doit01:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.doit11.nn1</name>
<value>doit01:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.doit11.nn2</name>
<value>doit02:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.doit11.nn2</name>
<value>doit02:50070</value>
</property>
<!-- 指定NameNode的edits元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://doit01:8485;doit02:8485;doit03:8485/doit11</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/myha/journaldata</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.doit11</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>

4.4 将配置好的hadoop拷贝到其他节点中去

  scp -r  /usr/apps/hadoop-2.8.5 feng02:/usr/apps/

 4.5 启动zookeeper集群

   zkServer.sh start(分别在feng01,feng02,feng03上启动)

  查看状态(zkServer.sh status):一个leader,两个follower

4.6 手动启动journalnode(分别在feng01,feng02,feng03)

  hadoop-daemon.sh start journalnode

  运行jps命令检验,feng01、feng02、feng03上多了JournalNode进程

 4.7 格式化namenode

  在feng01上执行命令:hdfs namenode -formatc

  格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里自己配置的是/myha/hdpdata,同时将这个文件拷贝至另一台namenode机器上(feng02)

4.8 格式化ZKFC(在feng01上进行)

  hdfs zkfc -formatZK

4.9 启动HDFS(在deng01上执行)

  start-dfs.sh

到此为止HDFS  HA就算配置完成了,接下来是验证配置是否成功

(1)访问http://feng01:50070,可得NameNode 'feng01:9000' (active)

    访问http://feng02:50070 , 可得NameNode 'feng02:9000' (standby)

(2)向hdfs上传一个文件

  hadoop fs -put /etc/profile /profile

(3)kill掉active的NameNode

(4)这个时候访问http://feng02:50070 ,会发现,namenode编程active。同时在hdfs的根目录下能发现profile文件

(5)手动启动刚才kill掉的namenode

  hadoop-daemon.sh start namenode

(6)继续访问http://feng01:50070,可得NameNode 'feng01:9000' (standby)

这样就表示HDFS HA配置成功

5. Hbase(具体见HBASE教程)

5.1 简介  

(1)mysql   关系型数据库等传统数据库有如下瓶颈

  • 并发量有限, 当并发量大的时候,简单的单表查询就有可能很慢
  • 存储的数据条数有限, 如果数据量非常大  查询很慢

(2)HBase是一个分布式数据库系统(在关系型和菲关系型数据库nosql之间),其特点是高可靠性、高性能、面向列、可伸缩

  • 高可靠性:数据的可靠和服务(集群)的可靠性。原因:hbase4是基于HDFS存储数据的(hdfs会有多个数据副本) 
  • 高性能:在上亿条数据中查询结果控制在几十或者几百毫秒以内(分布式存储和分布式运算) , 将数据上亿条数据存储在不同的机器上 , 在查找额时候快速的找到元数据 找到对应的这条数据所在的机器节点 (快速定位)
  • 可伸缩:存储的伸缩性  分布式的数据库系统  基于hdfs(横向扩容)  运算机器(为我们提供服务的机器可以添加或者减少)

(3)存储的方式:

  本质:数据在磁盘中存储大量的key-value数据

  一个完整的ket由三段组成:行键:列族名:列明(rowkey:columnFamily:qualifier),如下

  RowKey:用来表示唯一一行记录的主键,HBase的数据是按照RowKey的字典顺序进行全局排序的,所有的查询都只能依赖于这一个排序维度。

Hbase中的数据没有类型约束的(所谓没有类型,其实就是byte[])

f  在物理上,hbase的这些key-value是按“完整key”的字典顺序有序存储的

(4)面向列,如下图

 HBASE的物理数据存储是按列族分开存储的,所以hbase被称之为列式存储数据库。在对应的HDFS中,一张表对应一个文件夹,下面有表的列族的子文件夹(如上图的f1,f2)

注意:列族不要定的太多(若按region来查询数据的话,就需要跨多个子文件夹来查询数据),列族名尽可能短

5.2 安装

5.2.1 前提:

  • HDFS可以启动
  • zk集群启动
  • 时间同步

(1)连接时间服务器,自动同步时间,需要安装ntpdata(yum -y install ntpdate.x86_64),安装前检查本地yum源(yum list | grep ntpdate)

  连接时间服务器: ntpdate 0.asia.pool.ntp.org

(2)手动设置

  date -s  ‘2019-10-11 16:00:00’

5.2.2 安装过程:

(1)上传解压:

tar -zxvf  hbase-2.0.4-bin.tar.gz  -C  /usr/apps/

(2)hbase配置

  • 修改如下内容(vi  /usr/apps/hbase-2.0.4/conf/hbase-env.sh)
export JAVA_HOME=/usr/apps/jdk1.8.0_141/
export HBASE_MANAGES_ZK=false // 表示禁用hbase自带的zk
  • hbase-site.xml修改内容:
<configuration>
<!-- 指定hbase在HDFS上存储的路径 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://linux01:9000/hbase</value>
</property>
<!-- 指定hbase是分布式的 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定zk的地址,多个用“,”分割 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>linux91:2181,linux02:2181,linux03:2181</value>
</property>
</configuration>
  • regionservers 配置,表示启动机器的regionserver的设置(注:通常应该将regionserver配置为datanode相同的server上以实现本地存储,提升性能)

linux01
linux02
linux03

(3)集群分发

scp -r hbase-2.0.4/ linux02:/usr/apps  
scp -r hbase-2.0.4/ linux03:/usr/apps 

(4)环境变量配置(vi /etc/profile)

(4)启动

  • 启动方式一:
hbase-daemon.sh start master
hbase-daemon.sh start regionserver
  • 启动方式:二:
start-hbase.sh  一键启动

(5)页面访问

启动成功后,可以通过“host:port”的方式来访问HBase管理页面,例如:

 5.3 shell客户端

  见文档

 5.4 java客户端

  见文档

大数据学习day11------hbase_day01----1. zk的监控机制,2动态感知服务上下线案例 3.HDFS-HA的高可用基本的工作原理 4. HDFS-HA的配置详解 5. HBASE(简介,安装,shell客户端,java客户端)的更多相关文章

  1. logback常用配置详解及logback简介

    logback 简介(一) Ceki Gülcü在Java日志领域世界知名.他创造了Log4J ,这个最早的Java日志框架即便在JRE内置日志功能的竞争下仍然非常流行.随后他又着手实现SLF4J 这 ...

  2. 大数据学习--day11(抽象类、接口、equals、compareTo)

    抽象类.接口.equals.compareTo 什么是抽象方法  ?     区分于正常的方法       1.使用了 abstract 修饰符          该修饰符修饰方法 则该方法就是抽象方 ...

  3. 大数据学习——点击流日志每天都10T,在业务应用服务器上,需要准实时上传至(Hadoop HDFS)上

    点击流日志每天都10T,在业务应用服务器上,需要准实时上传至(Hadoop HDFS)上 1需求说明 点击流日志每天都10T,在业务应用服务器上,需要准实时上传至(Hadoop HDFS)上 2需求分 ...

  4. Java从入门到精通——数据库篇Mongo DB 安装启动及配置详解

    一.概述     Mongo DB 下载下来以后我们应该如何去安装启动和配置才能使用Mongo DB,本篇博客就给大家讲述一下Mongo DB的安装启动及配置详解. 二.安装 1.下载Mongo DB ...

  5. 基于 CentOS Mysql 安装与主从同步配置详解

    CentOS Mysql 安装 Mysql (Master/Slave) 主从同步 1.为什么要使用主从同步 1.如果主服务器出现问题,可以快速切换到从服务器提供的服务 2.可以在从服务器上执行查询操 ...

  6. 大数据学习day26----hive01----1hive的简介 2 hive的安装(hive的两种连接方式,后台启动,标准输出,错误输出)3. 数据库的基本操作 4. 建表(内部表和外部表的创建以及应用场景,数据导入,学生、分数sql练习)5.分区表 6加载数据的方式

    1. hive的简介(具体见文档) Hive是分析处理结构化数据的工具   本质:将hive sql转化成MapReduce程序或者spark程序 Hive处理的数据一般存储在HDFS上,其分析数据底 ...

  7. 大数据学习day31------spark11-------1. Redis的安装和启动,2 redis客户端 3.Redis的数据类型 4. kafka(安装和常用命令)5.kafka java客户端

    1. Redis Redis是目前一个非常优秀的key-value存储系统(内存的NoSQL数据库).和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list ...

  8. 大数据学习(16)—— HBase环境搭建和基本操作

    部署规划 HBase全称叫Hadoop Database,它的数据存储在HDFS上.我们的实验环境依然基于上个主题Hive的配置,参考大数据学习(11)-- Hive元数据服务模式搭建. 在此基础上, ...

  9. 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

    引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...

随机推荐

  1. Python matplotlib numpy 曼德尔布罗特集合 曼德尔布罗特 B.Madelbrot

    import numpy as np import matplotlib.pyplot as plt def mandelbrot(h,w,maxit=20): y,x = np.ogrid[-1.4 ...

  2. Luogu P1023 [NOIp2000提高组]税收与补贴问题 | 数学

    题目链接 思路:列不等式组,然后解出不等式,得出答案的取值范围,最后取一个绝对值最小的答案就行了. #include<iostream> #include<cstdio> #i ...

  3. Spring Cloud Alibaba环境搭建

    前言:Spring Cloud Alibaba是目前主流的分布式微服务架构,本文主要讲解了在IDEA中如何搭建Spring Cloud Alibaba环境,以及介绍Spring Cloud Aliba ...

  4. 【Azure 存储服务】如何把开启NFS 3.0协议的Azure Blob挂载在Linux VM中呢?(NFS: Network File System 网络文件系统)

    问题描述 如何把开启NFS协议的Azure Blob挂载到Linux虚拟机中呢? [答案]:可以使用 NFS 3.0 协议从基于 Linux 的 Azure 虚拟机 (VM) 或在本地运行的 Linu ...

  5. AppScan 10安装使用

    一.简介 AppScan是IBM的一款web安全扫描工具,具有利用爬虫技术进行网站安全渗透测试的能力,能够根据网站入口自动摸取网页链接进行安全扫描,提供了扫描.报告和修复建议等功能. appscan有 ...

  6. 西邮Linux兴趣小组第一次技术分享会

    2016年10月30日晚,西邮Linux兴趣小组技术分享会在西安邮电大学长安校区东区逸夫教学楼FF305室成功举办.200多名来自全校不同专业的15,16级同学参加了此次分享会. 分享会于20:00正 ...

  7. k8s入坑之路(8)kube-proxy详解

    kube-proxy 每台机器上都运行一个 kube-proxy 服务,它监听 API server 中 service 和 endpoint 的变化情况,并通过 iptables 等来为服务配置负载 ...

  8. Django 中间件 详细总结

    一.什么是中间件 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影 ...

  9. v-html | 数据内容包含元素标签或者样式

    问题 如果我们展示的数据包含元素标签或者样式,我们想展示标签或样式所定义的属性作用,该怎么进行渲染 插值表达式{{}}和v-text指令被直接解析为了字符串元素. <body> <d ...

  10. 如何系统学习C 语言(下)之 预处理命令篇

    大话c语言(下)之 预处理命令篇 预处理就是在编译之前,通过一些预处理命令对源代码进行管理和控制的过程. 由源代码得到可执行的程序,会经过预处理.编译.汇编和链接几个过程 预处理命令大致可以分为文件包 ...