安装部署Apache Hadoop (完全分布式模式并且实现NameNode HA和ResourceManager HA)
本节内容:
- 环境规划
- 配置集群各节点hosts文件
- 安装JDK1.7
- 安装依赖包ssh和rsync
- 各节点时间同步
- 安装Zookeeper集群
- 添加Hadoop运行用户
- 配置主节点登录自己和其他节点不需要输入密码
- 安装hadoop
- 启动hadoop
- 停止hadoop
一、环境规划
主机名 | IP地址 | 操作系统版本 | 安装软件 |
hadoop16 | 172.16.206.16 | CentOS 7.2 | JDK1.7、hadoop-2.7.2 |
hadoop26 | 172.16.206.26 | CentOS 7.2 | JDK1.7、hadoop-2.7.2 |
hadoop27 | 172.16.206.27 | CentOS 7.2 | JDK1.7、hadoop-2.7.2、Zookeeper |
hadoop28 | 172.16.206.28 | CentOS 7.2 | JDK1.7、hadoop-2.7.2、Zookeeper |
hadoop29 | 172.16.206.29 | CentOS 7.2 | JDK1.7、hadoop-2.7.2、Zookeeper |
由于机器资源紧张,将NameNode和ResourceManager安装在一台机器上。在hadoop16主机上安装NameNode和ResourceManager使其处于active状态,在hadoop26上安装NameNode和ResourceManager使其处于standby状态。
环境拓扑:
由于是实验环境,所以将NameNode和ResourceManager放在了一起,生产环境下应该将NameNode和ResourceManager放在单独的机器上。
Hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这两种共享数据的方案,NFS是操作系统层面的,JournalNode是hadoop层面的,这里我们使用简单的QJM集群进行数据共享。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode。
另外还配置了一个zookeeper集群(27,28,29主机),用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode和ResourceManager为standby状态。同时27,28,29主机作为DataNode节点。
二、配置集群各节点hosts文件
在集群各节点,编辑hosts文件,配置好各节点主机名和ip地址的对应关系:
# vim /etc/hosts
172.16.206.16 hadoop16
172.16.206.26 hadoop26
172.16.206.27 hadoop27
172.16.206.28 hadoop28
172.16.206.29 hadoop29
三、安装JDK1.7
Hadoop Java Versions
Version 2.7 and later of Apache Hadoop requires Java 7. It is built and tested on both OpenJDK and Oracle (HotSpot)'s JDK/JRE. <br />
Earlier versions (2.6 and earlier) support Java 6.
# mkdir /usr/java
# tar zxf /usr/local/jdk-7u80-linux-x64.gz -C /usr/java/
# vim /etc/profile
export JAVA_HOME=/usr/java/jdk1..0_80
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# source /etc/profile
安装JDK1.7
四、安装依赖包ssh和rsync
对于Redhat/CentOS系列的,安装系统时一般都会默认安装openssh软件,里面包含了ssh客户端和ssh服务端,所以先检查下这个软件包是否安装了:
# yum list all openssh
如果没有安装,安装:
# yum install -y openssh
在检查rsync软件包是否安装:
# yum list all rsync
五、各节点时间同步
采用NTP(Network Time Protocol)方式来实现, 选择一台机器, 作为集群的时间同步服务器, 然后分别配置服务端和集群其他机器。我这里以hadoop16机器时间为准,其他机器同这台机器时间做同步。
1. NTP服务端
(1)安装ntp服务
# yum install ntp -y
(2)配置/etc/ntp.conf,这边采用本地机器作为时间的原点
注释server列表:
server .centos.pool.ntp.org iburst
server .centos.pool.ntp.org iburst
server .centos.pool.ntp.org iburst
server .centos.pool.ntp.org iburst
添加如下内容:
server 127.127.1.0 prefer
fudge 127.127.1.0 stratum
logfile /var/log/ntp.log
(3)启动ntpd服务
# systemctl start ntpd
(4)查看ntp服务状态
# systemctl status ntpd
(5)加入开机启动
# systemctl enable ntpd
2. NTP客户端
(1)安装ntp
# yum install ntpdate
(2)配置crontab任务主动同步
# crontab -e
*/ * * * * /usr/sbin/ntpdate 172.16.206.16;hwclock -w
六、安装Zookeeper集群
对于Zookeeper集群的话,官方推荐的最小节点数为3个。
1. 安装配置zk
(1)配置zk节点的hosts文件
配置zk节点的hosts文件:配置3台机器的ip地址和主机名的对应关系。上面已经做过了。这里选择3台安装zk:hadoop27,hadoop28,hadoop29。
(2)解压安装配置第一台zk
# cd /usr/local/
# tar zxf zookeeper-3.4..tar.gz
# cd zookeeper-3.4.
创建快照日志存放目录:
# mkdir dataDir
创建事务日志存放目录:
# mkdir dataLogDir
注意:如果不配置dataLogDir,那么事务日志也会写在dataDir目录中。这样会严重影响zk的性能。因为在zk吞吐量很高的时候,产生的事务日志和快照日志太多。
# cd conf
# mv zoo_sample.cfg zoo.cfg
# vim zoo.cfg
# 存放数据文件
dataDir=/usr/local/zookeeper-3.4./dataDir
# 存放日志文件
dataLogDir=/usr/local/zookeeper-3.4./dataLogDir
# zookeeper cluster,2888为选举端口,3888为心跳端口
server.=hadoop27::
server.=hadoop28::
server.=hadoop29::
在我们配置的dataDir指定的目录下面,创建一个myid文件,里面内容为一个数字,用来标识当前主机,conf/zoo.cfg文件中配置的server.X中X为什么数字,则myid文件中就输入这个数字:
hadoop27主机:
# echo "" > /usr/local/zookeeper-3.4./dataDir/myid
(3)远程复制第一台的zk到另外两台上,并修改myid文件为2和3
# cd /usr/local/
# scp -rp zookeeper-3.4. root@172.16.206.28:/usr/local/
# echo "" > /usr/local/zookeeper-3.4./dataDir/myid
# scp -rp zookeeper-3.4. root@172.16.206.29:/usr/local/
# echo "" > /usr/local/zookeeper-3.4./dataDir/myid
2. 启动和关闭Zookeeper
在ZooKeeper集群的每个结点上,执行启动ZooKeeper服务的脚本,如下所示:
[root@hadoop27 ~]# /usr/local/zookeeper-3.4./bin/zkServer.sh start
[root@hadoop28 ~]# /usr/local/zookeeper-3.4./bin/zkServer.sh start
[root@hadoop29 ~]# /usr/local/zookeeper-3.4./bin/zkServer.sh start
停止zk的命令:
# /usr/local/zookeeper-3.4./bin/zkServer.sh stop
3. 测试zk集群
可以通过ZooKeeper的脚本来查看启动状态,包括集群中各个结点的角色(或是Leader,或是Follower):
[root@hadoop27 ~]# /usr/local/zookeeper-3.4./bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4./bin/../conf/zoo.cfg
Mode: follower
[root@hadoop28 ~]# /usr/local/zookeeper-3.4./bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4./bin/../conf/zoo.cfg
Mode: leader
[root@hadoop29 ~]# /usr/local/zookeeper-3.4./bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4./bin/../conf/zoo.cfg
Mode: follower
通过上面状态查询结果可见,hadoop28是集群的Leader,其余的两个结点是Follower。
另外,可以通过客户端脚本,连接到ZooKeeper集群上。对于客户端来说,ZooKeeper是一个整体,连接到ZooKeeper集群实际上感觉在独享整个集群的服务,所以,你可以在任何一个结点上建立到服务集群的连接。
[root@hadoop29 ~]# /usr/local/zookeeper-3.4./bin/zkCli.sh -server hadoop27:
Connecting to localhost:
-- ::, [myid:] - INFO [main:Environment@] - Client environment:zookeeper.version=3.4.-, built on // : GMT
-- ::, [myid:] - INFO [main:Environment@] - Client environment:host.name=hadoop29
-- ::, [myid:] - INFO [main:Environment@] - Client environment:java.version=1.7.0_80
-- ::, [myid:] - INFO [main:Environment@] - Client environment:java.vendor=Oracle Corporation
-- ::, [myid:] - INFO [main:Environment@] - Client environment:java.home=/usr/java/jdk1..0_80/jre
-- ::, [myid:] - INFO [main:Environment@] - Client environment:java.class.path=/usr/local/zookeeper-3.4./bin/../build/classes:/usr/local/zookeeper-3.4./bin/../build/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/netty-3.7.0.Final.jar:/usr/local/zookeeper-3.4.6/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper-3.4.6/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper-3.4.6/bin/../zookeeper-3.4.6.jar:/usr/local/zookeeper-3.4.6/bin/../src/java/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../conf:.:/usr/java/jdk1.7.0_80/lib/dt.jar:/usr/java/jdk1.7.0_80/lib/tools.jar
2016-07-18 21:26:57,652 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2016-07-18 21:26:57,653 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
2016-07-18 21:26:57,653 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=<NA>
2016-07-18 21:26:57,653 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux
2016-07-18 21:26:57,653 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=amd64
2016-07-18 21:26:57,653 [myid:] - INFO [main:Environment@100] - Client environment:os.version=2.6.32-431.el6.x86_64
2016-07-18 21:26:57,653 [myid:] - INFO [main:Environment@100] - Client environment:user.name=root
2016-07-18 21:26:57,653 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/root
2016-07-18 21:26:57,653 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/root
2016-07-18 21:26:57,654 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@279ac931
[root@hadoop29 ~]# /usr/local/zookeeper-3.4.6/bin/zkCli.sh -server hadoop27:2181
Connecting to hadoop27:2181
2016-07-18 21:29:48,216 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT
2016-07-18 21:29:48,219 [myid:] - INFO [main:Environment@100] - Client environment:host.name=hadoop29
2016-07-18 21:29:48,219 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.7.0_80
2016-07-18 21:29:48,221 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2016-07-18 21:29:48,221 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/usr/java/jdk1.7.0_80/jre
2016-07-18 21:29:48,221 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/usr/local/zookeeper-3.4.6/bin/../build/classes:/usr/local/zookeeper-3.4.6/bin/../build/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper-3.4.6/bin/../lib/netty-3.7.0.Final.jar:/usr/local/zookeeper-3.4.6/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper-3.4.6/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper-3.4.6/bin/../zookeeper-3.4.6.jar:/usr/local/zookeeper-3.4.6/bin/../src/java/lib/*.jar:/usr/local/zookeeper-3.4.6/bin/../conf:.:/usr/java/jdk1.7.0_80/lib/dt.jar:/usr/java/jdk1.7.0_80/lib/tools.jar
2016-07-18 21:29:48,221 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
2016-07-18 21:29:48,221 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
2016-07-18 21:29:48,221 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=<NA>
2016-07-18 21:29:48,221 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux
2016-07-18 21:29:48,221 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=amd64
2016-07-18 21:29:48,222 [myid:] - INFO [main:Environment@100] - Client environment:os.version=2.6.32-431.el6.x86_64
2016-07-18 21:29:48,222 [myid:] - INFO [main:Environment@100] - Client environment:user.name=root
2016-07-18 21:29:48,222 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/root
2016-07-18 21:29:48,222 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/root
2016-07-18 21:29:48,223 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=hadoop27:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@194d62f1
Welcome to ZooKeeper!
2016-07-18 21:29:48,245 [myid:] - INFO [main-SendThread(hadoop27:2181):ClientCnxn$SendThread@975] - Opening socket connection to server hadoop27/172.16.206.27:2181. Will not attempt to authenticate using SASL (unknown error)
2016-07-18 21:29:48,249 [myid:] - INFO [main-SendThread(hadoop27:2181):ClientCnxn$SendThread@852] - Socket connection established to hadoop27/172.16.206.27:2181, initiating session
JLine support is enabled
[zk: hadoop27:2181(CONNECTING) 0] 2016-07-18 21:29:48,356 [myid:] - INFO [main-SendThread(hadoop27:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server hadoop27/172.16.206.27:2181, sessionid = 0x155fc2e082e0000, negotiated timeout = 30000 WATCHER:: WatchedEvent state:SyncConnected type:None path:null [zk: hadoop27:2181(CONNECTED) 0]
连接Zookeeper集群
输入quit,可以退出。
4. 脚本定期清理zk快照和日志文件
正常运行过程中,ZK会不断地把快照数据和事务日志输出到dataDir和dataLogDir这两个目录,并且如果没有人为操作的话,ZK自己是不会清理这些文件的。
我这里采用脚本切割。将脚本上传到/usr/local/zookeeper-3.4.6/目录下。脚本内容如下:
#!/bin/bash
###Description:This script is used to clear zookeeper snapshot file and transaction logs.
###Written by: jkzhao - jkzhao@wisedu.com
###History: -- First release. # Snapshot file dir.
dataDir=/usr/local/zookeeper-3.4./dataDir/version- # Transaction logs dir.
dataLogDir=/usr/local/zookeeper-3.4./dataLogDir/version- # Reserved files.
COUNT= ls -t $dataDir/snapshot.* | tail -n +$[$COUNT+] | xargs rm -f
ls -t $dataLogDir/log.* | tail -n +$[$COUNT+] | xargs rm -f
脚本切割Zookeeper日志
# chmod +x clean_zklog.sh
赋予脚本执行权限
# crontab -e
* * /usr/local/zookeeper-3.4./clean_zklog.sh
配置周期性任务,每个星期日的0点0分执行
所有zk节点都得配置脚本和周期性任务。
七、添加Hadoop运行用户
# groupadd hadoop
# useradd -g hadoop hadoop
# echo "wisedu" | passwd --stdin hadoop &> /dev/null
添加hadoop运行用户
所有节点都得添加hadoop用户。
八、配置主节点登录自己和其他节点不需要输入密码
这里的主节点指的是NameNode,ResourceManager。配置hadoop16主机(Active)登录hadoop16,hadoop26,hadoop27,hadoop28,hadoop29主机免密码。还要配置hadoop26主机(Standby)登录hadoop16,hadoop26,hadoop27,hadoop28,hadoop29主机免密码。 (也可以不配置,每个节点一个一个启动服务,最好不要这样做)。
hadoop用户登录shell:
1. 配置hadoop16主机(Active)登录hadoop16,hadoop26,hadoop27,hadoop28,hadoop29主机免密码
[hadoop@hadoop16 ~]$ ssh-keygen -t rsa -P ''
[hadoop@hadoop16 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop16
[hadoop@hadoop16 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop26
[hadoop@hadoop16 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop27
[hadoop@hadoop16 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop28
[hadoop@hadoop16 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop29
配置主机密钥登录
2. 配置hadoop26主机(Standby)登录hadoop16,hadoop26,hadoop27,hadoop28,hadoop29主机免密码
[hadoop@hadoop26 ~]$ ssh-keygen -t rsa -P ''
[hadoop@hadoop26 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop16
[hadoop@hadoop26 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop26
[hadoop@hadoop26 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop27
[hadoop@hadoop26 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop28
[hadoop@hadoop26 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@hadoop29
配置主机密钥登录
九、安装hadoop
1. 安装配置master节点(hadoop16主机)
(1)将安装包上传至/usr/local目录下并解压
[root@hadoop16 ~]# cd /usr/local/
[root@hadoop16 local]# tar zxf hadoop-2.7..tar.gz
[root@hadoop16 local]# ln -sv hadoop-2.7. hadoop
[root@hadoop16 local]# cd hadoop
[root@hadoop16 hadoop]# mkdir logs
[root@hadoop16 hadoop]# chmod g+w logs
[root@hadoop16 hadoop]# chown -R hadoop:hadoop ./*
[root@hadoop16 hadoop]# chown -R hadoop:hadoop /usr/local/hadoop-2.7.2
解压安装hadoop
(2)配置hadoop环境变量
[root@hadoop16 hadoop]# vim /etc/profile
# HADOOP
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
配置hadoop环境变量
(3)修改文件hadoop-env.sh
Hadoop的各守护进程依赖于JAVA_HOME环境变量,可在这两个文件中配置特定的JAVA环境。此处仅需要修改hadoop-env.sh文件。此外,Hadoop大多数守护进程默认使用的堆大小为1GB,但现实应用中,可能需要对其各类进程的堆内存大小做出调整,这只需要编辑这两个文件中的相关环境变量值即可,例如HADOOP_HEAPSIZE、HADOOP_JOB_HISTORY_HEAPSIZE、JAVA_HEAP_SIZE和YARN_HEAP_SIZE等。
hadoop用户登录shell,或者root用户登录,su - hadoop。
[hadoop@hadoop16 ~]$ vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh
(4)修改配置文件
hadoop用户登录shell,或者root用户登录,su - hadoop。
[hadoop@hadoop16 ~]$ cd /usr/local/hadoop/etc/hadoop/
修改core-site.xml:该文件包含了NameNode主机地址以及其监听RPC端口等信息,对于伪分布式模式的安装来说,其主机地址是localhost;对于完全分布式中master节点的主机名称或者ip地址;如果配置NameNode是HA,指定HDFS的nameservice为一个自定义名称,然后在hdfs-site.xml配置NameNode节点的主机信息。NameNode默认的RPC端口是8020。
<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop27:,hadoop28:,hadoop29:</value>
</property>
</configuration>
core-site.xml配置
修改hdfs-site.xml:该文件主要用于配置HDFS相关的属性,例如复制因子(即数据块的副本数)、NN和DN用于存储数据的目录等。数据块的副本数对于伪分布式的Hadoop应该为1,完全分布式模式下默认数据副本是3份。在这个配置文件中还可以配置NN和DN用于存储的数据的目录。
<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>hadoop16:</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>hadoop16:</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>hadoop26:</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>hadoop26:</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop27:8485;hadoop28:8485;hadoop29:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop/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>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value></value>
</property>
</configuration>
hdfs-site.xml配置
注意:如果需要其它用户对hdfs有写入权限,还需要在hdfs-site.xml添加一项属性定义。
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
修改mapred-site.xml:该文件用于配置集群的MapReduce framework,此处应该指定yarn,另外的可用值还有local和classic。mapred-site.xml默认是不存在,但有模块文件mapred-site.xml.template,只需要将其复制mapred-site.xml即可。
[hadoop@hadoop16 hadoop]$ cp mapred-site.xml.template mapred-site.xml
[hadoop@hadoop16 hadoop]$ vim mapred-site.xml
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
mapred-site.xml配置
修改yarn-site.xml:该文件用于配置YARN进程及YARN的相关属性。首先需要指定ResourceManager守护进程的主机和监听的端口,对于伪分布式模型来来讲,其主机为localhost,默认的端口是8032;其次需要指定ResourceManager使用的scheduler,以及NodeManager的辅助服务。
<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>hadoop16</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop26</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop27:,hadoop28:,hadoop29:</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
yarn-site.xml配置
修改slaves:该文件存储了当前集群的所有slave节点的列表,对于伪分布式模型,其文件内容仅应该是你localhost,这也的确是这个文件的默认值。
[hadoop@hadoop16 hadoop]$ vim slaves
hadoop27
hadoop28
hadoop29
slaves配置
Hadoop启动后,会把进程的PID号存储在一个文件中,这样执行stop-dfs脚本时就可以按照进程PID去关闭进程了。而这个默认路径就是/tmp,/tmp目录下的文件系统会定期清理,所以需要修改pid存放的路径:
[hadoop@hadoop16 ~]$ cd /usr/local/hadoop/sbin/
[hadoop@hadoop16 sbin]$ vim hadoop-daemon.sh
HADOOP_PID_DIR=/usr/local/hadoop
修改hadoop-daemon.sh
[hadoop@hadoop16 ~]$ cd /usr/local/hadoop/sbin/
[hadoop@hadoop16 sbin]$ vim yarn-daemon.sh
YARN_PID_DIR=/usr/local/hadoop
修改yarn-daemon.sh
【注意】:每个节点的这两个文件都得修改。
(5)安装配置其他节点
这里由于实验节点数目少,没有使用ansible等自动化工具。
重复操作解压、配置环境变量,参照前面。
Hadoop集群的各节点配置文件都是一样的,我们可以将master节点上的配置文件scp到其他节点上:
[hadoop@hadoop16 ~]$ scp -p /usr/local/hadoop/etc/hadoop/* hadoop@hadoop26:/usr/local/hadoop/etc/hadoop/
[hadoop@hadoop16 ~]$ scp -p /usr/local/hadoop/etc/hadoop/* hadoop@hadoop27:/usr/local/hadoop/etc/hadoop/
[hadoop@hadoop16 ~]$ scp -p /usr/local/hadoop/etc/hadoop/* hadoop@hadoop28:/usr/local/hadoop/etc/hadoop/
[hadoop@hadoop16 ~]$ scp -p /usr/local/hadoop/etc/hadoop/* hadoop@hadoop29:/usr/local/hadoop/etc/hadoop/
十、启动hadoop
注意:请严格按照下面的步骤启动。
1. 启动Zookeeper集群
分别在hadoop27、hadoop28、hadoop29上启动zk,前面已经启动好了,不再重复。
2. 启动journalnode
hadoop用户登录shell,分别在在hadoop27、hadoop28、hadoop29上执行:
[hadoop@hadoop27 ~]$ /usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode
运行jps命令检验,hadoop27、hadoop28、hadoop29上多了JournalNode进程。
3. 格式化HDFS
在HDFS的NN启动之前需要先初始化其用于存储数据的目录,可以在hdfs-site.xml配置文件中使用dfs.namenode.name.dir属性定义HDFS元数据持久存储路径,默认为${hadoop.tmp.dir}/dfs/name,这里是存放在JournalNode中;dfs.datanode.data.dir属性定义DataNode用于存储数据块的目录路径,默认为${hadoop.tmp.dir}/dfs/data。如果指定的目录不存在,格式化命令会自动创建之;如果事先存在,请确保其权限设置正确,此时格式化操作会清除其内部的所有数据并重新建立一个新的文件系统。
在hadoop16(Active)上执行命令:
[hadoop@hadoop16 ~]$ hdfs namenode -format
格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/usr/local/hadoop/tmp。
启动hadoop16主机上的NameNode:
[hadoop@hadoop16 ~]$ hadoop-daemon.sh start namenode
然后在hadoop26(Standby)主机上执行如下命令,同步hadoop16主机上的NameNode元数据信息:
[hadoop@hadoop26 ~]$ hdfs namenode –bootstrapStandby
同步完成后,停止hadoop16主机上的NameNode:
[hadoop@hadoop16 ~]$ hadoop-daemon.sh stop namenode
这里如果不启动Active的NameNode,就在Standby主机上同步,会报如下的错误:
这是因为没有启动active namenode,因为standby namenode是通过active namenode的9000端口通讯的。若active namenode没有启动,则9000没有程序监听提供服务。
当然也可以不启动Active NameNode就进行同步元数据信息,就是直接用命令拷贝Active主机上的元数据信息目录到Standby主机上,但是不建议这么做:
[hadoop@hadoop16 hadoop]$ scp -r tmp/ hadoop@hadoop26:/usr/local/hadoop
4. 启动HDFS(在hadoop16上执行)
[hadoop@hadoop16 ~]$ /usr/local/hadoop/sbin/start-dfs.sh
可以在各主机执行jps,查看启动的进程:
5. 启动YARN
注意:还是在hadoop16上执行start-yarn.sh,这是因为没有把namenode和resourcemanager分开,生产环境需要把他们分开,他们分开了就要分别在不同的机器上启动。
启动yarn(在hadoop16上):
[hadoop@hadoop16 ~]$ /usr/local/hadoop/sbin/start-yarn.sh
启动yarn standby(在hadoop26上):
[hadoop@hadoop26 ~]$ /usr/local/hadoop/sbin/yarn-daemon.sh start resourcemanager
十一、停止hadoop
停止HDFS集群:
[hadoop@hadoop16 ~]$ stop-dfs.sh
停止YARN集群:
[hadoop@hadoop16 ~]$ stop-yarn.sh
停止ResourceManager(Standby):
[hadoop@hadoop26 ~]$ yarn-daemon.sh stop resourcemanager
安装部署Apache Hadoop (完全分布式模式并且实现NameNode HA和ResourceManager HA)的更多相关文章
- 安装部署Apache Hadoop (本地模式和伪分布式)
本节内容: Hadoop版本 安装部署Hadoop 一.Hadoop版本 1. Hadoop版本种类 目前Hadoop发行版非常多,有华为发行版.Intel发行版.Cloudera发行版(CDH)等, ...
- Hadoop完全分布式模式安装部署
在Linux上搭建Hadoop系列:1.Hadoop环境搭建流程图2.搭建Hadoop单机模式3.搭建Hadoop伪分布式模式4.搭建Hadoop完全分布式模式 注:此教程皆是以范例讲述的,当然你可以 ...
- Hadoop伪分布式模式部署
Hadoop的安装有三种执行模式: 单机模式(Local (Standalone) Mode):Hadoop的默认模式,0配置.Hadoop执行在一个Java进程中.使用本地文件系统.不使用HDFS, ...
- Apache Hadoop集群离线安装部署(一)——Hadoop(HDFS、YARN、MR)安装
虽然我已经装了个Cloudera的CDH集群(教程详见:http://www.cnblogs.com/pojishou/p/6267616.html),但实在太吃内存了,而且给定的组件版本是不可选的, ...
- Apache入门篇(一)之安装部署apache
一.HTTPD特性 (1)高度模块化:core(核心) + modules(模块) = apache(2)动态模块加载DSO机制: Dynamic Shared Object(动态共享对象)(3)MP ...
- Hadoop伪分布式模式搭建
title: Hadoop伪分布式模式搭建 Quitters never win and winners never quit. 运行环境: Ubuntu18.10-server版镜像:ubuntu- ...
- 初学者值得拥有【Hadoop伪分布式模式安装部署】
目录 1.了解单机模式与伪分布模式有何区别 2.安装好单机模式的Hadoop 3.修改Hadoop配置文件---五个核心配置文件 (1)hadoop-env.sh 1.到hadoop目录中 2.修 ...
- apache hadoop 伪分布式安装
1. 准备工作 1.1. 软件准备 1.安装VMWare 2.在VMWare上安装CentOS6.5 3.安装XShell5,用来远程登录系统 4.通过rpm -qa | grep ssh 检查cen ...
- 在Hadoop伪分布式模式下安装Hive(derby,mysql)
我的Hadoop版本是1.2.0,mysql版本是5.6.12. 先介绍一下嵌入式derby模式: 1.下载/解压 在hive官网上选择要下载的版本,我选择的版本是hive-0.10.0. 下载好解压 ...
随机推荐
- python 异常处理(try...finally...和with...as 方法)
try...finally... 结构 我们在执行一长串关联命令时,会有一个问题,如果当中一个命令失败了,整个命令串事实上就没有必要执行下去了.在异常发生时,我们也需要执行一些收场工作.比如 clos ...
- Python3 笨方法 练习41(面向对象)详解及运行结果
#无尽模式训练你,检验所掌握的面向对象的单词和短语. import random from urllib.request import urlopen import sys WORD_URL = &q ...
- NATS_08:NATS客户端Go语言手动编写
NATS客户端 一个NATS客户端是基于NATS服务端来说既可以是一个生产数据的也可以是消费数据的.生产数据的叫生产者英文为 publishers,消费数据的叫消费者英文为 subscriber ...
- python中高阶函数与装饰器
高阶函数的定义:传入参数有函数名或者返回值有内置函数名的函数. 最简单的高阶函数: def add(x, y, f): return f(x) + f(y) add(-5, 6, abs) 常用 ...
- Java基础-包(package)的声明与访问
Java基础-包(package)的声明与访问 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.包的概念 Java中的包,其实就是我们电脑系统中的文件夹,包里存放的是程序员生成的 ...
- 安装VisualSVN Server 报错The specified TCP port is occupied
安装过程中报错,如下图所示. The specified TCP port is occupied by another service.Please stop that service or use ...
- Nginx记录-Nginx配置
1. 启动,停止和重新加载Nginx配置 要启动nginx,请运行可执行文件. 当nginx启动后,可以通过使用-s参数调用可执行文件来控制它. 使用以下语法: nginx -s signal 信号( ...
- jmeter上传图片附件-小插曲
背景 最近,接到新项目的接口测试,发现该接口是需要上传图片,开始折腾了好久没有搞定,最后才发现st和sid,并不是作为请求实体,而是url的一部分,好吧,是我没有仔细 请求参数 { "con ...
- CSS3实战之resize
resize属性可以设置是否允许用户缩放网页中元素的大小 总共有4种取值 none vertical horizontal both 举个栗子 <!DOCTYPE html PUBLIC &qu ...
- 微信小程序开发(五)开发框架MINA
微信团队为小程序提供的框架命名为MINA应用框架.MINA框架通过封装微信客户端提供的文件系统.网络通信.任务管理.数据安全等基础功能,对上层提供一整套JavaScript API,让开发者能够非常方 ...