zookeeper

  1. 协同服务系统。
  2. 分布式系统协同处理。
  3. 小集群.

单机版

  1. 文件系统层级结构存储。
  2. path:/home/centos/xxx = znode ---> byte[] <= 1M
  3. 节点类型:1. 永久 2.临时 3.序列节点。10递增.
  4. 数据状态:版本.
  5. zkServer.sh start
  6. zkServer.sh status
  7. zkCli.sh -server s201:2181
  8. [zkCli]ls /
  9. [zkCli]create / ""
  10. [zkCli]get /
  11. [zkCli]set /
  12. [zkCli]rmr /
  13. api
  14. ZooKeeper zk = new ZooKeeper("s201:2181,s202:2181,...");

zk架构

  1. 1.Client
  2. server获取信息,周期性发送数据给server,表示自己还活着。
  3. client连接时,server回传ack信息。
  4. 如果client没有收到reponse,自动重定向到另一个server.
  5. 2.Server
  6. zk集群中的一员,向client提供所有service,回传ack信息给client,表示自己还活着。
  7. 3.ensemble
  8. 一组服务器。
  9. 最小节点数是3.
  10. 4.Leader
  11. 如果连接的节点失败,自定恢复,zk服务启动时,完成leader选举。
  12. 5.Follower
  13. 追寻leader指令的节点。

znode

  1. zk中的节点,维护了stat,由Version number, Action control list (ACL), Timestamp,Data length.构成.
  2. data version //数据写入的过程变化
  3. ACL //action control list,

节点类型

  1. 1.持久节点
  2. client结束,还存在。
  3. 2.临时节点
  4. client活动时有效,断开自动删除。临时节点不能有子节点。
  5. leader推选是使用。
  6. 3.序列节点
  7. 在节点名之后附加10个数字,主要用于同步和锁.

Session

  1. Session中的请求以FIFO执行,一旦client连接到serversession就建立了。sessionid分配client.
  2. client以固定间隔向server发送心跳,表示sessionvalid的,zk集群如果在超时时候,没有收到心跳,
  3. 判定为client挂了,与此同时,临时节点被删除。

Watches

  1. 观察。
  2. client能够通过watch机制在数据发生变化时收到通知。
  3. client可以在read 节点时设置观察者。watch机制会发送通知给注册的客户端。
  4. 观察模式只触发一次。
  5. session过期,watch机制删除了。

zk工作流程

  1. zk集群启动后,client连接到其中的一个节点,这个节点可以leader,也可以follower
  2. 连通后,node分配一个idclient,发送ack信息给client
  3. 如果客户端没有收到ack,连接到另一个节点。
  4. client周期性发送心跳信息给节点保证连接不会丢失。
  5. 如果client读取数据,发送请求给nodenode读取自己数据库,返回节点数据给client.
  6. 如果client存储数据,将路径和数据发送给serverserver转发给leader
  7. leader再补发请求给所有follower。只有大多数(超过半数)节点成功响应,则
  8. 写操作成功。

leader推选过程(最小号选举法)

  1. 1.所有节点在同一目录下创建临时序列节点。
  2. 2.节点下会生成/xxx/xx000000001等节点。
  3. 3.序号最小的节点就是leader,其余就是follower.
  4. 4.每个节点观察小于自己节点的主机。(注册观察者)
  5. 5.如果leader挂了,对应znode删除了。
  6. 6.观察者收到通知。

配置完全分布式zk集群

  1. 1.挑选3台主机
  2. s201 ~ s203
  3. 2.每台机器都安装zk
  4. tar
  5. 环境变量
  6. 3.配置zk配置文件
  7. s201 ~ s203
  8. [/soft/zk/conf/zoo.cfg]
  9. ...
  10. dataDir=/home/centos/zookeeper
  11. server.1=s201:2888:3888
  12. server.2=s202:2888:3888
  13. server.3=s203:2888:3888
  14. 4.在每台主机的/home/centos/zookeeper中添加myid,内容分别是1,2,3
  15. [s201]
  16. $>echo 1 > /home/centos/zookeeper/myid
  17. [s202]
  18. $>echo 2 > /home/centos/zookeeper/myid
  19. [s203]
  20. $>echo 3 > /home/centos/zookeeper/myid
  21. 5.启动服务器集群
  22. $>zkServer.sh start
  23. ...
  24. 6.查看每台服务器的状态
  25. $>zkServer.sh status
  26. 7.修改zklog目录

部署细节

  1. 1.jn节点分别启动jn进程
  2. $>hadoop-daemon.sh start journalnode
  3. 2.启动jn之后,在两个NN之间进行disk元数据同步
  4. a)如果是全新集群,先format文件系统,只需要在一个nn上执行。
  5. [s201]
  6. $>hadoop namenode -format
  7. b)如果将非HA集群转换成HA集群,复制原NNmetadata到另一个nn.
  8. 1.步骤一
  9. [s201]
  10. $>scp -r /home/centos/hadoop/dfs centos@s206:/home/centos/hadoop/
  11. 2.步骤二
  12. 在新的nn(未格式化的nn)上运行一下命令,实现待命状态引导。
  13. [s206]
  14. $>hdfs namenode -bootstrapStandby //需要s201为启动状态,提示是否格式化,选择N.
  15. 3)在一个NN上执行以下命令,完成edit日志到jn节点的传输。
  16. $>hdfs namenode -initializeSharedEdits
  17. #查看s202,s203是否有edit数据.
  18. 4)启动所有节点.
  19. [s201]
  20. $>hadoop-daemon.sh start namenode //启动名称节点
  21. $>hadoop-daemons.sh start datanode //启动所有数据节点
  22. [s206]
  23. $>hadoop-daemon.sh start namenode //启动名称节点

HA管理

  1. $>hdfs haadmin -transitionToActive nn1 //切成激活态
  2. $>hdfs haadmin -transitionToStandby nn1 //切成待命态
  3. $>hdfs haadmin -transitionToActive --forceactive nn2//强行激活
  4. $>hdfs haadmin -failover nn1 nn2 //模拟容灾演示,从nn1切换到nn2

完全0开始部署hadoop HDFS的HA集群,使用zk实现自动容灾

  1. 1.停掉hadoop的所有进程
  2. 2.删除所有节点的日志和本地数据.
  3. 3.改换hadoop符号连接为ha
  4. 4.登录每台JN节点主机,启动JN进程.
  5. [s202-s204]
  6. $>hadoop-daemon.sh start journalnode
  7. 5.登录其中一个NN,格式化文件系统(s201)
  8. $>hadoop namenode -format
  9. 6.复制201目录的下nn的元数据到s206
  10. $>scp -r ~/hadoop/* centos@s206:/home/centos/hadoop
  11. 7.在未格式化的NN(s206)节点上做standby引导.
  12. 7.1)需要保证201NN启动
  13. $>hadoop-daemon.sh start namenode
  14. 7.2)登录到s206节点,做standby引导.
  15. $>hdfs namenode -bootstrapStandby
  16. 7.3)登录201,将s201edit日志初始化到JN节点。
  17. $>hdfs namenode -initializeSharedEdits
  18. 8.启动所有数据节点.
  19. $>hadoop-daemons.sh start datanode
  20. 9.登录到206,启动NN
  21. $>hadoop-daemon.sh start namenode
  22. 10.查看webui
  23. http://s201:50070/
  24. http://s206:50070/
  25. 11.自动容灾
  26. 11.1)介绍
  27. 自动容灾引入两个组件,zk quarum + zk容灾控制器(ZKFC)。
  28. 运行NN的主机还要运行ZKFC进程,主要负责:
  29. a.健康监控
  30. b.session管理
  31. c.选举
  32. 11.2部署容灾
  33. a.停止所有进程
  34. $>stop-all.sh
  35. b.配置hdfs-site.xml,启用自动容灾.
  36. [hdfs-site.xml]
  37. <property>
  38. <name>dfs.ha.automatic-failover.enabled</name>
  39. <value>true</value>
  40. </property>
  41. c.配置core-site.xml,指定zk的连接地址.
  42. <property>
  43. <name>ha.zookeeper.quorum</name>
  44. <value>s201:2181,s202:2181,s203:2181</value>
  45. </property>
  46. d.分发以上两个文件到所有节点。
  47. 12.登录其中的一台NN(s201),在ZK中初始化HA状态
  48. $>hdfs zkfc -formatZK
  49. 13.启动hdfs进程.
  50. $>start-dfs.sh
  51. 14.测试自动容在(206是活跃节点)
  52. $>kill -9

配置RM的HA自动容灾

  1. 1.配置yarn-site.xml
  2. <property>
  3. <name>yarn.resourcemanager.ha.enabled</name>
  4. <value>true</value>
  5. </property>
  6. <property>
  7. <name>yarn.resourcemanager.cluster-id</name>
  8. <value>cluster1</value>
  9. </property>
  10. <property>
  11. <name>yarn.resourcemanager.ha.rm-ids</name>
  12. <value>rm1,rm2</value>
  13. </property>
  14. <property>
  15. <name>yarn.resourcemanager.hostname.rm1</name>
  16. <value>s201</value>
  17. </property>
  18. <property>
  19. <name>yarn.resourcemanager.hostname.rm2</name>
  20. <value>s206</value>
  21. </property>
  22. <property>
  23. <name>yarn.resourcemanager.webapp.address.rm1</name>
  24. <value>s201:8088</value>
  25. </property>
  26. <property>
  27. <name>yarn.resourcemanager.webapp.address.rm2</name>
  28. <value>s206:8088</value>
  29. </property>
  30. <property>
  31. <name>yarn.resourcemanager.zk-address</name>
  32. <value>s201:2181,s202:2181,s203:2181</value>
  33. </property>
  34. 2.使用管理命令
  35. //查看状态
  36. $>yarn rmadmin -getServiceState rm1
  37. //切换状态到standby
  38. $>yarn rmadmin -transitionToStandby rm1
  39. 3.启动yarn集群
  40. $>start-yarn.sh
  41. 4.hadoop没有启动两个resourcemanager,需要手动启动另外一个
  42. $>yarn-daemon.sh start resourcemanager
  43. 5.查看webui
  44. 6.做容灾模拟.
  45. kill -9

hive的注意事项

  1. 如果配置hadoop HA之前,搭建了Hive的话,在HA之后,需要调整路径信息.
  2. 主要是修改mysql中的dbs,tbls等相关表。

Hbase

  1. hadoop数据库,分布式可伸缩大型数据存储。
  2. 用户对随机、实时读写数据。
  3. 十亿行 x 百万列。
  4. 版本化、非关系型数据库。

Feature

  1. Linear and modular scalability. //线性模块化扩展方式。
  2. Strictly consistent reads and writes. //严格一致性读写
  3. Automatic and configurable sharding of tables //自动可配置表切割
  4. Automatic failover support between RegionServers. //区域服务器之间自动容在
  5. Convenient base classes for backing Hadoop MapReduce jobs with Apache HBase tables. //
  6. Easy to use Java API for client access. //java API
  7. Block cache and Bloom Filters for real-time queries //块缓存和布隆过滤器用于实时查询
  8. Query predicate push down via server side Filters //通过服务器端过滤器实现查询预测
  9. Thrift gateway and a REST-ful Web service that supports XML, Protobuf, and binary data encoding options //
  10. Extensible jruby-based (JIRB) shell //
  11. Support for exporting metrics via the Hadoop metrics subsystem to files or Ganglia; or via JMX //可视化
  12. 面向列数据库。

hbase存储机制

  1. 面向列存储,table是按row排序。

搭建hbase集群

  1. 0.选择安装的主机
  2. s201 ~ s204
  3. 1.jdk
  4. 2.hadoop
  5. 3.tar
  6. 4.环境变量
  7. 5.验证安装是否成功
  8. $>hbase version
  9. 5.配置hbase模式
  10. 5.1)本地模式
  11. [hbase/conf/hbase-env.sh]
  12. EXPORT JAVA_HOME=/soft/jdk
  13. [hbase/conf/hbase-site.xml]
  14. ...
  15. <property>
  16. <name>hbase.rootdir</name>
  17. <value>file:/home/hadoop/HBase/HFiles</value>
  18. </property>
  19. 5.2)伪分布式
  20. [hbase/conf/hbase-env.sh]
  21. EXPORT JAVA_HOME=/soft/jdk
  22. [hbase/conf/hbase-site.xml]
  23. <property>
  24. <name>hbase.cluster.distributed</name>
  25. <value>true</value>
  26. </property
  27. <property>
  28. <name>hbase.rootdir</name>
  29. <value>hdfs://localhost:8030/hbase</value>
  30. </property>
  31. 5.3)完全分布式(必做)
  32. [hbase/conf/hbase-env.sh]
  33. export JAVA_HOME=/soft/jdk
  34. export HBASE_MANAGES_ZK=false
  35. [hbse-site.xml]
  36. <!-- 使用完全分布式 -->
  37. <property>
  38. <name>hbase.cluster.distributed</name>
  39. <value>true</value>
  40. </property>
  41. <!-- 指定hbase数据在hdfs上的存放路径 -->
  42. <property>
  43. <name>hbase.rootdir</name>
  44. <value>hdfs://s201:8020/hbase</value>
  45. </property>
  46. <!-- 配置zk地址 -->
  47. <property>
  48. <name>hbase.zookeeper.quorum</name>
  49. <value>s201:2181,s202:2181,s203:2181</value>
  50. </property>
  51. <!-- zk的本地目录 -->
  52. <property>
  53. <name>hbase.zookeeper.property.dataDir</name>
  54. <value>/home/centos/zookeeper</value>
  55. </property>
  56. 6.配置regionservers
  57. [hbase/conf/regionservers]
  58. s202
  59. s203
  60. s204
  61. 7.启动hbase集群(s201)
  62. $>start-hbase.sh
  63. 8.登录hbasewebui
  64. http://s201:16010