码迷,mamicode.com
首页 > 其他好文 > 详细

搭建3节点hadoop集群

时间:2018-05-11 00:49:01      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:日志   cat   def   store   通信   命令   mapred   删除   dem   

前言

我们使用hadoop2.6.0版本配置Hadoop集群,同时配置NameNode+HA、ResourceManager+HA,并使用zookeeper来管理Hadoop集群。

 

(一)HDFS概述

基础架构

1、NameNode(Master)

1)命名空间管理:命名空间支持对HDFS中的目录、文件和块做类似文件系统的创建、修改、删除、列表文件和目录等基本操作。

2)块存储管理。

HA架构

技术分享图片

从上面的架构图可以看出,使用Active NameNode,Standby NameNode 两个节点可以解决单点问题,两个节点通过JounalNode共享状态,通过ZKFC 选举Active ,监控状态,自动备份。

1、Active NameNode

接受client的RPC请求并处理,同时写自己的Editlog和共享存储上的Editlog,接收DataNode的Block report, block location updates和heartbeat。

2、Standby NameNode

同样会接到来自DataNode的Block report, block location updates和heartbeat,同时会从共享存储的Editlog上读取并执行这些log操作,保持自己NameNode中的元数据(Namespcae information + Block locations map)和Active NameNode中的元数据是同步的。所以说Standby模式的NameNode是一个热备(Hot Standby NameNode),一旦切换成Active模式,马上就可以提供NameNode服务。

3、JounalNode

用于Active NameNode , Standby NameNode 同步数据,本身由一组JounnalNode节点组成,该组节点奇数个。

4、ZKFC

监控NameNode进程,自动备份。

 

(二)YARN概述

基础架构

1、ResourceManager(RM)

接收客户端任务请求,接收和监控NodeManager(NM)的资源情况汇报,负责资源的分配与调度,启动和监控ApplicationMaster(AM)。

2、NodeManager

节点上的资源管理,启动Container运行task计算,上报资源、container情况汇报给RM和任务处理情况汇报给AM。

3、ApplicationMaster

单个Application(Job)的task管理和调度,向RM进行资源的申请,向NM发出launch Container指令,接收NM的task处理状态信息。

4、Web Application Proxy

用于防止Yarn遭受Web攻击,本身是ResourceManager的一部分,可通过配置独立进程。ResourceManager Web的访问基于守信用户,当Application Master运行于一个非受信用户,其提供给ResourceManager的可能是非受信连接,Web Application Proxy可以阻止这种连接提供给RM。

5、Job History Server

NodeManager在启动的时候会初始化LogAggregationService服务, 该服务会在把本机执行的container log (在container结束的时候)收集并存放到hdfs指定的目录下. ApplicationMaster会把jobhistory信息写到hdfs的jobhistory临时目录下, 并在结束的时候把jobhisoty移动到最终目录, 这样就同时支持了job的recovery.History会启动web和RPC服务, 用户可以通过网页或RPC方式获取作业的信息。

HA架构

技术分享图片

ResourceManager HA 由一对Active,Standby结点构成,通过RMStateStore存储内部数据和主要应用的数据及标记。目前支持的可替代的RMStateStore实现有:基于内存的MemoryRMStateStore,基于文件系统的FileSystemRMStateStore,及基于zookeeper的ZKRMStateStore。 ResourceManager HA的架构模式同NameNode HA的架构模式基本一致,数据共享由RMStateStore,而ZKFC成为 ResourceManager进程的一个服务,非独立存在。

(三)规划

主机规划

这里我们使用5 台主机来配置Hadoop集群。

 

master

slave1

slave2

namenode

datanode

resourcemanager

journalnode

zookeeper

Journalnode和ZooKeeper保持奇数个,这点大家要有个概念,最少不少于 3 个节点。

软件规划

软件

版本

位数

说明

jdk

jdk1.7

64位

最新稳定版本

centos

centos6.5

64位

 

zookeeper

Apache zookeeper3.4.6

 

稳定版本

hadoop

Apache hadoop2.6.0

 

稳定版本

  •  
  •  

用户规划

每个节点的hadoop用户组和用户需要大家自己创建

 

(四)集群安装前的环境检查

时钟同步

所有节点的系统时间要与当前时间保持一致。

查看当前系统时间

date
Tue Nov  3 06:06:04 CST 2015

如果系统时间与当前时间不一致,进行以下操作。

1 [root@master~]# cd /usr/share/zoneinfo/
2 [root@master zoneinfo]# ls        //找到Asia
3 [root@master zoneinfo]# cd Asia/        //进入Asia目录
4 [root@master Asia]# ls        //找到Shanghai
5 [root@master Asia]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime        //当前时区替换为上海

 

我们可以同步当前系统时间和日期与NTP(网络时间协议)一致。

 

host文件检查

禁用防火墙

所有节点的防火墙都要关闭

(五)配置SSH免密码通信

使用命令:

ssh-keygen -t rsa

cat id_rsa.pub >> authorized_keys	

所有节点都要执行以上操作

将所有节点的authorized_keys合并

大家通过ssh 相互访问,如果都能无密码访问,代表ssh配置成功。

(六)脚本工具的使用

runRemoteCmd.sh 用于统一执行命令
deploy.sh远程复制文件脚本

(七)jdk安装

略 ,每个节点都要安装

(八)Zookeeper安装

修改Zookeeper中的配置文件。

[hadoop@master app]$ cd /home/hadoop/app/zookeeper/conf/
[hadoop@master conf]$ ls
configuration.xsl  log4j.properties  zoo_sample.cfg
[hadoop@master conf]$ cp zoo_sample.cfg zoo.cfg        //复制一个zoo.cfg文件
[hadoop@master  conf]$ vi zoo.cfg
dataDir=/home/hadoop/data/zookeeper/zkdata        //数据文件目录
dataLogDir=/home/hadoop/data/zookeeper/zkdatalog        //日志目录
# the port at which the clients will connect
clientPort=2181        //默认端口号
#server.服务编号=主机名称:Zookeeper不同节点之间同步和通信的端口:选举端口(选举leader)
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888

通过远程命令deploy.sh将Zookeeper安装目录拷贝到其他节点上面。

在所有节点上创建目录

/home/hadoop/data/zookeeper/zkdata
/home/hadoop/data/zookeeper/zkdatalog

分别在所有节点上创建myid
进入zkdata目录下,创建文件myid,里面的内容分别填充为:1、2、3

配置zookeeper环境变量

检查是否安装成功
/home/hadoop/app/zookeeper/bin/zkServer.sh start


(九)hadoop集群环境搭建

解压

 

修改配置文件 切换到/home/hadoop/app/hadoop/etc/hadoop/目录下。

配置HDFS

配置hadoop-env.sh

export JAVA_HOME=/home/hadoop/app/jdk1.7.0_79

配置core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://cluster1</value>
    </property>
    < 这里的值指的是默认的HDFS路径 ,取名为cluster1>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/data/tmp</value>
    </property>
    < hadoop的临时目录,如果需要配置多个目录,需要逗号隔开,data目录需要我们自己创建>
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>master:2181,slave1:2181,slave2:2181</value>
    </property>
    < 配置Zookeeper 管理HDFS>
</configuration>

配置hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    < 数据块副本数为3>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
    <property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
    </property>
    < 权限默认配置为false>
    <property>
        <name>dfs.nameservices</name>
        <value>cluster1</value>
    </property>
    < 命名空间,它的值与fs.defaultFS的值要对应,namenode高可用之后有两个namenode,cluster1是对外提供的统一入口>
    <property>
        <name>dfs.ha.namenodes.cluster1</name>
        <value>djt11,djt12</value>
    </property>
    < 指定 nameService 是 cluster1 时的nameNode有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可>
    <property>
        <name>dfs.namenode.rpc-address.cluster1.master</name>
        <value>master:9000</value>
    </property>
    < djt11 rpc地址>
    <property>
        <name>dfs.namenode.http-address.cluster1.master</name>
        <value>master:50070</value>
    </property>
    < djt11 http地址>
    <property>
        <name>dfs.namenode.rpc-address.cluster1.slave1</name>
        <value>slave1:9000</value>
    </property>
    < djt12 rpc地址>
    <property>
        <name>dfs.namenode.http-address.cluster1.slave1</name>
        <value>slave1:50070</value>
    </property>

    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
    < 启动故障自动恢复>
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://master:8485;slave1:8485;slave2:8485/cluster1</value>
    </property>
    < 指定journal>
    <property>
        <name>dfs.client.failover.proxy.provider.cluster1</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    < 指定 cluster1 出故障时,哪个实现类负责执行故障切换>
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/home/hadoop/data/journaldata/jn</value>
    </property>
    < 指定JournalNode集群在对nameNode的目录进行共享时,自己存储数据的磁盘路径 >
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>shell(/bin/true)</value>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/hadoop/.ssh/id_rsa</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>
</configuration>

配置 slave

[hadoop@masterhadoop]$ vi slaves
master
slave1 slave2

然后将配置好的hadoop分发到所有节点

hdfs配置完毕后启动顺序

1、启动所有节点上面的Zookeeper进程

/home/hadoop/app/zookeeper/bin/zkServer.sh start

2、启动所有节点上面的journalnode进程
"/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh start journalnode" all

与此同时,需要在备节点(比如,slave1)上执行数据同步
bin/hdfs namenode -bootstrapStandby	//同步主节点和备节点之间的元数据

如果上面操作没有问题,我们可以一键启动hdfs所有相关进程
[hadoop@masterhadoop]$ sbin/start-dfs.sh

7、验证是否启动成功

通过web界面查看namenode启动情况。

http://master:50070


YARN安装配置

配置mapred-site.xml

配置yarn-site.xml


启动YARN

1、在master节点上执行。

[hadoop@masterhadoop]$ sbin/start-yarn.sh	
		

2、在slave1节点上面执行。

[hadoop@slave1 hadoop]$ sbin/yarn-daemon.sh start resourcemanager

 

如果上面执行没有异常,说明YARN安装成功。

至此,hadoop 分布式集群搭建完毕。

搭建3节点hadoop集群

标签:日志   cat   def   store   通信   命令   mapred   删除   dem   

原文地址:https://www.cnblogs.com/dadaxin/p/9022487.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!