前言:要顺利完成本次环境搭建,必须准备好三台配置好ZooKeeper集群的虚拟机,再次确保三台主机有独立的IP、独立的主机名、并且配置好IP地址与主机名之间的映射,三台机器之间的SSH免密登录,以及三台机器之间的时间同步。
我们对于集群配置的修改,可以先在一台机器上进行(如master),修改完成后把配置文件分发到其他机器上即可!!!
本教程的集群的规划如图所示
(一)HDFS分布式集群的配置
一、修改core-site.xml配置文件
配置文件位于你的hadoop安装文件夹里面的/etc/hadoop/路径下,因此先:
cd ~/hadoop-2.9.2/etc/hadoop/
然后再:
vim core-site.xml
配置内容如下:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!--默认的HDFS路径-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/tmp</value>
</property>
<!--hadoop的临时目录,如果需要配置多个目录,需要逗号隔开-->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<!--配置Zookeeper管理HDFS-->
</configuration>
修改完成后,把该配置文件分发到另外两台机器,或者你自行在另外两台机器上修改相应的配置,要确保三台机器配置内容一样。
以下是发送配置文件的命令,以发送到slave1机器上的为例:
scp -r core-site.xml hadoop@slave1:/home/hadoop/hadoop-2.9.2/etc/hadoop/core-site.xml
请注意标红的部分,尝试理解这个scp命令,按照实际情况去修改执行。
二、修改hdfs-site.xml配置文件
该文件同样位于hadoop安装文件夹里面的/etc/hadoop/路径下:
cd ~/hadoop-2.9.2/etc/hadoop/
然后再:
vim hdfs-site.xml
配置内容如下:
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--数据块副本数为3-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!--权限默认配置为false-->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!--命名空间,它的值与fs.defaultFS的值要对应,namenode高可用之后有两个namenode,mycluster是对外提供的统一入口-->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- 指定 nameService 是 mycluster时的nameNode有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可-->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>master:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>master:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>slave1:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>slave1:50070</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--启动故障自动恢复-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value>
</property>
<!--指定NameNode的元数据在JournalNode上的存放位置-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--指定 mycluster 出故障时,哪个实现类负责执行故障切换-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/data/journaldata/jn</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
<!-- 配置隔离机制,shell通过ssh连接active namenode节点,杀掉进程-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 为了实现SSH登录杀掉进程,还需要配置免密码登录的SSH密匙信息 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>10000</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
</configuration>
请务必认真仔细,注意标红的主机名、路径等信息,要和你实际情况相符。
修改完成后,把该配置文件分发到另外两台机器,或者你自行在另外两台机器上修改相应的配置,要确保三台机器配置内容一样。
以下是发送配置文件的命令,以发送到slave1机器上的为例:
scp -r hdfs-site.xml hadoop@slave1:/home/hadoop/hadoop-2.9.2/etc/hadoop/hdfs-site.xml
三、配置slaves配置文件
该文件同样位于hadoop安装文件夹里面的/etc/hadoop/路径下:
cd ~/hadoop-2.9.2/etc/hadoop/
然后再:
vim slaves
配置内容如下:
master
slave1
slave2
以下是发送配置文件的命令,以发送到slave1机器上的为例:
scp -r slaves hadoop@slave1:/home/hadoop/hadoop-2.9.2/etc/hadoop/slaves
四、启动HDFS集群服务
步骤:
1、HDFS的高可用实现依赖ZooKeeper,因此先启动三台机器的ZooKeeper服务;
2、分别启动JournalNode集群,在三台机器上各自执行以下命令:
hadoop-daemon.sh start journalnode
3、格式化主节点NameNode,在master上,执行以下命令:
hdfs namenode -format // 格式化NameNode
hdfs zkfc -formatZK // 格式化ZooKeeper高可用
hdfs namenode // 启动NameNode
4、master上启动NameNode进程后,在slave1上就可以同步NameNode元数据,在slave1上执行以下命令:
hdfs namenode -bootstrapStandby
5、第4步同步完成后,可以关闭master上的NameNode进程,切回到master上的终端,使用<Ctrl+C>组合键结束进程即可。
6、关闭JournalNode集群,在三台机器上各自执行以下命令:
hadoop-daemon.sh stop journalnode
如果上述步骤没有报错,则后续可以在master上一键启动HDFS集群:
start-dfs.sh
测试:启动成功后,可以通过master、slave1的IP地址+50070端口在浏览器端访问HDFS集群的Web界面,查看状态,如:http://192.168.203.133:50070,或者使用以下命令查看NameNode状态:
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
测试2:可以尝试使用hadoop fs -mkdir命令创建一个/test文件夹,然后再把words.log文件上传到HDFS集群中,检查HDFS能否正常使用。
(二)YARN分布式集群的配置
一、修改mapred-site.xml配置文件
该文件主要配置MapReduce相关属性,将MapReduce运行环境指定未YARN即可,这里和前面的配置中是一致的,不需修改。文件内容如下,可供确认:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!--指定运行MapReduce的环境是YARN-->
</configuration>
二、修改yarn-site.xml配置文件
该文件同样位于hadoop安装文件夹里面的/etc/hadoop/路径下:
cd ~/hadoop-2.9.2/etc/hadoop/
然后再:
vim yarn-site.xml
配置内容如下:
<configuration>
<property>
<name>yarn.resourcemanager.connect.retry-interval.ms</name>
<value>2000</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--打开高可用-->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--启动故障自动恢复-->
<property>
<name>yarn.resourcemanager.ha.automatic-failover.embedded</name>
<value>true</value>
</property>
<!--RM启动内置选举active-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-rm-cluster</value>
</property>
<!--给yarn cluster 取个名字yarn-rm-cluster-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!--ResourceManager高可用 rm1,rm2-->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slave1</value>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--启用resourcemanager 自动恢复-->
<property>
<name>hadoop.zk.address</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<!--配置Zookeeper地址作为状态存储和leader选举-->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>master:8032</value>
</property>
<!--rm1端口号-->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>master:8034</value>
</property>
<!-- rm1调度器的端口号-->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value> master:8088</value>
</property>
<!-- rm1 webapp端口号-->
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>slave1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>slave1:8034</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>slave1:8088</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<!--执行MapReduce需要配置的shuffle过程-->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>4</value>
</property>
</configuration>
同样务必认真仔细,注意标红的主机名信息,要和你实际情况相符。
修改完成后,把该配置文件分发到另外两台机器,或者你自行在另外两台机器上修改相应的配置,要确保三台机器配置内容一样。
以下是发送配置文件的命令,以发送到slave1机器上的为例:
scp -r yarn-site.xml hadoop@slave1:/home/hadoop/hadoop-2.9.2/etc/hadoop/yarn-site.xml
三、启动YARN集群服务
步骤:
1、YARN的高可用实现也依赖与ZooKeeper,但前面已经启动了ZooKeeper服务,因此这步可以跳过。
2、一键启动YARN集群,在master上执行脚本命令:
start-yarn.sh
3、由于上面脚本不包含备用ResourceManager的启动,因此要手动启动备用ResourceManager,在slave1上执行命令:
yarn-daemon.sh start resourcemanager
4、测试:启动成功后,可以通过master、slave1的IP地址+8088端口在浏览器端访问YARN集群的Web界面,也可以使用以下命令查看两个ResourceManager的状态:
yarn rmadmin -getServiceState rm1
yarn rmadmin -getServiceState rm2
5、测试2:尝试上传一些数据集(用之前的天气数据,或者words.log都行)到HDFS中,然后执行一下对应的MapReduce程序,看看能否正常运行。