一、服务器
三个节点的虚拟机(master1、master2、slave)
-
IP地址:
192.168.199.121
192.168.199.122
192.168.199.123
-
配置第一台(192.168.199.121)虚拟机网卡:
[root@master1 ~] vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static IPADDR=192.168.199.121 NETMASK=255.255.255.0 GATEWAY=192.168.199.2 DNS1=114.114.114.114 DNS2=192.168.199.2
-
修改主机名
以192.168.199.121服务器为例:
在master1上分别执行如下命令:
[root@master1 ~]# vi /etc/sysconfig/network
NETWORKING=yes HOSTNAME=hadoop01
-
关闭防火墙
[root@master1 ~]# service iptables stop [root@master1 ~]# chkconfig iptables off
-
安装ssh与时间同步客户端
[root@master1 ~]# yum install -y openssh-clients
[root@master1 ~]# yum install ntp
配置自动时钟同步
该项同时需要在所有节点配置
使用Linux命令配置
[root@master1~]# crontab -e
该命令是vi编辑命令,按i进入插入模式,按Esc,然后键入:wq保存退出
键入下面的一行代码,输入i,进入插入模式(星号之间和前后都有空格)
0 * * * * /usr/sbin/ntpdate cn.pool.ntp.org
每小时(第0分钟)同步一次时间
手动同步时间
直接在Terminal运行下面的命令:
[root@master1~]# /usr/sbin/ntpdate cn.pool.ntp.org
-
jdk安装
把文件上传到linux
解压文件到安装目录:
[root@master1 ~]# tar -zxvf /root/jdk-8u102-linux-x64.tar.gz -C /usr/local/
配置环境变量
[root@master1 ~]# vi /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_102 export PATH=$PATH:$JAVA_HOME/bin
配置文件生效:
[root@master1 ~]# source /etc/profile
-
克隆(得到另外两部虚拟机)
-
配置第二台虚拟机(master2)
网络配置:
[root@master1 ~]# vi /etc/udev/rules.d/70-persistent-net.rules
# PCI device 0x8086:0x100f (e1000) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:ab:a6:61", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
PCI device 0x8086:0x100f (e1000) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:ab:a6:61", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
删除eth0,将eth1修改为eth0
配置网卡:
[root@master1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static IPADDR=192.168.199.121*************修改wei192.168.199.122 NETMASK=255.255.255.0 GATEWAY=192.168.199.2 DNS1=114.114.114.114 DNS2=192.168.199.2
修改主机名
[root@master1 ~]# vi /etc/sysconfig/network
NETWORKING=yes HOSTNAME=master2
修改网卡,使网卡生效:
[root@master2 ~]# reboot
-
第三台(slave)按照上面重新操作一遍(操作8)
-
hosts映射:(三台都需要修改)
修改host文件
windows路径:C:\Windows\System32\drivers\etc
linux:
[root@hadoop01 hadoop]# vi /etc/hosts
增加192.168.199.121 master1 192.168.199.122 master2 192.168.199.123 slave
二、 免密登陆
1.登陆master1 输入命令:
[root@master1 ~]# cd .ssh
进入rsa公钥私钥文件存放的目录,删除目录下的id_rsa,id_rsa.pub文件(删除现有的公钥私钥,新搭建的虚拟机忽略)
-
在每台机上产生新的rsa公钥私钥文件,并统一拷贝到一个authorized_keys文件中
1)登录master1,在.ssh目录下输入命令:
[root@master1 ~]# ssh-keygen -t rsa
三次回车后,/root/.ssh目录下将会产生id_rsa,id_rsa.pub文件。其他主机也使用该方式产生密钥文件
[root@master2 ~]# ssh-keygen -t rsa
[root@slave ~]# ssh-keygen -t rsa
2)再次登录master1,输入命令:
[root@master1 ~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
将id_rsa.pub公钥内容拷贝到authorized_keys文件中
3)登录其他主机,将其他主机的公钥文件内容都拷贝到master1主机上的authorized_keys文件中,命令如下:
登录master2,将公钥拷贝到master1中
[root@master2 ~]# ssh-keygen -t rsa
[root@master2 ~]# scp /root/.ssh/id_rsa.pub master2:/root/.ssh/id_rsa.pub02
登录slave,将公钥拷贝到master1中
[root@slave ~]# ssh-keygen -t rsa
[root@slave ~]# scp /root/.ssh/id_rsa.pub master1:/root/.ssh/id_rsa.pub03
3.登录master1节点,组合所有公钥
[root@master1 ~]# cat ~/.ssh/id_rsa.pub02 >> ~/.ssh/authorized_keys
[root@master1 ~]# cat ~/.ssh/id_rsa.pub03 >> ~/.ssh/authorized_keys
-
授权authorized_keys文件
登录master1,在.ssh目录下输入命令:
[root@master1 ~]# chmod 600 authorized_keys
[root@master1 ~]# chmod 700 ~/.ssh
-
将授权文件分配到其他主机上
登录master1,将授权文件拷贝到master、slave…,命令如下:
[root@master1 ~]# scp /root/.ssh/authorized_keys hadoop02:/root/.ssh/
…拷贝到hadoop02上
[root@master1 ~]# scp /root/.ssh/authorized_keys hadoop03:/root/.ssh/
…拷贝到hadoop03上 -
删除发到hadoop01上的公钥
[root@master1 ~]# rm -rf /root/.ssh/id_rsa.pub0*
-
测试
[root@master1 ~]# ssh master1
[root@master1 ~]# ssh master2
[root@master1 ~]# ssh slave
其他两台同理
三、安装Zookeeper
注:以下所有安装默认是在hadoop001上执行!
- 解压并移动软件包(在所有节点执行)
将zookeeper-3.4.6.tar.gz 上传到root目录下并解压缩
[root@master1 ~]# tar -zxvf /root/zookeeper-3.4.6.tar.gz -C /usr/local/
- 修改配置文件
修改Zookeeper配置文件/usr/local/zookeeper-3.4.6/conf/zoo_sample.cfg重名为zoo.cfg,进入到conf目录下,执行:
[root@master1 conf]# cp zoo_sample.cfg zoo.cfg
执行[root@master1 conf]# vi zoo.cfg
修改zoo.cfg,修改或添加如下内容
dataDir=/tmp/zk/data
dataLogDir=/tmp/zk/dataLog
server.1=master1:2888:3888 server.2=master2:2888:3888 server.3=slave:2888:3888
- 创建相关目录
创建/tmp/zk/data目录,并在此目录下创建myid文件
在文件中写入数字 1[root@master1 conf]# mkdir /tmp/zk/dataLog [root@master1 conf]# mkdir /tmp/zk/data [root@master1 conf]# cd /tmp/zk/data [root@master1 conf]# vi myid
- 修改环境变量
[root@master1 ~]# vi /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_102 export PATH=$PATH:$JAVA_HOME/bin export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.6 export HADOOP_HOME=/usr/local/hadoop-2.7.3 export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
- 分发zookeeper软件包、tmp文件与环境变量
[root@master1 ~]# scp -r /root/usr/zookeeper-3.4.6 master2:/usr/local/
[root@master1 ~]# scp -r /root/usr/zookeeper-3.4.6 slave:/usr/local/
[root@master1 ~]# scp -r /tmp/zk master2:/tmp
[root@master1 ~]# scp -r /tmp/zk slave:/tmp
[root@master1 ~]# scp -r /etc/profile master2:/etc
[root@master1 ~]# scp -r /etc/profile slave:/etc
- 修改master2与slave的myid文件
[root@master1 ~]# ssh master2
[root@master2 ~]# vi /tmp/zk/data/myid
在文件中写入数字 2
[root@master2 ~]# ssh slave
[root@slave ~]# vi /tmp/zk/data/myid
在文件中写入数字 3
注:重新登录终端环境变量生效 - 启动Zookeeper
三台上都执行
[root@master1 ~]# bin/zkServer.sh start
[root@master2 ~]# bin/zkServer.sh start
[root@slave ~]# bin/zkServer.sh start
查看进程QuorumPeerMain是否启动:jps
检查状态
[root@master1 ~]# bin/zkServer.sh status
[root@master2 ~]# bin/zkServer.sh status
[root@slave ~]# bin/zkServer.sh status
四、安装Hadoop
-
解压并移动软件包(在所有节点执行)
将zookeeper-3.4.6.tar.gz 上传到root目录下并解压缩
[root@master1 ~]# tar -zxvf /root/hadoop-2.7.3.tar.gz -C /usr/local
-
修改配置文件
进入到Hadoop目录下 /etc/hadoop/(进入到路径)
[root@master1 ~]# cd /usr/local/hadoop-2.7.3/etc/hadoop/
1.修改hadoop-env.sh文件
[root@master1 hadoop]# vi hadoop-env.sh
修改为:#The java implementation to use. export JAVA_HOME=/usr/local/jdk1.8.0_102
[root@master1 hadoop]# vi yarn-env.sh
修改为:# some Java parameters export JAVA_HOME=/usr/local/jdk1.8.0_102
2.修改 core-site.xml文件
[root@master1 hadoop]# vi core-site.xml
<configuration> <property> <!--连接hdfs的通讯地址#beh别名--> <name>fs.defaultFS</name> <value>hdfs://beh</value> <final>false</final> </property> <property> <!--存放namenode与datanode临时文件目录(手动创建/root/cxy)--> <name>hadoop.tmp.dir</name> <value>/home/cxy/hadoopdata</value> <final>false</final> </property> <property> <!--zookeeper集群--> <name>ha.zookeeper.quorum</name> <value>master1:2181,master2:2181,slave:2181</value> <final>false</final> </property> </configuration>
- 修改hdfs-site.xml文件
[root@master1 hadoop]# vi hdfs-site.xml
<configuration> <property> <!--HDFS NN的逻辑名称,可以随便设置 --> <name>dfs.nameservices</name> <value>beh</value> <final>false</final> </property> <property> <!-- 给定服务逻辑名称beh的节点列表 --> <name>dfs.ha.namenodes.beh</name> <value>nn1,nn2</value> <final>false</final> </property> <property> <!--beh中nn1节点对外服务的RPC地址--> <name>dfs.namenode.rpc-address.beh.nn1</name> <value>master1:9000</value> <final>false</final> </property> <property> <!--beh中nn1节点对外服务的http地址--> <name>dfs.namenode.http-address.beh.nn1</name> <value>master1:50070</value> <final>false</final> </property> <property> <name>dfs.namenode.rpc-address.beh.nn2</name> <value>master2:9000</value> <final>false</final> </property> <property> <name>dfs.namenode.http-address.beh.nn2</name> <value>master2:50070</value> <final>false</final> </property> <property> <!-- 设置一组 journalNode 的 URI 地址,active NN 将 edit log 写入这些JournalNode,而 standby NameNode 读取这些 editlog,并作用在内存中的目录树中。如果journalNode有多>个节点则使用分号分割。该属性值应符合以下格式qjournal://host1:port1;host2:port2;host3:port3/journalId--> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master1:8485;master2:8485;slave:8485/beh</value> <final>false</final> </property> <property> <!--启动自动failover(故障切换)--> <name>dfs.ha.automatic-failover.enabled.beh</name> <value>true</value> <final>false</final> </property> <property> <!--配置失败自动切换方式--> <!--客户端与 active NameNode 进行交互的 Java 实现类,DFS 客户端通过该类寻找当前的active NN ,确定active 节点是否活跃--> <name>dfs.client.failover.proxy.provider.beh</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> <final>false</final> </property> <property> <!--JournalNode 所在节点上的一个目录(手动创建目录/root/cxy),用于存放 editlog 和其他状态信息--> <name>dfs.journalnode.edits.dir</name> <value>/home/cxy/metadata/journal</value> <final>false</final> </property> <property> <!--配置隔离机制--> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> <final>false</final> </property> <property> <!--指定ssh通讯使用的密钥--> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> <final>true</final> </property> <property> <!--副本数,从节点个数--> <name>dfs.replication</name> <value>1</value> <final>false</final> </property> </configuration>
- 修改mapred-site.xml文件
[root@master1 hadoop]# vi mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <!--设置可查看历史任务--> <name>mapreduce.jobhistory.address</name> <value>slave:10020</value> </property> <property> <!--设置可查看历史任务--> <name>mapreduce.jobhistory.webapp.address</name> <value>slave:19888</value> </property> <property> <!--正在运行的Hadoop作业记录--> <name>yarn.app.mapreduce.am.staging-dir</name> <value>/home/cxy/metadata/hadoop-yarn/staging</value> </property> </configuration>
- 修改yarn-site.xml文件
[root@master1 hadoop]# vi yarn-site.xml
<configuration> <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> <property> <!--中间结果存放位置--> <name>yarn.nodemanager.local-dirs</name> <value>/home/cxy/metadata/yarn</value> </property> <property> <name>yarn.nodemanager.log-dirs</name> <value>/home/cxy/logs/yarn/userlogs</value> </property> <property> <!--是否启用日志聚合功能,日志聚合开启后保存到HDFS上--> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <description>Where to aggregate logs</description> <!--当应用程序运行结束后,日志被转移到的HDFS目录--> <name>yarn.nodemanager.remote-app-log-dir</name> <value>hdfs://beh/var/log/hadoop-yarn/apps</value> </property> <!-- Resource Manager Configs --> <property> <!--rm失联后重新链接的时间--> <name>yarn.resourcemanager.connect.retry-interval.ms</name> <value>2000</value> </property> <property> <!--开启resourcemanagerHA,默认为false--> <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.cluster-id</name> <value>beh</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!--RM1 RM2 is different--> <property> <name>yarn.resourcemanager.ha.id</name> <value>rm1</value> </property> <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> </property> <property> <!--开启自动恢复功能--> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <property> <!--配置与zookeeper的连接地址--> <name>yarn.resourcemanager.zk.state-store.address</name> <value>master1:2181,master2:2181,slave:2181</value> </property> <property> <!--schelduler失联等待连接时间--> <name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name> <value>5000</value> </property> <!-- 配置 RM1 configs --> <property> <name>yarn.resourcemanager.address.rm1</name> <value>master1:23140</value> </property> <property> <name>yarn.resourcemanager.scheduler.address.rm1</name> <value>master1:23130</value> </property> <property> <name>yarn.resourcemanager.webapp.https.address.rm1</name> <value>master1:23189</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>master1:23188</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address.rm1</name> <value>master1:23125</value> </property> <property> <name>yarn.resourcemanager.admin.address.rm1</name> <value>master1:23141</value> </property> <!-- 配置 RM2 configs --> <property> <name>yarn.resourcemanager.address.rm2</name> <value>master2:23140</value> </property> <property> <name>yarn.resourcemanager.scheduler.address.rm2</name> <value>master2:23130</value> </property> <property> <name>yarn.resourcemanager.webapp.https.address.rm2</name> <value>master2:23189</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>master2:23188</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address.rm2</name> <value>master2:23125</value> </property> <property> <name>yarn.resourcemanager.admin.address.rm2</name> <value>master2:23141</value> </property> <!-- Node Manager Configs --> <property> <name>mapreduce.shuffle.port</name> <value>23080</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>master1:2181,master2:2181,slave:2181</value> </property> </configuration>
以上四个配置文件也可以配置好后上传到linux然后再cp到/usr/local/hadoop-2.7.3/etc/hadoop/
[root@master1 ~]# cp /root/haconfigs/*.xml /usr/local/hadoop-2.7.3/etc/hadoop/
y+回车,y+回车,y+回车,y+回车; - 修改hdfs-site.xml文件
-
修改slaves(从节点主机名文件)
[root@slave ~]# vi slaves
更改为slave -
复制Hadoop环境到其他主机 在命令行分别输入如下命令
创建文件目录:mkdir /root/cxy
[root@master1 ~]# scp -r /usr/local/hadoop-2.7.3 master2:/usr/local
[root@master1 ~]# scp -r /usr/local/hadoop-2.7.3 slave:/usr/local
[root@master1 ~]# scp -r /root/cxy master2:/root/
[root@master1 ~]# scp -r /root/cxy slave:/root/
-
修改master2主机下的yarn-site.xml
修改为:<property> <name>yarn.resourcemanager.ha.id</name> <value>rm2</value> </property>
五、启动
-
启动journalnode(进程名:JournalNode 全部虚拟机都需运行)
[root@master1 ~]# hadoop-daemon.sh start journalnode
[root@master2 ~]# hadoop-daemon.sh start journalnode
[root@slave ~]# hadoop-daemon.sh start journalnode
-
格式化zookeeper,在master1上执行
[root@slave ~]# hdfs zkfc -formatZK
-
对master1节点进行格式化和启动启动namenode(进程名:NameNode):
[root@master1 ~]# hdfs namenode -format
[root@master1 ~]# hadoop-daemon.sh start namenode
-
对master2节点进行格式化和启动
[root@master2 ~]# hdfs namenode -bootstrapStandby
[root@master2 ~]# hadoop-daemon.sh start namenode
-
在hadoop1和hadoop2上启动zkfc服务(zkfc服务进程名:DFSZKFailoverController):此时hadoop1和hadoop2就会有一个节点变为active状态
[root@master1 ~]# hadoop-daemon.sh start zkfc
[root@master2 ~]# hadoop-daemon.sh start zkfc
-
启动datanode(进程名:DataNode):在master1上执行
[root@master1 ~]# hadoop-daemons.sh start datanode
-
验证是否成功
打开浏览器,访问 master1:50070 以及 master2:50070,你将会看到两个namenode一个是active而另一个是standby。
然后kill掉其中active的namenode进程,另一个standby的naemnode将会自动转换为active状态
-
启动yarn
在master1上启动(此脚本将会启动master1上的resourcemanager及所有的nodemanager)
[root@master1 ~]# start-yarn.sh
在master2上启动resourcemanager
[root@master2 ~]# yarn-daemon.sh start resourcemanager
-
验证是否配置成功
打开浏览器,访问master1:23188或者master2:23188,只有active的会打开如下界面,standby的那个不会看到页面
然后kill掉active的resourcemanager另一个将会变为active的,说明resourcemanager HA是成功的