您的位置:首页 > 运维架构 > 网站架构

hadoop_2_完全分布式高可用

2016-04-01 15:43 423 查看
2 HDFS 的高可用,针对namenode(管理节点)

当namenode内存受限时,增加namenode节点叫HDFS的联邦

3 HDFS HA namenode 高可用,zookeeper 主、备

4 hadoop2.0 完全分布式 高可用,注意与keepalived不同的是 主namenode 被 备namenode接管后,若主namenode再起来是

不会被主namenode接管回去的

被接管的前提是 是两个namenode的元数据必须一样

(启动初始化(fsimage,formate格式化时生成,(格式化时会把把数据上传到JN,以供合并)格式化完成后为了保持一致,要复制到backup namenode中)、

运行过程中(edits)记录操作日志,例如添加删除树信息)

所以只能在任意一台上格式话,edits文件要共享--放在一共享目录,权限开放。

接下来 zookeeper 它本身也是一个内存数据库集群(存每一台namenode的状态

,例如心跳状态,心跳数据由failoverController这个节点发送的,它还有一个功能

是负责自动切换namenode,可见failoverController(ZKFC)是zookeeper和namenode的桥梁,它和namenode在同一台机子上。

namenode的内存不够的解决方案是 联邦(每个都各自独立,HA独立,共享datanode) 一般企业少用,因为很少有元数据超过128G的,

电信行业会用,会用3个namenode来用 1个存流量1个存短信等,因为数量级很难达到

每一个namenode有一个id号,是供zookeeper用的

hdfs-site 配置 namenode 时配置2个协议的 1 rpc是进程之间的通信 2 http,http是供web页面的

同一服务器两进程状态之间的切换,其实是一个进程远程登录到本地来访问另一个进程,所以journalnode去

访问namenode要配置私钥

core-site.xml 配置公共的属性

hdfs-site.xml 配置hdfs的属性

zookeeper 中的内存数据和磁盘上的数据是一一映射的,启动的时候加载到内存,停掉时再写到磁盘

3个zookeeper是副本,没有master

zookeeper配到core-site.xml 因为 yarn的集群也要做高可用,yarn的高可用也是用zookeeper的

搭建zookeeper高可用集群:

1 配置zookeeper 环境变量

export ZOOKEEPER_HOME=/home/zookeeper-3.4.6

export PATH=$PATH:$ZOOKEEPER_HOME/bin

2 配置zookeeper设置

/home/zookeeper-3.4.6/conf

vi zoo.cfg

zookeeper配置文件官方文档http://zookeeper.apache.org/doc/r3.4.6/zookeeperStarted.html

tickTime=2000

dataDir=/opt/zookeeper

clientPort=2181

initLimit=5

syncLimit=2

server.1=hadoop-node1:2888:3888 1 2 3 为服务编号

server.2=hasoop-node2:2888:3888

server.3=hadoop-node3:2888:3888

3 拷贝zookeeper文件到其他机器(拷贝前删掉doc)

4 注意3台一起启动 zkServer.sh start

zookeeper的日志文件,默认是在哪里启在哪里产生日志文件 zookeeper.out

启动后,内存数据库也就起来

5 搭建完全分布式的HA集群

搭建过程:

1 修改配置文件

cd /home/hadoop-2.5.1/etc/hadoop/

文档地址 file:///D:/hadoop/hadoop-2.5.2/share/doc/hadoop/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html

org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

2

cd /home/hadoop-2.5.1/etc/hadoop

vi slaves 内容:

hadoop-node2

hadoop-node3

hadoop-node4

3 zookeeper启动了,配置同步了,接下来初始化namenode和同步namenode

1 启动JN (在hadoop-node1 hadoop-node2 hadoop-node3上启动,因为JN服务器有两个节点,因为JN和datanode必须是一对一的)那么启动单节点

命令: hadoop-daemon.sh start journalnode

2 在2个namenode上,选择任意一台格式化,我选择 hadoop-node4

hdfs namenode -format

3 同步元数据:

把元文件拷贝过来,拷贝到hadoop-node1

4 元数据同步后,要格式化 zkfc (把namenode和zookeeper搭桥)

在任意一台namenode上执行

5 全部配置初始化完

启动 start-dfs.sh

6 判断是否能接管

在namenode上jps

全部停止hadoop命令

stop-dfs.sh

启动单个节点 hadoop-daemon.sh start namenode

6 计算框架MapReduce 编程(分布式计算框架,离线计算也叫批量计算)

storm 是来一点计算一点(几M几k)每计算一次出结果,它不适合计算一完整的准备好的数据

MapReduce 是批量计算

MapReduce的环境是yarn

MapReduce 是移动计算,而不是移动数据

分布式计算其实也叫网格计算,是跨网络的,有一个一个的节点

离线计算,流式计算,内存计算统称为分布式计算

1个MapReduce 程序在计算框架中运行的时候它是按照4个步骤来进行的

1 切 切成若干个小的数据片段

2 map 执行程序 (maptask程序,每一个数据片段对应一个maptask线程)

3 洗牌 对map计算之后的结果进行洗牌,排序、分组、合并、跨网络传输、序列化、反序列化

4 reduce reducetask

MapReduce一个很大的一个优点是就近计算

整个流程我分了四步。简单些可以这样说,每个map task都有一个内存缓冲区,存储着map的输出结果,

当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个map task结束后

再对磁盘中这个map task产生的所有临时文件做合并,生成最终的正式输出文件,

然后等待reduce task来拉数据。

maptask洗牌

maptask输出的数据肯定在内存

1 partition 分区 目的是决定这条数(一个key-value)据最后到哪个reduce中

2 sort 排序比较得到一个排序号,把内存中任意一条数据俩俩比较,默认算法是

根据key的ascII吗比较的

3 排完后合并然后写到磁盘,依次循环,一直等到所有数据都写到磁盘

上面的一系列操作都会在 maptask机子上maptask线程

reducetask洗牌

1 从各个maptask那台机子上去抓取数据,判断是否属于我的数据(

根据partition得到的分区号)

2 由于是从各个maptask上fetch的数据,所以要进行二次排序也就是再次比较分组,key相同的就分到一组,然后把这一组

传给reducetask,传给程序也就是放到内存缓冲区,每计算一组就输出一组

2次洗牌注意2点

1 要涉及到网络传输

2 设计到2次排序

3 都要放到缓存

map输出的每一个split块,依次进行partition sort group sort 传给 reduce 这是默认洗牌步骤

combiner 合并(自己写的程序,根据key相同来进行合并的) 是为了减少map输出的数据(到reduce),这样在跨网络时就很快

计算框架默认1 partition 默认算法是对reduce数量取模 2 排序算法默认是根据key的hashcode值 3 分组是key是否相同

任何一个数据片段的大小不会超过blocksize,也 就是任何一个数据片段不会垮block

7 mapreduce执行的环境 YARN (也就是mapreduce在那台机器上执行)

是hadoop 2.0 引入的资源管理系统

资源管理 任务调度

ResourceManager:负责集群的资源管理

Application Master:负责应用程序相关的失误,比如: 任务调度、任务监控和容错

(例如由于网络原因任务挂掉了,它会自动启动任务)

YARN 程序运行的环境,它本身也是一个集群,有2个节点 ResourceManager 和 NodeManager(多个)(App Master在NodeManager进程里面有)

启动yarn环境

在hadoop-node1上

start-yarn.sh 可见ResourceManager启动了

但它并不会在hadoop-node4上自动启动ResourceManager(这是官方,此脚本的bug)

所有要手动启动一下

hadoop-node4上 输入 yarn-daemon.sh start resourcemanager

由于断电导致namenode都是stadby

执行hdfs haadmin -transitionToActive --forcemanual nn1 重新切换active
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: