zookeeper
协同服务系统。分布式系统协同处理。小集群.
单机版
文件系统层级结构存储。path:/home/centos/xxx = znode ---> byte[] <= 1M节点类型:1. 永久 2.临时 3.序列节点。10递增.          数据状态:版本.zkServer.sh startzkServer.sh statuszkCli.sh -server s201:2181[zkCli]ls /[zkCli]create / ""[zkCli]get /[zkCli]set /[zkCli]rmr /apiZooKeeper zk = new ZooKeeper("s201:2181,s202:2181,...");
zk架构
1.Client    从server获取信息,周期性发送数据给server,表示自己还活着。    client连接时,server回传ack信息。    如果client没有收到reponse,自动重定向到另一个server.2.Server    zk集群中的一员,向client提供所有service,回传ack信息给client,表示自己还活着。3.ensemble    一组服务器。    最小节点数是3.4.Leader    如果连接的节点失败,自定恢复,zk服务启动时,完成leader选举。5.Follower    追寻leader指令的节点。
znode
zk中的节点,维护了stat,由Version number, Action control list (ACL), Timestamp,Data length.构成.data version        //数据写入的过程变化ACL                    //action control list,
节点类型
1.持久节点    client结束,还存在。2.临时节点    在client活动时有效,断开自动删除。临时节点不能有子节点。    leader推选是使用。3.序列节点    在节点名之后附加10个数字,主要用于同步和锁.
Session
Session中的请求以FIFO执行,一旦client连接到server,session就建立了。sessionid分配client.client以固定间隔向server发送心跳,表示session是valid的,zk集群如果在超时时候,没有收到心跳,判定为client挂了,与此同时,临时节点被删除。
Watches
观察。client能够通过watch机制在数据发生变化时收到通知。client可以在read 节点时设置观察者。watch机制会发送通知给注册的客户端。观察模式只触发一次。session过期,watch机制删除了。
zk工作流程
zk集群启动后,client连接到其中的一个节点,这个节点可以leader,也可以follower。连通后,node分配一个id给client,发送ack信息给client。如果客户端没有收到ack,连接到另一个节点。client周期性发送心跳信息给节点保证连接不会丢失。如果client读取数据,发送请求给node,node读取自己数据库,返回节点数据给client.如果client存储数据,将路径和数据发送给server,server转发给leader。leader再补发请求给所有follower。只有大多数(超过半数)节点成功响应,则写操作成功。
leader推选过程(最小号选举法)
1.所有节点在同一目录下创建临时序列节点。2.节点下会生成/xxx/xx000000001等节点。3.序号最小的节点就是leader,其余就是follower.4.每个节点观察小于自己节点的主机。(注册观察者)5.如果leader挂了,对应znode删除了。6.观察者收到通知。
配置完全分布式zk集群
1.挑选3台主机    s201 ~ s2032.每台机器都安装zk    tar    环境变量3.配置zk配置文件    s201 ~ s203    [/soft/zk/conf/zoo.cfg]    ...    dataDir=/home/centos/zookeeper    server.1=s201:2888:3888    server.2=s202:2888:3888    server.3=s203:2888:38884.在每台主机的/home/centos/zookeeper中添加myid,内容分别是1,2,3    [s201]    $>echo 1 > /home/centos/zookeeper/myid    [s202]    $>echo 2 > /home/centos/zookeeper/myid    [s203]    $>echo 3 > /home/centos/zookeeper/myid5.启动服务器集群     $>zkServer.sh start    ...6.查看每台服务器的状态    $>zkServer.sh status7.修改zk的log目录
部署细节
1.在jn节点分别启动jn进程    $>hadoop-daemon.sh start journalnode2.启动jn之后,在两个NN之间进行disk元数据同步    a)如果是全新集群,先format文件系统,只需要在一个nn上执行。        [s201]        $>hadoop namenode -format    b)如果将非HA集群转换成HA集群,复制原NN的metadata到另一个nn.        1.步骤一            [s201]            $>scp -r /home/centos/hadoop/dfs centos@s206:/home/centos/hadoop/        2.步骤二            在新的nn(未格式化的nn)上运行一下命令,实现待命状态引导。            [s206]            $>hdfs namenode -bootstrapStandby        //需要s201为启动状态,提示是否格式化,选择N.        3)在一个NN上执行以下命令,完成edit日志到jn节点的传输。            $>hdfs namenode -initializeSharedEdits            #查看s202,s203是否有edit数据.        4)启动所有节点.            [s201]            $>hadoop-daemon.sh start namenode        //启动名称节点            $>hadoop-daemons.sh start datanode        //启动所有数据节点            [s206]            $>hadoop-daemon.sh start namenode        //启动名称节点
HA管理
$>hdfs haadmin -transitionToActive nn1                //切成激活态$>hdfs haadmin -transitionToStandby nn1                //切成待命态$>hdfs haadmin -transitionToActive --forceactive nn2//强行激活$>hdfs haadmin -failover nn1 nn2                    //模拟容灾演示,从nn1切换到nn2
完全0开始部署hadoop HDFS的HA集群,使用zk实现自动容灾
1.停掉hadoop的所有进程2.删除所有节点的日志和本地数据.3.改换hadoop符号连接为ha4.登录每台JN节点主机,启动JN进程.    [s202-s204]    $>hadoop-daemon.sh start journalnode5.登录其中一个NN,格式化文件系统(s201)    $>hadoop namenode -format6.复制201目录的下nn的元数据到s206    $>scp -r ~/hadoop/* centos@s206:/home/centos/hadoop7.在未格式化的NN(s206)节点上做standby引导.    7.1)需要保证201的NN启动        $>hadoop-daemon.sh start namenode    7.2)登录到s206节点,做standby引导.        $>hdfs namenode -bootstrapStandby    7.3)登录201,将s201的edit日志初始化到JN节点。        $>hdfs namenode -initializeSharedEdits8.启动所有数据节点.    $>hadoop-daemons.sh start datanode9.登录到206,启动NN    $>hadoop-daemon.sh start namenode10.查看webui    http://s201:50070/    http://s206:50070/11.自动容灾    11.1)介绍        自动容灾引入两个组件,zk quarum + zk容灾控制器(ZKFC)。        运行NN的主机还要运行ZKFC进程,主要负责:        a.健康监控        b.session管理        c.选举    11.2部署容灾        a.停止所有进程            $>stop-all.sh        b.配置hdfs-site.xml,启用自动容灾.            [hdfs-site.xml]            <property>                <name>dfs.ha.automatic-failover.enabled</name>                <value>true</value>            </property>        c.配置core-site.xml,指定zk的连接地址.            <property>                <name>ha.zookeeper.quorum</name>                <value>s201:2181,s202:2181,s203:2181</value>            </property>        d.分发以上两个文件到所有节点。12.登录其中的一台NN(s201),在ZK中初始化HA状态    $>hdfs zkfc -formatZK13.启动hdfs进程.    $>start-dfs.sh14.测试自动容在(206是活跃节点)    $>kill -9
配置RM的HA自动容灾
1.配置yarn-site.xml    <property>        <name>yarn.resourcemanager.ha.enabled</name>        <value>true</value>    </property>    <property>        <name>yarn.resourcemanager.cluster-id</name>        <value>cluster1</value>    </property>    <property>        <name>yarn.resourcemanager.ha.rm-ids</name>        <value>rm1,rm2</value>    </property>    <property>        <name>yarn.resourcemanager.hostname.rm1</name>        <value>s201</value>    </property>    <property>        <name>yarn.resourcemanager.hostname.rm2</name>        <value>s206</value>    </property>    <property>        <name>yarn.resourcemanager.webapp.address.rm1</name>        <value>s201:8088</value>    </property>    <property>        <name>yarn.resourcemanager.webapp.address.rm2</name>        <value>s206:8088</value>    </property>    <property>        <name>yarn.resourcemanager.zk-address</name>        <value>s201:2181,s202:2181,s203:2181</value>    </property>2.使用管理命令    //查看状态    $>yarn rmadmin -getServiceState rm1    //切换状态到standby    $>yarn rmadmin -transitionToStandby rm13.启动yarn集群    $>start-yarn.sh4.hadoop没有启动两个resourcemanager,需要手动启动另外一个    $>yarn-daemon.sh start resourcemanager5.查看webui6.做容灾模拟.    kill -9
hive的注意事项
如果配置hadoop HA之前,搭建了Hive的话,在HA之后,需要调整路径信息.主要是修改mysql中的dbs,tbls等相关表。
Hbase
hadoop数据库,分布式可伸缩大型数据存储。用户对随机、实时读写数据。十亿行 x 百万列。版本化、非关系型数据库。
Feature
Linear and modular scalability.                    //线性模块化扩展方式。Strictly consistent reads and writes.            //严格一致性读写Automatic and configurable sharding of tables    //自动可配置表切割Automatic failover support between RegionServers.    //区域服务器之间自动容在Convenient base classes for backing Hadoop MapReduce jobs with Apache HBase tables.        //Easy to use Java API for client access.            //java APIBlock cache and Bloom Filters for real-time queries    //块缓存和布隆过滤器用于实时查询 Query predicate push down via server side Filters    //通过服务器端过滤器实现查询预测Thrift gateway and a REST-ful Web service that supports XML, Protobuf, and binary data encoding options    //Extensible jruby-based (JIRB) shell                    //Support for exporting metrics via the Hadoop metrics subsystem to files or Ganglia; or via JMX            //可视化面向列数据库。
hbase存储机制
面向列存储,table是按row排序。
搭建hbase集群
0.选择安装的主机    s201 ~ s2041.jdk    略2.hadoop    略3.tar     略4.环境变量    略5.验证安装是否成功    $>hbase version5.配置hbase模式    5.1)本地模式        [hbase/conf/hbase-env.sh]        EXPORT JAVA_HOME=/soft/jdk        [hbase/conf/hbase-site.xml]        ...        <property>            <name>hbase.rootdir</name>            <value>file:/home/hadoop/HBase/HFiles</value>        </property>    5.2)伪分布式        [hbase/conf/hbase-env.sh]        EXPORT JAVA_HOME=/soft/jdk        [hbase/conf/hbase-site.xml]        <property>            <name>hbase.cluster.distributed</name>            <value>true</value>        </property        <property>            <name>hbase.rootdir</name>            <value>hdfs://localhost:8030/hbase</value>        </property>    5.3)完全分布式(必做)        [hbase/conf/hbase-env.sh]        export JAVA_HOME=/soft/jdk        export HBASE_MANAGES_ZK=false        [hbse-site.xml]        <!-- 使用完全分布式 -->        <property>            <name>hbase.cluster.distributed</name>            <value>true</value>        </property>        <!-- 指定hbase数据在hdfs上的存放路径 -->        <property>            <name>hbase.rootdir</name>            <value>hdfs://s201:8020/hbase</value>        </property>        <!-- 配置zk地址 -->        <property>            <name>hbase.zookeeper.quorum</name>            <value>s201:2181,s202:2181,s203:2181</value>        </property>        <!-- zk的本地目录 -->        <property>            <name>hbase.zookeeper.property.dataDir</name>            <value>/home/centos/zookeeper</value>        </property>6.配置regionservers    [hbase/conf/regionservers]    s202    s203    s2047.启动hbase集群(s201)    $>start-hbase.sh8.登录hbase的webui    http://s201:16010