hadoop namenode启动不了_Hadoop 安装教程 - HA方式

架构图

hadoop各个组件的关系是这样的

928ddfea9de0f95ad3c6097b296ab8d2.png

namenode 总数就2个,不能多也不能少,一个是active状态,一个是standby状态,只有active状态的在工作,另一个只是备份,当active状态的挂了之后,standby的会切换为active状态。但是这个动作其实不是天生自动的,配合上zookeeper才能实现自动化切换。

journalNode 用于存储active状态的namenode所做的所有改变,并同步到standby的namenode,以保证在standby转换为active之后不会漏掉操作

namenode管理着datanode,namenode负责存储地址空间,datanode负责真正的存储数据

本次部署之后的架构图是这样的

7fe71cd4a91c0a88ff473a49be2d66e6.png
  • 为了降低部署的难度,我就虚拟了两台机子,其实真正部署的时候至少要有3台(保持奇数个)
  • zookeeper是负责在active的namenode挂掉之后自动把standby状态的namenode切换成active的

这幅图则解释了zookeeper在整个hadoop集群中的作用

38fd51e5-3f2b-eb11-8da9-e4434bdf6706.png

zookeeper是游离于hadoop集群之外的组件

hadoop利用 zkfc (zookeeperFC) 来跟 zookeeper进行协作,其实目的很简单,就是在一个namenode挂掉的时候,自动切换成另一个namenode为active状态

准备工作

用vmware开出两台虚拟机,安装上Centos6。 我弄了两个host,分别是 host1(192.168.199.126) 和host2(192.168.199.128)

开始前请按照上篇文章, hadoop 安装教程 (CentOS6 CDH分支 yum方式) 里面的方式添加yum源

安装

安装Zookeeper

注意:我这人比较懒,所以基本都是用root在安装,所以以下命令,如果你们无法执行,请再前面加一个 sudo 。或者想我一样直接用root玩

在两台机都执行

eec655b09e9e9c89eb7fd4d51bfce390.png

都安装 zookeeper-server

c35a69c02bbb195c3735a96b710f923f.png

host1上启动zookeeper

8528c9841600788915a8f7d079117f85.png

注意:这个 --myid=1 标定了zookeeper的id,会在 /var/lib/zookeeper 下建立一个 myid 文件

在 host2 上启动zookeeper

d3daebdd74c1a6606870c1066a222d88.png

检查下是否在2181端口监听

58edbb71b2f71ef4e51b8922a6eea758.png

用client端测试一下

3078fbaba753a20f710496e8dc750dca.png

配置zookeeper

在两台机子上都编辑 /etc/zookeeper/conf/zoo.cfg 文件

4bf57167c31d4693f2ddd840db387ad6.png

改完记得重启zookeeper

注意:其实zookeeper的服务器最小的安装数量是3台机器,但是现在只有2台,只能凑合了。因为zookeeper是根据超过半数出问题来关停系统的,所以2台就无法正确的判断了,不过我们只是做例子所以没关系。

hadoop在启动的时候会自动去找zookeeper的2181端口,如果没有就启动不起来

安装Resource Manager

你需要在两台机子中挑选一台作为resource manager,在这里我挑选 host1(192.168.199.126) 安装

在 host1 上执行

c3629040b517050e6d0523be7ff38a81.png

安装Name Node

两台机子上都安装name node

bdbb77312cf24f524c661a30115d2a31.png

安装Date Node 等

官方文档说在除了Resource Manager 以外的所有机器上安装以下几个包,不过你要是非在有Resource Manager的机器上装这些也不会出错,只是生产环境肯定不能这么干了。既然我们只有两台机子而且都装datanode,那肯定是只能两台机都要安装了

0b922e19fc848e8eeccc2c3f18edc0a5.png

官方文档说在其中一台机子上安装以下软件,随便挑一台,就挑host2

8b5813615075c3e8a17d513d3021bdfe.png

在随便一台机器上安装client,选host1安装吧

66b0ae2e4a4bad465590205162c14d5b.png

配置

配置网络

hadoop官方强烈建议,大家不要用ip,而是用host的名字来进行配置,所以我们要先配置host文件

在host1上运行该命令设置机器名字

58527b0db3aec1319056ca28920810d5.png

在host2 上

b0e0e571f06d723be3ea30b6e1d14aa5.png

这样定义的名字只保持在下次重启之前

在两台机的 /etc/hosts 文件里面都插入这段

308b937c477d9587e2095ac4d91fa25d.png

那个localdomain代表的是本地的域名,相当于localhost一样的东西

修改 /etc/sysconfig/network 确保里面的 HOSTNAME 是 host1.localdomain 或者 host2.localdomain

用uname -a 可以检查是否正确的设置了主机名

eab63139030444d4d8a456a92ff3bf17.png

配置HDFS

host1

到 /etc/hadoop/conf 文件夹下,编辑

core-site.xml 在 <configuration> 中增加

00db09189fe6273e6b3c34ec60d29d85.png

打开 hdfs-site.xml 添加

3ecf66d6889850dfccb529d22a8e7d80.png

在hdfs-site.xml里面修改一下 namanode 的实际存储位置为更大的磁盘

f3efe80e321ce1e264edc66ca70abcfe.png

官方文档说在每一个datanode节点上的hdfs-site.xml里面都配置相同的文件夹来存储数据,比如我就建三个文件夹来存储datanode数据

5f345c507a16f79db11dd8ee27ee3c01.png

所以最后hdfs-site.xml 是这样的

6cdd6f2aa1fd69c3deaa16f08eeb11bb.png

PS:默认情况下只要有一台datanode挂了,整个集群就停了然后启动的时候会自动修复数据,如果要提高容错机制,就设置 dfs.datanode.failed.volumes.tolerated ,如果设置为3,那就只有4台挂了才会停止。把

844a132d6410d3f9949ec302b555a0d9.png

全都建立出来,并统一把用户改成 hdfs.hdfs

da2ccca59d74440ced7272e52cc68fec.png

host2

core-site.xml

f14be380160f913206046f32b8da464c.png

hdfs-site.xml

c3b4f609112b2d7c41f3666fb2cfe941.png

把需要的文件夹也都建立出来,并分配权限

893d83b80d704269883bcc2b3b76b831.png

格式化namenode

在两台机子上都使用hdfs来格式化namenode

9db3a82de94259bbf6879bbf67fd5b3c.png

启动HDFS

在两台机器上都运行

9b526fdc3be5eaaabc5a050e77d78d4e.png

建立/tmp文件夹

在host1 上运行

6460cae30cc1e254bed53111f7aacba4.png

这样会在hdfs集群上建立 /tmp 文件夹。

注意:这里的 /tmp 并不是某一台机器上的 /tmp 文件夹,是hdfs这个分布式文件系统上的 tmp 文件夹,这是一个高于真实物理机器环境的一个文件环境,host1 和 host2 共同组成了它

可以用

e1e36c1f3e814eafbd075114c2c9aa4d.png

来看下hdfs上根目录下有什么文件夹检查是否启动成功

启动完后可以用jps 命令 检查是否启动成功

host1

0b75ab1558679c97895a0dd894e5d66f.png

host2

f8c6988207b7a03170c5ffbc58f6abed.png

客户端测试

打开你的浏览器输入 http://<hadoop server ip>:50070

如果看到

Overview 'host1.localdomain:8020' (active)

这样的字样就成功进入了hadoop的命令控制台

提示:但是此时你会发现host1 跟 host2 之间其实没有什么关联,通过控制台只能查到各自的datanode信息,接下来我们说下怎么样把两个host组成一个集群

设置HA

最早的时候一个hadoop集群只能有一个namenode如果这个namenode挂了,整个集群就挂了,后来hadoop结合zookeeper发展出新的部署模式,就是HA(High Availability)模式。在这种模式下

一个集群可以有多个namenode

只有一个namenode处于活跃状态,其他namenode处于备选状态

活跃状态的namenode跟备选状态的namenode之间有一定的时间差

采用journalNode来记录namenode的所有改动,在活跃namenode到备选namenode切换过程中保证不漏掉操作步骤

配置HA

先从修改core-site.xml 开始

接下来的配置是两台机器都一样的,所以我就只写一份

5e0371e6337c980982ad2867fd875fee.png

建立对应的文件夹并分配权限

16c1d72a1c211bfb1448141cef2125f4.png

参数解释:

fs.defaultFS 用一个统一的名字来标定集群的名字

hadoop.tmp.dir 是yarn使用的临时文件夹

ha.zookeeper.quorum 设定所有zookeeper server的地址,理论上一定要是奇数个,但是现在条件所迫就设置成2个吧

接下来是hdfs-site.xml

6798cd646b34a83268932b582e10db9f.png

5c4c1f4ef55c087f19d91ddfb92c2436.png

配置解释

dfs.replication 数据的复制份数

dfs.nameservices serviceid 接下来的配置参数中会用到,也就是一个集群的名字

dfs.ha.namenodes.mycluster 这个mycluster就是之前定义的serviceid,这边列出所属的namenode,也就是namenode的host名字

dfs.namenode.rpc-address.mycluster.host1 各个namenode的 rpc通讯地址

dfs.namenode.http-address.mycluster.host1 各个namenode的http状态页面地址

dfs.ha.automatic-failover.enabled 是否启用故障自动处理?就是故障的时候会自动启用备选的namenode,暂时设定为false

dfs.namenode.shared.edits.dir 定义了集群的日志节点,采用统一格式 "qjournal://host1:port1;host2:port2;host3:port3/journalId" ,日志节点是由active状态的namenode写入,由standby(备选)状态节点读出

dfs.ha.fencing.methods 处于故障状态的时候hadoop要防止脑裂问题,所以在standby机器切换到active后,hadoop还会试图通过内部网络的ssh连过去,并把namenode的相关进程给kill掉,一般是sshfence 就是ssh方式,后面的 dfs.ha.fencing.ssh.private-key-files 则配置了 ssh用的 key 的位置。

建立文件夹,并分配权限

3ce540605742ecd6fb8df36b8eb8135a.png

删除之前建立的dn文件夹,重新建立新的dn文件夹

5708d1f5a22a8d9013a20bb84cb64a2e.png

为 dfs.ha.fencing.ssh.private-key-files 建立sshkey

step1

在host1 上切换到root用户创建id_rsa文件

992e82e8b914681861496c51bc361ae8.png

中间过程问的问题全部回车解决

Step2

把生成的 /root/.ssh/id_rsa.pub 拷贝到 host2 上,然后到host2上用root 权限执行

f0abc8f2a59440f1d2f5ce042fdcf88b.png

Step3

回到 host1 ,把 /root/.ssh/id_rsa 拷贝到 hdfs 的 .ssh 目录,并且修改用户为hdfs

604404ad857d07580ec3d974b72b6020.png

Step4

在host1上用hdfs测试一下看能不能用root身份ssh连上host2

d7a7ad4843822b80a52206bd2a6ab79c.png

Step5

在host2上重复以上4步

修改mapred-site.xml

0bc4833bfd0dc2680e35781cb0322ad1.png

修改yarn-site.xml ,在 <configuration/> 节点里面插入一个属性

026f93e71d296df2637868d0c62d9e1c.png

修改文件slave

3f0b693b7b9dd4529675624269b40306.png

把 core-site.xml , hdfs-site.xml, mapred-site.xml, yarn-site.xml, slaves 复制到host2上

重启两台机器上的hadoop, 顺序无所谓

694d6a7343094572f6f636201dab573d.png

注意:如果你启动有错,不要慌,去 /var/log/hadoop-hdfs 看下日志,看具体错在哪里再想解决方案

这个时候你可以访问 host1:50070 或者 host2:50070 会看到两个namenode都处在standby状态,是不能对外服务的

接下来我们来看下如何部署HA

部署HA
安装并启动JournalNodes

两台机器上都执行

ace4b3b5f9fe0fcb1f635e4f594139d1.png

在两台机器上都启动服务

586f3c9e2495618e03d2a3a9caae9526.png

格式化

在两台机器上格式化namenode

773c75fcdd60a6ef52b29de30ac9f8ad.png

在两台机器上停止namenode

5eaac7ea5704c6e3bcceca70fe985b48.png

host1上初始化journalnode

58f49d822c71a8b7beb478b33a626de5.png

启动namenode
再启动第一个namenode就是你要作为主要的namenode的那个,这里我把host1作为主要的

在host1上执行

6c1fd37c5c20e1def7270b871f3a687b.png

接下来启动备用namenode,这里我把host2作为备用的namenode

2e71c47694673d90e43088fccb86c155.png

可能会问你是否要格式化,记得选Y

启动备用namenode

f2250fa966f8ab0c21b4c4fb4be8d115.png

我解释一下,当你用 -bootstrapStandby 启动备选的namenode的时候,它会将内容从主namenode上复制过来(包括命名空间信息和最近修改信息)存储的位置就是你在 dfs.namenode.name.dir 和 dfs.namenode.edits.dir里面配置的,在本教程中就是 file:///data/hdfs/1/dfs/nn

启动 datanode

请大家记住hadoop的基本启动顺序

1.最先启动的是所有机器上的 journalnode

2.再启动主机上的namenode

3.启动备选机上的namenode(还需要用 -bootstrapStandby 拉取镜像)

4.启动所有机器上的datanode

设置host1为active状态

现在我们用浏览器访问 http://host1:50070 和 http://host2:50070 你会发现两个namenode 都还是standby状态。这时你需要把其中一个转化为active状态才行。不过前提是你得先把 dfs.ha.automatic-failover.enabled 设置成false,所以前面我设置的时候设置成了false 。

现在我们来设置host1 为active状态

17e883da1e6473d41b859400b5e2c452.png

成功后再去看 http://host1:50070 会看到 'host1:8020' (active) 字样,标志着 host1终于处在活跃状态,集群终于可以工作了!

其实haadmin 有一个transitionToActive命令,但是最好不要用这个命令,因为主备切换的时候最大的问题就是 脑裂问题,说具体了就是,有可能一不小心把俩namenode都弄成active状态,并且还都同时工作,造成数据写入的不一致,后果不堪设想。所以用failover的好处就是会检查另外一个namenode,如果是active就会设置成standby,如果已经是standby就什么也不做,这样比较安全。

设置自动failover

部署还没有结束,我们之前用的是手动failover,其实是不够的,如果每次出问题都要手动解决,这个集群等于是不稳定的。所以要设置自动failover。自动failover用的是zookeeper 的 ZooKeeper FailoverController (ZKFC)

安装zkfc

两台机器都运行

bba48c6c04e6262fa81b2db66fe4f832.png

先去把 hdfs-site.xml 里面的 dfs.ha.automatic-failover.enabled 弄成true,然后重启namenode

41563eb9e73a6ddd065a056049438864.png

格式化zookeeper

在host1 上执行

aacc0e9e63defce4f5b881e1908eb106.png

这一步会在zookeeper根目录下建立 /hadoop-ha/mycluster 这个目录。

建立完后我们去验证一下用 zookeeper-client 连接上zookeeper

7a4312da48af4fe37bb9b46c0f96c7d8.png

在两台机器上都启动 zkfc

e3d833f277d0e68834e2d7438841c02e.png

官方说明了几点:

zkfc跟zookeeper关系密切,要是zookeeper挂了,zkfc也就失效了

最好监控着zkfc进程,防止zkfc退出了,造成无法自动切换

zkfc跟namenode的启动顺序是无所谓的

验证namenode状态

打开浏览器访问 host1:50070 会发现 这个 namenode 变成了active 状态,再看看 host2:50070 会发现是 standby 状态。并且datanode下有两个datanode节点出现

恭喜你!配置完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值