写的不到位的地方,欢迎评论指出不足之处
一、检查系统环境
1、HostName、Hosts、JDK、SSH、网络、防火墙、数据源
一、集群角色分配表
注:这只是实例
服务器 | ||||||
NameNode | NameNode | Zookepper FailoverController | DataNode | Zookepper | JournalNode | |
One | yes (NN2和其它节点免密) | yes |
yes |
|||
Two | yes (NN1和其它节点免密) |
yes |
yes |
yes |
yes |
|
Three | yes |
yes |
yes |
|||
Four | yes |
yes |
二、解压软件
1、Hadoop、ZooKeeper 软件解压在了 /opt
2、所有节点上的所有角色数据,都在 /var/hadoop/ha/dfs 目录下(每个节点都一样)
注:配置的内容只要对,什么形式,大伙随意
三、配置相关文件
1、hadoop下的 core-site.xml
<!-- mycluster 配置一个服务逻辑名称 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://myHA</value>
</property>
<!-- 配置 zookeeper 主机名:端口号,以逗号隔开 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>two:2181,three:2181,four:2181</value>
</property>
2、hadoop下的 hdfs-site.xml
<property>
<name>dfs.nameservices</name>
<value>myHA</value>
</property>
<!--
为一对多的节点起逻辑名称,用逗号 隔开
hadoop2.x支持2个 ,hadoop3.x支持5个
-->
<property>
<name>dfs.ha.namenodes.myHA</name>
<value>nn1,nn2</value>
</property>
<!-- 为每个节点配置对应的主机名 + 端口号,进行物理映射 -->
<property>
<name>dfs.namenode.rpc-address.myHA.nn1</name>
<value>one:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.myHA.nn1</name>
<value>one:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.myHA.nn2</name>
<value>two:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.myHA.nn2</name>
<value>two:50070</value>
</property>
<!--
共享 EditLog
配置 JNode 协议 ,多个节点用分号隔开,指向服务,服务一对多的方式,给到对应的 NameNode
-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://one:8485;two:8485;three:8485/myHA</value>
</property>
<!--
配置 JNode 数据位置
-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/hadoop/ha/dfs/jnode</value>
</property>
<!-- ha切换 NameNode 主从时命令发给哪个实现类去实现 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--
如何发出信息的
SSH免密(企业不直接使用 root )
-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value> <!-- 定义免密 -->
</property>
<property>
<!-- 使用私有密钥,那么配置SSH免密时,就需要使用私有密钥 -->
<name>dfs.ha.fencing.ssh.private-key-files</name>
<!-- 密钥物理位置 -->
<value>/root/.ssh/id_rsa</value>
</property>
<!--
默认false,配置true
true:当NameNode启动时,自动启动ZKFC
-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
3、hadoop下的 slaves
two
three
four
4、配置 zookeeper
cd /opt/apache-zookeeper-3.5.9-bin/conf
# 将 zoo_sample.cfg 复制改名 zoo.cfg
#dataDir=/tmp/zookeeper # 原本的样子
dataDir= /var/hadoop/ha/dfs/zk # 修改 ZK 的数据目录
# 追加,server. (1、2、3)可随意写,只要保证是唯一即可,使用过半选举
# 由于zk有两状态(无主、有主),因此两端口号,各干各的事
server.1=two:2888:3888
server.2=three:2888:3888
server.3=four:2888:3888
# clientPort=2181 #无需修改,这个端口是为了客户端连接通信时使用
5、配置 zookeeper 权重,权重的目录需要自己创建,其它配置的目录会自动创建
# 在相应的 zookeeper 节点的目录下,加权重
# 权重内容要与配置文件一样
# 每个节点都要加,不要重复
# 1、2、3
echo 1 > /var/hadoop/ha/dfs/zk/myid
6、配置环境变量
vim /etc/profile
export JAVA_HOME=/usr/java/default
export HADOOP_HOME=/opt/hadoop-2.10.1
export ZOOKEEPER_HOME=/opt/apache-zookeeper-3.5.9-bin
export PATH=$PATH:${JAVA_HOME}/bin:$HADOOP_HOME/bin
:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
7、将配置好的软件,使用 SSH 发送到相应的服务器上,根据角色配置表,进行发送,ZK一定要记得
注:配置文件中调用的是 SSH 的私钥,所以将私钥发送对相关节点免密文件中
8、第一次启动,格式化
主控节点,选在one的带NN的服务器上,(具体随意)
1、# (主控节点上)生成 QuorumPeerMain 进程,在相应的节点启动 ZK
zkServer.sh start
2、# (主控节点上)生成 JournalNode 进程,在相应的节点启动 JN
hadoop-daemon.sh start journalnode
3、# (主控节点上)多个NN,选一个NN节点,进行格式化
hdfs namenode -format
4、# (主控节点上)启动NN(主) / namenode 换 zkfc 就是单独启动zkfc
hadoop-daemon.sh start namenode
5、# (副NN节点上)其它 NN (副)启动时同步数据
hdfs namenode -bootstrapStandby
6、# (主控节点上)进行ZK格式化
hdfs zkfc -formatZK
7、# 启动服务
start-dfs.sh