zookeeper搭建和脚本编写

hadoop:
    hdfs:分布式存储
    MR: 分布式计算

hdfs:
=========================
    1、namenode(元数据)、datanode(真实数据)、2nn(检查点)

    2、hadoop-daemon.sh start namenode    //启动本机进程
       hadoop-daemons.sh start datanode    //启动slave机器进程

    3、namenode:编辑日志(hdfs oev)和镜像文件(oiv)
        编辑日志:hdfs对文件的写操作,读取文件不需要修改编辑日志
        镜像文件:hdfs文件的元数据,即索引

    4、datanode:真实数据、校验和(7字节的头部+每个chunk512字节进行的4字节校验)

    5、2nn:    每个3600s对namenode中的数据进行备份

编辑日志和镜像文件的融合:
===============================
    1、每进行一次写操作,编辑日志的id都会+1,保存在edits_inprogress中
    2、在namenode启动的时候:
        namenode处于安全模式状态(safemode),此模式下文件只可读不可写
        edits_inprogress实例化为编辑日志文件
        老镜像文件和比镜像文件id数大的编辑日志文件加载到内存,重新操作编辑日志的所有操作步骤,并产生新镜像文件
        融合过后,safemode自动退出

    3、2nn在进行日志滚动的时候
        将namenode的edits_inprogress实例化为编辑日志文件
        将此编辑日志和namenode中的镜像文件进行fetch(获取),在2nn中进行重新融合
        融合之后将新的镜像文件发送给namenode

VERSION
===================================

namenode:
    在hadoop工作目录中存在一种对节点的描述性文件
    namespaceID=133742883                //namenodeID

    clusterID=CID-126a68dc-a8c1-4517-8f28-60fb6af6c269
    cTime=0
    storageType=NAME_NODE
    blockpoolID=BP-1464761855-192.168.23.101-1520907981134
    layoutVersion=-63                //布局版本,每次格式化都-1

datanode:
    #Sun Mar 25 09:02:26 CST 2018
    storageID=DS-6068e606-1d2d-4865-aa62-1cd326ee3e64
    clusterID=CID-126a68dc-a8c1-4517-8f28-60fb6af6c269
    cTime=0
    datanodeUuid=705f0e4e-a50b-4448-84ed-fc6e2f8d2923    //每个datanode的唯一标识
                        //若所有datanodeUUID都一样,namenode会仅识别所有的datanode的一个
    storageType=DATA_NODE
    layoutVersion=-56

hdfs文件:
====================================

    串行化writable:永久存储和网络间传输
        1、紧凑
        2、快速
        3、可扩展性    //升级
        4、支持互操作    //跨平台

    压缩:
        gzip
        deflate
        bzip2        //逻辑可切割(在任何位置定位文件数据)
        lz4
        snappy
        lzo        //通过加索引的方式实现逻辑可切割

    SequenceFile:序列文件(可切割)
        扁平化的k-v

        同步点:能够定位数据

        压缩类型:
            不压缩
            记录压缩    //只压缩value
            块压缩        //压缩k-v

hdfs文件写入流程:
    block:块        //128M
    packet:包        //block的基本单位,64K
    chunk:小块        //packet的基本单位,512字节,是checkSum的校验单位
    checksum:校验和    //CRC32C校验,大小4字节
    header:        //packet的头部,大小33字节

MR过程:
    job提交流程:
    资源调度机制

Hadoop:大象

Hive:

Hbase:

Zookeeper:
    动物管理员
    分布式协调框架:

    分布式框架的好处:
        可靠性:一个或几个节点的崩溃不会导致整个集群的崩溃
        可伸缩性:可以通过动态添加主机的方式以及修改少量配置文件,以便提升集群性能
        透明性:隐藏系统的复杂性,对用户体现为一个单一的应用

    分布式框架的弊端:
        竞态条件:    一个或多个主机尝试运行一个应用,但是该应用只需要被一个主机所运行
        死锁:        两个进程分别等待对方完成
        不一致性:    数据的部分丢失

    zk,即分布式协调框架的作用:
        名字服务:    标识集群中的所有节点,(节点能够向其注册并产生唯一标识)
        配置管理:    存储配置文件,以便共享
        集群管理:    添加或删除节点同时,事实更新集群信息
        领袖推选机制:
        锁和同步服务:    当文件进行修改,会将其进行加锁,防止多用户同时写入
        高有效性数据注册:

zk中的文件是同步的:zk中的文件夹,统称为节点
    文件内容是树形结构,相当于linux文件系统,只不过是逻辑系统,类似于hdfs

    只存在路径和数据:
        /    "aaa"
        /a
        /a/b    "hello"

    配置文件最大只能存储1M数据:

ZK集群搭建:
    本地模式:
        1、解压:
            tar -xzvf zookeeper-3.4.10.tar.gz -C /soft/
        2、创建符号链接
            /soft]$ ln -s zookeeper-3.4.10 zk

        3、配置环境变量
            sudo nano /etc/profile,添加:
                export ZK_HOME=/soft/zk
                export PATH=$PATH:$ZK_HOME/bin

        4、使环境变量生效
            source /etc/profile

        5、修改${ZK_HOME}/conf/zoo_sample.cfg
            将其重命名为zoo.cfg
                mv zoo_sample.cfg zoo.cfg

        6、启动zk服务
            zkServer.sh start

    完全分布式:
        1、修改zk配置文件
            修改dataDir=/home/centos/zk
            添加如下配置:
                server.102=s102:2888:3888
                server.103=s103:2888:3888
                server.104=s104:2888:3888

            //其中102、103、104称之为myid,在1~255之间的整数
            //s102,s103,s104称为对应的ip地址
            //2888是leader端口,负责和follower进行通信
            //3888是领袖推选端口,负责所有节点进行开会(推选leader)的端口
            //3888端口在leader节点也存在

        2、修改完成后,分发zk解压目录和zk符号链接
            /soft]$    xsync.sh zookeeper-3.4.10
            /soft]$    xsync.sh zk

        3、切换到root用户,分发环境变量
            ~]# xsync.sh /etc/profile

        4、分别使s102~s104的环境变量生效
            s102 ~]$ source /etc/profile
            s103 ~]$ source /etc/profile
            s104 ~]$ source /etc/profile

        4.5、分别在~/zk/创建一个myid文件,内容如下:(提示没有文件夹,则创建zk文件夹)
            s102 ~]$ echo 102 > ~/zk/myid
            s103 ~]$ echo 103 > ~/zk/myid
            s104 ~]$ echo 104 > ~/zk/myid

        5、分别启动s102~s104的zk进程
            s102 ~]$ zkServer.sh start
            s103 ~]$ zkServer.sh start
            s104 ~]$ zkServer.sh start

zk相关命令:

    QuorumPeerMain是zk的主进程

    zkServer.sh status    //查看zk的状态
                //mode:standalone    处于独立模式

    zkServer.sh stop    //关闭zk进程

    客户端命令:
        zkCli.sh            //进入zk客户端
        zkCli.sh -server s102:2181    //进入zk远程客户端

        ls /                //列出根下节点(必须用绝对路径)
        get /                //读取根节点数据(必须用绝对路径)
        create /a tom            //创建/a节点并添加数据tom
        create /b ‘‘            //创建空节点
        //create命令无法实现递归创建

        set /a jerry            //修改节点数据
        stat /a tom            //查看节点状态,和get的区别在于没有数据
                        //也可以说,在使用get命令同时,返回了stat命令

        delete    /a/b/c/d/e        //删除节点不能有子目录
        rmr    /a            //删除节点,递归删除

        quit                //退出

ACL:
    access control list : 访问控制列表,相当于定义权限

    入口点在Zoodef下的Ids接口

zk中三种节点:
    持久节点:在zk客户端退出后,不会自动删除    //zkCli默认创建

    临时节点:在zk客户端退出后,会自动删除        //可以通过此类型节点来判断分布式服务的连接或断开

    序列节点:后缀添加一个自动增长的十位序列号    //可以通过此模式,重复注册相同的节点

编写xzk.sh 脚本:    /usr/local/bin/xzk.sh
================================
#!/bin/bash
cmd=$1
if [ $# -gt 1 ] ; then echo param must be 1 ; exit ; fi
for (( i=102 ; i<=104 ; i++ )) ; do
    tput setaf 2
    echo ================ s$i [email protected] ================
    tput setaf 9
    ssh s$i "source /etc/profile ; zkServer.sh $cmd"
done

ZK客户端编程:
====================================
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.10</version>
</dependency>

    1、列出孩子节点:
        @Test
        public void testList() throws Exception {
            //定义连接串:以,分隔 ip:port  客户端端口2181
            String conn = "s102:2181,s103:2181,s104:2181";
            //param1:连接串;param2:超时时间;param3:观察者,null
            ZooKeeper zk = new ZooKeeper(conn, 5000,null);
            //
            List<String> children = zk.getChildren("/", false);
            for (String child : children){
                System.out.println(child);
            }

        }

    2、添加节点:
        @Test
        public void testCreate() throws Exception {
            //定义连接串:以,分隔 ip:port  客户端端口2181
            String conn = "s102:2181,s103:2181,s104:2181";
            //param1:连接串;param2:超时时间;param3:观察者,null
            ZooKeeper zk = new ZooKeeper(conn, 5000,null);
            //
            String s = zk.create("/a", "tomas".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            System.out.println(s);
            zk.close();
        }

    3、递归列出指定路径下所有节点:
    public static void testLsChild(String path) {
        try {
            //定义连接串:以,分隔 ip:port  客户端端口2181
            String conn = "s102:2181,s103:2181,s104:2181";
            //param1:连接串;param2:超时时间;param3:观察者,null
            ZooKeeper zk = new ZooKeeper(conn, 5000,null);

            List<String> children = zk.getChildren(path, false);
            if (path.endsWith("/")){
            for (String child : children){
                System.out.println(path+child);
                testLsChild(path+child);
            }
            }
            else {
            for (String child : children){
                System.out.println(path+"/"+child);
                testLsChild(path+"/"+child);
            }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
     }

     4、获取相应节点数据

     5、修改(set)相应节点数据,并指定版本号

        版本号version相当于mysql中的锁,字段是自增的
        如果在修改时指定版本号和dataVersion不对应,会报badVersion异常

观察者模式:watcher
    在get、ls、和stat中有watch参数,此参数设定观察者
    如果在以上操作中制定的路径被修改(包括删除或修改数据),则出发watcher的事件

    watcher在new Zookeeper的时候实例化,并在节点发生改变时使用回调机制来进行方法调用。

    /**
     * 测试观察者模式
     * @throws Exception
     */
    @Test
    public void testWatcher() throws Exception {
        //定义连接串:以,分隔 ip:port  客户端端口2181
        String conn = "s102:2181,s103:2181,s104:2181";
        //param1:连接串;param2:超时时间;param3:观察者,null
        ZooKeeper zk = new ZooKeeper(conn, 5000, new Watcher() {
            public void process(WatchedEvent event) {
                Event.EventType type = event.getType();
                System.out.println(type.getIntValue());
                System.out.println("出事了");
            }
        });

        //
        List<String> children = zk.getChildren("/", true);
        for (String child : children){
            System.out.println(child);
        }

        for(;;){
            Thread.sleep(1000);
        }

    }

zk的领袖推选机制:leaderElection

原文地址:https://www.cnblogs.com/zyde/p/8945336.html

时间: 2024-11-03 21:49:17

zookeeper搭建和脚本编写的相关文章

ZooKeeper搭建系列集 (这套很全,也很详细)

原文链接:http://blog.csdn.net/shatelang/article/details/7596007 本篇文章结构: 总共包括10个系列 ZooKeeper系列之一:ZooKeeper简介 ZooKeeper系列之二:ZooKeeper数据模型.命名空间以及节点的概念 ZooKeeper系列之三:ZooKeeper的安装 ZooKeeper系列之四:ZooKeeper的配置 ZooKeeper系列之五:ZooKeeper的运行 ****************** ------

LoadRunner脚本编写

一.脚本编写 案例一 Action() { //请求1 web_custom_request("WebTours", //可以自定义 "URL=http://127.0.0.1:1080/WebTours/", //Get请求的地址 "Method=GET", //方式GET "Resource=0", //说明URL是否是一个资源,0代表不是资源,1代表是资源 "RecContentType=text/html&q

SecureCRT中python脚本编写

SecureCRT中python脚本编写学习指南 SecureCRT python 引言 在测试网络设备中,通常使用脚本对设备端进行配置和测试以及维护:对于PE设备的测试维护人员来说使用较多是SecureCRT工具:SecureCRT支持VB.JavaScript.Python等多种脚本语言,为了实现脚本在CRT中更加丰富稳定地执行,掌握CRT的常用函数是非常有用的.接下来的时间我将对SecureCRT脚本编写的常用函数展开学习应用. 内容 (1)使用python语言实现SecureCRT中的D

SecureCRT脚本编写常用函数(一)

SecureCRT脚本编写常用函数(一) 测试 python 引言 在测试网络设备中,通常使用脚本对设备端进行配置和测试以及维护:对于PE设备的测试维护人员来说使用较多是SecureCRT工具:SecureCRT支持VB.JavaScript.Python等多种脚本语言,为了实现脚本在CRT中更加丰富稳定地执行,掌握CRT的常用函数是非常有用的.接下来的时间我将对SecureCRT脚本编写的常用函数展开学习应用. 索引 本阶段重点对SecureCRT中Screen相关函数进行学习,针对Pytho

LoadRunner学习---脚本编写(4)(比较重要)

今天接着来翻译http://www.wilsonmar.com/中关于LoadRunner脚本编写部分,下面该翻译脚本编写中一些比较重要的部分了. Web用户Action 在VuGen中,脚本产生的默认模式是基于HTML的--“描述用户的动作的脚本”直接与用户的动作是对应的: * web_url是浏览器地址栏的URL. * web_link是点击在<a href= ...>和<a>之间的文本超链接. * web_image是点击HTML的<img href= link. *

Linux 脚本编写基础

1. Linux 脚本编写基础1.1 语法基本介绍1.1.1 开头程序必须以下面的行开始(必须放在文件的第一行):#!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执行:编译 chmod +x filename 这样才能用./filename 来运行1.1.2 注释 在进行shell编程时,以#开头的句子表示注释,直到这一行的结束.我们真诚地建议您在程序中使用

Android Monkey 脚本编写与检查内存泄露

一.Monkey脚本编写 1.Monkey脚本格式 脚本优势: 简单快捷,不需要接触任何工具,只需要一个记事本文件 脚本缺点: 实现坐标.按键等基本操作的相应步骤,顺序脚本无逻辑性 脚本源码: \development\cmds\monkey\src\com\android\commands\monkey\MonkeySourceScrip.java #头文件.控制monkey发送消息的参数 type=raw events count=10 speed=1.0 #以下为monkey命令 star

wap图片滚动特效_无css3 元素js脚本编写

手机图片滑动切换,网上有很多这样的例子,但都借助于其他组件,让代码混乱的不行:还有就是用到css3里的 transform:translate(x,y);移动元素,不过发现在不支持css3的设备上马上完蛋了,所 有下定决心自己做一个,谁知出现了很多的问题,其中最重要的是给图片加链接,网页中的上下滚动条不能在拖动图片的时候滚动,并且不能兼容pc机器上的拖动:在这里就简单介绍一下遇到的问题和解决的方法: 问题一:给图片加上链接后,在拖动的时候总是跳到其他页面: 问题根源主要是不能判断是点击还是拖动,

windows下注册表脚本编写

Reg文件就是我今天所说的注册表脚本文件,双击可将其中的数据写入注册表.利用注册表脚本文件可以对注册表进行关于键值的任何操作,而且还不受注册表被禁用的限制.     我们平常对注册表的修改大体上可以分为两种:     1.对注册表子键的修改;     2.对子键下的键值的修改;     下面依次对这两种修改做个简略的介绍.    一,对子键的修改(1)添加子键     操作:只需在主体文件部分加入"[ ]"即可     例如:在HKEY_CURRENT_USER/Software下添加