HDFS分布式集群搭建【高级版】
HDFS集群要保证NameNode的高可用性,为了让NameNode更安全,这里选择用ZooKeeper集群来保证
环境及准备
同上篇普通版
zookeeper集群的搭建
- 下载并解压zookeeper
- 在zookeeper根目录下创建data文件夹
- 进入conf文件夹修改配置
3.1 修改zoo_sample.cfg 名字为 zoo.cfg
3.2 编辑 zoo.cfg
dataDir=/opt/install/zookeeper-3.4.5/data
server.0=hadoop1.msk.com:2888:3888
server.1=hadoop2.msk.com:2888:3888
server.2=hadoop3.msk.com:2888:3888
- 在zookeeper/data下创建myid文件
第一台节点myid里面填0 第二台 1 以此类推(三台机器分别为 0,1,2)
- 用主节点分别ssh免密登录三台机器(包括主节点自身)
zookeeper的启停命令
bin/zkServer.sh start | stop | restart | status
zookeeper客户端命令
- 注:在zookeeper的主节点运行
bin/zkCli.sh
HA-HDFS分布式集群搭建
- 如果使用的是以前的普通集群建议先清空data/tmp,如果是新环境可以参考以往基础版集群文章搭建基础环境
- 配置文件的修改
core-site.xml
<!-- 这里的ns随意 只是入口 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/install/hadoop-2.5.2/data/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1.msk.com:2181,hadoop2.msk.com:2181,hadoop3.msk.com:2181</value>
</property>
**hdfs-site.xml **
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!--指定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>hadoop1.msk.com:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>hadoop1.msk.com:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>hadoop2.msk.com:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>hadoop2.msk.com:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1.msk.com:8485;hadoop2.msk.com:8485;hadoop3.msk.com:8485/ns</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/install/hadoop-2.5.2/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>
<!-- 配置隔离机制,如果ssh是默认22端口,value直接写sshfence即可 -->
<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>
yarn-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_71
- 首先启动zookeeper集群(三台都要执行启动zookeeper服务指令)
- 在主NameNode节点格式化zkfc
bin/hdfs zkfc -formatZK
- 在每个journalnode节点用如下命令启动journalnode
sbin/hadoop-daemon.sh start journalnode
- 在主namenode节点格式化namenode和journalnode目录
bin/hdfs namenode -format ns
- 在主namenode节点启动namenode进程
sbin/hadoop-daemon.sh start namenode
- 在备namenode节点执行第一行命令,这个是把备namenode节点的目录格式化并把元数据从主namenode节点copy过来,并且这个命令不会把journalnode目录再格式化了!然后用第二个命令启动备namenode进程
bin/hdfs namenode -bootstrapStandby
sbin/hadoop-daemon.sh start namenode
- 在两个namenode节点都执行以下命令
sbin/hadoop-daemon.sh start zkfc
- 在所有datanode节点都执行以下命令启动datanode
sbin/hadoop-daemon.sh start datanode
- 日常启停命令
sbin/start-dfs.sh
sbin/stop-dfs.sh