以下所有操作均在测试环境中执行
于『VMWare』中安装『CentOS-6.8-x86_64』。注:尽量安装最新版VM,旧版会因一些操作导致虚拟机卡死,这将对我们接下来的操作产生严重影响
安装过程没什么可说的,唯一一点就是在创建磁盘分区的时候尽量选择『Create Custom Layout』(创建自定义布局)。
分区 | 大小(M) |
---|---|
/boot | 200 |
swap | 2048 |
/ | Fill to maximum allowable size(使用全部可用空间) |
配置静态『IP』。
vi /etc/sysconfig/network-scripts/ifcfg-eth0
参数 | 参数值 |
---|---|
HWADDR[1] | 注释掉改行 |
ONBOOT | yes |
BOOTPROTO | static |
IPADDR[2] | 虚拟网络编辑器-->VMnet8-->子网IP(替换第四组的0为100+) |
NETMASK | 虚拟网络编辑器-->VMnet8-->子网掩码 |
GATEWAY | NAT设置-->网关IP |
DNS1 | 114.114.114.114 |
DNS2[3] | 8.8.8.8 |
重新启动下网络。
service network restart
关闭防火墙[4]。
service iptables stop
禁用防火墙。
chkconfig iptables off
禁用安全模块[5]。
vi /etc/selinux/config
参数 | 参数值 |
---|---|
SELINUX | disabled |
此文件中会利用『eth0』和硬件地址做一个关联绑定。为方便后续克隆,保证克隆出的系统『eth0』接口可用,需要将此文件删除[6],解除绑定关系。
rm -rf /etc/udev/rules.d/70-persistent-net.rules
poweroff
关机拍快照。
在快照管理器中选中快照,点击克隆,一路默认到设置虚拟机名称,输入自定义名称(PS:caroly01),选择克隆路径进行克隆。重复此操作克隆四台虚拟机(caroly01、caroly02、caroly03、caroly04)。
给四台克隆虚拟机分配『IP』,分别为『240.151』『240.152』『240.153』『240.154』,并重启网络。
service network restart
给四台克隆虚拟机重设主机名。
vi /etc/sysconfig/network
更改『HOSTNAME』的值分别为『caroly01』『caroly02』『caroly03』『caroly04』。注:主机名生效需要重启虚拟机
给四台克隆虚拟机配置『hosts』[7]。
vi /etc/hosts
本地物理机配置『hosts』
C:\Windows\System32\drivers\etc\hosts
IP地址 | 主机名 |
---|---|
192.168.240.151 | caroly01 |
192.168.240.152 | caroly02 |
192.168.240.153 | caroly03 |
192.168.240.154 | caroly04 |
poweroff
关机拍快照。
重新登陆虚拟机可以进行互通测试。
使用『MobaXterm』连接四台虚拟机,向四台虚拟机发送同步时间指令。
ntpdate 0.centos.pool.ntp.org
输入『date』可以查看系统当前时间。
注:点击菜单栏的『MultiExec』,可以同时向四台虚拟机发送相同指令
将『JDK』的『RPM』包上传到虚拟机,安装。
rpm -i jdk-8u251-linux-x64.rpm
配置环境变量,在最后新增两行[8]:
vi + /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_251-amd64
PATH=$PATH:$JAVA_HOME/bin
保存退出后重新执行该文件使之生效[9]。
. /etc/profile
检查一下是否可以在没有密码的情况下SSH到本虚拟机。
ssh localhost
如果需要输入密码才能SSH到本虚拟机,执行以下命令:
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
将『caroly01』的 .ssh/id_dsa.pub
分发给其他三台虚拟机[10]
scp id_dsa.pub caroly02:`pwd`/caroly01.pub scp id_dsa.pub caroly03:`pwd`/caroly01.pub scp id_dsa.pub caroly04:`pwd`/caroly01.pub
分发完毕后在被分发的虚拟机中追加此文件内容到 authorized_keys
文件
cat caroly01.pub >> authorized_keys cat caroly01.pub >> authorized_keys cat caroly01.pub >> authorized_keys
可以测试一下配置是否正确。
主机名 | NameNode | SecondaryNameNode | DataNode |
---|---|---|---|
caroly01 | √ | ||
caroly02 | √ | √ | |
caroly03 | √ | ||
caroly04 | √ |
解压『Hadoop』到目录 opt/caroly
,该模块操作在『caroly01』中执行。
tar xf hadoop-2.9.2.tar.gz -C /opt/caroly
配置环境变量,在最后新增两行:
vi + /etc/profile
export HADOOP_HOME=/opt/caroly/hadoop-2.9.2
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
修改以下可执行文件:cd /opt/caroly/hadoop-2.9.2/etc/hadoop
,该模块操作在『caroly01』中执行。
文件名 | 修改参数 |
---|---|
hadoop-env.sh | export JAVA_HOME=/usr/java/jdk1.8.0_251-amd64 |
mapred-env.sh | export JAVA_HOME=/usr/java/jdk1.8.0_251-amd64 |
yarn-env.sh | export JAVA_HOME=/usr/java/jdk1.8.0_251-amd64 |
修改以下配置文件(『caroly01』):
vi /opt/caroly/hadoop-2.9.2/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://caroly01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/caroly/hadoop/full</value>
</property>
</configuration>
vi /opt/caroly/hadoop-2.9.2/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>caroly02:50090</value>
</property>
</configuration>
vi /opt/caroly/hadoop-2.9.2/etc/hadoop/slaves
#localhost
caroly02
caroly03
caroly04
配置好后进入 opt
目录,将 caroly
目录分发[11]给其他三台虚拟机,并在其他三台虚拟机中配好『JDK』以及『Hadoop』的环境变量。
scp -r caroly/ caroly02:`pwd`
scp -r caroly/ caroly03:`pwd`
scp -r caroly/ caroly04:`pwd`
----------------------------------
scp /etc/profile caroly02:/etc/
scp /etc/profile caroly03:/etc/
scp /etc/profile caroly04:/etc/
----------------------------------
. /etc/profile
主机名 | NameNode-1 | NameNode-2 | DataNode | ZK | ZKFC | JN |
---|---|---|---|---|---|---|
caroly01 | √ | √ | √ | |||
caroly02 | √ | √ | √ | √ | √ | |
caroly03 | √ | √ | √ | |||
caroly04 | √ | √ |
在『caroly01』中修改以下配置文件:
vi /opt/caroly/hadoop-2.9.2/etc/hadoop/core-site.xml
<configuration>
<!-- 指定在Hadoop中要使用的文件系统 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- Hadoop文件系统依赖的基础配置,很多路径都依赖它。默认路径在/tmp下,Linux重启后会删除,需更改位置。 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/var/caroly/hadoop/full</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>caroly02:2181,caroly03:2181,caroly04:2181</value>
</property>
</configuration>
vi /opt/caroly/hadoop-2.9.2/etc/hadoop/hdfs-site.xml
<configuration>
<!-- 默认块复制。创建文件时可以指定实际的复制数量。如果未在创建时指定复制,则使用默认值。 --> <property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 集群的逻辑名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 每个NameNode的唯一标识符,以下是两个 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1监听的RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>caroly01:8020</value>
</property>
<!-- nn2监听的RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>caroly02:8020</value>
</property>
<!-- nn1监听的HTTP地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>caroly01:50070</value>
</property>
<!-- nn2监听的HTTP地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>caroly02:50070</value>
</property>
<!-- 配置提供共享编辑存储的JournalNodes的地址,该地址由Active NameNode写入并由Standby NameNode读取,以与Active NameNode所做的所有文件系统更改保持最新。 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://caroly01:8485;caroly02:8485;caroly03:8485/mycluster</value>
</property>
<!-- 配置Java类的名称,DFS客户端将使用该Java类来确定哪个NameNode是当前的Active,从而确定哪个NameNode当前正在服务于客户端请求。 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 为了保证系统的正确性,在任何给定时间只有一个NameNode处于Active状态。重要的是,使用Quorum Journal Manager时,将只允许一个NameNode写入JournalNodes,因此不会因"脑裂"情况而损坏文件系统元数据。多个机制用换行分割。 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登录 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_dsa</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/caroly/hadoop/ha/journalnode</value>
</property>
<!-- 启用故障转移机制 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
将修改的两个文件分发到其他三台虚拟机中[12]:
cd /opt/caroly/hadoop-2.9.2/etc/hadoop
scp core-site.xml hdfs-site.xml caroly02:`pwd`
scp core-site.xml hdfs-site.xml caroly03:`pwd`
scp core-site.xml hdfs-site.xml caroly04:`pwd`
在『caroly02』『caroly03』『caroly04』中配置『ZooKeeper』。该模块操作在『caroly02』中执行。
tar xf zookeeper-3.4.6.tar.gz -C /opt/caroly/
cd /opt/caroly/zookeeper-3.4.6/
修改配置文件:
cd conf/
mv zoo_sample.cfg zoo.cfg
vi zoo.cfg
#修改以下内容
dataDir=/var/caroly/zookeeper
#新增以下内容
server.1=caroly02:2888:3888
server.2=caroly03:2888:3888
server.3=caroly04:2888:3888
配置好后将『zookeeper-3.4.6』目录[13]分发给『caroly03』『caroly04』。
scp -r zookeeper-3.4.6/ caroly03:`pwd`
scp -r zookeeper-3.4.6/ caroly04:`pwd`
在『caroly02』『caroly03』『caroly04』中创建目录:
mkdir -p /var/caroly/zookeeper
为『ZooKeeper』配置编号:
在『caroly02』中输入命令:
echo 1 > /var/caroly/zookeeper/myid
在『caroly03』中输入命令:
echo 2 > /var/caroly/zookeeper/myid
在『caroly04』中输入命令:
echo 3 > /var/caroly/zookeeper/myid
配置环境变量,在最后新增两行:
vi + /etc/profile
export ZOOKEEPER_HOME=/opt/caroly/zookeeper-3.4.6
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
保存退出后将此文件分发给『caroly03』『caroly04』:
scp /etc/profile caroly03:/etc/
scp /etc/profile caroly04:/etc/
重新执行该文件使之生效。
. /etc/profile
启动『ZooKeeper』集群,在『caroly02』『caroly03』『caroly04』中输入以下命令:
zkServer.sh start
启动『JournalNode』,在『caroly01』『caroly02』『caroly03』中输入以下命令:
hadoop-daemon.sh start journalnode
格式化节点,『caroly01』和『caroly02』任选一个,在『caroly01』中输入以下命令:
hdfs namenode -format
启动格式化的主节点『caroly01』:
hadoop-daemon.sh start namenode
把主节点上的元数据信息拷贝到当前目录之下,在『caroly02』中输入以下命令:
hdfs namenode -bootstrapStandby
在『ZooKeeper』中初始化所需的状态,在『caroly01』中输入以下命令:
hdfs zkfc -formatZK
启动当前集群,在『caroly01』中输入以下命令:
start-dfs.sh
ResourceManager(RM) 负责跟踪集群中的资源,并调度应用程序(例如MapReduce作业)。
主机名 | NN-1 | NN-2 | DN | ZK | ZKFC | JN | RM | NM |
---|---|---|---|---|---|---|---|---|
caroly01 | √ | √ | √ | |||||
caroly02 | √ | √ | √ | √ | √ | √ | ||
caroly03 | √ | √ | √ | √ | √ | |||
caroly04 | √ | √ | √ | √ |
在『caroly01』中修改以下配置文件:
cd /opt/caroly/hadoop-2.9.2/etc/hadoop
mv mapred-site.xml.template mapred-site.xml
vi mapred-site.xml
<configuration>
<!-- 配置Yarn框架执行map-reduce处理程序-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!--日志监控服务的地址,一般填写为namenode机器地址,此处配置在caroly02上 -->
<property>
<name>mapreduce.jobhistroy.address</name>
<value>caroly02:10020</value>
</property>
</configuration>
vi yarn-site.xml
<configuration>
<!-- NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 开启高可用(RM HA)-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 集群标识,确保RM不会接管另一个集群(即不会成为其他集群的Active RM)-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster1</value>
</property>
<!-- RM的逻辑ID,比如rm1,rm2-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 为每个rm-id声明一个对应的主机名,也可以声明RM的服务地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>caroly03</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>caroly04</value>
</property>
<!-- rm-zk的地址,同时用于状态存储和leader选举 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>caroly02:2181,caroly03:2181,caroly04:2181</value>
</property>
<!-- 启用日志聚合功能,日志聚合开启后保存到HDFS上 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
</configuration>
将这两个文件分发给『caroly02』『caroly03』『caroly04』:
scp mapred-site.xml yarn-site.xml caroly02:`pwd`
scp mapred-site.xml yarn-site.xml caroly03:`pwd`
scp mapred-site.xml yarn-site.xml caroly04:`pwd`
『caroly03』『caroly04』配置高可用切换,需要配置免密登陆:
# 在 caroly03 中执行以下命令
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat id_dsa.pub >> authorized_keys
scp id_dsa.pub caroly04:`pwd`/caroly03.pub
#测试配置是否成功
ssh caroly04
---------------------------------------------
# 在 caroly04 中执行以下命令
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat id_dsa.pub >> authorized_keys
scp id_dsa.pub caroly03:`pwd`/caroly04.pub
# 测试配置是否成功
ssh caroly03
启动集群:
# 在 caroly02、caroly03、caroly04 中输入启动 zk 的命令
zkServer.sh start
# 在 caroly01中启动 hdfs
start-dfs.sh
# 在 caroly01中启动 yarn
start-yarn.sh
# 在 caroly03、caroly04 中启动 RM
yarn-daemon.sh start resourcemanager
# 在 caroly03、caroly04 中启动 historyserver
mr-jobhistory-daemon.sh start historyserver
通过浏览器访问 RM:
caroly03:8088
或
caroly04:8088
其中,『Active Nodes』的值为 3 表示搭建成功(从节点为 3 个)。
单词统计,在『caroly01』中执行:
cd /opt/caroly/hadoop-2.9.2/share/hadoop/mapreduce
# 此目录下有一个 mapreduce 的例子包,封装有一些写好的 job 任务
# 此处用到这个包的 wordcount 程序
hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /user/root/test.txt /wordcount
# 执行这个 jar 包下的 wordcount 程序,计算第一个路径下的 test.txt 文件,输出目录为第二个路径下的 wordcount 目录。
# /wordcount 目录可以不存在,若是存在必须是空目录。
# 查看结果
hdfs dfs -cat /wordcount/part-r-00000
关闭集群:
# 在 caroly03、caroly04 中关闭 RM
yarn-daemon.sh stop resourcemanager
# 在 caroly03、caroly04 中关闭 historyserver
mr-jobhistory-daemon.sh stop historyserver
# 在 caroly01 中关闭集群
stop-all.sh
# 在 caroly02、caroly03、caroly04 中关闭 zk
zkServer.sh stop
仅在实验环境注释,这台虚拟机将会用来克隆其他四台虚拟机。如果没有注释掉,『VMWare』会将新克隆的虚拟机的网卡地址(硬件地址)换成与这台虚拟机不一样的,为保证全局唯一,需要注释掉。 ↩︎
第四组的数不要为0、1、2,除此之外小于255并且该局域网中没有其他相同IP,都可。 ↩︎
此处可不写。 ↩︎
此处关闭防火墙,再次重启虚拟机依旧会开启,若想永久关闭,需禁用。 ↩︎
会阻断使用某些功能模块,所以暂且禁用。 ↩︎
与上方『1』标注一样,仅在实验环境中删除。 ↩︎
此处在一台虚拟机中配置好,再通过『scp』命令分发到其他虚拟机,省事。 ↩︎
『+』是定位到该文件的最后一行,放在文件前面后者后面都可以。按『o』(小写)即可在该行下面插入。 ↩︎
『.』可以替换成『source』。 ↩︎
『pwd』是输出分发文件方的当前目录. ↩︎
目录分发需要加参数『-r』 ↩︎
pwd 的当前目录是 /opt/caroly/hadoop-2.9.2/etc/hadoop/ ↩︎
当前目录是/opt/caroly/ ↩︎
本文由 caroly 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载 / 出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://caroly.fun/archives/高可用集群搭建
最后更新:2021-04-29 16:05:53
Update your browser to view this website correctly. Update my browser now