主机名 | NN | DN | RM | NM | ZK | JN |
---|---|---|---|---|---|---|
node1 | √ | √ | √ | √ | ||
node2 | √ | √ | √ | |||
node3 | √ | √ | √ | √ | √ | |
node4 | √ | √ | √ | √ |
注:打勾的说明,本台主机配置有该项服务。服务全称为:
NN : NameNode
DN : DataNode
RM : ResourceManager
NM : NodeManager
ZK : ZooKeeper
JN : JournalNode(最后的参考文章第一篇是这个服务作用的解释)
本文章各组件安装地址:
zookeeper : /usr/local/zookeeper
hadoop : /usr/local/hadoop
参考http://blog.csdn.net/qq_806913882/article/details/53511741中的JDK安装。
这一步不是必须,如果担心无法准确将本文章中的配置文件中的主机名替换成自己的主机名,可以把自己的主机名修改成与本文章一样。这样可以避免更改本文章中的配置文件。
# 打开主机名配置文件
vi /etc/sysconfig/network
# 更改主机名,修改HOSTNAME=?,?即是本机名。例如,修改本机名为node1,则
HOSTNAME=node1
#保存退出,主机名需要重启才能生效。
给每台主机配置到其他主机的网络映射。
# 打开 /etc/hosts
vi /etc/hosts
# 添加一下内容到hosts,主机名称,ip地址等,由自己的集群确定。
192.168.20.128 node1
192.168.20.129 node2
192.168.20.130 node3
192.168.20.131 node4
# 查看是否安装了ssh服务
rpm -qa | grep openssh
# 如果没有安装ssh服务,则安装ssh
yum install ssh
各节点启动时需要通信,所以要配置ssh免密码登录,以保证各服务正确启动。以node1的root用户为例配置,其余节点步骤相同。
# 生成公钥
ssh-keygen -t rsa
# 将公钥发送给各个主机,包括自己。
ssh-copy-id -i /root/.ssh/id_rsa.pub root@node1
ssh-copy-id -i /root/.ssh/id_rsa.pub root@node2
ssh-copy-id -i /root/.ssh/id_rsa.pub root@node3
ssh-copy-id -i /root/.ssh/id_rsa.pub root@node4
# 测试免密码登录,依次登录到各个主机,观察是否需要密码
ssh root@node1
exit
ssh root@node2
exit
ssh root@node3
exit
ssh root@node4
exit
其余主机类似配置并测试后,如果任一主机都可以免密码登录到任一主机,则配置成功。
从hadoop下载网站任选一个版本下载即可,本文章选用zookeeper-3.4.6.tar.gz
下载完毕
cd /usr/local
# 下载
wget http://apache.fayea.com/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
# 解压
tar -zxvf zookeeper-3.4.6.tar.gz
#重命名,将zookeeper-3.4.6重命名为zookeeper
mv zookeeper-3.4.6 zookeeper
进入配置文档 cd zookeeper/conf/
# 如果zoo.cfg不存在,则复制zoo_sample.cfg一份并重命名即可。
# 在zoo.cfg添加一下内容
# The number of milliseconds of each tick
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/usr/local/zookeeper-3.4.5/data
clientPort=2181
server.1=node1:2888:3888
server.2=node3:2888:3888
server.3=node4:2888:3888
注:这一步应该在下一步,把zookeeper发送到各个节点之后做。
在zoo.cfg文件中,配置了dataDi的路径,在此路径下创建一个叫myid的文件。此文件要填入的内容是本台主机在zoo.cfg文件中配置的server号。
例如:
# 假设本主机为node3. 在zoo.cfg配置文件中,有
server.2=node3:2888:3888
# 所以,本主机的myid文件中,只用写入一个数字 2 即可。
配置完成后,把整个zookeeper文件夹传输到要用本服务的主机上,根据本文开头的集群配置,即把文件夹传输到 node1 node3 node4三台主机上,依旧放在/usr/local目录下。
# 使用scp命令传输,也可使用别的工具传输
# 传输给node1
scp -r /usr/local/zookeeper
root@node1:/usr/local/zookeeper
# 传输给node3
scp -r /usr/local/zookeeper
root@node3:/usr/local/zookeeper
# 传输给node4
scp -r /usr/local/zookeeper
root@node4:/usr/local/zookeeper
zookeeper配置完成。启动zookeeper的命令为 zkServer.sh start,zookeeper为单独启动,需要每个节点都启动一次。
参考 http://blog.csdn.net/qq_806913882/article/details/53511741 的第四节 “下载hadoop安装包并安装” 。
# 进入hadoop文件夹中
cd /usr/local/hadoop
# 创建文件
mkdir logs
mkdir -p tmp/mapred/local
mkdir journal
# 配置JAVA_HOME环境变量和HADOOP的类路径
export JAVA_HOME=/usr/local/jdk1.8.0_51
export HADOOP_CLASSPATH=.
# 配置JAVA_HOME环境变量
export JAVA_HOME=/usr/local/jdk1.8.0_51
# 配置hadoop的日志文件夹
export HADOOP_MAPRED_LOG_DIR="/usr/local/hadoop/logs"
# 配置JAVA_HOME环境变量,这个可以不配,
export JAVA_HOME=/usr/local/jdk1.8.0_51
# 本参数指定默认文件系统的名称。hadoophdfs1 是namenode节点集群的逻辑名,在hdfs-site.xml中配置
<property>
<name>fs.defaultFSname>
<value>hdfs://hadoophdfs1value>
property>
# 本参数指定Hadoop的临时目录,其它目录会基于此路径。本地目录。
<property>
<name>hadoop.tmp.dirname>
<value>/usr/local/hadoop/tmpvalue>
property>
# 本参数是Ha功能,需要一组zookeepr地址,用逗号分隔。各个ZK节点的IP/host,及客户端连接ZK的端口,该端口需与zoo.cfg中的clientPort一致!
<property>
<name>ha.zookeeper.quorumname>
<value>node1:2181,node3:2181,node4:2181value>
property>
# 以分钟为单位的垃圾回收时间,垃圾站中数据超过此时间,会被删除。如果是0,垃圾回收机制关闭。默认关闭,建议开启,建议4320(3天)
<property>
<name>fs.trash.intervalname>
<value>4320value>
property>
# 设置副本数
<property>
<name>dfs.replicationname>
<value>3value>
property>
# namenode集群的逻辑名,与core-site.xml的参数fs.defaultFS逻辑名相同。
<property>
<name>dfs.nameservicesname>
<value>hadoophdfs1value>
property>
# 包含一个NN列表。EXAMPLENAMESERVICE是指具体的nameservice名称,通常就是dfs.nameservices中配置的。值是预备配置的NN的ID。
<property>
<name>dfs.ha.namenodes.hadoophdfs1name>
<value>nn1,nn2value>
property>
# 以下四个函数是配置各个namenode的地址和端口
# NN的RPC地址和端口
<property>
<name>dfs.namenode.rpc-address.hadoophdfs1.nn1name>
<value>node1:8020value>
property>
<property>
<name>dfs.namenode.rpc-address.hadoophdfs1.nn2name>
<value>node2:8020value>
property>
# NN的HTTP地址和端口。0表示任意空闲端口。
<property>
<name>dfs.namenode.http-address.hadoophdfs1.nn1name>
<value>node1:50070value>
property>
<property>
<name>dfs.namenode.http-address.hadoophdfs1.nn2name>
<value>node2:50070value>
property>
# 在多个NN中共享存储目录,用于存放edits文件。这个目录,由active写,由standby读,以保持命名空间数据一致。如果是用qj方式,则配置各个journalnode节点的地址和端口。与下面那个参数一起用。
<property>
<name>dfs.namenode.shared.edits.dirname>
<value>qjournal://node2:8485;node3:8485;node4:8485/abcvalue>
property>
# 这是JournalNode进程保持逻辑状态的路径。这是在linux服务器文件的绝对路径。
<property>
<name>dfs.journalnode.edits.dirname>
<value>/usr/local/hadoop/journalvalue>
property>
# 是否开启自动故障转移。建议开启,true
<property>
<name>dfs.ha.automatic-failover.enabledname>
<value>truevalue>
property>
# 这里配置HDFS客户端连接到Active NameNode的一个java类。
<property>
<name>dfs.client.failover.proxy.provider.laoxiaoname> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvidervalue>
property>
# 配置active namenode出错时的处理类。当active namenode出错时,一般需要关闭该进程。处理方式可以是ssh也可以是shell。
<property>
<name>dfs.ha.fencing.methodsname>
<value>sshfencevalue>
property>
<property>
<name>dfs.ha.fencing.ssh.private-key-filesname>
<value>/root/.ssh/id_dsavalue>
property>
# 设置使用 yarn框架
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
# 配置历史作业日志收集参数,参数具体含义和原理可以参看参考文章的第五篇 "Hadoop 2.0中作业日志收集原理以及配置方法" , 可以使用“sbin/mr-jobhistory-daemon.sh start jobhistoryserver”命令启动JobHistory Server。
<property>
<name>mapreduce.jobhistory.addressname>
<value>node1:10020value>
property>
<property>
<name>mapreduce.jobhistory.webapp.addressname>
<value>node1:19888value>
property>
<property>
<name>yarn.app.mapreduce.am.staging-dirname>
<value>/mapredvalue>
property>
# MapReduce的缓存数据存储在文件系统中的位置
<property>
<name>mapreduce.cluster.local.dirname>
<value>file:/usr/local/hadoop/tmp/mapred/localvalue>
property>
# 配置shuffle,配置为:mapreduce.shuffle,在Yarn上开启MR的必须项
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.nodemanager.aux-
services.mapreduce_shuffle.classname>
<value>org.apache.hadoop.mapred.ShuffleHandlervalue>
property>
# 配置使用HA
<property>
<name>yarn.resourcemanager.ha.enabledname>
<value>truevalue>
property>
# 配置resourcemanager集群
<property>
<name>yarn.resourcemanager.cluster-idname>
<value>hadoopyarn1value>
property>
<property>
<name>yarn.resourcemanager.ha.rm-idsname>
<value>rm1,rm2value>
property>
<property>
<name>yarn.resourcemanager.hostname.rm1name>
<value>node2value>
property>
<property>
<name>yarn.resourcemanager.hostname.rm2name>
<value>node3value>
property>
# 配置zookeeper节点
<property>
<name>yarn.resourcemanager.zk-addressname>
<value>node1:2181,node3:2181,node4:2181value>
property>
# 本文件添加datanode和nodemanager节点的地址
node1
node3
node4
为了寻求便捷,本文章一次性配置好一个hadoop文件夹,然后把此文件夹发送到其余主机、
# 使用scp命令传输,也可使用别的工具传输
# 传输给node1
scp -r /usr/local/hadoop
root@node1:/usr/local/hadoop
# 传输给node2
scp -r /usr/local/hadoop
root@node2:/usr/local/hadoop
# 传输给node3
scp -r /usr/local/hadoop
root@node3:/usr/local/hadoop
# 传输给node4
scp -r /usr/local/hadoop
root@node4:/usr/local/hadoop
因为节点之间要相互通信,所以要关闭各个节点的防火墙,以node1为例关闭防火墙,需要root权限
# 关闭防火墙
service iptables stop
# 关闭防火墙的开机自启,下次开机,防火墙不再启动
chkconfig iptables off
各个节点都需要配置,也可将配置内容写到一个 .sh 文件中,然后发送到每个主机的/etc/profile.d/目录下。
# 在 /etc/profile文件最后添加如下内容,
# 配置zookeeper环境变量
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=${PATH}:${ZOOKEEPER_HOME}/bin
# 配置JDK
export JAVA_HOME=/usr/local/jdk1.8.0_51
export JRE_HOME=/usr/local/jdk1.8.0_51/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASS_PATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
# 配置 hadoop
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export CLASS_PATH=$CLASS_PATH:$HADOOP_HOME/lib
第一次启动集群时需要做一些初始化工作,请依次执行,这个流程只是第一次启动时使用,以后启动使用正常化启动的流程。
#每个拥有zookeeper服务的节点都要执行启动,
#启动三个zookeeper:
./zkServer.sh start
#启动三个JournalNode:
./hadoop-daemon.sh start journalnode
#在其中一个namenode上格式化:
hdfs namenode -format
#把刚刚格式化之后的元数据拷贝到另外一个namenode上
#启动刚刚格式化的namenode
./hadoop-daemon.sh start namenode
#在没有格式化的namenode上执行:
hdfs namenode -bootstrapStandby
#启动第二个namenode
./hadoop-daemon.sh start namenode
#在其中一个namenode上初始化zkfc:
hdfs zkfc -formatZK
#停止上面节点:
stop-dfs.sh
#全面启动:
start-dfs.sh
一般来说,集群的启动都是使用脚本的,本文章以脚本形式来启动
#!/bin/bash
#启动zookeeper
ssh root@node1 "zkServer.sh start" < /dev/null > /dev/null
ssh root@node3 "zkServer.sh start" < /dev/null > /dev/null
ssh root@node4 "zkServer.sh start" < /dev/null > /dev/null
#启动hdfs
ssh root@node1 "start-dfs.sh" < /dev/null > /dev/null
#启动yarn
ssh root@node2 "start-yarn.sh" < /dev/null > /dev/null
ssh root@node3 "yarn-daemon.sh start resourcemanager" < /dev/null > /dev/null
Hadoop Journal Node 作用
https://my.oschina.net/u/189445/blog/661561
hadoop配置参数汇总
https://segmentfault.com/a/1190000000709725
【甘道夫】Hadoop2.2.0 NN HA详细配置+Client透明性试验【完整版】
http://blog.csdn.net/u010967382/article/details/30976935
Hadoop2.2.0集群的HA高可靠的最简单配置
http://www.linuxidc.com/Linux/2014-01/95794p2.htm
Hadoop 2.0中作业日志收集原理以及配置方法
http://dongxicheng.org/mapreduce-nextgen/hadoop-2-0-jobhistory-log/