宿主机配置:
宿主机:小黑 T450
CPU :I5
内存 :16G
系统 :Windows 10 家庭版 64位
虚拟机:
Oracle VM VirtualBox:
VirtualBox-5.1.30.18389-Win.exe
系统准备:
CentOS-7-x86_64-Minimal-1708.iso
CentOS-7-x86_64-DVD-1708.iso
Linux系统安装:
CentOS-7-x86_64-Minimal-1708.iso #最简化安装,为了节省系统资源
下载DVD版本,目的是从当yum的软件源,对于需要的如:vim ssh net-tools 软件,需要挂在本地源,安装
CentOS-7-x86_64-DVD-1708.iso
一 :安装hadoop前系统环境配置:
1>挂载yum软件源:
第一步:光驱加载ISO文件:CentOS-7-x86_64-DVD-1708.iso
操作如下
第二步:CentOS系统挂载
linux外部存储一般都挂载在/mnt目录下,这里我先建一个容纳此光驱的文件夹 cdrom:
-->cd /mnt
-->mkdir cdrome
然后把此光驱挂载到此文件夹下:
-->mount /dev/cdrom /mnt/cdrom #/dev/cdrom是光驱的默认路径
第三步:配置yum软件包源(使用上一步我们挂载的本地源)
/etc/yum.repos.d/目录下
删除
CentOS-Base.repo
CentOS-Debuginfo.repo
-->cd /etc/yum.repos.d
-->rm -f CentOS-Base.repo
-->rm -f CentOS-Debuginfo.repo
编辑CentOS-Media.repo,把源路径指定为挂载源路径,并开启使用
-->vi CentOS-Media.repo
-->baseurl:file:///mnt/cdrom/ #指定本地资源挂载路径
enabled=1 #开启
2>安装以下软件
vim #功能强大的本文编辑器
net-tools #查看网络状态软件,例如查看ifconfig命令等
ssh #远程安全登录或文件上传下载
提示:如果不知道哪个命令是哪个软件包提供的,可以这样查看:
-->yum provides ifconfig(具体命令)
或者
-->yum whatprovides ifconfig(具体命令)
------------------------------------------------------------
-->yum -y install vim
-->yum -y install net-tools
-->yum -y install openssh* #表示安装源里openssh开头的软件全部安装
3>修改Linux系统主机名称:
-->vim /etc/hostname
-->hadoop-ha-01
4>配置Linux系统主机上网
(1)网卡设置为桥连
(2)设置网卡参数
-->cd /etc/sysconfig/network-scripts/
-->ls #查找ifcfg-eth*
-->vim ifcfg-eth3 #打开文件编辑
-->onboot=yes #启用该网卡
(3)修改网关
-->vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=hadoop-ha-01 #配置永久主机名
GATEWAY=192.168.1.21 #这里设置网关,也就是那个虚拟网卡的ip
(4)修改DNS
-->vim /etc/resolv.conf
nameserver 192.168.1.1 #增加一个域名服务器
(5)配置防火墙 #这里先直接关闭
-->systemctl stop firewalld.service #停止firewall
-->systemctl disable firewalld.service #禁止firewall开机启动
(6)网络配置好后,重启网络
-->service network restart
然后重启Linux系统
-->reboot
--------------------------------------------------------------------------------
二:以上准备好后,我们开始这手搭建集群
hadoop-ha集群规划图
主机名称 | IP | 软件 | 运行进程 |
hadoop-ha-01 | 192.168.1.21 | JDK、HADOOP | NameNode、DFSZKFailoverController(zkfc) |
hadoop-ha-02 | 192.168.1.22 | JDK、HADOOP | NameNode、DFSZKFailoverController(zkfc) |
hadoop-ha-03 | 192.168.1.23 | JDK、HADOOP | ResourceManager |
hadoop-ha-04 | 192.168.1.24 | JDK、HADOOP | ResourceManager |
hadoop-ha-05 | 192.168.1.25 | JDK、HADOOP、Zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
hadoop-ha-06 | 192.168.1.26 | JDK、HADOOP、Zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
hadoop-ha-07 | 192.168.1.27 | JDK、HADOOP、Zookeeper | DataNode、NodeManager、JournalNode、QuorumPeerMain |
说明:
hdfs 文件高可用配置 主从NameNode 主机 hadoop-ha-01、hadoop-ha-02
yarn管理系统高可用配置 主从ResourceManager 主机 hadoop-ha-03、hadoop-ha-04
因为yarn管理系统NodeManager节点管理器本身就是管理 MR程序在hdfs文件系统的DataNode上执行的,所以把他们配置到一起配置在剩下三台机器上
根据集群设计图,需要7台系统,所以根据hadoop-ha-01镜像,在虚拟机下搭建7个系统
注意:每个系统搭建好后需要修改下主机名称和IP如设计图
1>我这里用hadoop-ha-01来管理集群,所以这里我配置01可以免密访问集群中所有机器
(1)配置ssh免密登陆
-->ssh-keygen #生成密钥
-->ls /root/.ssh #查看生成密钥文件
结果:
id_rsa #私钥
id_rsa.pub #公钥
-->ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected] #把公钥拷贝到远端服务器
-->ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected] #把公钥拷贝到远端服务器
-->ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected] #把公钥拷贝到远端服务器
-->ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected] #把公钥拷贝到远端服务器
-->ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected] #把公钥拷贝到远端服务器
-->ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected] #把公钥拷贝到远端服务器
-->ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected] #把公钥拷贝到远端服务器
2>以上全部用ip访问特别难记也难写,这里我在hosts文件里配置下,ip与主机名的关联关系
--vim /etc/hosts
192.168.1.21 hadoop-ha-01
192.168.1.22 hadoop-ha-02
192.168.1.23 hadoop-ha-03
192.168.1.24 hadoop-ha-04
192.168.1.25 hadoop-ha-05
192.168.1.26 hadoop-ha-06
192.168.1.27 hadoop-ha-07
然后发送到集群每个机器上
scp /etc/hosts [email protected]:/etc/host
scp /etc/hosts [email protected]:/etc/host
scp /etc/hosts [email protected]:/etc/host
scp /etc/hosts [email protected]:/etc/host
scp /etc/hosts [email protected]:/etc/host
scp /etc/hosts [email protected]:/etc/host
2>安装集群用到软件包
jdk-8u162-linux-x64.tar.gz
hadoop-2.6.5.tar.gz
zookeeper-3.3.6.tar.gz
以上包我都在宿主机下载好了,怎么发送到虚拟机上呢?我使用了FileZilla工具来做这件事
我准备把软件全部安装到/usr/app目录下,所以集群里所有机器全部新建app目录(这个可以提前搞)
-->mkdir /usr/app
3>解压jdk 并且发送的集群所有机器上
-->tar -zxvf jdk-8u162-linux-x64.tar.gz
4>在hadoop-ha-05上解压 zookeeper-3.3.6.tar.gz
-->tar -zxvf zookeeper-3.3.6.tar.gz
配置zookeeper:
-->cd /root/app/zookeeper-3.3.6/conf/
-->cp zoo_sample.cfg zoo.cfg
-->vim zoo.cfg
dataDir=/root/app/zookeeper-3.3.6/tmp
#在最后添加:
server.1=hadoop-ha-05:2888:3888
server.2=hadoop-ha-06:2888:3888
server.3=hadoop-ha-07:2888:3888
#保存退出
然后创建一个tmp文件夹
-->mkdir /root/app/zookeeper-3.3.6/tmp
#根据zzo.cfg配置文件server.* 在集群上建myid文件
-->echo 1 > /root/app/zookeeper-3.3.6/tmp/myid #这个文件名必须事myid
将配置好的zookeeper拷贝到其他节点
-->scp -r /root/app/zookeeper-3.3.6/ hadoop-ha-06:/root/app/
-->scp -r /root/app/zookeeper-3.3.6/ hadoop-ha-07:/root/app/
注意:修改hdp-ha-06、hdp-ha-07对应/hadoop-ha-/zookeeper-3.3.6/tmp/myid内容
hdp-ha-06:
echo 2 > /root/app/zookeeper-3.3.6/tmp/myid
hdp-ha-07:
echo 3 > /root/app/zookeeper-3.3.6/tmp/myid
5>安装hadoop #先在hadoop-ha-01上
解压:
-->tar -zxvf hadoop-2.6.5.tar.gz
#hadoop配置 hadoo-env.sh
export JAVA_HOME=/usr/app/jdk1.8.0_162
#hadoop配置 core-site.xml
<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1/</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/app/hadoop-2.6.5/tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop-ha-05:2181,hadoop-ha-06:2181,hadoop-ha-07:2181</value>
</property>
</configuration>
#hadoop配置 hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>hadoop-ha-01:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hadoop-ha-01:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hadoop-ha-02:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hadoop-ha-02:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop-ha-05:8485;hadoop-ha-06:8485;hadoop-ha-07:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/app/hadoop-2.6.5/journaldata</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns1</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>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
#hadoop配置 mapred-site.xml
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
#hadoop配置 yarn-site.xml
<configuration>
<!-- 开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop-ha-03</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop-ha-04</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop-ha-05:2181,hadoop-ha-06:2181,hadoop-ha-07:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
#hadoop配置 slaves
修改slaves(slaves是指定子节点的位置,因为要在hadoop-ha-01上启动HDFS、在hadoop-ha-03启动yarn,所以hadoop-ha-01上的slaves文件指定的是datanode的位置,hadoop-ha-03上的slaves文件指定的是nodemanager的位置)
hadoop-ha-05
hadoop-ha-06
hadoop-ha-07
最后把hadoop安装目录拷贝到集群每个机器上
slaves理论上事需要修改的!及
hadoop-ha-01上启动hdfs,所以需要知道datanode的位置,所以把启动datanode的节点放入hadoop-ha-01机器的slaves文件里
hadoop-ha-03上启动yarn,所以需要知道nodemanager的位置,所以把启动nodemanager的节点让如hadoop-ha-03机器的slaves文件里
-----------------------------------------------------------------
三:配置环境变量:
-->vim /etc/profile
#jdk的集群所有机器都需要配
export JAVA_HOME=/usr/app/jdk1.8.0_162
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
#hadoop的集群所有机器都需要配
export HADOOP_HOME=/usr/app/hadoop-2.6.5
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH #在jdk基础上改
#zookeeper只在05/06/07上配置
export ZOOKEEPER_HOME=/usr/app/zookeeper-3.3.6
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$PATH #在jdk基础上改
四:搭建完成后,开始启动 #需要注意启动顺序
#启动zookeeper集群(分别在hadoop-ha-05、hadoop-ha-06、hadoop-ha-上启动zk)
zkServer.sh start
#查看状态:一个leader,两个follower
zkServer.sh status
#启动journalnode(分别在在hadoop-ha-05、hadoop-ha-06、hadoop-ha-07上执行)
hadoop-daemon.sh start journalnode
#运行jps命令检验,hdp-ha-05、hdp-ha-06、hdp-ha-07上多了JournalNode进程
#格式化HDFS
#在hadoop-ha-01上执行命令:
hdfs namenode -format
#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/usr/app/hadoop-2.6.5/tmp,然后将/usr/app/hadoop-2.6.5/tmp拷贝到hadoop-ha-02的/usr/app/hadoop-2.6.5/下。
scp -r tmp/ hadoop-ha-02:/root/app/hadoop-2.6.5/
#格式化ZKFC(在hdp-ha-01上执行即可)
hdfs zkfc -formatZK
#启动HDFS(在hdp-ha-01上执行)
start-dfs.sh
#启动YARN
#(是在hdp-ha-03上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动)
start-yarn.sh