宿主机配置:
宿主机:小黑 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.isonode
Linux系统安装:linux
CentOS-7-x86_64-Minimal-1708.iso #最简化安装,为了节省系统资源shell
下载DVD版本,目的是从当yum的软件源,对于须要的如:vim ssh net-tools 软件,须要挂在本地源,安装apache
CentOS-7-x86_64-DVD-1708.isovim
一 :安装hadoop前系统环境配置:安全
1>挂载yum软件源:服务器
第一步:光驱加载ISO文件:CentOS-7-x86_64-DVD-1708.iso网络
操做以下
app
第二步: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-0一、hadoop-ha-02
yarn管理系统高可用配置 主从ResourceManager 主机 hadoop-ha-0三、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 root@192.168.1.21 #把公钥拷贝到远端服务器 -->ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.22 #把公钥拷贝到远端服务器 -->ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.23 #把公钥拷贝到远端服务器 -->ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.24 #把公钥拷贝到远端服务器 -->ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.25 #把公钥拷贝到远端服务器 -->ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.26 #把公钥拷贝到远端服务器 -->ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.27 #把公钥拷贝到远端服务器
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 root@192.168.1.22:/etc/host scp /etc/hosts root@192.168.1.23:/etc/host scp /etc/hosts root@192.168.1.24:/etc/host scp /etc/hosts root@192.168.1.25:/etc/host scp /etc/hosts root@192.168.1.26:/etc/host scp /etc/hosts root@192.168.1.27:/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-0六、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-0五、hadoop-ha-0六、hadoop-ha-上启动zk) zkServer.sh start #查看状态:一个leader,两个follower zkServer.sh status #启动journalnode(分别在在hadoop-ha-0五、hadoop-ha-0六、hadoop-ha-07上执行) hadoop-daemon.sh start journalnode #运行jps命令检验,hdp-ha-0五、hdp-ha-0六、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