云服务器大数据高可用集群搭建-----hadoop篇

       【注意】记录自己在云端服务器搭建hadoop集群过程,用于个人学习使用

一、集群配置

       本次利用云服务器搭建Hadoop集群,分别采用腾讯云、华为云、百度云等产品,具体配置如下:

服务器命名配置
hadoop1012cpu 内存4GB
hadoop1021cpu 内存2GB
hadoop1031cpu 内存2GB
hadoop1041cpu 内存2GB
hadoop1051cpu 内存2GB

二、集群规划

|服务器名|Zookeeper | NameNode | DataNode |Resourcenode | Nodemanager
|–|–|–|–|–|–|–|–|–|
| hadoop101 | √| √|√ | √|√ | | |
| hadoop102 |√ |√ | √ | | √| | |
| hadoop103 | √| | √| | √ | | |
| hadoop104 | √ | | √| √| √|√ | |
| hadoop105 | √ | | √ | | √| | |

三、Hadoop、Zookeeper、Java、Centos版本

HadoopZookeeperJavaCentos
2.7.23.4.141.87.6

四、Linux配置

4.1 主机名配置

       注意:该部分暂时使用root用户来操作

4.1.1 修改Linux主机名

       1)通过命令 hostname查看主机名,如果不爽当前主机名,可以自己修改。
       2)修改linux的主机名命令如下:

# 在文件里修改名字
vim /etc/sysconfig/network
或者
vim /etc/hostname

或者通过直接在终端输入如下命令修改
hostnamectl set-hostname 新名字

       本次通过vim /etc/hostname来修改,将五台服务器分别命名为hadoop101、hadoop102、hadoop103、hadoop104、hadoop105。
在这里插入图片描述

4.1.2 修改linux的hosts文件

       修改centos的hosts文件,命令:vim /etc/hosts,如下图。
在这里插入图片描述
       注意,因为是云服务器,会有两个ip,一个是内网IP,一个是外网IP,我们在设置hosts时,对于要设置的服务器,IP为内网,而对于其他服务器,要设置外网IP。举个例子,假设hadoop101的内网ip为:a:b:c:d,外网IP为e:f:g:h,那么在设置hadoop101的hosts时,hadoop102~hadoop105用外网IP,而hadoop001要使用它的内网IP:a:b:c:d

4.1.3 重启服务器

       重启服务器,此时主机名已经修改为我们指定的hadoop101~105,通过ping 主机名 查看各服务器能进行相互通信。

4.1.4 修改windows的hosts文件

       由于我的电脑系统是windows,为了方便后续操作,需要修改hosts文件。在这里插入图片描述
       注意:这里的ip都是外网IP,通过windows终端通过ping 主机名 来检查windows主机能否和各服务器通信。
在这里插入图片描述

4.2防火墙配置

       注意:该部分使用root用户来操作
       关闭5个服务器的防火墙
       1) 查看防火墙状态:firewall-cmd --state
       2) 如果防火墙开启,请关闭它:systemctl stop firewalld.service
       3) 设置开机时关闭防火墙:systemctl disable firewalld.service
       4) 再次查看防火墙状态:firewall-cmd --state,确保防已火墙关闭。

4.3 设置普通用户

       注意:该部分使用root用户来操作
       前面的操作都是用root用户,由于该用户权限太大,最好使用一般用户操作
       1) 在每台服务器上分别创建普通用户,此处我选择用户名为hadoop:useradd hadoop
       2) 在每台服务器上为hadoop创建密码:passwd hadoop
       3) 在每台服务器上修改配置文件/etc/sudoers,使得普通用户可以具有root操作权限:vim /etc/sudoers,在下图的root位置下面添加hadoop用户。
在这里插入图片描述
注意

# 以下方式每次使用sudo命令时需要输入密码
hadoop  ALL=(ALL)     ALL

# 或者通过以下方式设置,那么每次使用sudo命令时就可以不用输入密码了
hadoop  ALL=(ALL)      NOPASSWD:ALL

4.4 免密登录

       注意:以后均使用hadoop用户来操作
       完成前面的配置后,在5台服务器上使用刚刚创建的hadoop用户登录:su hadoop
       1)生成公钥和私钥:ssh-keygen -t rsa ,连续按3次Enter键,会在当前用户家目录下生成隐藏目录.ssh,里面包含私钥id_rsa和公钥id_rsa.pub
在这里插入图片描述

       2) 将公钥复制到要免密登录的服务器上:ssh-copy-id 服务器名,会让你确认是否要连接,输入yes
在这里插入图片描述
       再输入对方主机的密码即可。在这里,我选择将各台服务器都相互免密登录,大家在实际过程中可按需求选择要免密的主机。
       3)验证免密效果,分别测试免密效果:ssh 想要登录的主机名
在这里插入图片描述
       在这里我从hadoop101登录了hadoop102,可以看到不用输入密码就可以直接登录了,如果想要退出对方主机,输入exit即可

4.5 创建安装目录和软件包存放目录

       注意:均使用hadoop用户来操作
       1)创建文件夹
       先创建两个文件夹: /opt/module 和/opt/softs,我所有软件都安装在/opt/module下,软件安装包均放在/opt/softs下,命令为:

# 如果不使用sudo会提示Permission denied
sudo mkdir /opt/module
sudo mkdir /opt/softs

       2)修改文件所有者。上一步创建的2个文件夹属于root用户,将其所有者和所属组都改成hadoop:

sudo chown hadoop:hadoop /opt/module/
sudo chown hadoop:hadoop /opt/softs

4.6 编写分发脚本

       1)由于集群有5台服务器,如果分别安装各程序效率比较低,所以可以通过在一台服务器安装各程序,再编写一个分发脚本,将程序分发到其他服务器(当然也可以在各台服务器上分别安装各个程序)。在/home/hadoop下创建bin目录,,再在bin目录下编写分发程序脚本:xsync.sh:

 cd /home/hadoop 
 mkdir bin
 cd bin
 vim xsync.sh

       脚本内容为:

#!/bin/bash
# 获取输入参数的数量,如果没有参数就直接退出
pcount=$#
if((pcount==0)); then
	echo "没有参数";
exit;
fi

#获取文件名称
p1=$1
fname=`basename $p1`
	echo fname=$fname

#获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
	echo pdir=$pdir

#获取当前用户名称
user=`whoami`

#循环,我在hadoop101上安装,所以需要将程序分发到hadoop102~105for((host=102; host<106; host++)); do
    echo --------------------- hadoop$host ----------------
    rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done

       2)权限修改
       刚刚创建的脚本没有不可执行,所以需要修改,将其设定为可执行:chmod +x xsync.sh
       3)测试脚本
       为了确定脚本是否能够运行,先创建个文件来测试(目标主机的父目录需要已经创建,否则无法分发成功)。在当前家目录下创建文件:vim xsy.txt,内容随便写,我写的是This is a test file!
              a) 开始测试:xsync.sh /home/hadoop/xsy.txt,结果如下图
在这里插入图片描述
              b) 发现hadoop105提示没有rsync,那么需要在hadoop105上安装该模块:

sudo yum install rsync -y

              c) 再次测试,所有文件分发成功,结果如下图
在这里插入图片描述
              d) 找一台服务器确认最终结果,发现文件确实分发到其他服务器上了,结果如下图
在这里插入图片描述

五、jdk安装

       我使用的是jkd8
       1)首先将jdk压缩文件上传到hadoop101的/opt/softs目录下,之后进入/opt/softs/目录:cd /opt/softs/
       2)安装jdk:tar -zxvf jdk-8u291-linux-x64.tar.gz -C /opt/module/表示将jdk安装到/opt/module/
       3) 配置系统环境变量:sudo vim /etc/profile,添加如下信息

export JAVA_HOME=/opt/module/jdk1.8.0_291
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

       4)使得配置的环境变量生效:source /etc/profile
       5)将hadoop101安装好的jdk分发到hadoop102~105:xsync.sh /opt/module/jdk1.8.0_291
       6)在各台主机上添加jdk系统变量并用source来刷新,之后查看java版本,确认安装成功:java -version
在这里插入图片描述

六、Zookeeper安装

       注意:均使用hadoop用户来操作
       为保证集群高可用,Zookeeper 集群的节点数量最好是奇数,此处我选择了五台服务器。

6.1 安装Zookeeper

       1)首先将Zookeeper压缩文件上传到hadoop101的/opt/softs目录下,之后进入/opt/softs/目录:cd /opt/softs/
       2)安装Zookeeper:tar -zxvf zookeeper-3.4.14.tar.gz -C /opt/module/表示将zookeeper安装到/opt/module/
       3) 配置系统环境变量:sudo vim /etc/profile,添加如下信息

export ZOOKEEPER_HOME=/opt/module/zookeeper-3.4.14
export PATH=$ZOOKEEPER_HOME/bin:$PATH

       4)使得配置的环境变量生效:source /etc/profile

6.2 修改配置文件

       1)进入zookeeper的安装目录下的 conf目录 ,拷贝配置样本并进行修改:

cd  /opt/module/zookeeper-3.4.14/conf
cp zoo_sample.cfg  zoo.cfg
vim zoo.cfg

       2)修改dataDir,增加dataLogDir如下:

dataDir=/opt/module/zookeeper-3.4.14/zookeeper-cluster/data
dataLogDir=/opt/module/zookeeper-3.4.14/zookeeper-cluster/log
# server.1 这个1是服务器的标识,可以是任意有效数字,标识这是第几个服务器节点,这个标识要写到dataDir目录下面myid文件里
# 指名集群间通讯端口和选举端口
server.1=hadoop101:2287:3387
server.2=hadoop102:2287:3387
server.3=hadoop103:2287:3387
server.4=hadoop104:2287:3387
server.5=hadoop105:2287:3387

6.3 程序分发

       1) 将hadoop101安装好的zookeeper分发到hadoop102~105:xsync.sh /opt/module/zookeeper-3.4.14
        2)在各台主机上添加zookeeper系统变量并用source来刷新

6.4 标识节点

       1)分别在五台主机的 dataDir 目录下新建 myid 文件: mkdir -vp /opt/module/zookeeper-3.4.14/zookeeper-cluster/data/
在这里插入图片描述
       2)写入对应的节点标识。Zookeeper 集群通过 myid 文件识别集群节点,并通过上文配置的节点通信端口和选举端口来进行节点通信,选举出 Leader 节点。

# hadoop101上执行
echo "1" > /opt/module/zookeeper-3.4.14/zookeeper-cluster/data/myid

# hadoop102上执行
echo "2" > /opt/module/zookeeper-3.4.14/zookeeper-cluster/data/myid

# hadoop103上执行
echo "3" > /opt/module/zookeeper-3.4.14/zookeeper-cluster/data/myid

# hadoop104上执行
echo "4" > /opt/module/zookeeper-3.4.14/zookeeper-cluster/data/myid

# hadoop105上执行
echo "5" > /opt/module/zookeeper-3.4.14/zookeeper-cluster/data/myid

6.5 启动集群

       进入各台服务器${ZOOKEEPER_HOME}/bin,然后执行zkServer.sh start 启动集群,并用zkServer.sh status查看状态:

cd $ZOOKEEPER_HOME/bin
zkServer.sh start
zkServer.sh status

       其结果如下图,可以看出:5个节点进程均启动成功,并且 hadoop105 为 leader 节点其他节点为 follower 节点。
在这里插入图片描述

七、Hadoop安装

7.1 hadoop安装

       1)首先将hadoop压缩文件上传到hadoop101的/opt/softs目录下,之后进入/opt/softs/目录:cd /opt/softs/
       2)安装hadoop:tar -zxvf hadoop-2.7.2.tar.gz -C /opt/module/表示将hadoop安装到/opt/module/
       3) 配置系统环境变量:sudo vim /etc/profile,添加如下信息

export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:${HADOOP_HOME}/bin

       4)使得配置的环境变量生效:source /etc/profile

7.2 修改配置

       进入 ${HADOOP_HOME}/etc/hadoop 目录下,修改几个配置文件。各个配置文件内容如下:

7.2.1 修改hadoop-env.sh

# 指定JDK的安装位置
export JAVA_HOME=/opt/module/jdk1.8.0_291

7.2.2 修改core-site.xml

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

7.2.3 修改hdfs-site.xml

<configuration>
    <property>
        <!-- 指定 HDFS 副本的数量 -->
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <!-- namenode 节点数据(即元数据)的存放位置,可以指定多个目录实现容错,多个目录用逗
号分隔 -->
        <name>dfs.namenode.name.dir</name>
        <value>/home/hadoop/namenode/data</value>
    </property>
    <property>
        <!-- datanode 节点数据(即数据块)的存放位置 -->
        <name>dfs.datanode.data.dir</name>
        <value>/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>hadoop101:8020</value>
    </property>
    <property>
        <!-- nn2 的 RPC 通信地址 -->
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>hadoop102:8020</value>
    </property>
    <property>
        <!-- nn1 的 http 通信地址 -->
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>hadoop101:50070</value>
    </property>
    <property>
        <!-- nn2 的 http 通信地址 -->
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>hadoop102:50070</value>
    </property>
    <property>
        <!-- NameNode 元数据在 JournalNode 上的共享存储目录 -->
        <name>dfs.namenode.shared.edits.dir</name>
       
<value>qjournal://hadoop101:8485;hadoop102:8485;hadoop103:8485;hadoop104:8485;hadoop105/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>/home/hadoop/.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>

7.2.4 修改yarn-site.xml

<configuration>
    <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>hadoop101</value>
    </property>
    <property>
        <!-- RM2 的服务地址 -->
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop104</value>
    </property>
    <property>
        <!-- RM1 Web 应用程序的地址 -->
                <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>hadoop101:8088</value>
    </property>
    <property>
        <!-- RM2 Web 应用程序的地址 -->
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>hadoop104:8088</value>
    </property>
    <property>
        <!-- ZooKeeper 集群的地址 -->
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop101:2181,hadoop102:2181,hadoop103:2181,hadoop104:2181,hadoop105: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>

7.2.5 修改mapred-site.xml

       生成mapred-site.xml:cp mapred-site.xml.template mapred-site.xml

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

7.2.6 修改slaves

       配置所有节点的主机名或 IP 地址,每行一个,所有从属节点上的 DataNode 服务和
NodeManager 服务都会被启动。

hadoop101
hadoop102
hadoop103
hadoop104
hadoop105

7.3 程序分发

       1) 将hadoop101安装好的hadoop分发到hadoop102~105:xsync.sh /opt/module/hadoop-2.7.2
        2)在各台主机上添加hadoop系统变量并用source来刷新

7.4 启动集群

7.4.1 启动Zookeeper

       启动集群之前需要先启动zookeeper,由于前面已经启动了zookeeper,所以此处不需要再启动zookeeper。

7.4.2 初始化NameNode

        2)在每一台几点上cd ${HADOOP_HOME}/sbin
        2)在每一台几点上./hadoop-daemon.sh start journalnode启动日journalnode
        3)在一台namenode节点上初始化集群,我选择在hadoop101上进行,命令为:hdfs namenode -format

看到successfully表示初始化成功。
        4) 执行初始化命令后,需要将 NameNode 元数据目录的内容复制到其他未格式化的 NameNode 上。元数据存储目录就是我们在 hdfs-site.xml 中使用 dfs.namenode.name.dir 属性指定的目录。这里我们需要将其复制到 hadoop102 上: scp -r /home/hadoop/namenode/data hadoop102:/home/hadoop/namenode/

7.4.3 初始化HA状态

        在任意一台namenode节点上初始化集群,我选择在hadoop101上进行,命令为:hdfs zkfc -formatZK

7.4.4 启动HDFS

        在namenode节点上初始化集群。进入到 hadoop101 的 ${HADOOP_HOME}/sbin 目录下,启动 HDFS。此时 hadoop101 和
hadoop102 上的 NameNode 服务,和5台服务器上的 DataNode 服务都会被启动:命令为:./start-dfs.sh

7.4.5 启动YARN

        1) 在namenode节点上初始化集群。进入到 hadoop101 的 ${HADOOP_HOME}/sbin 目录下,启动 YARN。此时 hadoop101 上的
ResourceManager 服务和5台服务器上的 NodeManager 服务都会被启动:命令为:./start-yarn.sh
        2) 此时 hadoop104 上的 ResourceManager 服务通常是没有启动的,需要手动启动, 首先进入hadoop104的 ${HADOOP_HOME}/sbin目录,再执行命令:./yarn-daemon.sh start resourcemanager

7.5 查看集群

        1)通过在每台机器上输入命令:jps查看集群各服务开启情况。如下图,发现所有服务正常开启。
在这里插入图片描述

        2)HDFS 和 YARN 的端口号分别为 50070 和 8080。打开浏览器,输入hadoop101:50070进入WEB UI界面,此时 hadoop101 上的 NameNode 处于可用状态:

在这里插入图片描述
        3)同样输入hadoop102:50070进入WEB UI界面,此时 hadoop102 上的 NameNode 处于不可用状态::

在这里插入图片描述
        4)HDFS 和 YARN 的端口号分别为 50070 和 8080。打开浏览器,输入hadoop101:8088进入WEB UI界面,此时 可在hadoop101 上的 查看YARN节点情况,可以看到有5台服务器节点:

在这里插入图片描述

八、Hadoop集群测试

        通过上面几个步骤安装了Hadoop,现在对其自带的例子进行测试,计算pi值:

hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar pi 3 3

在这里插入图片描述

九、遇到的一些问题

9.1重新初始化

        如果想要重新初始化,需要把删除一些文件,主要是hadoop设置里面的文件,清单如下:

配置文件对应的需要删除的文件夹
core-site.xml/home/hadoop/tmp
hdfs-site.xml/home/hadoop/namenode/data、/home/hadoop/datanode/data、/home/hadoop/journalnode/data

然后再重新按照7.4.2初始化

9.2 浏览器无法访问hadoop UI界面的问题

       这个问题可能是没有设置物理机的hosts问题,可做如下修改:
       1.进入C:\Windows\System32\drivers\etc,以管理员打开hosts
       2.将hadoop的ip 和别名写入hosts,保存后再刷新或重启试试
在这里插入图片描述

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值