Hadoop完全分布式安装配置
概述
Hadoop中的NameNode好比是人的心脏,非常重要,绝对不可以停止工作。在hadoop1时代,只有一个NameNode。如果该NameNode数据丢失或者不能工作,那么整个集群就不能恢复了。
为了解决hadoop1中的单点问题,在hadoop2中新的NameNode不再是只有一个,可以有多个(目前只支持2个)。每一个都有相同的职能。一个是active状态的,一个是standby状态的。当集群运行时,只有active状态的NameNode是正常工作的,standby状态的NameNode是处于待命状态的,时刻同步active状态NameNode的数据。一旦active状态的NameNode不能工作,通过手工或者自动切换,standby状态的NameNode就可以转变为active状态的,就可以继续工作了。这就是高可用。
Hadoop2.0中,可以存在两个NameNode,一个是active状态,另一个是standby状态
当集群运行时,只有active状态的NameNode是正常工作的,standby状态的NameNode是处于待命状态的,时刻同步active状态NameNode的数据
使用JournalNode集群进行数据共享
两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了
故障切换
对于HA集群而言,确保同一时刻只有一个NameNode处于active状态是至关重要的。否则,两个NameNode的数据状态就会产生分歧,可能丢失数据,或者产生错误的结果。为了保证这点,这就需要利用使用ZooKeeper了。首先HDFS集群中的两个NameNode都在ZooKeeper中注册,当active状态的NameNode出故障时,ZooKeeper能检测到这种情况,它就会自动把standby状态的NameNode切换为active状态。
相关概念
在hadoop完全分布式配置中,可以配置多个nameNode,形成互为热备的状态,解决单点故障的问题
两个NameNode通过JN集群来共享元数据,基本原理和Zookeeper相似,处于active状态的NameNode通过元数据的更新发送给大部分的JN集群,只要Jn集群的大部分机器存活,处于standby的NameNode就可以同步到这些元数据
两个NameNode通过zk实现选举,
NameNode(Active):真正工作状态的NameNode,保持元数据,并将元数据更新信息写入km
NameNode(Standby):出在备用的nameNode,从jn中获取信息。同步元数据
DataNode:保存数据的节点
JN集群:用来同步元数据的集群,防止单点故障
ZK:集群协调,包括nameNode的选举
FailOverController:联系nameNode和ZK
Hadoop完全分布式集群规划
hadoop安装集群配置的原则:
a.两个nameNode一般单独安装
b.ResourceManager一般单独安装或者和NameNode一起
c.dataNode单独安装
d.NodeManager一般和dataNode装在一起
e.FailOverController进程必须和NameNode在一起
f.JN要么单独安装,要么和DataNode在一起
g.zk通常是一个单独的集群,但没有条件,也可以配置在hadoop集群中
机器角色
-
hadoop01
NameNode,FailOverController,ResourceManager,zookeeper
-
hadoop02
DataNode,NodeManager,JN,Zookeeper
-
hadoop03
DataNode,NodeManager,JN,Zookeeper
配置步骤 HDFS分布式
vi /etc/hosts
vi /etc/sysconfig/network
ssh-keygen
ssh-copy-id hadoop01
service iptables stop
chkconfig iptables off
dataDir=/home/software/zookeeper-3.4.7/tmp
clientPort=2181
server.1=192.168.168.101:2888:3888
server.2=192.168.168.102:2888:3888
server.3=192.168.168.103:2888:3888
分别在每个zookeeper的tmp目录下创建myid文件,并写上id
安装jdk,并在/etc/profile下进行如下配置
JAVA_HOME=/home/software/jdk1.8.0_65
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH
source /etc/profile
安装hadoop
export HADOOP_HOME=/home/software/hadoop-2.7.1/
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export JAVA_HOME=/home/software/jdk1.8.0_65
<configuration>
<property>
<!--用来指定hdfs的老大,namenode的地址-->
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<property>
<!--用来指定hadoop运行时产生文件的存放目录-->
<name>hadoop.tmp.dir</name>
<value>/home/software/hadoop-2.7.1/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<!--修改core-site.xml中的ipc参数,防止出现连接journalnode服务ConnectException-->
<property>
<name>ipc.client.connect.max.retries</name>
<value>100</value>
<description>Indicates the number of retries a client will make to establish a server connection.</description>
</property>
<property>
<name>ipc.client.connect.retry.interval</name>
<value>10000</value>
<description>Indicates the number of milliseconds a client will wait for before retrying to establish a server connection.</description>
</property>
</configuration>
<configuration>
<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- ns下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>hadoop01:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>hadoop01:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>hadoop02:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>hadoop02:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/ns</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/software/hadoop-2.7.1/tmp/journal</value>
</property>
<!-- 开启NameNode故障时自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///home/software/hadoop-2.7.1/tmp/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///home/software/hadoop-2.7.1/tmp/hdfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
<configuration>
<property>
<!--指定mapreduce运行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<!--指定yarn的老大resourcemanager的地址-->
<name>yarn.resourcemanager.hostname</name>
<value>hadoop03</value>
</property>
<property>
<!--NodeManager获取数据的方式-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
将集群中的节点的主机名分别填入
hadoop01
hadoop02
hadoop03
scp -r $HADOOP_HOME/etc/hadoop root@hadoop02:/home/software/hadoop-2.7.1/etc/
scp -r $HADOOP_HOME/etc/hadoop root@hadoop03:/home/software/hadoop-2.7.1/etc/
集群的启动
分别在三台上执行 sh zkServer.sh start
查看集群状态 sh zkServer.sh status
hadoop-daemons.sh start journalnode
执行jps,查看是否启动成功
在hadoop01上执行 hdfs zkfc -formatZK
格式化成功后可以在zookeeper执行 ls /hadoop-ha
会出现节点名称 [ns]
hadoop namenode -format
hadoop-daemon.sh start namenode
hdfs namenode –bootstrapStandby
hadoop-daemon.sh start namenode
hadoop-daemons.sh start datanode
start-yarn.sh
hadoop-daemons.sh start zkfc
分别执行jps,查看启动结果
----------------------
[root@hadoop01 bin]# jps
19089 NameNode
19541 DFSZKFailoverController
19784 NodeManager
19976 Jps
18856 QuorumPeerMain
19193 DataNode
19390 JournalNode
----------------------
[root@hadoop02 bin]# jps
2099 Jps
2051 DFSZKFailoverController
1798 NodeManager
1367 QuorumPeerMain
1561 DataNode
1661 JournalNode
1503 NameNode
-----------------------
[root@hadoop03 bin]# jps
1729 ResourceManager
1507 DataNode
1831 NodeManager
1367 QuorumPeerMain
2220 Jps
1596 JournalNode
HA高可用
此时hadoop01为active,hadoop02为standby
将hadoop01的namenode关闭,测试高可用
[root@hadoop01 bin]# hadoop-daemon.sh stop namenode
原来的standby节点变为了active节点
Yarn完全分布式配置
<property>
<!--指定mapreduce运行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<configuration>
<property>
<!--NodeManager获取数据的方式-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property><!-- 指定 RM 的集群 id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>RM_CLUSTER</value>
</property>
<!-- 定义 RM 的节点-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 指定 RM1 的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop03</value>
</property>
<!-- 指定 RM2 的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop02</value>
</property>
<!-- 激活 RM 自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 配置 RM 状态信息存储方式,有 MemStore 和 ZKStore-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 配置为 zookeeper 存储时,指定 zookeeper 集群的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>
在active RM上启动
start-yarn.sh
在backup RM上启动
yarn-daemon.sh start resourcemanager
参考自:
http://www.iteye.com/news/30739
https://blog.csdn.net/Lockey23/article/details/78338133