Hadoop2.0高可用集群搭建保姆级教程

Posted Charon_yyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop2.0高可用集群搭建保姆级教程相关的知识,希望对你有一定的参考价值。

搭载Hadoop2.0高可用集群

说明

 主要是记录自己学习Hadoop的过程,梳理自己的思路,可能也会帮助正在配置Hadoop环境同学。

准备

下载好所需要的文件

首先安装好三台虚拟机比如我的命名为node-01、node-02、node-03,并且已经完成了jdk、Hadoop、zookeeper文件的下载(我自己使用的是*vmworkstation、centos6.7、 jdk-8u161、hadoop-2.7.4、Zookeeper-3.4.10)
附上文件链接

链接:https://pan.baidu.com/s/18eEnbsU5Eyl7UcqI-VXlRA
提取码:fzlt

目录准备

 为了规范Hadoop集群的配置文件,防止我们产生混淆,我们在根目录下创建几个文件用于存储文件(命名可以自己选择,自己分清就行)

/export/data/ 用与存储数据类
/export/servers/ 用于存储服务类软件
/export/software/ 用于存放安装包文件

虚拟机网络配置(可能会在其他文章中讲到)

  1、主机名与ip映射配置
  2、网络参数配置

文件的安装

  这里我使用的是SecureCRT远程连接工具,连接到node-01、node-02、node-03虚拟机(进行ssh服务配置之后可以避免主节点对其他节点访问时频繁输入代码)
  在secureCRT中有好几种上传文件到虚拟机的方法,比如sftp上传以及rz命令(rz命令使用yum install rz -y安装,但由于Centos6停止维护因此无法使用yum源,我们需要重新安装yum源,可以参考其他博主的文章进行安装
1、安装包的上传(我们只在node-01上操作就可以)
  ①cd /export/software先进到这个目录下上传安装包
  ②如果使用rz命令的话可以直接输入rz会弹出如下窗口,然后选择刚才下载的jdk、Hadoop、zookeeper所在的目录进行上传就可以。
 ③使用sftp上传时,点击CRT菜单栏中的选项,点击会话选项,选择X/Y/Zomdem,可以切换到Windows中下载三个安装包的目录中。按住alt+p,会在CRT中弹出一个新的会话,然后使用cd /export/software去切换到我们要上传到Linux的文件目录中,使用pwd可以查看所在Linux目录位置,使用lpwd可以查看Windows所在目录位置,之后使用put jdk-8u161-linux-x64.tar.gz命令将Windows中下载的安装包上传到Linux中 /export/software/ ,其他两个安装包类似方法上传。

注意
在安装jdk之前应该先使用rpm -qa|grep java检查系统中是否有其他jdk如果有,就全部删除之后在进行jdk的安装
使用rpm -e --nodeps [jdk的名称]
切记切记把显示的所有jdk全部卸载!!!否则安装不了自己需要的jdk!!!

 ④上传成功后,在Linux中将安装包进行解压到node-01中,进入到/export/servers/目录下,使用如下命令

tar -zxvf jdk-8u161-linux-x64.tar.gz -C /export/servers/
tar -zxvf hadoop-2.7.4.tar.gz -C /export/servers
tar -zxvf zookeeper-3.4.10.tar.gz -C /export/servers/

 ⑤如果感觉解压名过长可以进入到cd /export/servers/ 目录中使用mv命令进行重命名
比如
mv jdk1.8.0_161/ jdk

配置环境变量

  进入到 /etc目录下使用vi编辑器编辑profile来编辑环境变量
vi /etc/prifile

export JAVA_HOME=/export/servers/jdk    配置jdk系统的环境变量
export HADOOP_HOME=/export/servers/hadoop-2.7.4   配置hadoop的环境变量
export ZK_HOME=/export/servers/zookeeper-3.4.10   配置zookeeper的环境变量
export CLASSPATH=.:$JAVA_HOME/lib/da.jar:$JAVA_HOME/lib/tools.jar
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$JAVA_HOME/bin: $ ZK_HOME/bin:$PATH

环境变量的验证

  使用source /etc/profile指令使配置文件生效
查看我们的版本号
java -version
hadoop version
显示结果如下图表示配置正确

关闭防火墙

  因为我们使用的是vmware的虚拟机,是通过系统的内网创建的,关闭防火墙并没有什么安全隐患,而且会避免出现一些问题(具体原因可以自己查一下)
service iptables stop(三台虚拟机都需要关闭)

配置Hadoop高可用集群

修改hadoop-env.sh

 由于Hadoop是Java进程所以需要添加jdk,配置hadoop-env.sh文件是设置Hadoop运行时需要的JDK环境变量,我们先进入到主节点node-01解压包下的==/etc/hadoop/==目录下
cd /export/servers/hadoop-2.7.4/etc/hadoop/
export JAVA_HOME=/export/servers/jdk

修改core-site.xm文件

 该文件是Hadoop的核心配置文件,同样是在*/export/servers/hadoop-2.7.4/etc/hadoop/*目录下
vi core-site.xml

<configuration>
        <!-- 指定hdfs的nameservice为ns1 -->
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://ns1</value>
        </property>
        <!-- 指定hadoop临时目录 -->
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/export/servers/hadoop-2.7.4/tmp</value>
        </property>
        <!-- 指定zookeeper地址 -->
        <property>
                <name>ha.zookeeper.quorum</name>
                <value>node-01:2181,node-02:2181,node-03:2181</value>
        </property>
</configuration>

修改hdfs-site.xml文件

<configuration>
        <!-- 设置副本个数 -->
        <property> 
                <name>dfs.replication</name>
                <value>2</value>
        </property> 
        <!-- 设置namenode.name目录 -->
        <property>    
                <name>dfs.namenode.name.dir</name>    
                <value>file:/export/data/hadoop/name</value>    
        </property>  
        <!-- 设置namenode.data目录 -->
        <property>    
                <name>dfs.datanode.data.dir</name>    
                <value>file:/export/data/hadoop/data</value>    
        </property>  
        <!-- 开启webHDFS -->
        <property> 
                <name>dfs.webhdfs.enabled</name>  
                <value>true</value>  
        <!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 --> 
        </property>
        <!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
        <property>
                <name>dfs.nameservices</name>
                <value>ns1</value>
        </property>
        <!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
        <property>
                <name>dfs.ha.namenodes.ns1</name>
                <value>nn1,nn2</value>
        </property>
        <!-- nn1的RPC通信地址 -->
        <property>
                <name>dfs.namenode.rpc-address.ns1.nn1</name>
                <value>node-01:9000</value>
        </property>
        <!-- nn1的http通信地址 -->
        <property>
                <name>dfs.namenode.http-address.ns1.nn1</name>
                <value>node-01:50070</value>
        </property>
        <!-- nn2的RPC通信地址 -->
        <property>
                <name>dfs.namenode.rpc-address.ns1.nn2</name>
                <value>node-02:9000</value>
        </property>
        <!-- nn2的http通信地址 -->
        <property>
                <name>dfs.namenode.http-address.ns1.nn2</name>
                <value>node-02:50070</value>
        </property>
        <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>
qjournal://node-01:8485;node-02:8485;node-03:8485/ns1
                </value>
        </property>
        <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
        <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/export/data/hadoop/journaldata</value>
        </property>
        <!-- 开启NameNode失败自动切换 -->
        <property>
                <name>dfs.ha.automatic-failover.enabled</name>
                <value>true</value>
        </property>
        <!-- 配置失败自动切换实现方式 -->
        <property>
                <name>dfs.client.failover.proxy.provider.ns1</name>
                <value>
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
                </value>
        </property>
        <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
        <property>
                <name>dfs.ha.fencing.methods</name>
                <value>
                        sshfence
                        shell(/bin/true)
                </value>
        </property>
        <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
        <property>
                <name>dfs.ha.fencing.ssh.private-key-files</name>
                <value>/root/.ssh/id_rsa</value>
        </property>
        <!-- 配置sshfence隔离机制超时时间 -->
        <property>
                <name>dfs.ha.fencing.ssh.connect-timeout</name>
                <value>30000</value>
        </property>
</configuration>

修改mapred-site.xml文件

 在目录默认没有mapred-site.xml文件但是有mapred-site.xml.template文件,因此我们需要使用cp命令复制文件并重命名为mapred-site.xml。
cp mapred-site.xml.template mapred-site.xml

<configuration>
<!-- 指定MapReduce运行时框架,这里指定在Yarn上,默认是local -->
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
</configuration>

修改yarn-site.xml文件

<configuration>
<!-- Site specific YARN configuration properties -->
        <property>
                <name>yarn.nodemanager.resource.memory-mb</name>
                <value>2048</value>
        </property>
        <property>
                <name>yarn.scheduler.maximum-allocation-mb</name>
                <value>2048</value>
        </property>
        <property>
                <name>yarn.nodemanager.resource.cpu-vcores</name>
                <value>1</value>
        </property>
        <!-- 开启RM高可用 -->
        <property>
                <name>yarn.resourcemanager.ha.enabled</name>
                <value>true</value>
        </property>
        <!-- 指定RM的cluster id -->
        <property>
                <name>yarn.resourcemanager.cluster-id</name>
                <value>yrc</value>
        </property>
        <!-- 指定RM的名字 -->
        <property>
                <name>yarn.resourcemanager.ha.rm-ids</name>
                <value>rm1,rm2</value>
        </property>
        <!-- 分别指定RM的地址 -->
        <property>
                <name>yarn.resourcemanager.hostname.rm1</name>
                <value>node-01</value>
        </property>
        <property>
                <name>yarn.resourcemanager.hostname.rm2</name>
                <value>node-02</value>
        </property>
        <!-- 指定zk集群地址 -->
        <property>
                <name>yarn.resourcemanager.zk-address</name>
                <value>node-01:2181,node-02:2181,node-03:2181</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
</configuration>

修改slaves文件

 注意在Hadoop3.0以后slaves更名为workers了(我们配置的是Hadoop2.0),该文件是用来记录Hadoop集群所有slaves的节点名称或者是ip,每行存放一个,在配置完SSH免密登陆后,还可以用来一键启动集群所有从节点。
 使用vi slaves后删除里面的默认localhost,添加

node-01
node-02
node-03

注意:我们在三台机器上搭载了Hadoop集群,同时在hdfs-site.xml指定了副本数量为3

Zookeeper分布式集群部署

修改myid文件

 这是我们的zookeeper集群的参数文件,参数越大,在FastLeaderElection选举leader时所占权重越大,这里我设置node-01、node-02、node-03的参数分别为1、2、3。
 首先进入到该目录cd /export/data/zookeeper/zkdata,使用echo添加信息到myid,注意在>后面有一个空格,不要出错,echo会覆盖文件中原信息。

echo 1 > myid

 使用cat命令可以查看文件内容cat myid

修改zoo.cfg文件

 我们的zookeeper同样解压到了/export/servers目录下,我们进入到Zookeeper解压目录下,找到conf目录
cd /export/servers/zookeeper-3.4.10/conf
 在该目录同样默认没有zoo.cfg,我们需要复制zoo_sample.cfg文件并重命名为zoo.cfg
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改的内容

#该属性对应的目录是用来存放myid信息跟一些版本,日志,跟服务器唯一的ID信息
dataDir=/export/data/zookeeper/zkdata 
#server.后面的是myid赋予每台机器的选举权重
#node-01...是机器的名(ip和机器名映射)
#28883888分别是内部默认的通信端口和选举端口
#将下面三行添加到zoo.cfg最下面
server.1=node-01:2888:3888
server.2=node-02:2888:3888
server.3=node-03:2888:3888

分发配置文件

 1、使用scp-r命令递归复制整个export目录到node-02、node-03的根目录下,并将环境变量都分别分发到node-02、node-03

scp -r /export/ node-02:/
scp -r /export/ node-03:/
scp /etc/profile node-02:/etc/profile
scp /etc/profile node-03:/etc/profile

分发完成之后分别在node-02、node-03输入source /etc/profile重新加载环境变量

注意:在使用scp命令分发时,不会覆盖原文件,所以当我们得配置出现错误使,但是已经分发完成了,我们需要进入到虚拟机得目录中,将文件删除掉,然后将配置成功的文件重新进行分发。

 2、起初我们在配置myid文件中,给node-01设置的参数为1,然后使用了scp命令将目录分发到了node-02、node-03,因此我们需要修改一下node-02、node-03的myid中的参数值。
在两台机器中执行下面命令:

cd /export/data/zookeeper/zkdata/
在node-02中
echo 2 >myid
cat myid

node-03中
echo 3 >myid
cat myid

启动Hadoop高可用集群

1、首先启动集群各个节点的Zookeeper服务
zkServer.sh start

2、启动集群各个节点监控NameNode的管理日志JournalNode
hadoop-daemon.sh start journalnode

3、在node-01节点格式化NameNode,并将格式化后的目录复制到node-02中,格式化只能在最开始配置时格式化,如果二次格式化,因为在目录dfs.name.dir已经存在了上次产生的文件,因此会使得集群不同步,如果必须进行格式化,应先把日志文件全部删除,包括zookeeper。
hadoop namenode -format
scp -r /export/data/hadoop node-02:/export/data

4、在node-01节点上格式化zkfc(注意事项与上面类似)
hdfs zkfc -formatZK

5、启动dfs、yarn集群
start-dfs.sh
start-yarn.sh

查看集群是否启动

 使用jps命令可以查看进程,出现如图所示,集群配置完成。

特别说明:我们可以通过分别启动然后使用jps命令查看进程是否已经开启,如果某个进程并没有开启成功,我们就需要对没有配置好的文件进行修改,建议不要一看出错了就重装虚拟机,因为可能还会出错 !

以上是关于Hadoop2.0高可用集群搭建保姆级教程的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop 3.1.3 分布式集群搭建,超详细,保姆级教程

Hadoop完全分布式集群搭建 centos 6.5(保姆级教程)

保姆级教程!使用k3d实现K3s高可用!

k8s搭建(超详细,保姆级教程)

大数据Hadoop的HA高可用架构集群部署

大数据Hadoop的HA高可用架构集群部署