Hadoop1 | Hadoop1 | Hadoop3 |
NodeManager | NodeManager | NodeManager |
NameNode | NameNode | |
DataNode | DataNode | DataNode |
DFSZKFailoverController | DFSZKFailoverController | |
JournalNode | JournalNode | JournalNode |
ResourceManager | ResourceManager | |
QuorumPeerMain | QuorumPeerMain | QuorumPeerMain |
1. 配置主机名以及解析(3台)
新建三台虚拟机:hadoop1、hadoop2、hadoop3
查看三台虚拟机ip:ip addr
A.配置host映射
B.配置完成后可以使用ping命令一一测试,看看是够能够正确解析出ip地址,得到目标机器的回应(可以每台机器都测试一下:使用Ctrl + C结束)
C. 在slave1和slave2 上也修改hosts文件,追加内容和步骤1的内容相同,然后重复步骤2
2. 配置服务器间ssh免密码登陆(3台)
SSH服务配置
A.SSH远程登录功能配置
(1)查看ssh服务是否开启
查看当前机器是否安装了SSH服务:rpm -qa |grep ssh
查看SSH服务是否启动:ps -e | grep sshd
如上图所示代表已安装并开启了SSH服务,所以不需要进行额外安装就可以直接远程访问(如果没有安装,则执行:yum install openssh-server 指令进行安装)
2)使用Xshell连接3台虚拟机节点
-
-
B.SSH免密登录设置
(1)生成公钥密钥对
在3个节点上分别都执行如下命令:ssh-keygen
-
(注意连续按Enter键确认)
在root目录下输入:ll -a 可以查看当前目录下的所有文件(包含隐藏文件)。
然后进入.ssh隐藏目录,输入ls 命令,如图所示:
-
在图中能够看到包含两个文件分别是私钥和公钥,其中id_rsa为生成的私钥,id_rsa.pub为生成的公钥
-
(2)将子节点的公钥拷贝到主节点并添加进authorized_keys
在hadoop1、hadoop2、hadoop3节点上执行如下两行命令:ssh-copy-id hadoop1 ssh-copy-id hadoop2 ssh-copy-id hadoop3
执行时,到了红色框区域,需要输入yes -
(3)测试是否成功
为了测试免密设置是否成功,可执行如下命令: -
ssh hadoop1 ssh hadoop2 ssh hadoop3
注意,要在hadoop1、hadoop2和hadoop3这三台虚拟机上都要操作一次免密操作
3. 安装hadoop
(1)修改配置文件
A.将hadoop安装包下载、上传、解压、,拷贝到/export/software下
B.修改各配置文件,所有的配置文件在/export/software/hadoop-2.4.1/etc/hadoop目录下
a.修改core-site.xml,内容如下:配置hdfs的端口和zookeeper的地址和端口
[root@hadoop1 zkdata]# cd /export/software/hadoop-2.4.1/etc/hadoop
[root@hadoop1 hadoop]# vi core-site.xml
<configuration>
<!--指定hdfs连接地址,集群模式(高可用)-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/export/software/hadoop-2.4.1/tmp</value>
</property>
<property>
<name>hadoop.native.lib</name>
<value>false</value>
</property>
<!-- 指定ZooKeeper集群的地址和端口。注意,数量一定是奇数,且不少于三个节点-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
</configuration>
b.修改hdfs-site.xml,内容如下:
vi hdfs-site.xml
<configuration>
<!--指定HDFS副本的数量,不能超过机器节点数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 为namenode集群定义一个services name -->
<property>
<name>dfs.nameservices</name>
<value>cluster</value>
</property>
<!-- nameservice 包含哪些namenode,为各个namenode起名 -->
<property>
<name>dfs.ha.namenodes.cluster</name>
<value>nn01,nn02</value>
</property>
<!-- 名为nn01的namenode的rpc地址和端口号,rpc用来和datanode通讯 -->
<property>
<name>dfs.namenode.rpc-address.cluster.nn01</name>
<value>hadoop1:9000</value>
</property>
<!--名为nn01的namenode的http地址和端口号,用来和web客户端通讯 -->
<property>
<name>dfs.namenode.http-address.cluster.nn01</name>
<value>hadoop1:50070</value>
</property>
<!-- 名为nn02的namenode的rpc地址和端口号,rpc用来和datanode通讯 -->
<property>
<name>dfs.namenode.rpc-address.cluster.nn02</name>
<value>hadoop2:9000</value>
</property>
<!--名为nn02的namenode的http地址和端口号,用来和web客户端通讯 -->
<property>
<name>dfs.namenode.http-address.cluster.nn02</name>
<value>hadoop2:50070</value>
</property>
<!-- namenode间用于共享编辑日志的journal节点列表 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/cluster</value>
</property>
<!-- journalnode 上用于存放edits日志的目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/export/data/hadoop/journaldata</value>
</property>
<!-- 指定该集群出现故障时,是否自动切换到另一台namenode -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 一旦需要NameNode切换,使用ssh方式进行操作 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence
shell(/bin/true)
</value>
</property>
<!-- 如果使用ssh进行故障切换,使用ssh通信时用的密钥存储的位置 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- connect-timeout超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/export/software/hadoop-2.4.1/tmp/dfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/export/software/hadoop-2.4.1/tmp/dfs/data</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
c.修改yarn-site.xml,内容如下:
vi yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 启用Resource Manager HA高可用性 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- NodeManager上运行的附属服务,默认是mapreduce_shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定resourcemanager的名字 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 使用了2个resourcemanager,分别指定Resourcemanager的地址 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 指定rm1的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop1</value>
</property>
<!-- 指定rm2的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop2</value>
</property>
<!-- 指定zookeeper集群机器 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
</configuration>
d.修改mapred-site.xml(该文件不存在,需要手动创建),cp mapred-site.xml.template mapred-site.xml,内容如下:
<configuration>
<!-- 采用yarn作为mapreduce的资源调度框架 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
e.修改slaves文件,内容如下:
hadoop1
hadoop2
hadoop3
f.修改hadoop-env.sh和yarn-env.sh文件,指定jdk的地址
export JAVA_HOME=/export/software/jdk1.8.0_161
g.配置hadoop环境变量,vi /etc/profile 内容如下(三台虚拟机都要有)
[root@hadoop1 hadoop]# vi /etc/profile
h.source /etc/profile(三台虚拟机都操作)
[root@hadoop1 hadoop]# source /etc/profile
(2)拷贝复制到其它机器(hadoop2、hadoop3)
[root@hadoop1 hadoop]# scp -r /export/software/hadoop-2.4.1/etc/hadoop hadoop2:/export/software/hadoop-2.4.1/etc/
[root@hadoop1 hadoop]# scp -r /export/software/hadoop-2.4.1/etc/hadoop hadoop3:/export/software/hadoop-2.4.1/etc/
(3)进入:
[root@hadoop1 hadoop]# cd /export/data/
[root@hadoop1 data]# ls
hadoop zookeeper
[root@hadoop1 data]# hdfs zkfc -formatZK
ls 查看是否有zookeeper(即进行过格式化zookeeper),若没有则进行格式化zookeeper:
命令行输入: hdfs zkfc -formatZK
(3)启动Zookeeper(三台虚拟机都进行)
[root@hadoop1 data]# zkServer.sh start
(4)进入
[root@hadoop1 hadoop]# cd /export/data/
[root@hadoop1 data]# ls
hadoop zookeeper
[root@hadoop1 data]# cd hadoop/
[root@hadoop1 hadoop]# ls
journaldata
[root@hadoop1 hadoop]# rm -rf journaldata/
删除文件 :
(4)启动journalnode
[root@hadoop1 hadoop]# hadoop-daemon.sh start journalnode
(5)进入
[root@hadoop1 hadoop]# cd /export/software/hadoop-2.4.1/tmp/
删除文件
[root@hadoop1 hadoop]# rm -rf *
进入
ls 查看是否有dfs,有则进行删除:(三台虚拟机都需操作)
(6)格式化hadoop
[root@hadoop1 hadoop]# hadoop namenode -format
ls 查看tmp下是否有dfs,将有dfs的tmp文件拷贝到hadoop2虚拟机上
[root@hadoop1 hadoop]# scp -r /export/software/hadoop-2.4.1/tmp hadoop2:/export/software/hadoop-2.4.1/
(3)启动hadoop
[root@hadoop1 hadoop]# start-all.sh
若yarn的resourcemanager没开启,则单独开启
命令行输入 yarn-daemon.sh start resourcemanager
(4) 查看每台节点的进程
(5)通过Web界面查看hadoop信息
(6)测试namenode高可用
A.在hadoop1上kill掉namenode进程,然后通过浏览器查看hadoop2的状态,发现状态变为active,说明高可用测试成功
B.重新启动hadoop1的namenode进程,sh start-dfs.sh,浏览器访问hadoop1,此时hadoop1的状态为standby