欢迎光临
我们一直在努力

云服务器搭建高可用Hadoop集群

一、高可用HDFS

hadoop基础组成:https://www.cnblogs.com/funyoung/p/9889719.html

1、HDFS基础结构

云服务器搭建高可用Hadoop集群

2、高可用HDFS架构

 

  云服务器搭建高可用Hadoop集群

  • 主备切换控制器 ZKFailoverController:ZKFailoverController 作为独立的进程运行,对 nameNode 的主备切换进行总体控制。ZKFailoverController 能及时检测到 namenode 的健康状况,在主 NameNode 故障时借助 Zookeeper 实现自动的主备选举和切换,当然 NameNode 目前也支持不依赖于 Zookeeper 的手动主备切换。
  • Zookeeper 集群:为主备切换控制器提供主备选举支持。
  • 共享存储系统:共享存储系统是实现 NameNode 的高可用最为关键的部分,共享存储系统保存了 NameNode 在运行过程中所产生的 HDFS 的元数据。
  • 主 NameNode 和 NameNode 通过共享存储系统实现元数据同步。在进行主备切换的时候,新的主 NameNode 在确认元数据完全同步之后才能继续对外提供服务。
  • DataNode 节点:除了通过共享存储系统共享 HDFS 的元数据信息之外,主 NameNode 和备 NameNode 还需要共享 HDFS 的数据块和 DataNode 之间的映射关系。
  • DataNode 会同时向主 NameNode 和备 NameNode 上报数据块的位置信息。
  • Quorum Journal Manager (QJM):Active NameNode 首先把 EditLog 提交到 JournalNode 集群,然后 Standby NameNode 再从 JournalNode 集群定时同步 EditLog,当 Active NameNode 宕机后, Standby NameNode 在确认元数据完全同步之后就可以对外提供服务。向 JournalNode 集群写入 EditLog 是遵循 “过半写入则成功” 的策略,所以至少要有3个 JournalNode 节点。

3、YARN结构

云服务器搭建高可用Hadoop集群

 

 

  4、高可用YARN

云服务器搭建高可用Hadoop集群

 

 

二、搭建说明

1、搭建高可用的hadoop集群,本次搭建使用三台腾讯云服务器。其中,一台作为NameNode管理DataNode的分布信息和运行状态;两台作为普通的DataNode节点。

2、本次使用CentOS系统,搭建节点为hadoop1、hadoop2和hadoop3.

3、节点结构:

 节点

Name

Node 

Secondary

Node

 Data

Node

Journal

Node 

 Resource

Manager

Secondary

Resource

Node

Manager

DFS

ZKFC

Zookeeper/JDK
hadoop1  √    √    
hadoop2    √ √   
hadoop3      √    

 

 

 

 

 

 

三、搭建准备

1、更改用户名或新建用户,名为hadoop(确保每台机器上的用户名相同,使ssh免密验证更容易)。

adduser hadoop passwd hadoop //赋予root权限 //修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示: ## Allow root to run any commands anywhere root ALL=(ALL) ALL tommy ALL=(ALL) ALL 

2、修改主机名和ip-hostname映射关系(修改 /etc/hostname 和 /etc/hosts 两个文件)。

a.分别在三台机器的/etc/hostname文件修改主机名,分别取名为hadoop1,hadoop2,hadoop3。(centos可以用sudo hostnamectl set-hostname hadoop1)

b.在每台机器的 /etc/hosts 文件中中添加Ip和主机名的映射关系。设置本机映射为内网ip,其他服务器的ip映射为公网ip(注意,每台机器都需要添加所有的映射)

3、ssh免登陆配置:在每台服务器的/home/hadoop/.ssh/ 目录中,执行如下命令生成一对密钥,并将本地主机的公钥添加到远程主机的authorized_keys文件上。三台机器两两双向进行配置,注意包括自己对自已。(例子紧配置了自己)

 ssh-keygen -t rsa ssh-copy-id -i ~/.ssh/id_rsa.pub master

4、安装java

------------------java安装传送门-----------------

5、zookeeper集群环境搭建

-------------------zookeeper搭建传送门-----------------

踩坑:版本在3.5以后需要下载bin版本;zoo配置文件中的server.x=hostname:host:host,若是本机,hostname在hosts文件中对应的是内网地址。

5、Hadoop安装:每台服务器Hadoop的安装目录必须一致,安装包的配置信息也必须一致。新建/usr/hadoop/后执行以下命令,或官网下载通过XFTP导入安装包(我下载的2.6.0版本)。 

sudo wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz sudo tar -zxvf hadoop-2.8.5.tar.gz 

6、添加环境变量:在每台服务器的 /etc/profile 文件最后添加hadoop,java的路径。

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre export HADOOP_HOME=/usr/local/hadoop-2.8.5 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin source /etc/profile //执行后配置生效

7、测试安装是否生效

java -version hadoop version

三、配置文件的修改(配置文件位于/usr/hadoop/hadoop-2.6.0/conf)

1、hadoop-env.sh:将25行左右的那一行替换成如下语句

export JAVA_HOME=/usr/java/jdk1.8.0_251

2、core-site.xml

<configuration>
<property>
<!-- 指定namenode的hdfs协议文件系统的通信地址 -->
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:8020</value>
</property>
<property>
<!-- 指定hadoop集群存储临时文件的目录 -->
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
<property>
<!-- ZooKeeper集群的地址 -->
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
<property>
<!-- ZKFC连接到ZooKeeper超时时长 -->
<name>ha.zookeeper.session-timeout.ms</name>
<value>10000</value>
</property>

</configuration>

3、hdfs-site.xml  

<configuration>
<property>
<!-- 指定HDFS副本的数量 -->
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<!-- namenode节点数据(即元数据)的存放位置,可以指定多个目录实现容错,多个目录用逗号分隔 -->
<name>dfs.namenode.name.dir</name>
<value>file:/home/hadoop/namenode/data</value>
</property>
<property>
<!-- datanode节点数据(即数据块)的存放位置 -->
<name>dfs.datanode.data.dir</name>
<value>file:/home/hadoop/datanode/data</value>
</property>
<property>
<!-- 集群服务的逻辑名称 -->
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<!-- NameNode ID列表-->
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<!-- nn1的RPC通信地址 -->
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop1:8020</value>
</property>
<property>
<!-- nn2的RPC通信地址 -->
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop2:8020</value>
</property>
<property>
<!-- nn1的http通信地址 -->
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop1:50070</value>
</property>
<property>
<!-- nn2的http通信地址 -->
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop2:50070</value>
</property>
<property>
<!-- NameNode元数据在JournalNode上的共享存储目录 -->
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/mycluster</value>
</property>
<property>
<!-- Journal Edit Files的存储目录 -->
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/journalnode/data</value>
</property>
<property>
<!-- 配置隔离机制,确保在任何给定时间只有一个NameNode处于活动状态 -->
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<!-- 使用sshfence机制时需要ssh免密登录 -->
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<!-- SSH超时时间 -->
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<!-- 访问代理类,用于确定当前处于Active状态的NameNode -->
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<!-- 开启故障自动转移 -->
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>

4、mapred-site.xml:修改mapred-site.xml(复制mapred-site.xml.template,再修改文件名)

<configuration>
<property>
<!--指定mapreduce作业运行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

5、yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
<property>
<!--配置NodeManager上运行的附属服务。需要配置成mapreduce_shuffle后才可以在Yarn上运行MapReduce程序。-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<!-- 是否启用日志聚合(可选) -->
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<!-- 聚合日志的保存时间(可选) -->
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
<property>
<!-- 启用RM HA -->
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<!-- RM集群标识 -->
<name>yarn.resourcemanager.cluster-id</name>
<value>my-yarn-cluster</value>
</property>
<property>
<!-- RM的逻辑ID列表 -->
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<!-- RM1的服务地址 -->
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop2</value>
</property>
<property>
<!-- RM2的服务地址 -->
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop3</value>
</property>
<property>
<!-- RM1 Web应用程序的地址 -->
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop2:8088</value>
</property>
<property>
<!-- RM2 Web应用程序的地址 -->
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop3:8088</value>
</property>
<property>
<!-- ZooKeeper集群的地址 -->
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
<property>
<!-- 启用自动恢复 -->
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<!-- 用于进行持久化存储的类 -->
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>

</configuration>

6、slaves:在每台服务器的slaves文件中配置集群Datanode的主机名,只有这个文件里面的主机名才能被Namenode识别。

hadoop1
hadoop2
hadoop3

7、可以通过分发形式部署到三个服务器中(也可分别单独配置)

# 将安装包分发到hadoop2 scp -r /usr/hadoop/hadoop-2.6.0/ hadoop2:/usr/hadoop/ # 将安装包分发到hadoop3 scp -r /usr/hadoop/hadoop-2.6.0/ hadoop3:/usr/hadoop/

四、启动Hadoop集群

1、启动zookeeper

zkServer.sh start

2、分别到三台服务器的的hadoo-2.6.0p/sbin目录下,启动journalnode进程:

hadoop-daemon.sh start journalnode

3、在hadop001上执行NameNode初始化命令:

hdfs namenode -format 

执行初始化命令后,需要将NameNode元数据目录的内容,复制到其他未格式化的NameNode上。元数据存储目录就是我们在hdfs-site.xml中使用dfs.namenode.name.dir属性指定的目录。这里我们需要将其复制到hadoop2上(可以通过scp命令)。

4、在任意一台NameNode上使用以下命令来初始化ZooKeeper中的HA状态:

hdfs zkfc -formatZK 

5、进启动HDFS。此时hadoop001hadoop002上的NameNode服务,和三台服务器上的DataNode服务都会被启动:

start-dfs.sh 

6、启动YARN。此时hadoop2上的ResourceManager服务,和三台服务器上的NodeManager服务都会被启动:

start-yarn.sh 

    需要注意的是,这个时候hadoop003上的ResourceManager服务通常是没有启动的,需要手动启动:

yarn-daemon.sh start resourcemanager

五、测试

1、成功启动后,每台服务器上的进程应该如下:

云服务器搭建高可用Hadoop集群   云服务器搭建高可用Hadoop集群   云服务器搭建高可用Hadoop集群

2、可通过ip地址+50070和8088端口号HDFS和YARN的状态

云服务器搭建高可用Hadoop集群

 

 

云服务器搭建高可用Hadoop集群

3、运行一下hadoop提供的demo中的WordCount程序:

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount input out

 

  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《云服务器搭建高可用Hadoop集群》
文章链接:https://www.456zj.com/3853.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址