hadoop、zookeeper、hbase、spark集群环境搭建

本文详细讲解如何搭建Hadoop、zookeeper、HbaseSpark的集群环境,这里我是在本地虚拟机上搭建的集群,但是和实际环境的配置差不多。我会从零开始搭建并且尽量写得详细,所以还会讲到很多配置Linux环境的东西,希望大家不要烦,务必按照步骤一步步做下去。
本文主要讲了以下内容:

  1. Linux系统的一些基础配置
  2. 安装jdk
  3. 配置SSH免登陆
  4. hadoop的安装和配置
  5. zookeeper集群的安装配置
  6. hbase的安装和配置
  7. spark的安装和配置

1 使用Vmware安装Linux系统

这个很easy,软件和操作步骤请自行搜索,我安装的ubuntu系统,三个主机的名称分别是master、slave1、slave2,用户名统一都是trigl,后面设置ssh免登录需要用户名是相同的否则就会出错。后面的很多配置这三台主机都是相同的,直接复制配置文件即可,这里教大家一下不同主机之间传输文件(文件夹)的命令:

scp -r 本主机文件路径 其他主机用户名@其他主机IP:文件父目录
  • 1
  • 1

如将master的jdk的tar包传给slave1,命令如下:

scp -r /data/install/java/jdk-7u45-linux-x64.tar.gz trigl@192.168.79.133:/data/install/java
  • 1
  • 1

2 安装xshell和xftp

xshell用于连接linux系统并输入命令,xftp用于向linux系统传输文件,安装比较简单,请自行搜索。
我安装了ubuntu系统后首次用xshell连接是连不上的,如图:

这里写图片描述

这是由于新装的系统没有ssh服务,使用下面命令下载安装:

sudo apt-get install openssh-server
  • 1
  • 1

安装完成以后用xshell就可以连接上了

3 解决ubuntu自带VI编辑器不好用的问题

使用ubuntu自带的vi来编辑文件的时候,方向键会变成ABCD,解决方法如下:
编辑 /etc/vim/vimrc.tiny ,将“set compatible”改为“set nocompatible”,在这句话的下面加上“set backspace=2”,如下:

这里写图片描述

4 分别修改三台主机的hosts文件和主机名

1、修改hosts文件
编辑hosts文件:

sudo vi /etc/hosts
  • 1
  • 1

添加下面内容:

192.168.79.131 master
192.168.79.132 slave1
192.168.79.133 slave2
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

这样就配置好了域名,在后面配置需要ip时我们可以直接用域名来方便地替换ip。

2、修改主机名
分别修改三台主机 /etc/hostname 的内容为master、slave1、slave2

注意主机名和hosts文件中设置的名称应当保持一致,否则会产生意外的错误

5 关闭防火墙

1、关闭命令

service iptables stop
chkconfig iptables off
  • 1
  • 2
  • 1
  • 2

2、查看防火墙状态

service iptables status 
  • 1
  • 1

6 设置NTP时间同步

为了保证集群内的时间是一致的,我们可以将其中的一台主机作为时间服务器,其他主机设置定时任务每天与时间服务器同步一次时间

6.1 配置某台主机为ntp时间服务器

1、安装ntp

yum -y install ntp
  • 1
  • 1

2、修改配置文件/etc/ntp.conf

#允许10.*.*.*的主机进行时间同步
restrict 10.0.0.0 mask 255.0.0.0 nomodify notrap
  • 1
  • 2
  • 1
  • 2

3、手动同步

ntpdate 0.asia.pool.ntp.org
  • 1
  • 1

4、启动服务

service ntpd start
  • 1
  • 1

5、开机启动

chkconfig ntpd on
  • 1
  • 1

6.2 配置其他主机为ntp客户端

1、安装ntp

yum -y install ntp
  • 1
  • 1

2、修改配置文件/etc/ntp.conf

#注释默认配置,添加刚刚创建的ntpserver
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 192.168.2.151
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3、安装使用定时器crontab

传送至:Linux下使用定时器crontab

4、编辑定时器任务

sudo crontab -e
  • 1
  • 1

添加如下内容:

0 0 * * * /usr/sbin/ntpdate 192.168.2.151 >> /home/hadoop/logs/ntpd.log
  • 1
  • 1

7 修改最大线程数

Linux默认有一个最大线程数,线程数不能超过这个值,可以使用以下命令查看:

ulimit -u
  • 1
  • 1

默认是1024,hadoop集群跑任务的时候会需要同时创建很多线程,有时候会超过1024,所以最好将该参数改的大一点

1、修改文件/etc/security/limits.d/90-nproc.conf

#注释掉该行
#*          soft    nproc     1024
root       soft    nproc     unlimited
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

2、修改文件/etc/security/limits.conf,添加内容:

*   soft    nproc   102400
*       hard    nproc   102400
*       soft    nofile   102400
*       hard    nofile   102400
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

8 新建安装目录并更改所属用户和组

1、新建应用的安装目录

sudo mkdir -p /data/install
  • 1
  • 1

2、更改该安装目录所属用户和组
例如将目录归属为trigl用户和trigl用户组:

sudo chown -R trigl:trigl /data
  • 1
  • 1

对slave1和slave2做相同操作,更改用户和组以后对该目录就有了所有权限,后续输入命令不再需要加sudo了

9 安装jdk

hadoop等的搭建都依赖于jdk,所以需要先安装jdk

1、到官网下载jdk:http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk7-downloads-1880260.html,我下载的是 jdk-7u75-linux-x64.tar.gz

2、下载好的tar包放在 /data/install/Java 目录并解压:

tar -xvf jdk-7u75-linux-x64.tar.gz
  • 1
  • 1

3、配置环境变量
首先进入编辑Linux配置环境变量的文件:

sudo vi /etc/profile
  • 1
  • 1

在里面添加如下内容:

export JAVA_HOME=/data/install/java/jdk1.7.0_45
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

4、使环境变量立刻生效:

source /etc/profile
  • 1
  • 1

10 配置SSH免登陆

关于为什么需要配置SSH免登陆请看这篇文章:SSH免密码登录详解,我这里仅给出具体的配置方式

1、生成SSH的公钥,命令如下,三台主机都要执行一次:

ssh-keygen -t rsa
  • 1
  • 1

让输入内容直接回车即可,执行以后会在 /home/trigl/.ssh/(家目录/.ssh) 下生成id_rsa和id_rsa.pub文件

2、将主机slave1和slave2在上一步骤生成的id_rsa.pub文件传到主机master的 /home/trigl/.ssh/ 下面,为了防止覆盖,重命名为id_rsa.pub.slave1和id_rsa.pub.slave2

scp id_rsa.pub trigl@master:~/.ssh/id_rsa.pub.slave1
scp id_rsa.pub trigl@master:~/.ssh/id_rsa.pub.slave2
  • 1
  • 2
  • 1
  • 2

3、在主机master的 /home/trigl/.ssh/ 目录下分别将id_rsa.pub、id_rsa.pub.slave1和id_rsa.pub.slave2追加到authorized_keys文件中

cat id_rsa.pub >> authorized_keys
cat id_rsa.pub.slave1 >> authorized_keys
cat id_rsa.pub.slave2 >> authorized_keys
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

这样就生成了一个可以同时验证master、slave1和slave2的公钥文件

4、将上一步生成的authorized_keys文件分别传到slave1和slave2的/home/trigl/.ssh/下面

scp authorized_keys trigl@slave1:~/.ssh
scp authorized_keys trigl@slave2:~/.ssh
  • 1
  • 2
  • 1
  • 2

5、验证
验证master连接slave1:

ssh slave1
  • 1
  • 1

如果没有让输入密码且成功切换到slave1的终端,说明配置成功,验证连接slave2类似

2016.11.25更新:注意如果是在Centos系统下还需要更改文件权限

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
  • 1
  • 2
  • 1
  • 2

11 hadoop的安装和配置

1、下载hadoop
首先到Apache官网(http://www.apache.org/dyn/closer.cgi/hadoop/common/)复制下载地址,然后进入 /data/install/apache 目录下面执行以下命令直接进行下载:

wget http://mirror.bit.edu.cn/apache/hadoop/common/stable/hadoop-2.7.3.tar.gz
  • 1
  • 1

下载完成后进行解压:

tar -xvf hadoop-2.7.3.tar.gz
  • 1
  • 1

2、配置hadoop
进入hadoop的配置目录:

cd /data/install/apache/hadoop-2.7.3/etc/hadoop/
  • 1
  • 1

需要修改的配置文件为:core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml、slaves、hadoop-env.sh、yarn-env.sh

core-site.xml

<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://master:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/data/install/apache/hadoop-2.7.3/tmp</value>
    </property>
    <property>
        <name>io.file.buffer.size</name>
        <value>131702</value>
    </property>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

hdfs-site.xml

<configuration>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/data/install/apache/hadoop-2.7.3/hdfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/data/install/apache/hadoop-2.7.3/hdfs/data</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>master:9001</value>
    </property>
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>
    <property>
        <name>dfs.namenode.datanode.registration.ip-hostname-check</name>
        <value>false</value>
    </property>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

yarn-site.xml

<configuration>
    <!-- Site specific YARN configuration properties -->
    <property>
        <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>master:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>master:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>master:8031</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>master:8033</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>master:8088</value>
    </property>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

mapred-site.xml

通过cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml创建etc/hadoop/mapred-site.xml,内容改为如下:

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>master:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>master:19888</value>
    </property>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

slaves

slave1
slave2
  • 1
  • 2
  • 1
  • 2

hadoop-env.shyarn-env.sh

export JAVA_HOME=/data/install/java/jdk1.7.0_45
  • 1
  • 1

配置文件修改完以后,将master下hadoop文件夹复制到slave1和slave2中

scp -r /data/install/apache/hadoop-2.7.3 trigl@slave1:/data/install/apache/
scp -r /data/install/apache/hadoop-2.7.3 trigl@slave2:/data/install/apache/
  • 1
  • 2
  • 1
  • 2

3、运行hadoop

启动hadoop的命令都在master上执行

(1)初始化hadoop(清空hdfs数据):

rm -rf /data/install/apache/hadoop-2.7.3/hdfs/*
rm -rf /data/install/apache/hadoop-2.7.3/tmp/*
/data/install/apache/hadoop-2.7.3/bin/hdfs namenode -format
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

(2)启停hdfs:

/data/install/apache/hadoop-2.7.3/sbin/start-dfs.sh
/data/install/apache/hadoop-2.7.3/sbin/stop-dfs.sh
  • 1
  • 2
  • 1
  • 2

验证是否启动成功,在master输入 jps,应当存在namenode和secondary namenode

这里写图片描述

在slave1和slave2输入jps,应当存在datanode

这里写图片描述

进一步验证,访问:http://192.168.79.131:50070/dfshealth.html(192.168.79.131是master的ip),如图:

这里写图片描述

(3)启停yarn

/data/install/apache/hadoop-2.7.3/sbin/start-yarn.sh
/data/install/apache/hadoop-2.7.3/sbin/stop-yarn.sh
  • 1
  • 2
  • 1
  • 2

在master输入 jps,应当存在resourcemanager

这里写图片描述

在slave1和slave2输入jps,应当存在nodemanager

这里写图片描述

访问:http://192.168.79.131:8088/cluster

这里写图片描述

12 zookeeper集群的安装配置

1、下载
http://apache.fayea.com/zookeeper/stable/下载安装包并解压:

wget http://apache.fayea.com/zookeeper/stable/zookeeper-3.4.9.tar.gz
  • 1
  • 1

2、配置

(1)建立数据目录

mkdir /data/install/apache/zookeeper-3.4.9/data
  • 1
  • 1

(2)进入conf目录创建并修改zoo.cfg文件

cp zoo_sample.cfg zoo.cfg
  • 1
  • 1

修改以后的内容为:

# 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=/data/install/apache/zookeeper-3.4.9/data
# 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
server.0=master:2888:3888
server.1=slave1:2888:3888
server.2=slave2:2888:3888
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

这里还需要在数据目录/data/install/apache/zookeeper-3.4.9/data下面新建名为myid的文件,各个主机对应的内容是不同的,master的内容是0,slave1的内容是1,slave2的内容是2,分别对应server.x中的x

(3)设置环境变量:/etc/profile添加如下内容

export ZOOKEEPER_HOME=/data/install/apache/zookeeper-3.4.9
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf
  • 1
  • 2
  • 1
  • 2

别忘了source一下让环境变量生效

source /etc/profile
  • 1
  • 1

3、启停zookeeper

在各个节点执行以下命令:

/data/install/apache/zookeeper-3.4.9/bin/zkServer.sh start
/data/install/apache/zookeeper-3.4.9/bin/zkServer.sh stop
  • 1
  • 2
  • 1
  • 2

输入jps检测一下:

这里写图片描述

查看各个主机的状态:

sh bin/zkServer.sh status
  • 1
  • 1

这里写图片描述

这里如果报错:

bin/zkServer.sh: 81: /data/install/apache/zookeeper-3.4.9/bin/zkEnv.sh: Syntax error: "(" unexpected (expecting "fi")
  • 1
  • 1

看这篇文章的解决方法:http://blog.csdn.net/lcdcxy/article/details/50393363

13 hbase的安装和配置

1、下载
首先到http://apache.fayea.com/hbase/stable/下载稳定版安装包并解压:

wget http://apache.fayea.com/hbase/stable/hbase-1.2.2-bin.tar.gz
  • 1
  • 1

2、配置

主要修改conf目录下的三个文件:hbase-env.sh、hbase-site.xml、regionservers

hbase-env.sh

export JAVA_HOME=/data/install/java/jdk1.7.0_45
export HBASE_MANAGES_ZK=true 
export HBASE_LOG_DIR=/data/install/apache/hbase-1.2.2/logs
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

hbase-site.xml

<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://master:9000/hbase</value>
    </property>
    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>master,slave1,slave2</value>
    </property>
    <property>
        <name>hbase.master.maxclockskew</name>
        <value>180000</value>
        <description>Time difference of regionserver from master</description>
    </property>
</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

regionservers

slave1
slave2
  • 1
  • 2
  • 1
  • 2

2016.11.25更新:还需要同步集群时间,否则有的从节点无法启动,在每个节点上运行ntp即可

ntpdate asia.pool.ntp.org
  • 1
  • 1

3、启停hbase

/data/install/apache/hbase-1.2.2/bin/start-hbase.sh
/data/install/apache/hbase-1.2.2/bin/stop-hbase.sh
  • 1
  • 2
  • 1
  • 2

master输入jps:

这里写图片描述

slave1和slave2输入jps:

这里写图片描述

访问:http://192.168.79.131:16010

这里写图片描述

4、hbase的一些基本命令

名称 命令表达式
创建表 create ‘表名称’, ‘列名称1’,’列名称2’,’列名称N’
添加记录 put ‘表名称’, ‘行名称’, ‘列名称:’, ‘值’
查看记录 get ‘表名称’, ‘行名称’
查看表中的记录总数 count ‘表名称’
删除记录 delete ‘表名’ ,’行名称’ , ‘列名称’
删除一张表 disable ‘表名称’
drop ‘表名称’
查看所有记录 scan “表名称”

首先进入hbase shell

./bin/hbase shell
  • 1
  • 1

(1)创建表

creat 'test','address'
  • 1
  • 1

(2)添加记录

put'test','row1','address:province','zhejiang'
put 'test','row2','address:city','hangzhou'
  • 1
  • 2
  • 1
  • 2

(3)查看记录

get 'test','row1'
  • 1
  • 1

(4)查看表中的记录总数

count 'test'
  • 1
  • 1

(5)删除记录

delete 'test','row1','address'
  • 1
  • 1

(6)删除一张表

disable 'test'
drop 'test'
  • 1
  • 2
  • 1
  • 2

(7)查看所有记录

scan 'test'
  • 1
  • 1

14 spark的安装和配置

1、下载
首先在http://spark.apache.org/downloads.html下载指定hadoop版本的安装包,然后解压缩

2、配置

创建并修改conf目录下的配置文件 spark-env.sh,slaves

spark-env.sh

cp spark-env.sh.template spark-env.sh
  • 1
  • 1

修改内容为:

export JAVA_HOME=/data/install/java/jdk1.7.0_45
export HADOOP_HOME=/data/install/apache/hadoop-2.7.3
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HBASE_HOME=/data/install/apache/hbase-1.2.2
#如果ssh端口非22
export SPARK_SSH_OPTS="-p 22022"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

slaves

cp slaves.template slaves
  • 1
  • 1

修改内容为:

slave1
slave2
  • 1
  • 2
  • 1
  • 2

3、启停spark

/data/install/apache/spark-2.0.0-bin-hadoop2.7/sbin/start-all.sh
/data/install/apache/spark-2.0.0-bin-hadoop2.7/sbin/stop-all.sh
  • 1
  • 2
  • 1
  • 2

在master上输入jps:

这里写图片描述

在slave1和slave2上输入jps:

这里写图片描述

访问:http://192.168.79.131:8080/

这里写图片描述


以上,就完成了整个集群环境的搭建,详细配置文件和启停命令可以到这里下载:http://download.csdn.net/download/trigl/9629044

【Hadoop】YARN详解与安装指南

一 背景介绍

  自从Hadoop推出以来,在大数据计算上得到广泛使用。其他分布式计算框架也出现,比如spark等。随着Hadoop的使用和研究越来越透彻,它暴漏出来的问题也越来越明显。比如NameNode的单点故障,任务调度器JobTracker的单点故障和性能瓶颈。各个公司对这几个问题都做出了对源代码的改变,比如阿里对NameNode做出修改使Hadoop的集群可以跨机房,而腾讯也做出了改变让Hadoop可以管理更多的节点
  相对于各个企业对Hadoop做出改变以适应应用需求,Apache基金也对Hadoop做出了升级,从Hadoop 0.2.2.0推出了Hadoop二代,即YARN。YARN对原有的Hadoop做出了多个地方的升级,对资源的管理与对任务的调度更加精准。下面就对YARN从集群本身到集群的安装做一个详细的介绍。

  二 YARN介绍

  在介绍YARN之前,Hadoop内容请查看相关附注中的连接。

  2.1 框架基本介绍

  相对于第一代Hadoop,YARN的升级主要体现在两个方面,一个是代码的重构上,另外一个是功能上。通过代码的重构不在像当初一代Hadoop中一个类的源码几千行,使源代码的阅读与维护都不在让人望而却步。除了代码上的重构之外,最主要的就是功能上的升级。
  功能上的升级主要解决的一代Hadoop中的如下几个问题:
  1:JobTracker的升级。这个其中有两个方面,一个是代码的庞大,导致难以维护和阅读;另外一个是功能的庞大,导致的单点故障和消耗问题。这也是YARN对原有Hadoop改善最大的一个方面。
  2:资源的调度粗粒度。在第一代Hadoop中,资源调度是对map和reduce以slot为单位,而且map中的slot与reduce的slot不能相互更换使用。即就算执行map任务没有多余的slot,但是reduce有很多空余slot也不能分配给map任务使用。
  3:对计算节点中的任务管理粒度太大。
  针对上述相应问题,YARN对Hadoop做了细致的升级。YARN已经不再是一个单纯的计算平台,而是一个资源的监管平台。在YARN框架之上可以使用MapReduce计算框架,也可以使用其他的计算或者数据处理,通过YARN框架对计算资源管理。升级后的YARN框架与原有的Hadoop框架之间的区别可以用下图解释:
 
 
 细节内容待补充。

  2.2 框架架构解读

   相对于一代Hadoop中计算框架的JobTracker与TaskTracker两个主要通信模块,YARN的模块变的更加丰富。在一代Hadoop中JobTracker负责资源调度与任务分配,而在YARN中则把这两个功能拆分由两个不同组件完成,这不仅减少了单个类的代码量(单个类不到1000行),也让每个类的功能更加专一。原有的JobTracker分为了如今的ResourceManager与ApplicationMaster 两个功能组件,一个负责任务的管理一个负责任务的管理。有人会问那任务的调度与计算节点的谁来负责。任务的调度有可插拔的调
度器ResourceScheduler,计算节点有NodeManager来完成。这在下面会细说。
  YARN的架构设计如下图所示:
  
  相对于第一代Hadoop,YARN把Hadoop中的资源控制、任务调度和具体任务计算的JobTracker/TaskTracker架构,变为下述的四个功能组件,让资源调度和任务调度更加细粒化。
  • 集群唯一的ResourceManager
  • 每个任务对应的ApplicationMaster
  • 每个机器节点上的NodeManager
  • 运行在每个NodeManager上针对某个任务的Container
通过上述四个功能组件的合作,解决了第一代Hadoop中JobTracker负责所有资源的调度和任务的调度的重任。除此之外还解决了,资源分配简单粗暴的问题。

  2.3 功能组件细讲

    ResourceManager
    ResourceManager是这一代Hadoop升级中最主要的一个功能组件。
    NodeManager
    ResourceScheduler

  三 安装

  相对于Hadoop的安装,YARN的安装稍微繁琐一点,因为它的组件更多。对于一代Hadoop,它大的组件就可以分为HDFS与MapReduce,HDFS主要是NameNode与Datanode,而MapReduce就是JobTracker与TaskTracker。YARN框架中HDFS部分虽然和一代Hadoop相同,但是启动方式则和一代完全不同;而MapReduce部分则更加复杂。所以安装起来稍微繁琐一点。下面我们就参考官方文档,开始慢慢讲解整个安装过程。在安装过程中遇到的问题都记录在附录中给出的连接中。
  YARN安装可以通过下载tar包或者通过源代码两种方式安装,我们集群是采用的下载tar包然后进行解压的安装方式,下载地址在附录中给出。为了方便安装,我们是解压到根目录/yarn。解压tar包后的YARN目录结构有一点需要注意,即配置文件conf所在的正确位置应该是/yarn/conf,但是解压后/yarn目录中是没有conf文件的,但是有有个/etc/hadoop目录。所有的配置文件就在该目录下,你需要做的是把该文件move到/yarn/conf位置。再做下一步的安装。如果你解压后的文件没有出现上面情况,那这一步操作可以取消。
对于YARN的安装主要是HDFS安装与MapReduce安装。我们的集群共有四台机器,其中一台作为NameNode所在,一台作为ResourceManager所在,剩下的两台则担任数据节点与计算节点。具体的机器安排如下:
linux-c0001:ResourceManager
linux-c0002:NameNode
linux-c0003:DataNode/NodeManager
linux-c0004:DataNode/NodeManager
  因为我们的集群上已经安装有其他版本的Hadoop,比如Apache的Hadoop还有Intel推出的Intel Distributiong Hadoop,所以很多默认的端口号都要修改,数据文件的存储位置与运行Hadoop的用户都要修改。在安装的过程中因为已经安装的Hadoop的存在,也遇到了很多问题。这在下面还有附录中的连接中都会有说明。
下面针对每个安装进行介绍:

  3.1 HDFS安装与配置

  HDFS安装主要是NameNode与DataNode的安装与配置,其中NameNode还需要一步格式化formate操作。其中HDFS的配置主要存在于core-site.xmlhdfs-site.xml两个文件中。这两个配置文件的默认属性已经在附录中给出,但是在我们集群中不能采用。因为,我们集群中已经安装有其他Hadoop,如果全部采用默认配置则会出现冲突,在安装过程中出现Port in useBindException。主要需要配置的地方如下几点:
  1:NameNode配置
在我们集群中c0002是NameNode所在的机器,在该机器的配置文件中需要修改的是两个文件core-site.xml与hdfs-site.xml。需要修改的配置文件指定namenode所在主机与端口号,NameNode的数据文件目录等几点。
下面分别给出我们的core-site.xml与hdfs-site.xml的配置:
  core-site.xml:
  1. <configuration>
  2. <property>
  3.     <name>fs.defaultFS</name>
  4.         <value>hdfs://linux-c0002:9090</value>
  5.                   </property>
  6.   <property>
  7.       <name>io.file.buffer.size</name>
  8.           <value>131072</value>
  9.                     </property>
  10. </configuration>
对于HDFS的配置,因为有NameNode与DataNode两种节点身份,所以在NameNode与DataNode中配置文件不会完全一致,下面就会贴出两种节点上的不同配置。

hdfs-site.xml(NameNode):

  1. <configuration>
  2.   <property>
  3.       <name>dfs.namenode.http-address</name>
  4.                      <value>linux-c0002:50071</value>
  5.                                        </property>
  6.  <property>
  7.        <name>dfs.namenode.backup.address</name>
  8.                     <value>linux-c0002:50101</value>
  9.                                       </property>
  10.  <property>
  11.        <name>dfs.namenode.backup.http-address</name>
  12.                     <value>linux-c0002:50106</value>
  13.                                       </property>
  14.   <property>
  15.       <name>dfs.namenode.name.dir</name>
  16.         <value>/home/hadoop/YarnRun/name1,/home/hadoop/YarnRun/name2</value>
  17.                   </property>
  18.   <property>
  19.       <name>dfs.blocksize</name>
  20.           <value>268435456</value>
  21.                     </property>
  22.  <property>
  23.        <name>dfs.namenode.handler.count</name>
  24.             <value>100</value>
  25.                     </property>
  26. </configuration>
2:DataNode的配置
DataNode的配置是在hdfs-site.xml中进行个性化配置的,主要包括DataNode的主机和对外端口号,数据文件位置。按照正常DataNode的主机与对外端口号是不用额外配置的,在安装的时候采用默认的端口号就好。但是,还是那个原因,因为我们集群中安装有其他的Hadoop版本,所以不得不对默认的DataNode中的端口号做一定的修改。
下面给出配置后的文件内容:
   hdfs-site.xml(DataNode)

  1. <configuration>
  2.   <property>
  3.       <name>dfs.namenode.http-address</name>
  4.                      <value>linux-c0002:50071</value>
  5.                                        </property>
  6.   <property>
  7.         <name>dfs.datanode.address</name>
  8.                       <value>linux-c0003:50011</value>
  9.                                         </property>
  10.   <property>
  11.         <name>dfs.datanode.http.address</name>
  12.                       <value>linux-c0003:50076</value>
  13.                                         </property>
  14.   <property>
  15.       <name>dfs.datanode.ipc.address</name>
  16.                     <value>linux-c0003:50021</value>
  17.                                       </property>
  18.   <property>
  19.       <name>dfs.blocksize</name>
  20.           <value>268435456</value>
  21.                     </property>
  22.  <property>
  23.         <name>dfs.datanode.data.dir</name>
  24.             <value>/home/hadoop/YarnRun/data1</value>
  25.                     </property>
  26. </configuration>

3:slaves文件的修改
slaves文件主要是指明子节点的位置,即数据节点和计算节点的位置。和一代Hadoop不同的是,在YARN中不需要配置masters文件,只有slaves配置文件。在slaves添加两个子节点主机名(整个集群的主机名在集群中的所有主机的hosts文件中已经注明):

linux-c0003
linux-c0004

4:Namenode的格式化
采用官方文档给出的格式化命令进行格式化(cluster_name没有指定则不需要添加该参数)

  $HADOOP_PREFIX/bin/hdfs namenode -format <cluster_name>

   5:Namenode启动
采用官方文档给出的启动命令直接启动就好。(注意:启动命令与格式化命令的脚本不再同一个文件中)

  $HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode

6:检查NameNode是否启动
输入jps命令,看是否有NameNode进程;或者访问其web链接看是否能正常访问。如果不能正常访问,则去看相应的日志进行相应的定向修改。

   7:DataNode的启动
   在YARN中DataNode的启动与第一代Hadoop的启动是不相同的,在第一代Hadoop中你执行一个start-all命令包括NameNode与各个节点上的DataNode都会相继启动起来,但是在YARN中你启动DataNode必须要去各个节点依次执行启动命令。当然你也可以自己写启动脚本,不去各个节点重复执行命令。
  下面贴出启动命令:
[plain] view plain copy

在CODE上查看代码片派生到我的代码片

  1. $HADOOP_PREFIX/sbin/hadoop-daemon.sh –config $HADOOP_CONF_DIR –script hdfs start datanode
3.2 MapReduce安装与配置
  MapReduce其中需要配置安装的地方是ResourceManager与NodeManager的安装与配置。
  1:ResourceManager的配置
  ResourceManager与NameNode一样,都是单独在一个机器节点上,对ResourceManager的配置主要是在yarn-site.xml中进行配置的。可配置的属性主要包括主机与端口号,还有调度器的配置。
  1. <configuration>
  2.   <property>
  3.       <name>yarn.resourcemanager.address</name>
  4.                 <value>linux-c0001:8032</value>
  5.                               <description>the host is the hostname of the ResourceManager and the port is the port on
  6.                                                 which the clients can talk to the Resource Manager. </description>
  7.                                                                     </property>
  8.   <property>
  9.     <name>yarn.resourcemanager.resource-tracker.address</name>
  10.         <value>linux-c0001:8031</value>
  11.             <description>host is the hostname of the resource manager and
  12.                 port is the port on which the NodeManagers contact the Resource Manager.
  13.                     </description>
  14.                       </property>
  15. <!– for scheduler –>
  16.   <property>
  17.       <name>yarn.resourcemanager.scheduler.address</name>
  18.           <value>linux-c0001:8030</value>
  19.               <description>host is the hostname of the resourcemanager and port is the port
  20.                   on which the Applications in the cluster talk to the Resource Manager.
  21.                       </description>
  22.                         </property>
  23.   <property>
  24.       <name>yarn.resourcemanager.scheduler.class</name>
  25.           <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
  26.               <description>In case you do not want to use the default scheduler</description>
  27.                 </property>
  28.   <property>
  29.       <name>yarn.nodemanager.local-dirs</name>
  30.           <value></value>
  31.               <description>the local directories used by the nodemanager</description>
  32.                 </property>
  33. <!– for nodemanager –>
  34.   <property>
  35.       <name>yarn.nodemanager.resource.memory-mb</name>
  36.           <value>10240</value>
  37.               <description>the amount of memory on the NodeManager in GB</description>
  38.                 </property>
  39.   <property>
  40.       <name>yarn.nodemanager.remote-app-log-dir</name>
  41.           <value>/app-logs</value>
  42.               <description>directory on hdfs where the application logs are moved to </description>
  43.                 </property>
  44.    <property>
  45.        <name>yarn.nodemanager.log-dirs</name>
  46.            <value></value>
  47.                <description>the directories used by Nodemanagers as log directories</description>
  48.                  </property>
  49.   <property>
  50.       <name>yarn.nodemanager.aux-services</name>
  51.           <value>mapreduce_shuffle</value>
  52.               <description>shuffle service that needs to be set for Map Reduce to run </description>
  53.                 </property>
  54. </configuration>
  2:NodeManager的配置
  NodeManager主要是配置计算节点上的对计算资源的控制和对外的端口号,它的配置也在yarn-site.xml中进行配置,所以这里的配置文件和上面贴出的配置文件代码是完全一样的,在这里就不再次粘贴文件具体内容。
  3:mapreduce的配置
   mapreduce的配置主要是在mapred-site.xml中,用来指明计算框架的版本(Hadoop/YARN)还有计算的中间数据位置等。
  1. <configuration>
  2.   <property>
  3.     <name>mapreduce.framework.name</name>
  4.         <value>yarn</value>
  5.                   </property>
  6.   <property>
  7.       <name>mapreduce.cluster.temp.dir</name>
  8.               <value></value>
  9.                                 </property>
  10.   <property>
  11.       <name>mapreduce.cluster.local.dir</name>
  12.           <value></value>
  13.                     </property>
  14. </configuration>

4:ResourceManager启动

  具体代码
[plain] view plain copy

在CODE上查看代码片派生到我的代码片

  1. $HADOOP_YARN_HOME/sbin/yarn-daemon.sh –config $HADOOP_CONF_DIR start resourcemanager
  5:NodeManager的启动
  NodeManager的启动和DataNode的启动也是一样,需要到各个计算节点上执行启动命令。具体代码如下:
[plain] view plain copy

在CODE上查看代码片派生到我的代码片

  1. $HADOOP_YARN_HOME/sbin/yarn-daemon.sh –config $HADOOP_CONF_DIR start nodemanager

6:JobHistory的启动

JobHistory服务主要是负责记录集群中曾经跑过的任务,对完成的任务查看任务运行期间的详细信息。一般JobHistory都是启动在运行任务的节点上,即NodeManager节点上。如果不对JobHistory的配置进行修改,那么直接可以在NodeManager所在节点上运行启动命令即可,具体启动命令如下:

$HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh start historyserver --config $HADOOP_CONF_DIR
启动了之后就可以在集群运行任务页面查看具体的job history,通过点击每个任务条目的左后history链接就可以查看具体的任务细节。具体的截图如下:

  四 关闭集群

   当集群升级或者需要重启集群的时候,就需要执行关闭命令。分别关闭NameNode与DataNode,然后关闭ResourceManager与NodeManager。但是在关闭的时候可能会遇到no namenode to stop或者no resourcemanager to stop的问题。这是因为YARN在关闭的时候,它会首先获取当前系统中的YARN相关运行进程的ID,如果没有则就会爆出上述两个问题。但是系统中明明运行这YARN相关进程,为何还是会说没有进程stop。这是因为当YARN运行起来之后,运行中的进程ID会存储在/tmp文件夹下,而/tmp文件会定期删除文件,这就导致YARN停止脚本无法找到YARN相关进程的ID,导致不能停止。
   两个解决方案,第一个就是使用kill命令,而第二个则是修改YARN的进程ID的存放文件夹目录。

  五 附录

YARN官方文档:YARN官方介绍
YARN下载:Hadoop 0.2.2.0