节点担任的角色
NN DN JN ZK ZKFC RM
node01 1 1 1 1 1
node02 1 1 1 1 1 1
node03 1 1 1 1
1.修改Hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_67
2.配置core-site.xml
<configuration>
<property>
<name>ipc.client.connect.max.retries</name>
<value>20</value> //最大连接次数,修改大一点,为20,默认10
</property>
<property>
<name>ipc.client.connect.retry.interval</name>
<value>1000</value> //重复连接的间隔1000ms=1s
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ocean</value> //集群的名字
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value> //zookeeper节点
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop2</value> //NN DN的数据信息
</property>
</configuration>
3.配置hdfs-site.xml
<configuration>
<property>
<!-- 服务器的名称 -->
<name>dfs.nameservices</name>
<value>ocean</value>
</property>
<property>
<!-- 高可用的NN -->
<name>dfs.ha.namenodes.shsxt</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.shsxt.nn1</name>
<value>node01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.shsxt.nn2</name>
<value>node02:8020</value>
</property>
<property>
<!-- namenode的http地址和端口 -->
<name>dfs.namenode.http-address.shsxt.nn1</name>
<value>node01:50070</value>
</property>
<property>
<!-- namenode的http地址和端口 -->
<name>dfs.namenode.http-address.shsxt.nn2</name>
<value>node02:50070</value>
</property>
<property>
<!-- 指定namenode元数据存储在journalnode中的路径 -->
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/shsxt</value>
</property>
<property>
<!-- 指定HDFS客户端连接active namenode的java类 -->
<name>dfs.client.failover.proxy.provider.shsxt</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<!-- 配置隔离机制为ssh 防止脑裂 -->
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<value>shell(true)</value>
</property>
<property>
<!-- 指定秘钥的位置 -->
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_dsa</value>
</property>
<property>
<!-- 指定journalnode日志文件存储的路径 -->
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop2/data</value>
</property>
<property>
<!-- 开启自动故障转移 -->
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
3.配置hadoop中的slaves
node01
node02
node03
4.准备zookeeper
a)三台zookeeper:hadoop1,hadoop2,hadoop3
b)编辑zoo.cfg配置文件
修改dataDir=/opt/zookeeper
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888
c)创建/opt/zookeeper,并在该目录中创建一个myid的文件,三个节点的myid文件内容分别为1,2,3
5.环境变量配置
export PATH
export JAVA_HOME=/usr/java/jdk1.7.0_67
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/usr/soft/hadoop-2.6.5
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export ZOOKEEPER_HOME=/usr/soft/zookeeper-3.4.6
export PATH=$PATH:$ZOOKEEPER_HOME/bin
6.把环境变量、Hadoop和zookeeper发到其他节点,并加载环境变量
7.启动三个zookeeper:
zkServer.sh start
jps看一下,有时候jps有线程不代表启动成功,zkServer.sh status看一下
8.启动三个JournalNode:
hadoop-daemon.sh start journalnode
jps看一下是否启动
9.在其中一个namenode上格式化:
hdfs namenode -format
10.把刚刚格式化之后的元数据拷贝到另外一个namenode上:
a)启动刚刚格式化的namenode :
hadoop-daemon.sh start namenode
jps看到namenode已经启动
b)在没有格式化的namenode上执行:
hdfs namenode -bootstrapStandby
c)启动第二个namenode
hadoop-daemon.sh start namenode
11.在其中一个namenode上初始化zkfc:
hdfs zkfc -formatZK
12.在随便一个节点上停止服务:
stop-dfs.sh
jps查看一下
13.在随便一个节点上全面启动:
start-dfs.sh
jps查看一下是否全部启动
14.启动node02和node03 yarn的resourcemanager
yarn-daemon.sh start resourcemanager (yarn resourcemanager )
关闭集群:
stop-dfs.sh
zkServer.sh stop
yarn-daemon.sh stop resourcemanager
有可能会出错的地方
1,确认每台机器防火墙均关掉
2,确认每台机器的时间是一致的
3,确认配置文件无误,并且确认每台机器上面的配置文件一样
4,如果还有问题想重新格式化,那么先把所有节点的进程关掉
5,删除之前格式化的数据目录hadoop.tmp.dir属性对应的目录,所有节点同步都删掉,别单删掉之前的一个,
删掉三台JN节点中dfs.journalnode.edits.dir属性所对应的目录
6,接上面的第6步又可以重新格式化已经启动了
7,最终Active Namenode停掉的时候,StandBy可以自动接管!
部署过程中遇到的问题:
1.每次只能启动一个namenode:
搭建HA的情况下,开启start-dfs.sh 服务的时候,master和slave1两个NameNode服务总有一个挂掉,
原因:start-dfs.sh的时候,首先开启的是master:NameNode,后是slave1:NameNode,最后是JournalNode
即是:namenode-->datanode-->journalnode-->zkfc,两个NameNode的服务冲突,必须的先开启JournalNode服务才行(三个节点都要先开)
解决方案:在core-site.xml添加下述内容:
<property>
<name>ipc.client.connect.max.retries</name>
<value>20</value> //最大连接次数,修改大一点,为20,默认10
<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>1000</value> //重复连接的间隔1000ms=1s
<description>Indicates the number of milliseconds a client will wait for
before retrying to establish a server connection.
</description>
</property>
因为:NameNode连接不上JournalNode,超过一定的次数,就会挂掉,所以要增加连接的最大次数。
2.一个namenode挂掉后不会自动切换:hdfs-site.xml
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<value>shell(true)</value>
</property>