在上一篇中已经介绍了Linux虚拟机的搭建,那么下一步我们就应该来搭建我们的Hadoop集群了。系列主要增加了HA高可用和YARN,一个充分解决了集群环境中namenode挂掉的情况,一个解决了mapreduce计算的缺陷。那么下面我们来具体操作吧。
集群目标
一、安排
在进行HA配置之前需要对HA的基本概念有所了解,并且设计好HA的集群节点。在之前1.0的时候NameNode 存在单点故障,虽然有 SecorndaryNameNode,但是它并不是NameNode的备份,它只是 NameNode 的一个助理,协助 NameNode 工作,对 fsimage 和 edits 文件进行合并,并推送给 NameNode ,防止因 edits 文件过大,导致 NameNode 重启变得缓慢。
- 各节点简称如下:
NN 表示 NameNode
DN 表示 DataNode
ZK 表示 ZooKeeper
JN 表示 JournalNode
RM 表示 ResouceManager
DM 表示 DataManager - 各节点安排如下:
下面表格中,1表示该机器上有此节点,总体集群是:两台namenode(3核2G)、三台Zookeeper(ZK的投票机制决定了要使用大于1的奇数台ZK)、一台resourceManager(node1上),三台datanode(1核1.5G),后续如果不够用可以再加。
NN | DN | ZK | ZKFC | JN | RN | DM | |
---|---|---|---|---|---|---|---|
node1 | 1 | 1 | 1 | 1 | |||
node2 | 1 | 1 | 1 | 1 | 1 | ||
node3 | 1 | 1 | 1 | 1 | |||
node4 | 1 | 1 | 1 |
二、安装步骤
安装Hadoop2.9.2
在安装之前我们先进行集群免密配置
1、首先在本地生成公钥和私钥。
ssh-keygen -t rsa #后面都按回车跳过即可(三次) # 运行结束后在 ~/.ssh/下生成两个新文件: id_rsa.pub和id_rsa
2、将公钥拷贝到远程主机
ssh-copy-id username@host # username是用户名 host是主机的地址 #远程主机将用户的公钥保存在 ~/.ssh/authorized_keys文件中
第二步是每台机器都要操作,包括本机。
将下载好的Hadoop安装包上传linux,在root创建一个soft文件夹,以后Hadoop的组件全部放入到这个文件夹下管理。
然后执行:
tar -zxvf hadoop-2.9.2.tar.gz
mv hadoop-2.9.2.tar.gz hadoop
解压好后,我们最主要修改三个文件,他们都在/root/soft/hadoop/etc/hadoop/
配置hadoop-env.sh
这里主要是配置java的路径,默认使用的是 `${JAVA_HOME}`,还是建议换成绝对的路径
export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/java/jdk1.8
配置hadoop-hdfs.xml
<property>
<name>dfs.nameservices</name>
<value>JPFee</value>
<description>这个是集群的唯一标示,之后都会用到,官网指南上给的例子是mycluster</description>
</property>
<property>
<name>dfs.ha.namenodes.JPFee</name>
<value>nn1,nn2</value>
<description>配置两个namenode的名称,注意namenodes的s和后面的JPFee,JPFee就是上面配置的nameservice</description>
</property>
<property>
<name>dfs.namenode.rpc-address.JPFee.nn1</name>
<value>node1:8020</value>
<description>配置nn1的rpc地址(该地址是hdfs://node1:8020的地址)</description>
</property>
<property>
<name>dfs.namenode.rpc-address.JPFee.nn2</name>
<value>node2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.JPFee.nn1</name>
<value>node1:50070</value>
<description>配置nn1的http的地址,通过这个地址能够访问nn1的web界面</description>
</property>
<property>
<name>dfs.namenode.http-address.JPFee.nn2</name>
<value>node2:50070</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
<description>开启自动切换</description>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node2:8485;node3:8485;node4:8485/JPFee</value>
<description>配置edits.dir,这个是为了投票将某个namenode标记为active的ZK地址,有三个ZK,分别在node1/node2/node3上,注意最后面的ptbirdns</description>
</property>
<property>
<name>dfs.client.failover.proxy.provider.JPFee</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
<description>这是默认的配置</description>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<description>配置通信方式为ssh</description>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
<description>SSH免密钥登录的私钥</description>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/jndata</value>
<description>配置journalnode的目录,主要存放fsImage等namenode的元数据,为了切换</description>
</property>
配置core-site.xml
<!-- do not know which node is avtive, so do not use ip address to replace hdfs://ptbirdns-->
<!-- and ptbirdns is the 'nameservice' in hdfs-site.xml-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://JPFee</value>
<description>上面的JPFee就是在hdfs-site中配置的nameservice</description>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value>
<description>配置zookeeper的集群地址,默认端口2181</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
<description>配置临时目录</description>
</property>
配置slaves
node2
node3
node4
配置Zookeeper
先去这个地址去下载zookeeper
下下来上传到soft下解压就行。,然后吧刚才的hadoop和zookeeper一块配置到环境变量中。
vim /etc/profile
#java
export JAVA_HOME=/mnt/software/jdk1.7.0_79
export PATH=$PATH:$JAVA_HOME/bin
#zookeeper home
export ZOOKEEPER_HOME=/root/soft/zookeeper/bin
export PATH=$PATH:$ZOOKEEPER_HOME
#HADOOP_HOME
export HADOOP_HOME=/root/soft/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
写完后不要忘了sourcem /etc/profile
配置 conf/zoo.sample.cfg ,当然需要改成zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/opt/zookeeper/
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
#
#zookeeper cluster config
#the "server.x":the x is the ID of the zookeeper cluster
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
最主要把dataDir这个文件夹配好,里面要配置myid。zookeeper cluster这个server后面1对应你的机器的myid。
配置完之后一定要检查一下你的集群所有机器的防火墙是否关闭,最好设置成开机关闭,不然zookeeper报错。
systemctl status firewalld.service #查看firewalld状态
systemctl stop firewalld #关闭
systemctl disable firewalld #开机自动关闭
chkconfig --list|grep network
在上述条件都配置好了之后。
在启动Hadoop之前先启动三台zookeeper。
zkServer.sh start
根据上面的配置条件,在2,3,4上分别执行以下命令开启journalnode
hadoop-daemon.sh start journalnode
在node1上进行format操作。
hadoop namenode -format
format成功(出现successfully)之后,需要将将node1的namenode启动,此时node1就是active的namenode
启动成功后,node1的元数据 /opt/Hadoop/tmp/dfs/name/current/fsimage_* 拷贝到node2【在没有格式化的namenode也就是node2上执行 hdfs namenode -bootstrapStandby】说明地址:指南
hdfs namenode -bootstrapStandby
上述操作成功后,停止dfs再重新启动dfs,此时node1不一定是active,可能node2是active。
./sbin/stop-dfs.sh
./sbin/start-dfs.sh
然后在其中一个namenode中初始化 zkfc ,官网地址:指南
这个命令一定要手打,不知道为什么,复制粘贴就是不对。
./bin/hdfs zkfc –formatZK
上述操作完成后,再次stop和start
./sbin/stop-dfs.sh
./sbin/start-dfs.sh
当出现这个界面,证明你已经安装好啦。
这节有点偏长了,下一节我们在配置MapReduce和YARN吧。
关注本公众号,分享视频教程,分享工作中遇到的问题,一起学习大数据。