Alex 的 Hadoop 菜鸟教程: 第4课 Hadoop 安装教程 - HA方式 (2台服务器)

声明

  • 本文基于Centos 6.x + CDH 5.x
  • 官方英文安装教程 http://www.cloudera.com/content/cloudera/en/documentation/cdh5/v5-0-0/CDH5-Installation-Guide/cdh5ig_cdh5_install.html 本文并不是简单翻译,而是再整理
  • 如果没有yum源请参考http://blog.csdn.net/nsrainbow/article/details/36629339#t2

准备工作

  1. 用vmware开出两台虚拟机,安装上Centos6。 我弄了两个host,分别是 host1(192.168.199.126)  和host2(192.168.199.128)
  2. 开始前请按照 Alex 的 Hadoop 菜鸟教程: 第2课 hadoop 安装教程 (CentOS6 CDH分支 yum方式) 里面的方式添加yum源

安装

安装Zookeeper

注意:我这人比较懒,所以基本都是用root在安装,所以以下命令,如果你们无法执行,请再前面加一个 sudo 。或者想我一样直接用root玩

在两台机都执行

yum install zookeeper -y

都安装 zookeeper-server

sudo yum install zookeeper-server -y

host1 上启动zookeeper

$ sudo service zookeeper-server init --myid=1
$ sudo service zookeeper-server start
JMX enabled by default
Using config: /etc/zookeeper/conf/zoo.cfg
Starting zookeeper ... STARTED

注意:这个 --myid=1 标定了zookeeper的id,会在  /var/lib/zookeeper 下建立一个 myid 文件

host2 上启动zookeeper

$ sudo service zookeeper-server init --myid=2
$ sudo service zookeeper-server start
JMX enabled by default
Using config: /etc/zookeeper/conf/zoo.cfg
Starting zookeeper ... STARTED

检查下是否在2181端口监听

 $ netstat -tpnl | grep 2181
tcp        0      0 :::2181                     :::*                        LISTEN      5477/java

用client端测试一下

zookeeper-client -server host1:2181

配置zookeeper

在两台机子上都编辑 /etc/zookeeper/conf/zoo.cfg 文件

tickTime=2000
dataDir=/var/lib/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
server.1=host1:2888:3888
server.2=host2:2888:3888

改完记得重启zookeeper

注意:其实zookeeper的服务器最小的安装数量是3台机器,但是现在只有2台,只能凑合了。因为zookeeper是根据超过半数出问题来关停系统的,所以2台就无法正确的判断了,不过我们只是做例子所以没关系。

hadoop在启动的时候会自动去找zookeeper的2181端口,如果没有就启动不起来

安装Resource Manager

你需要在两台机子中挑选一台作为resource manager,在这里我挑选 host1(192.168.199.126) 安装

在 host1 上执行

yum install hadoop-yarn-resourcemanager -y

安装Name Node

两台机子上都安装name node

sudo yum install hadoop-hdfs-namenode -y

安装Date Node 等

官方文档说在除了Resource Manager 以外的所有机器上安装以下几个包,既然我们只有两台机子,那肯定是安装在host2上了

yum install hadoop-yarn-nodemanager hadoop-hdfs-datanode hadoop-mapreduce -y

在host1 上也安装 datanode

yum install hadoop-hdfs-datanode -y

官方文档说在其中一台机子上安装以下软件,随便挑一台,就挑host2

yum install hadoop-mapreduce-historyserver hadoop-yarn-proxyserver -y

在随便一台机器上安装client,选host1安装吧

yum install hadoop-client -y

配置

配置网络

hadoop官方强烈建议,大家不要用ip,而是用host的名字来进行配置,所以我们要先配置host文件

在host1上运行该命令设置机器名字

sudo hostname host1

在host2 上

sudo hostname host2

这样定义的名字只保持在下次重启之前

在两台机的 /etc/hosts 文件里面都插入这段

192.168.199.126 host1.localdomain host1
192.168.199.128 host2.localdomain host2

那个localdomain代表的是本地的域名,相当于localhost一样的东西

修改 /etc/sysconfig/network 确保里面的 HOSTNAME 是 host1.localdomain 或者 host2.localdomain

用uname -a 可以检查是否正确的设置了主机名

[[email protected] conf]# uname -a
Linux host1 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

配置HDFS

host1

到 /etc/hadoop/conf 文件夹下,编辑

core-site.xml 在 <configuration> 中增加

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://host1.localdomain:8020</value>
</property>

打开 hdfs-site.xml 添加

<property>
 <name>dfs.permissions.superusergroup</name>
 <value>hadoop</value>
</property>

在hdfs-site.xml里面修改一下 namanode 的实际存储位置为更大的磁盘

<configuration>
  <property>
     <name>dfs.namenode.name.dir</name>
     <value>file:///data/hdfs/1/dfs/nn</value>
  </property>
  <property>
   <name>dfs.permissions.superusergroup</name>
    <value>hadoop</value>
    </property>
</configuration>

官方文档说在每一个datanode节点上的hdfs-site.xml里面都配置相同的文件夹来存储数据,比如我就建三个文件夹来存储datanode数据

  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///data/hdfs/1/dfs/dn,file:///data/hdfs/2/dfs/dn,file:///data/hdfs/3/dfs/dn</value>
  </property>

所以最后hdfs-site.xml 是这样的

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <property>
     <name>dfs.namenode.name.dir</name>
     <value>file:///data/hdfs/1/dfs/nn</value>
  </property>
  <property>
    <name>dfs.permissions.superusergroup</name>
    <value>hadoop</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///data/hdfs/1/dfs/dn,file:///data/hdfs/2/dfs/dn,file:///data/hdfs/3/dfs/dn</value>
  </property>
</configuration>

PS:默认情况下只要有一台datanode挂了,整个集群就停了然后启动的时候会自动修复数据,如果要提高容错机制,就设置 dfs.datanode.failed.volumes.tolerated ,如果设置为3,那就只有4台挂了才会停止

  • /data/hdfs/1/dfs/nn
  • /data/hdfs/1/dfs/dn
  • /data/hdfs/2/dfs/dn
  • /data/hdfs/3/dfs/dn

全都建立出来,并统一把用户改成 hdfs.hdfs

chown -R hdfs.hdfs hdfs

host2

core-site.xml

<configuration>
     <property>
       <name>fs.defaultFS</name>
       <value>hdfs://host2.localdomain:8020</value>
     </property>
</configuration>

hdfs-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
  <property>
     <name>dfs.namenode.name.dir</name>
     <value>file:///data/hdfs/1/dfs/nn</value>
  </property>
  <property>
     <name>dfs.permissions.superusergroup</name>
     <value>hadoop</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///data/hdfs/1/dfs/dn,file:///data/hdfs/2/dfs/dn,file:///data/hdfs/3/dfs/dn</value>
  </property>
</configuration>

把需要的文件夹也都建立出来,并分配权限

chown -R hdfs.hdfs hdfs

格式化namenode

在两台机子上都使用hdfs来格式化namenode

sudo -u hdfs hdfs namenode -format

启动HDFS

在两台机器上都运行

for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x start ; done

建立/tmp文件夹

在host1 上运行

$ sudo -u hdfs hadoop fs -mkdir /tmp
$ sudo -u hdfs hadoop fs -chmod -R 1777 /tmp

这样会在hdfs集群上建立 /tmp 文件夹。

注意:这里的 /tmp 并不是某一台机器上的 /tmp 文件夹,是hdfs这个分布式文件系统上的 tmp 文件夹,这是一个高于真实物理机器环境的一个文件环境,host1 和 host2 共同组成了它

可以用

sudo -u hdfs hadoop fs -ls /

来看下hdfs上根目录下有什么文件夹

检查是否启动成功

启动完后可以用jps 命令 检查是否启动成功

host1

[[email protected] ~]# jps
12044 Jps
2207 ResourceManager
11857 NameNode

host2

[[email protected] ~]# jps
10735 NameNode
10855 Jps
10644 DataNode
2272 JobHistoryServer

客户端测试

打开你的浏览器输入 http://<hadoop server ip>:50070

如果看到

Overview ‘host1.localdomain:8020‘ (active)

这样的字样就成功进入了hadoop的命令控制台

提示:但是此时你会发现host1 跟 host2 之间其实没有什么关联,通过控制台只能查到各自的datanode信息,接下来我们说下怎么样把两个host组成一个集群

设置HA

最早的时候一个hadoop集群只能有一个namenode如果这个namenode挂了,整个集群就挂了,后来hadoop结合zookeeper发展出新的部署模式,就是HA(High Availability)模式。在这种模式下

  • 一个集群可以有多个namenode
  • 只有一个namenode处于活跃状态,其他namenode处于备选状态
  • 活跃状态的namenode跟备选状态的namenode之间有一定的时间差
  • 采用journalNode来记录namenode的所有改动,在活跃namenode到备选namenode切换过程中保证不漏掉操作步骤

配置HA

先从修改core-site.xml 开始

接下来的配置是两台机器都一样的,所以我就只写一份

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://mycluster</value>
  </property>
  <property>
     <name>hadoop.tmp.dir</name>
     <value>/data/hdfs/tmp</value>
  </property>
  <property>
     <name>ha.zookeeper.quorum</name>
     <value>host1:2181,host2:2181</value>
  </property>
</configuration>

建立对应的文件夹并分配权限

cd /data/hdfs
mkdir tmp
chown -R hdfs.hdfs tmp

参数解释:

  • fs.defaultFS 用一个统一的名字来标定集群的名字
  • hadoop.tmp.dir 是yarn使用的临时文件夹
  • ha.zookeeper.quorum 设定所有zookeeper server的地址,理论上一定要是奇数个,但是现在条件所迫就设置成2个吧

接下来是hdfs-site.xml

<configuration>
  <property>
     <name>dfs.replication</name>
     <value>2</value>
  </property>
  <property>
    <name>dfs.permissions</name>
    <value>false</value>
  </property>
  <property>
    <name>dfs.nameservices</name>
    <value>mycluster</value>
  </property>
  <property>
    <name>dfs.ha.namenodes.mycluster</name>
    <value>host1,host2</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.mycluster.host1</name>
    <value>host1:8020</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.mycluster.host1</name>
    <value>host1:50070</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.mycluster.host2</name>
    <value>host2:8020</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.mycluster.host2</name>
    <value>host2:50070</value>
  </property>
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>false</value>
  </property>
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://host1:8485;host2:8485/mycluster</value>
  </property>
  <property>
    <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/data/yarn/tmp/journal</value>
  </property>
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
  </property>
  <property>
       <name>dfs.ha.fencing.ssh.private-key-files</name>
       <value>/root/.ssh/id_dsa</value>
   </property>
   <property>
       <name>dfs.ha.fencing.ssh.connect-timeout</name>
       <value>10000</value>
   </property>
   <property>
       <name>dfs.namenode.handler.count</name>
       <value>100</value>
  </property>
<property>
     <name>dfs.namenode.name.dir</name>
     <value>file:///data/hdfs/1/dfs/nn</value>
  </property>
  <property>
    <name>dfs.permissions.superusergroup</name>
    <value>hadoop</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///data/hdfs/1/dfs/dn,file:///data/hdfs/2/dfs/dn,file:///data/hdfs/3/dfs/dn</value>
  </property>
</configuration>

配置解释

  • dfs.replication 数据的复制份数
  • dfs.nameservices serviceid 接下来的配置参数中会用到,也就是一个集群的名字
  • dfs.ha.namenodes.mycluster 这个mycluster就是之前定义的serviceid,这边列出所属的namenode,也就是namenode的host名字
  • dfs.namenode.rpc-address.mycluster.host1 各个namenode的 rpc通讯地址
  • dfs.namenode.http-address.mycluster.host1 各个namenode的http状态页面地址
  • dfs.ha.automatic-failover.enabled 是否启用故障自动处理?就是故障的时候会自动启用备选的namenode,暂时设定为false
  • dfs.namenode.shared.edits.dir 定义了集群的日志节点,采用统一格式  "qjournal://host1:port1;host2:port2;host3:port3/journalId" ,日志节点是由active状态的namenode写入,由standby(备选)状态节点读出
  • dfs.ha.fencing.methods 处于故障状态的时候hadoop采取行动的方式,一般是sshfence 就是ssh方式,后面的 dfs.ha.fencing.ssh.private-key-files 则配置了 ssh用的 key 的位置

建立文件夹,并分配权限

sudo mkdir -p /data/yarn/tmp/journal
sudo chown -R hdfs:hdfs /data/yarn

建立sshkey

在host1 上进行如下操作

cd ~
ssh-keygen -t dsa
全程回车
ssh-copy-id -i ~/.ssh/id_dsa [email protected]
<pre name="code" class="plain">Are you sure you want to continue connecting (yes/no)?输入 yes

这步会让你输入host2的密码ssh [email protected]第一次会问你Are you sure you want to continue connecting (yes/no)?记得输入yes


在host2上也做一遍

ssh-keygen -t dsa
ssh-copy-id -i ~/.ssh/id_dsa [email protected]
ssh [email protected]

修改mapred-site.xml

<configuration>
  <property>
       <name>mapreduce.framework.name</name>
       <value>yarn</value>
  </property>
</configuration>

修改yarn-site.xml ,在 <configuration/> 节点里面插入一个属性

<property>
      <name>yarn.resourcemanager.hostname</name>
      <value>host1</value>
  </property>

修改文件slave

host1
host2

把 core-site.xml , hdfs-site.xml, mapred-site.xml, yarn-site.xml, slaves 复制到host2上

重启两台机器上的hadoop, 顺序无所谓

for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x stop; done
for x in `cd /etc/init.d ; ls hadoop-hdfs-*` ; do sudo service $x start ; done

注意:如果你启动有错,不要慌,去 /var/log/hadoop-hdfs 看下日志,看具体错在哪里再想解决方案

这个时候你可以访问 host1:50070 或者 host2:50070 会看到两个namenode都处在standby状态,是不能对外服务的

接下来我们来看下如何部署HA

部署HA

安装并启动JournalNodes

两台机器上都执行

yum install hadoop-hdfs-journalnode -y

在两台机器上都启动服务

service hadoop-hdfs-journalnode start

格式化

在两台机器上格式化namenode

sudo -u hdfs hdfs namenode -format

在两台机器上停止namenode

service hadoop-hdfs-namenode stop

host1上初始化journalnode

hdfs namenode -initializeSharedEdits

启动namenode

再启动第一个namenode就是你要作为主要的namenode的那个,这里我把host1作为主要的

在host1上执行

service hadoop-hdfs-namenode start

接下来启动备用namenode,这里我把host2作为备用的namenode

sudo -u hdfs hdfs namenode -bootstrapStandby

可能会问你是否要格式化,记得选Y

启动备用namenode

service hadoop-hdfs-namenode start

我解释一下,当你用 -bootstrapStandby 启动备选的namenode的时候,它会将内容从主namenode上复制过来(包括命名空间信息和最近修改信息)存储的位置就是你在 dfs.namenode.name.dir 和 dfs.namenode.edits.dir里面配置的,在本教程中就是 file:///data/hdfs/1/dfs/nn

启动 datanode

请大家记住hadoop的基本启动顺序

  1. 最先启动的是所有机器上的 journalnode
  2. 再启动主机上的namenode
  3. 启动备选机上的namenode(还需要用 -bootstrapStandby 拉取镜像)
  4. 启动所有机器上的datanode

设置host1为active状态

现在我们用浏览器访问 http://host1:50070 和 http://host2:50070 你会发现两个namenode 都还是standby状态。这时你需要把其中一个转化为active状态才行。不过前提是你得先把 dfs.ha.automatic-failover.enabled 设置成false,所以前面我设置的时候设置成了false 。

现在我们来设置host1 为active状态

hdfs haadmin -failover host2 host1

成功后再去看 http://host1:50070 会看到 ‘host1:8020‘ (active) 字样,标志着 host1终于处在活跃状态,集群终于可以工作了!

其实haadmin 有一个transitionToActive命令,但是最好不要用这个命令,因为主备切换的时候最大的问题就是 脑裂问题,说具体了就是,有可能一不小心把俩namenode都弄成active状态,并且还都同时工作,造成数据写入的不一致,后果不堪设想。所以用failover的好处就是会检查另外一个namenode,如果是active就会设置成standby,如果已经是standby就什么也不做,这样比较安全。

设置自动failover

部署还没有结束,我们之前用的是手动failover,其实是不够的,如果每次出问题都要手动解决,这个集群等于是不稳定的。所以要设置自动failover。自动failover用的是zookeeper 的 ZooKeeper FailoverController (ZKFC)

安装zkfc

两台机器都运行

yum install hadoop-hdfs-zkfc -y

先去把 hdfs-site.xml 里面的 dfs.ha.automatic-failover.enabled 弄成true,然后重启namenode

格式化zookeeper

在host1 上执行

hdfs zkfc -formatZK

这一步会在zookeeper根目录下建立 /hadoop-ha/mycluster 这个目录。

建立完后我们去验证一下用 zookeeper-client 连接上zookeeper

# zookeeper-client -server host1:2181
[zk: host1:2181(CONNECTED) 0] ls /
[hadoop-ha, zookeeper]

在两台机器上都启动 zkfc

service hadoop-hdfs-zkfc start

官方说明了几点:

  • zkfc跟zookeeper关系密切,要是zookeeper挂了,zkfc也就失效了
  • 最好监控着zkfc进程,防止zkfc退出了,造成无法自动切换
  • zkfc跟namenode的启动顺序是无所谓的

验证namenode状态

打开浏览器访问 host1:50070 会发现 这个 namenode 变成了active 状态,再看看 host2:50070 会发现是 standby 状态。

那么恭喜你,HA安装完全成功了!

时间: 2024-10-24 23:20:40

Alex 的 Hadoop 菜鸟教程: 第4课 Hadoop 安装教程 - HA方式 (2台服务器)的相关文章

Alex 的 Hadoop 菜鸟教程: 第6课 Sqoop2 安装教程

安装 sqoop 分为服务端和客户端,先安装服务端 $ sudo yum install sqoop2-server 再安装客户端 $ sudo yum install sqoop2-client 服务端 配置 分为 MRv1 和 YARN(Map Reduce 2代)两种情况 YARN alternatives --set sqoop2-tomcat-conf /etc/sqoop2/tomcat-conf.dist MRv1 alternatives --set sqoop2-tomcat-

Alex 的 Hadoop 菜鸟教程: 第15课 Impala 安装使用教程

声明: 本文基于Centos 6.x + CDH 5.x 硬件要求 Impala的使用是有硬件要求的!我第一次见到有硬件要求的,那就是你的CPU必须支持SSSE3,如果你的CPU较老,不支持SSSE3 (3个S),那么你只能找别的机器来学习Impala,因为虚拟机也没有办法给你虚拟出不同的CPU. 为什么用 Impala 因为Hive 太慢了!Impala 也可以执行SQL,但是比Hive的速度快很多.为什么Impala可以比Hive快呢?因为Hive采用的是把你的sql转化成hadoop 的

最完整的网狐棋牌-新手零基础教程 第三节 数据库的安装教程

最完整的网狐棋牌-新手零基础教程 第三节 数据库的安装教程 百度云在线播放地址: 本帖隐藏的内容 链接:http://pan.baidu.com/s/1qYHMIPu 密码:vpw3 解压密码:www.ttkmwl.com ----------------------------------------------------------------- 通天源码论坛官方QQ群: 官方一群: 147949983 官方二群: 536016771 通天源码论坛!专注源码分享,本论坛不仅有web源码,还

MySQL官方教程及各平台的安装教程和配置详解入口

官方文档入口: https://dev.mysql.com/doc/ 一般选择MySQL服务器版本入口: https://dev.mysql.com/doc/refman/en/ 在右侧有版本选择: 比如安装教程的入口: https://dev.mysql.com/doc/refman/5.7/en/installing.html 还有很多官方的教程: 官方提供的是英文版本,采用Chrome翻译即可. 这个教程上没有APT源的安装方式,入口在这里: https://dev.mysql.com/d

Alex 的 Hadoop 菜鸟教程: 第7课 Sqoop2 导出教程

承接上节课,现在说说导出教程 检查连接 先看看有没有可用的connection 连接,如果没有就要根据上节课的方法创建一个 sqoop:000> show connector --all 1 connector(s) to show: Connector with id 1: Name: generic-jdbc-connector Class: org.apache.sqoop.connector.jdbc.GenericJdbcConnector Version: 1.99.3-cdh5.0

Alex 的 Hadoop 菜鸟教程: 第10课 Hive 入门教程

Hive 安装 相比起很多教程先介绍概念,我喜欢先动手装上,然后用例子来介绍概念.我们先来安装一下Hive 先确认是否已经安装了对应的yum源,如果没有照这个教程里面写的安装cdh的yum源http://blog.csdn.net/nsrainbow/article/details/36629339 Hive是什么 Hive 提供了一个让大家可以使用sql去查询数据的途径.但是最好不要拿Hive进行实时的查询.因为Hive的实现原理是把sql语句转化为多个Map Reduce任务所以Hive非常

Alex 的 Hadoop 菜鸟教程: 第8课 Sqoop1 安装/导入/导出教程

靠!sqoop2的文档太少了,而且居然不支持Hbase,十分简陋,所以我愤而放弃Sqoop2转为使用Sqoop1,之前跟着我教程看到朋友不要拿砖砸我,我是也是不知情的群众 卸载sqoop2 这步可选,如果你们是照着我之前的教程你们已经装了sqoop2就得先卸载掉,没装的可以跳过这步 $ sudo su - $ service sqoop2-server stop $ yum -y remove sqoop2-server $ yum -y remove sqoop2-client 安装Sqoop

Alex 的 Hadoop 菜鸟教程: 第7课 Sqoop2 导入教程

具体的安装和jdbc的驱动准备你们看第6课.现在我用一个例子讲解sqoop2的具体使用方法 数据准备 有一个mysql的表叫worker,里面有三条数据,我们要将其导入hadoop 这是建表语句 CREATE TABLE `workers` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 插入三

Alex 的 Hadoop 菜鸟教程: 第17课 Spark 安装以及使用教程

声明 本文基于Centos6.x + CDH 5.x 本文基于CSDN的markdown编辑器写成,csdn终于支持markdown了,高兴! Spark是什么 Spark是Apache的顶级项目.项目背景是 Hadoop 的 MapReduce 太挫太慢了,于是有人就做了Spark,目前Spark声称在内存中比Hadoop快100倍,在磁盘上比Hadoop快10倍. 安装Spark spark有5个组件 spark-core: spark核心包 spark-worker: spark-work