HDFS高可用的完全分布式设计架构图
HDFS的高可用指的是HDFS持续对各类客户端提供读、写服务的能力,因为客户端对HDFS的读、写操作之前都要访问Namenode服务器,客户端只有从Namenode获取元数据之后才能继续进行读、写。所以HDFS的高可用的关键在于Namenode上的元数据持续可用。
主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换。所有DataNode同时向两个NameNode汇报数据块信息。Zookeeper监控NameNode健康状态,实现主备节点自动切换。
搭建流程
集群规划:
NN-1 | NN-2 | DN | ZK | ZKFC | JNN | |
---|---|---|---|---|---|---|
node01 | * | * | * | |||
node02 | * | * | * | * | * | |
node03 | * | * | ||||
node04 | * | * |
配置免密登录
node01->node01 node01->node02 node01->node03 node01->node04 node02->node01
在node02节点执行:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node01
修改hdfs-site.xml配置文件
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node02:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/sxt/hadoop/ha/jn</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
修改core-site.xml配置文件(配置Datanode节点以及Zookeeper节点)
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>
修改slaves配置文件
node02
node03
node04
将配置好的HDFS安装包拷贝到node02 node03 node04
scp -r hadoop-2.6.5 root@node02:`pwd`
scp -r hadoop-2.6.5 root@node03:`pwd`
scp -r hadoop-2.6.5 root@node04:`pwd`
搭建zookeeper集群
上传zookeeper-3.4.10.tar.gz到node02并解压。
修改conf目录下的zoo_sample.cfg的名称,改为zoo.cfg
修改zoo.cfg
dataDir=/var/zfg/zookeeper
server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888
将配置好的zookeeper安装包拷贝到node03 node04
scp -r zookeeper-3.4.10 root@node03:`pwd`
scp -r zookeeper-3.4.10 root@node04:`pwd`
在各自节点上的dataDir目录创建myid号,ID号要依次递增
在node02 node03 node04节点上启动Zookeeper
cd ./zookeeper-3.4.10/bin/
./zkServer.sh start
格式化NameNode(创建目录以及文件)
① 在node01、node02、node03分别执行如下命令,启动journalnode
hadoop-daemon.sh start journalnode
② 随机选择一台NameNode执行,格式化Namenode并启动:
hdfs namenode -format
hadoop-daemon.sh start namenode
③ 另外一台NameNode节点执行,启动Standby Namenode:
hdfs namenode -bootstrapStandby
格式化ZKFC
hdfs zkfc -formatZK
关闭所有节点上的进程
stop-dfs.sh
启动HDFS
start-dfs.sh
操作HDFS文件系统