赞
踩
hadoop 支持单机模式、伪分布式和完全分布式模式3种安装模式
(1)单机模式:又叫本地模式,即只在一台机器安装 hadoop ,其属于默认安装模式,无需进行配置就可以运行 hadoop 。该模式主要用于 MapReduce 应用程序的调试,没有使用分布式文件系统,也不会加载程序。
(2)伪分布式模式:同意是运行在一台机器上,其增加了代码调试功能,包括5个进程(NameNode、SecondaryNameNode、DataNode、ResourceManager、NodeManager),即在一台机器上模拟分布式,主要用于测试。
(3)完全分布式模式:又叫集群模式,它由两台及以上的机器组成,是真正的分布式。
本文章将在虚拟机集群的基础上搭建一个 hadoop 高可用分布式集群(包括两个NameNode),该集群结合 ZooKeeper 实现自动故障转移功能,由三台虚拟机组成。
要搭建完全分布式高可用集群我们要准备虚拟机,Linux(CentOS 7) 镜像文件, jdk,zookeeper,hadoop 安装文件和远程连接工具 MobaXterm
MobaXterm 下载地址:https://mobaxterm.mobatek.net/
jdk1.8.0 下载地址:https://www.oracle.com/cn/java/technologies/downloads/
zookeeper-3.6.2 下载地址:https://zookeeper.apache.org/releases.html
hadoop-2.7.6 下载地址:https://archive.apache.org/dist/hadoop/common/
CentOS 7 下载地址:https://mirrors.163.com/centos/7.9.2009/isos/x86_64/
主机名称 | IP地址 |
---|---|
hadoop1 | 192.168.119.21 |
hadoop2 | 192.168.119.22 |
hadoop3 | 192.168.119.23 |
每台机器分别修改 /etc/hosts 文件,将每个节点的 IP 和主机名映射,可以方便地使用主机名进行网络访问,不在需要输入要访问节点地 IP 地址
# vi /etc/hosts
- 192.168.119.21 hadoop1
- 192.168.119.22 hadoop2
- 192.168.119.23 hadoop3
分别在3个节点中执行以下命令,生成密钥文件
# ssh-keygen
执行该命令时,会要求确认密钥文件的存储位置(默认是 “~/.ssh/” )、输入并确认私钥的密码,均直接按 Enter 键即可(表示将私钥密码留空)。其中, id_rsa 是本机的私钥文件, id_rsa.pub 是本机的公钥文件
- # ssh-copy-id hadoop1
- # ssh-copy-id hadoop2
- # ssh-copy-id hadoop3
- # ssh hadoop1
- # ssh hadoop2
- # ssh hadoop3
- # mkdir /opt/packages
- # mkdir /opt/programs
# tar -zxvf jdk-8u202-linux-x64.tar.gz -C /opt/programs
# vi /etc/profile
在末尾添加以下内容:
- export JAVA_HOME=/opt/programs/jdk1.8.0_202
- export PATH=$PATH:$JAVA_HOME/bin
# source /etc/profile
# java -version
- # scp -r /etc/profile hadoop2:/etc
- # scp -r /etc/profile hadoop3:/etc
- # scp -r /opt/programs/jdk1.8.0_202 hadoop2:/opt/programs
- # scp -r /opt/programs/jdk1.8.0_202 hadoop3:/opt/programs
# source /etc/profile
# rpm -qa | grep jdk
# yum -y remove XXX(上面查询到的 jdk 名称)
注意:如果终端出现以下错误:/var/run/yum.pid 已被锁定,PID 为 1610 的另一个程序正在运行。
则输入以下命令:
# rm -f /var/run/yum.pid
之后再执行以上删除 jdk 命令
# source /etc/profile
由于双 NameNode 的 hadoop 高可用分布式集群,需要安装与配置一个 ZooKeeper 集群,用于 ZKFC(ZooKeeper Failover Controller),从而保证当活动状态的 NameNode 失效时,备用状态的 NameNode 可以自动切换为活动状态
# tar -zxvf zookeeper-3.6.2.tar.gz -C /opt/programs
# cd /opt/programs/zookeeper-3.6.2
- # mkdir data
- # mkdir logs
- # touch /data/myid
- # vi /data/myid
- '1'>myid
(注意:hadoop2 节点写入 2 ,hadoop3 节点写入 3)
- # cd /opt/programs/zookeeper-3.6.2/conf
- # cp zoo_sample.cfg zoo.cfg
# vi zoo.cfg
先将文件中的 dataDir 修改为
dataDir=/opt/programs/zookeeper-3.6.2/data
然后在末尾加入以下内容
- dataLogDir=/opt/programs/zookeeper-3.6.2/logs
- server.1=hadoop1:2888:3888
- server.2=hadoop2:2888:3888
- server.3=hadoop3:2888:3888
# vi /etc/profile
在文件末尾添加以下内容
- export ZOOKEEPER_HOME=/opt/programs/zookeeper-3.6.2
- export PATH=$PATH:$ZOOKEEPER_HOME/bin
- # scp -r /etc/profile hadoop2:/etc
- # scp -r /etc/profile hadoop3:/etc
- # scp -r /opt/programs/zookeeper-3.6.2 hadoop2:/opt/programs
- # scp -r /opt/programs/zookeeper-3.6.2 hadoop3:/opt/programs
# source /etc/profile
# zkServer.sh start
若均能输出以下信息,说明启动成功
# zkServer.sh status
hadoop3 节点上的 ZooKeeper 服务为 Leader ,其余两个节点上的 ZooKeeper 服务为 Follower ,这是系统根据 ZooKeeper 选举机制确定的
当 ZooKeeper 服务启动后,可以在其中一个节点中执行以下命令,连接到 ZooKeeper 集群(供用户进行交互操作)
# zkCli.sh
( 注:要退出客户端可以执行 “quit” 命令)
要停止 ZooKeeper 服务,可以执行以下命令
# zkServer.sh stop
# tar -zxvf hadoop-2.7.6.tar.gz -C /opt/programs
# cd /opt/programs/hadoop-2.7.6/etc/hadoop
依次修改配置文件 core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、slaves、hadoop-env.sh、mapred-env.sh 和 yarn-env.sh
- <configuration>
- <property>
- <name>fs.defaultFS</name>
- <value>hdfs://ns</value>
- </property>
- <property>
- <name>hadoop.tmp.dir</name>
- <value>/opt/programs/hadoop-2.7.6/tmp</value>
- </property>
- <property>
- <name>ha.zookeeper.quorum</name>
- <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
- </property>
- </configuration>
- <configuration>
- <property>
- <name>dfs.replication</name>
- <value>3</value>
- </property>
- <property>
- <name>dfs.nameservices</name>
- <value>ns</value>
- </property>
- <property>
- <name>dfs.ha.namenodes.ns</name>
- <value>nn1,nn2</value>
- </property>
- <property>
- <name>dfs.namenode.rpc-address.ns.nn1</name>
- <value>hadoop1:9000</value>
- </property>
- <property>
- <name>dfs.namenode.http-address.ns.nn1</name>
- <value>hadoop1:50070</value>
- </property>
- <property>
- <name>dfs.namenode.rpc-address.ns.nn2</name>
- <value>hadoop2:9000</value>
- </property>
- <property>
- <name>dfs.namenode.http-address.ns.nn2</name>
- <value>hadoop2:50070</value>
- </property>
- <property>
- <name>dfs.namenode.shared.edits.dir</name>
- <value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/ns</value>
- </property>
- <property>
- <name>dfs.journalnode.edits.dir</name>
- <value>/opt/programs/hadoop-2.7.6/journal/data</value>
- </property>
- <property>
- <name>dfs.ha.automatic-failover.enabled</name>
- <value>true</value>
- </property>
- <property>
- <name>dfs.client.failover.proxy.provider.ns</name>
- <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
- </property>
- <property>
- <name>dfs.ha.fencing.methods</name>
- <value>
- sshfence
- shell(/bin/true)
- </value>
- </property>
- <property>
- <name>dfs.ha.fencing.ssh.private-key-files</name>
- <value>/root/.ssh/id_rsa</value>
- </property>
- <property>
- <name>dfs.ha.fencing.ssh.connect-timeout</name>
- <value>30000</value>
- </property>
- </configuration>
- <configuration>
- <property>
- <name>mapreduce.framework.name</name>
- <value>yarn</value>
- </property>
- </configuration>
- <configuration>
- <property>
- <name>yarn.resourcemanager.ha.enabled</name>
- <value>true</value>
- </property>
- <property>
- <name>yarn.resourcemanager.cluster-id</name>
- <value>yrc</value>
- </property>
- <property>
- <name>yarn.resourcemanager.ha.rm-ids</name>
- <value>rm1,rm2</value>
- </property>
- <property>
- <name>yarn.resourcemanager.hostname.rm1</name>
- <value>hadoop1</value>
- </property>
- <property>
- <name>yarn.resourcemanager.hostname.rm2</name>
- <value>hadoop2</value>
- </property>
- <property>
- <name>yarn.resourcemanager.zk-address</name>
- <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
- </property>
- <property>
- <name>yarn.nodemanager.aux-services</name>
- <value>mapreduce_shuffle</value>
- </property>
- </configuration>
- hadoop1
- hadoop2
- hadoop3
export JAVA_HOME=/opt/programs/jdk1.8.0_202
# vi /etc/profile
在文件末尾添加以下内容
- export HADOOP_HOME=/opt/programs/hadoop-2.7.6
- export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
- # scp -r /etc/profile hadoop2:/etc
- # scp -r /etc/profile hadoop3:/etc
- # scp -r /opt/programs/hadoop-2.7.6 hadoop2:/opt/programs
- # scp -r /opt/programs/hadoop-2.7.6 hadoop3:/opt/programs
# source /etc/profile
由于是第一次启动 hadoop ,需要格式化 NameNode ,格式化前需要先启动 JournalNode (仅初始化 NameNode 需要)
# hadoop-daemon.sh start journalnode
若均能输出以下信息,说明启动成功
# hdfs namenode -format
若能输出以下信息,说明格式化成功
(注:tmp 目录则生成用于存储 HDFS 文件系统元数据信息的文件 fsimage 等,logs 目录用于存储 hadoop 集群的日志文件)
执行以下命令,将 hadoop1 节点 hadoop 安装目录下的 tmp 文件远程发送到 hadoop2 节点的 hadoop 安装目录下
# scp -r /opt/programs/hadoop-2.7.6/tmp hadoop2:/opt/programs/hadoop-2.7.6
(提示:两个 NameNode 分别位于 hadoop1 和 hadoop2 节点上,如果想要再次初始化,请删除两个节点上的 tmp 和 logs 目录)
# hdfs zkfc -formatZK
若能输出以下信息,说明格式化成功
(注意:格式化 ZKFC 只需执行一次,且仅在hadoop1节点上)
- # start-dfs.sh
- # start-yarn.sh
提示!!
以下展示了 hadoop 集群各个节点分配的角色(即启动的守护进程)。其中,QuorumPeerMain 是ZooKeeper 集群所启动的进程;NameNode、DataNode、JournaNode、DFSZKFailoverController 是 HDFS 集群所启动的进程;ResourceManager、NodeManager 是 YARN 集群所启动的进程
访问 192.168.119.22:50070 ,页面显示 hadoop2:9000(standby)
(注意:谁先启动就是active,此时若 hadoop1 节点挂掉,即 hadoop2 节点的 standby 变为 active )
我们可以使用 kill 命令来挂掉 hadoop1 节点的 NameNode ,来测试备用状态下 hadoop2 节点的 NameNode 是否自动切换为活动状态,这里博主就不展示了
可以看出,双 NameNode 的 hadoop 分布式集群搭建成功
如果要停止 hadoop 集群,在 hadoop1 节点上输入以下命令停止 HDFS 和 YARN
- # stop-dfs.sh
- # stop-yarn.sh
然后在每个节点上执行以下命令停止 ZooKeeper
# zkServer.sh stop
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。