我这里采用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 #生成密钥 (一直回车)
我这里用的root用户,生成的id_rea.pub 在/root/.ssh/目录下面
将生成的cat id_rsa.pub >> authorized_keys
注意:这里是追加
然后将app01的id_rea.pub分别追加到app02和app03的authorized_keys。这一步很关键
这样app01,就能免密码登录到app02和app03了。
二、接下来,在centos上安装java
下载好java的安装包,将其解压,在环境变量里面加上JAVA_HOME。此过程略
三、接下来,我们安装zookeeper集群
我打算在app01,app02,app03上都装zookeeper集群,这里建议集群的个数为奇数个。
将zookeeper的安装包上传到app01,将其解压,进入目录,pwd。设置此目录为zookeeper的环境变量
进入zookeeper_home/conf。将zoo_sample.cfg复制为zoo.cfg
修改zoo.cfg.
注意,最下面的server.1,1为app02在zookeeper集群中的编号,这个编号需要我们设置,在上面设置的dataDir目录下面创建myid文件,修改里面的内容为1,剩下的以此类推。
接下来scp将zookeeper的安装包分发到每台机器上,然后修改对应的myid文件
我这里是app01的机器,对应的是编号是3,所以文件里面输入的是3.
接下来,启动我们的zookeeper集群,在每台机器上执行,zkServer.sh start
我们用zkServer.sh status来查看我们集群的状态
这里app03是我们zookeeper集群的领导者,说明现在zookeeper集群已经可以使用了。
四、接下来安装我们的Hadoop。
首先将Hadoop2.5.1的安装文件上传到app01上,将其解压。
进入hadoop-2.5.1,然后输入pwd。将此路径设置到环境变量。就是配置hadoop的环境变量。
保存退出,记得source /etc/profile 然配置文件生效。
接下来,我们来配置hadoop,进入hadoop_home/etc/hadoop目录
我们首先来修改hadoop-env.sh文件
修改hadoop-env.sh里面JAVA_HOME。这里改成我们刚才安装的java路径
接下来修改yarn-env.sh。同样也是修改JAVA_HOME
接下来我们来配置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>
我们这里修改了临时目录,和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>
接下来修改mapred-site.xml,这里是没有这个xml的,需要将mapred-site.xml.template文件复制重命名,直接重命名也行
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
接下来修改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>
接下来修改slaves。这个文件里面制定的是datanode
这时候配置就配置完成了,现在需要将hadoop的安装包分发到app02和app03上。(这时候注意。app02和app03上也要相应设置hadoop_home环境变量)
五、启动hadoop
hdfs zkfc -formatZK
successfully说明我们已经成功初始化zookeeper集群,我们可以用zookeeper客户端查看我们注册的hadoop-ha的服务
3.启动日志程序journalnode,三个节点的journalnode全部启动,前面我们配置的每台机器上都有一个
hadoop-daemon.sh start journalnode
4.格式化NameNode(必须开启JournalNode进程)
hdfs namenode -format
如果不是首次format的话还是把NameNode和DataNode存放数据地址下的数据手动删除一下,否则会造成NameNode ID和DataNode ID不一致,
/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
6.把NameNode的数据从app01同步到app02中
注意,在app02(namenode standby)下执行:
hdfs namenode -bootstrapStandby
此时说明格式化hdfs的信息已经同步到了app02机器上
7.启动所有的DataNode
hadoop-daemons.sh start datanode
8.启动Yarn
start-yarn.sh
9.在app01,app02启动ZooKeeperFailoverController
hadoop-daemon.sh start zkfc
10 启动别的resourcemanager
NameNode HA操作完之后我们可以发现只有一个节点(这里是app01)启动,需要手动启动另外一个节点(app02)的resourcemanager。
yarn-daemon.sh start resourcemanager
这时候我们已经配置完,也同步完信息了,我习惯使用start-all.sh和stop-all.sh(虽然已经过时),首先执行stop-all.sh。然后执行start-all.sh验证一波。
所有的节点全部启动成功,我们在windows上面连接web界面,我们查看一下hadoop的情况
app02是standby状态的没问题。
我们来看resourcemanager,现在app02的是active的,当输入app01:8088的时候,会跳转到active的机器上
这样,我们的hadoop中hdfs和MapReduce的HA的安装已经成功了,如果有兴趣,直接杀掉app01的namenode。可以看看是否zookeeper帮我们切换到standby的机器上。