一、准备服务器环境
1.1、服务器规划
Hadoop2 HA Cluster | |||||
Host | IP | NameNode | JournalNode | FailoverController | DataNode |
nn1 | 192.168.50.221 | Y | Y | Y | N |
nn2 | 192.168.50.222 | Y | Y | Y | N |
dn1 | 192.168.50.225 | N | Y | N | Y |
dn2 | 192.168.50.226 | N | N | N | Y |
dn3 | 192.168.50.227 | N | N | N | Y |
ZooKeeper机器部署,请看ZooKeeper哪一篇,做HADOOP的HA,需要提前部署ZK
1.2、软件版本
Linux: CentOS2.6.32-431.el6.x86_64
Hadoop:2.6.0(建议升级为2.7.1+)
ZooKeeper:3.4.6
JDK/JRE: 1.7.0_75 (64bit)
1.3、系统环境配置
1、修改主机名称
第一步临时修改
#hostname nn1
第二步修改永久修改,防止下次重启后被重置
修改/etc/sysconfig/network中的hostname
NETWORKING=yes
HOSTNAME= NameNode1
第三步做DNS映射,可以直接访问主机名则访问的部本机IP地址
修改/etc/hosts文件
在最后增加一行,如
192.168.50.221 nn1
第四步重启电脑
重启后,ping nn1
如果能ping成功则配置完成
其他机器依次配置即可
2、关闭防火墙
命令:service iptables stop
同时关闭防火墙自启动服务:chkconfig iptables off
查看是否关闭了自启动:chkconfig --list | grep iptables ,如果全部是off则表示都关闭了
查看状态:service iptables status
# service iptables status
Firewall is stopped.
3、设置ssh
修改/etc/ssh/sshd_config root帐户修改
#vim /etc/ssh/sshd_config
取消如下注释
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
修改后,重启ssh: service sshd restart
切换到普通用户下进行设置
生成SSH通讯密钥,有这个证书后,hadoop启动时就可以免密码登录了
a、先在每台机器上面执行ssh-keygen -t rsa -P "",密码都为空,主要是每次hadoop启动时需要认证,如果有密码每次都需要输入,实在麻烦,所以密码留空,回车即可,执行后,将产生两个文件,位于~/.ssh文件夹中
b、然后相互执行 ssh-copy-id userName@machineName,此功能可以快速把自己的公钥发给对方,并自动追加
[root ~]# ssh nn1
进入后,exit退出SSH即可
这里注意,有时候还是需要你输入密码,这里有可能是authorized_keys的权限问题,我们进一步设置权限,chmod 600 authorized_keys即可
如果对于其他计算机则需要把你的公钥发送给对方,你就可以无密码登录了,认证了
二、安装ZooKeeper Cluster
参见:《Zookeeper部署文档.doc》
三、安装Hadoop2 HA Cluster步骤
3.1、初始化系统配置
3.1.1、创建应用帐户和组(可选,建议新建一个专门的用户)
为了系统安全建议每个对外应用都创建单独的帐户和组,具体创建方法请网上搜索。
#新建组
[root ~]# groupadd bdata
#添加用户和分组
[root ~]# useradd -g bdata bdata
#设置密码
[root ~]# passwd bdata
Changing password for user bdata.
New password:
BAD PASSWORD: it does not contain enough DIFFERENT characters
BAD PASSWORD: is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.
3.1.2、修改hosts映射
#vim /etc/hosts
192.168.50.221 nn1
192.168.50.222 nn2
192.168.50.223 HMaster1
192.168.50.224 HMaster2
192.168.50.225 dn1
192.168.50.226 dn2
192.168.50.227 dn3
192.168.50.225 jn1
192.168.50.226 jn2
192.168.50.227 jn3
192.168.50.228 Zookeeper1
192.168.50.229 Zookeeper2
192.168.50.230 Zookeeper3
3.1.2、安装JDK/JRE
HADOOP2是使用JAVA语言开发的软件,所以必须要安装JRE或JDK才可以运行,为了测试方便建议安装JDK(生产环境安装JRE即可),JDK安装步骤(略)
3.2、安装HADOOP2
3.2.1、单机安装HADOOP2
下载地址:
http://mirrors.cnnic.cn/apache/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz
官方提供的发布包是基于32位系统编译的,Hadoop依赖的so库也是32位版本,因此在64位操作系统部署会提示一些警告信息,建议下载源码包自行编译64位版本HADOOP2。
配置环境变更
export HADOOP_HOME=/hom/bdata/software/hadoop-2.6.0
export PATH=.:$PATH:$HADOOP_HOME/bin
配置$HADOOP_HOME/etc/hadoop/core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<!-- 配置HDFS集群名称及HDFS存储的路径 -->
<name>fs.defaultFS</name>
<value>hdfs://dfscluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/bdata/datadir/hadoopinfo/journal</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<!-- zookeeper集群地址列表,以逗号分隔 -->
<value>Zookeeper1:2181,Zookeeper2:2181,Zookeeper3:2181</value>
</property>
</configuration>
配置$HADOOP_HOME/etc/hadoop/hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<!-- HDFS冗余数量 -->
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<!-- HDFS集群名称,必须与core-site.xml中的名称一致 -->
<name>dfs.nameservices</name>
<value>dfscluster</value>
</property>
<property>
<!--
dfs.ha.namenodes.[nameservices id]
hdfs namenode集群列表
-->
<name>dfs.ha.namenodes.dfscluster</name>
<value>nn1,nn2</value>
</property>
<property>
<!--
namenode rpc端口
dfs.namenode.rpc-address.[nameservices id].[host id]
-->
<name>dfs.namenode.rpc-address.dfscluster.nn1</name>
<!-- hostname/IP -->
<value>nn1:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.dfscluster.nn2</name>
<value>nn2:9000</value>
</property>
<property>
<!--
namenode http端口(Web后台访问端口)
dfs.namenode.http-address.[nameservices id].[host id]
-->
<name>dfs.namenode.http-address.dfscluster.nn1</name>
<value>nn1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.dfscluster.nn2</name>
<value>nn2:50070</value>
</property> <property><!-- 毫秒,最大时间,超过后客户端会断开和服务器的连接,默认1000ms,网络不好的情况下,可以设置大一些 --> <name>ipc.client.connection.maxidletime </name> <value>1000</value> </property> <!-- 客户端连接重试次数(在网络情况不好的情况下,有必要设置大一些,默认是10次,每次1000ms) --> <property>
<name>ipc.client.connect.max.retries</name>
<value>30</value>
</property>
<property>
<!--
QJM实现Hadoop HA
配置JournalNode集群列表以分号分隔
qjournal://[hostname/IP:port];[hostname/IP:port]/[nameservices id]
-->
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://jn1:8485;jn2:8485;jn3:8485/dfscluster</value>
</property>
<property>
<!-- 客户端检查到namenode失效自动切换 -->
<name>dfs.client.failover.proxy.provider.dfscluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<!--
namenode切换时需要把fence standby的节点(禁止写入EditLog)
有两种方式实现:
1、使用Hadoop使用Java实现的方式(推荐)
2、编写shell脚本
-->
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<!-- 配置本地私钥地址(配置SSH无密码登录时生成的私钥) -->
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/bdata/.ssh/id_rsa</value>
</property>
<property>
<!-- 配置sshfence超时时间单位毫秒 -->
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>10000</value>
</property>
<property>
<!-- 是否启用Failover自动切换(true:启用false:禁用) -->
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<!-- 指定namespace存入目录 -->
<name>dfs.namenode.name.dir</name>
<value>/home/bdata/datadir/hadoop/name</value>
</property>
<property>
<!-- 指定datanode数据存放目录 -->
<name>dfs.datanode.data.dir</name>
<value>/home/bdata/datadir/hadoop/data</value>
</property>
</configuration>
单节点配置,下面有HA的配置方式,如果不使用资源管理器,可以不配置
#vim yarn-site.xml
<property>
<name>yarn.resourcemanager.hostname</name>
<value>nn1</value>
</property>
<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.resourcemanager.scheduler.address</name>
<value>nn1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>nn1:8031</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>nn1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>nn1:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>nn1:8001</value>
</property>
YARN HA配置,如果不使用资源管理器,可以不配置
#vim yarn-site.xml
<?xml version="1.0"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<configuration>
<!-- Site specific YARN configuration properties -->
<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.resourcemanager.ha.enabled</name>
<value>true</value>
<description>启用Yarn的HA配置方式</description>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-ha</value>
<description>配置HA的集群名称,在ZK中显示也为该名称</description>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
<description>设置HA多个RM的名称,便于下面引用配置</description>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>nn1</value>
<description>配置rm1对应的主机</description>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>nn2</value>
<description>配置RM2对应的主机名称</description>
</property>
<!-- 启用RM重启的功能-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
<description>启用RM重启的功能,默认为false</description>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
<description>用于状态存储的类,采用ZK存储状态类</description>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>dn1:2181,dn2:2181,dn3:2181</value>
<description>由于数据需要存储在ZK中,通过ZK来选举active,所以这里需要配置ZK的地址</description>
</property>
<!-- 配置通讯的地址和端口,有多少个RM就配置多少组property -->
<!-- RM1-->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>nn1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>nn1:8031</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>nn1:8032</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm1</name>
<value>nn1:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>nn1:8001</value>
<description>提供给web页面访问的地址,可以查看任务状况等信息</description>
</property>
<!-- RM2 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>nn2:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>nn2:8031</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>nn2:8032</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm2</name>
<value>nn2:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>nn2:8001</value>
</property></configuration>添加数据从节点#vim slavesdn1dn2dn3修改hadoop-env.sh,JAVA_HOME地址export JAVA_HOME=/usr/java/jdk1.7.0_45
3.2.2、集群安装Hadoop
把配置好的hadoop复制到其它节点,这里bdata代表用户
scp -r hadoop bdata@NameNode1:/home/bdata/stoftware/
scp -r hadoop bdata@DataNode1:/home/bdata/stoftware/
scp -r hadoop bdata@DataNode2:/home/bdata/stoftware/
scp -r hadoop bdata@DataNode3:/home/bdata/stoftware/
3.2.3、启动Hadoop集群
3.2.3.1、首次启动(只能运行一次)
1、启动zookeeper集群(必须提前全部启动)
#zkServer.sh start
2、格式化zookeeper(与zookeeper建立联系,只有首次启动需要执行这一步)
# hdfs zkfc -formatZK
3、启动所有JournalNode(首次只能单台启动)
#hadoop-daemon.sh start journalnode #启动所有journalnode
4、格式化主NameNode节点
#hdfs namenode -format //在主namenode上执行格式化命令(保证zookeeper已经启动)
5、启动首个NameNode节点
#hadoop-daemon.sh start namenode //启动主namenode(保证journalnode已经启动,并且是格式化的节点上)
6、同步主NameNode数据到备NameNode上
#hdfs namenode -bootstrapStandby //备用namenode同步主namenode数据,在备节点上启动
7、关闭HDFS集群
#stop-dfs.sh
8、启动HDFS集群
#start-dfs.sh
启动后查看相应日志检查启动是否正常,也可通过JPS查看对应的进程是否启动
单独启动某个进程
hadoop-daemon.sh start journalnode //启动journalnode
hadoop-daemon.sh start namenode //启动namenode
hadoop-daemon.sh start datanode //启动datanode
hadoop-daemon.sh start zkfc //启动DFSZKFailoverController
3.2.3.2、非首次启动(保证Zookeeper节点正常)
1、关闭HDFS集群
#stop-dfs.sh
2、启动HDFS集群
#start-dfs.sh
3.2.4、Yarn HA启动和停止
1、启动Yarn HA
主启动所有节点,但是第二个RM节点需要手动启动
#./start-yarn.sh
手动启动standy的RM节点,该节点必须手动启动
#./yarn-daemon.sh start resourcemanager
单独启动某一个节点的方式
RM节点
#./yarn-daemon.sh start resourcemanager
NM节点
#./yarn-daemon.sh start nodemanager
2、停止Yarn HA
主启动所有节点,但是第二个RM节点需要手动启动
#./stop-yarn.sh
手动启动standy的RM节点,该节点必须手动启动
#./yarn-daemon.sh stop resourcemanager
单独启动某一个节点的方式
RM节点
#./yarn-daemon.sh stop resourcemanager
NM节点
#./yarn-daemon.sh stop nodemanager
3、查看任务
yarn application -list
4、停止任务
yarn application -kill <Application ID>
5、查看状态
yarn application -status <Application ID>
3.3、Hadoop集群异常处理
3.3.1、启动指定节点
集群可能因为各种异常导致部分节点失效,需要重启部分节点,相应命令如下:
hadoop-daemon.sh start journalnode //启动journalnode
hadoop-daemon.sh start namenode //启动namenode
hadoop-daemon.sh start datanode //启动datanode
hadoop-daemon.sh start zkfc //启动DFSZKFailoverController
3.3.2、重新格式化/清空HDFS数据及元数据(慎用)
hdfs zkfc -formatZK
hadoop-daemon.sh start journalnode #启动所有journalnode
hdfs namenode -format //在主namenode上执行格式化命令(保证zookeeper已经启动)
hadoop-daemon.sh start namenode //启动主namenode(保证journalnode已经启动)
hdfs namenode -bootstrapStandby //备用namenode同步主namenode数据
hadoop-daemon.sh start namenode //启动备用namenode
hadoop-daemon.sh start datanode //启动datanode