我这里采用3台机器搭建Hadoop集群,分别为app01,app02,app03。

首先我们这三台机器做免秘钥登录。

一、多台机器之间免密ssh

分别在各个主机上检查ssh服务状态:
# systemctl status sshd.service  #检查ssh服务状态
# yum install openssh-server openssh-clients  #安装ssh服务,如果已安装,则不用执行该步骤
# systemctl start sshd.service  #启动ssh服务,如果已安装,则不用执行该步骤
 
分别在各个主机上生成密钥
# ssh-keygen -t rsa  #生成密钥 (一直回车)

hadoop集群密码输入并排怎么输_zookeeper


我这里用的root用户,生成的id_rea.pub 在/root/.ssh/目录下面

将生成的cat id_rsa.pub >> authorized_keys

注意:这里是追加

hadoop集群密码输入并排怎么输_hdfs_02

然后将app01的id_rea.pub分别追加到app02和app03的authorized_keys。这一步很关键

这样app01,就能免密码登录到app02和app03了。

hadoop集群密码输入并排怎么输_hadoop_03

二、接下来,在centos上安装java

下载好java的安装包,将其解压,在环境变量里面加上JAVA_HOME。此过程略

三、接下来,我们安装zookeeper集群

我打算在app01,app02,app03上都装zookeeper集群,这里建议集群的个数为奇数个。

将zookeeper的安装包上传到app01,将其解压,进入目录,pwd。设置此目录为zookeeper的环境变量

hadoop集群密码输入并排怎么输_hadoop_04

进入zookeeper_home/conf。将zoo_sample.cfg复制为zoo.cfg

hadoop集群密码输入并排怎么输_hadoop_05

修改zoo.cfg.

hadoop集群密码输入并排怎么输_zookeeper_06

注意,最下面的server.1,1为app02在zookeeper集群中的编号,这个编号需要我们设置,在上面设置的dataDir目录下面创建myid文件,修改里面的内容为1,剩下的以此类推。

接下来scp将zookeeper的安装包分发到每台机器上,然后修改对应的myid文件

hadoop集群密码输入并排怎么输_大数据_07

我这里是app01的机器,对应的是编号是3,所以文件里面输入的是3.

接下来,启动我们的zookeeper集群,在每台机器上执行,zkServer.sh start

我们用zkServer.sh status来查看我们集群的状态

hadoop集群密码输入并排怎么输_hadoop集群密码输入并排怎么输_08

hadoop集群密码输入并排怎么输_hdfs_09

hadoop集群密码输入并排怎么输_zookeeper_10

这里app03是我们zookeeper集群的领导者,说明现在zookeeper集群已经可以使用了。

四、接下来安装我们的Hadoop。

首先将Hadoop2.5.1的安装文件上传到app01上,将其解压。

hadoop集群密码输入并排怎么输_hdfs_11

进入hadoop-2.5.1,然后输入pwd。将此路径设置到环境变量。就是配置hadoop的环境变量。

hadoop集群密码输入并排怎么输_hadoop_12

保存退出,记得source /etc/profile 然配置文件生效。

接下来,我们来配置hadoop,进入hadoop_home/etc/hadoop目录

hadoop集群密码输入并排怎么输_hadoop集群密码输入并排怎么输_13

我们首先来修改hadoop-env.sh文件

hadoop集群密码输入并排怎么输_大数据_14

修改hadoop-env.sh里面JAVA_HOME。这里改成我们刚才安装的java路径

接下来修改yarn-env.sh。同样也是修改JAVA_HOME

hadoop集群密码输入并排怎么输_hdfs_15

接下来我们来配置core-site.xml。

<configuration>

<property>

  <name>fs.defaultFS</name>
  <value>hdfs://mycluster</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop-2.6.0/tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>Slave4:2181,Slave5:2181,Slave6:2181</value>
</property>
</configuration>

hadoop集群密码输入并排怎么输_hadoop集群密码输入并排怎么输_16

我们这里修改了临时目录,和zookeeper集群的主机名

接下来,我们来修改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>machine1.example.com:8020</value>
 </property>
 <property>
   <name>dfs.namenode.rpc-address.mycluster.nn2</name>
   <value>machine2.example.com:8020</value>
 </property>
 <property>
   <name>dfs.namenode.http-address.mycluster.nn1</name>
   <value>machine1.example.com:50070</value>
 </property>
 <property>
   <name>dfs.namenode.http-address.mycluster.nn2</name>
   <value>machine2.example.com:50070</value>
 </property>
 <!--journal-->
 <property>
   <name>dfs.namenode.shared.edits.dir</name>
   <value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</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>


 <!--SSH-->
 <property>
   <name>dfs.ha.fencing.ssh.private-key-files</name>
   <value>/home/exampleuser/.ssh/id_rsa</value>(需要修改)
 </property>
 <property>
   <name>dfs.journalnode.edits.dir</name>
   <value>/path/to/journal/node/local/data</value>(需要修改)
 </property>


 <!--Zookeeper-->
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>


hadoop集群密码输入并排怎么输_zookeeper_17

hadoop集群密码输入并排怎么输_hadoop集群密码输入并排怎么输_18

接下来修改mapred-site.xml,这里是没有这个xml的,需要将mapred-site.xml.template文件复制重命名,直接重命名也行

  <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

hadoop集群密码输入并排怎么输_hdfs_19

接下来修改yarn-site.xml,

<property>
         <name>yarn.nodemanager.aux-services</name>
         <value>mapreduce_shuffle</value>
     </property>


 <property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>cluster1</value>
  </property>
  <property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
  </property>
  <property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>master1</value>
  </property>
  <property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>master2</value>
  </property>
  <property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>zk1:2181,zk2:2181,zk3:2181</value>
  </property>

hadoop集群密码输入并排怎么输_hdfs_20

接下来修改slaves。这个文件里面制定的是datanode

hadoop集群密码输入并排怎么输_hadoop_21

这时候配置就配置完成了,现在需要将hadoop的安装包分发到app02和app03上。(这时候注意。app02和app03上也要相应设置hadoop_home环境变量)

五、启动hadoop


1.启动zookeeper,这个时候要首先启动zookeeper,因为要格式化zookeeper集群,目的是在ZooKeeper集群上建立HA的相应节点。


首先zkServer.sh status查看状态,如果没有启动,就zkServer.sh start启动zookeeper集群,



2.格式化ZooKeeper集群




hdfs zkfc -formatZK



hadoop集群密码输入并排怎么输_hdfs_22

successfully说明我们已经成功初始化zookeeper集群,我们可以用zookeeper客户端查看我们注册的hadoop-ha的服务

hadoop集群密码输入并排怎么输_大数据_23

3.启动日志程序journalnode,三个节点的journalnode全部启动,前面我们配置的每台机器上都有一个

hadoop-daemon.sh start journalnode

hadoop集群密码输入并排怎么输_大数据_24

hadoop集群密码输入并排怎么输_hadoop集群密码输入并排怎么输_25

hadoop集群密码输入并排怎么输_hadoop_26

4.格式化NameNode(必须开启JournalNode进程)

hdfs namenode -format

如果不是首次format的话还是把NameNode和DataNode存放数据地址下的数据手动删除一下,否则会造成NameNode ID和DataNode ID不一致,

hadoop集群密码输入并排怎么输_大数据_27

/opt/hadoop-2.5.1/tmp/dfs/name has been successfully formatted说明我们已经成功格式化hdfs

5.启动NameNode,首先启动app01的namenode,后启动app02的namenode,保证app02的namenode是standby的,方面执行第6步,同步信息到app02的namonode上。因为app01的hdfs格式化了,为了保证两个节点相同、
hadoop-daemon.sh start namenode

hadoop集群密码输入并排怎么输_hadoop集群密码输入并排怎么输_28

hadoop集群密码输入并排怎么输_hadoop_29

6.把NameNode的数据从app01同步到app02中
注意,在app02(namenode standby)下执行:
hdfs namenode -bootstrapStandby

hadoop集群密码输入并排怎么输_hadoop集群密码输入并排怎么输_30

此时说明格式化hdfs的信息已经同步到了app02机器上

7.启动所有的DataNode

hadoop-daemons.sh start datanode

hadoop集群密码输入并排怎么输_hdfs_31


8.启动Yarn

start-yarn.sh


hadoop集群密码输入并排怎么输_zookeeper_32


9.在app01,app02启动ZooKeeperFailoverController

hadoop-daemon.sh start zkfc

hadoop集群密码输入并排怎么输_zookeeper_33

hadoop集群密码输入并排怎么输_hadoop_34

10 启动别的resourcemanager

NameNode HA操作完之后我们可以发现只有一个节点(这里是app01)启动,需要手动启动另外一个节点(app02)的resourcemanager。
yarn-daemon.sh start resourcemanager

hadoop集群密码输入并排怎么输_hadoop_35

这时候我们已经配置完,也同步完信息了,我习惯使用start-all.sh和stop-all.sh(虽然已经过时),首先执行stop-all.sh。然后执行start-all.sh验证一波。

hadoop集群密码输入并排怎么输_大数据_36

hadoop集群密码输入并排怎么输_hdfs_37

hadoop集群密码输入并排怎么输_hadoop_38

所有的节点全部启动成功,我们在windows上面连接web界面,我们查看一下hadoop的情况

hadoop集群密码输入并排怎么输_hadoop_39

hadoop集群密码输入并排怎么输_hadoop_40

hadoop集群密码输入并排怎么输_hadoop集群密码输入并排怎么输_41

app02是standby状态的没问题。

hadoop集群密码输入并排怎么输_hdfs_42

我们来看resourcemanager,现在app02的是active的,当输入app01:8088的时候,会跳转到active的机器上

hadoop集群密码输入并排怎么输_大数据_43

这样,我们的hadoop中hdfs和MapReduce的HA的安装已经成功了,如果有兴趣,直接杀掉app01的namenode。可以看看是否zookeeper帮我们切换到standby的机器上。