目录

  • 一、准备模板机(最小化安装)
  • 二、配置一台纯净的模板机
  • 修改主机名
  • 固定IP地址
  • 通过yum安装方式安装必要的软件
  • 关闭防火墙且禁止自启
  • 修改hosts映射文件
  • 创建普通用户 并让他能用sudo命令
  • 在/opt下创建software和module
  • 完成
  • 三、搭建完全分布式运行模式
  • 3.1克隆第一台机器hadoop102 完成相应配置
  • 建议统一管理好
  • 修改hadoop102的主机名和IP地址
  • 之后 就可以用Xshell登录了
  • 在102上安装jdk并配置环境变量
  • 在102上安装hadoop
  • hadoop目录结构
  • 本地模式测试
  • 3.2克隆hadoop103 hadoop104 完成相应配置
  • 修改主机名和IP
  • 用scp分发102的软件给103和104
  • 编写集群分发脚本xsync
  • 分发my_env给103 104
  • 3.3Hadoop集群规划
  • 3.4修改Hadoop配置文件
  • Hadoop配置文件介绍
  • coresite.xml
  • hdfs-site.xml
  • yarn-site.xml
  • mapred-site.xml
  • 分发配置文件到103 104
  • 3.5群起/群停集群
  • 配置ssh免密登录
  • 配置workers文件
  • 格式化
  • 群起集群
  • 群停集群
  • 查看Web端界面
  • 完全分布式模式测试
  • 单点启动的指令

一、准备模板机(最小化安装)

安装Linux系统参考:安装Linux操作系统详细步骤(附VMware16+CentOS7下载地址)

  • 模板机只是为了将来克隆使用 这台磨板机安装之后 做常规化的统一配置 比如关闭防火墙 静态IP 安装必要的软件等
  • 为了更契合实际开发场景 需要创建一个普通用户 所以也需要配置普通用户能够使用sudo获得root权限
  • 把磨板机配置好 克隆三台出来 作为集群真正需要的机器

hadoop高可用集群搭建hbase_大数据

hadoop高可用集群搭建hbase_大数据_02

二、配置一台纯净的模板机

修改主机名

vi /ect/hostname
#主机名改完要重启才会生效 可以用hostname指令看看当前主机名是什么

固定IP地址

vi /etc/sysconfig/network-scripts/ifcfg-ens33

hadoop高可用集群搭建hbase_xml_03

systemctl restart network #重启网络服务 就会生效

hadoop高可用集群搭建hbase_hadoop高可用集群搭建hbase_04

完成这些配置后 接下来的操作 就可以用xshell远程连接 最小化安装用着还是很别扭的

通过yum安装方式安装必要的软件

分别指令下面两条命令

yum install -y epel-release
yum install -y psmisc nc net-tools rsync vim lrzsz ntp libzstd openssl-static tree iotop git

关闭防火墙且禁止自启

systemctl stop firewalld
systemctl disable firewalld

修改hosts映射文件

改Windows为了Xshell连接能用主机名

hadoop高可用集群搭建hbase_xml_05

改Linux 因为不同主机之间的通信 还是希望用主机名来通信而不是IP地址 vim /etc/hosts

hadoop高可用集群搭建hbase_hadoop_06

创建普通用户 并让他能用sudo命令

hadoop高可用集群搭建hbase_分布式_07

这里还是要在root用户下的

hadoop高可用集群搭建hbase_大数据_08

hadoop高可用集群搭建hbase_xml_09

在/opt下创建software和module

software放软件安装包

然后把软件解压到module里

hadoop高可用集群搭建hbase_xml_10

修改所有者和所属组 因为前面说了 后面会用普通用户zcy来登录

hadoop高可用集群搭建hbase_hadoop高可用集群搭建hbase_11

完成

至此 纯净模板机就配置好了 接下来 他的作用就是克隆新的机器 然后完成对应的配置 开始搭建Hadoop集群

三、搭建完全分布式运行模式

3.1克隆第一台机器hadoop102 完成相应配置

建议统一管理好

  • 在hadoop102上 先安装一些必要的软件比如jdk hadoop 配置好hadoop环境 先了解一下本地模式
  • 然后注意 这里103 104机器 继续基于模板机来克隆 而不是基于hadoop102去克隆
  • 然后通过102 用Linux提供的分发技术 把102配置好的东西分发给104 103

克隆可以参考:

VMware16如何克隆虚拟机

hadoop高可用集群搭建hbase_分布式_12

修改hadoop102的主机名和IP地址

主机名改成hadoop102

IP地址改成.162

改完记得reboot才会生效

hadoop高可用集群搭建hbase_hadoop高可用集群搭建hbase_13

之后 就可以用Xshell登录了

hadoop高可用集群搭建hbase_大数据_14

hadoop高可用集群搭建hbase_hadoop_15

hadoop高可用集群搭建hbase_分布式_16

在102上安装jdk并配置环境变量

先把两个安装包传输到software下

hadoop高可用集群搭建hbase_分布式_17

解压jdk到上一层的module下 tar -zxvf jdk-8u212-linux-x64.tar.gz -C …/module/

hadoop高可用集群搭建hbase_大数据_18

配置jdk的环境变量 vim /etc/profile

hadoop高可用集群搭建hbase_hadoop高可用集群搭建hbase_19

hadoop高可用集群搭建hbase_xml_20

配置profile.sh 先 cd /etc/profile.d/

hadoop高可用集群搭建hbase_hadoop高可用集群搭建hbase_21

hadoop高可用集群搭建hbase_hadoop高可用集群搭建hbase_22

重新加载一下/etc/profile 环境变量就会生效 (我曾经有一个疑问 为什么不是加载profile.d 会看前面才发现 profile它里面有代码来读取到profile.h下面的sh脚本)

hadoop高可用集群搭建hbase_xml_23

在102上安装hadoop

先解压到module

tar -zxvf hadoop-3.1.3.tar.gz -C ../module/

hadoop高可用集群搭建hbase_分布式_24

sudo vim /etc/profile.d/my_env.sh

hadoop高可用集群搭建hbase_大数据_25

重新加载一下环境变量生效(重启也可以)

hadoop高可用集群搭建hbase_xml_26

hadoop目录结构

  • bin目录:存放对Hadoop相关服务(HDFS,YARN)进行操作的脚本
  • etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件
  • lib目录:存放Hadoop的本地库(对数据进行压缩解压缩功能)
  • sbin目录:存放启动或停止Hadoop相关服务的脚本
  • share目录:存放Hadoop的依赖jar包、文档、和官方案例

本地模式测试

Hadoop的运行模式介绍:

  • 本地模式:hadoop默认安装后启动就是本地模式 就是将来的数据存在Linux本地并且运行MR程序的时候也是在本地机器上运行
  • 伪分布式模式:伪分布式其实就只在一台机器上启动HDFS集群 启动YARN集群 并且数据存在HDFS集群上 以及运行MR程序也是在YARN上运行 计算后的结果也是输出到HDFS上 本质上就是利用一台服务器中多个java进程去模拟多个服务
  • 完全分布式:完全分布式其实就是多台机器上分别启动HDFS集群 启动YARN集群 并且数据存在HDFS集群上的以及运行MR程序也是在YARN上运行 计算后的结果也是输出到HDFS上

上面安装好之后

就可以跑本地模式了

hadoop高可用集群搭建hbase_大数据_27

3.2克隆hadoop103 hadoop104 完成相应配置

修改主机名和IP

克隆之后 先修改IP和主机名 再用Xshell连接

hadoop高可用集群搭建hbase_hadoop高可用集群搭建hbase_28

hadoop103的主机名改成hadoop103 IPADDR改成.163 hadoop104的主机名改成hadoop104 IPADDR改成.164 记得reboot生效 改完就可以用Xshell登录了 各服务器之间也能ping通

hadoop高可用集群搭建hbase_hadoop高可用集群搭建hbase_29

用scp分发102的软件给103和104

这个时候103 和 104上面都是没有jdk这些软件的 需要从102分发过来 前提:在 hadoop102 hadoop103 hadoop104 都已经创建好 /opt/module 和 /opt/software 两个目录(因为是模板机克隆的 所以我这里是有的)并且已经把这两个目录修改为zcy:zcysudo chown zcy:zcy -R /opt/module 下面 再介绍另一种分发的方法 自己写一个脚本 可以选择这两种方式的中的一种

#在102上让102分发给103
#在hadoop102上执行:
scp -r ./* zcy@hadoop103:/opt/module/

#在103上让102分发给104
#在hadoop103上执行:
scp -r zcy@hadoop102:/opt/module/* zcy@hadoop104:/opt/module/

#当然 也可以在104上拉取102上的东西

编写集群分发脚本xsync

上面的分发方式 存在一定问题:如果集群机器特别多 怎么办? 这时候要是有一个脚本 执行它就遍历所有机器去同步分发就好了!!

去一台我们经常使用的机器上写这个脚本

而且希望该脚本能在任意位置执行

那也就要配置环境变量了!

hadoop高可用集群搭建hbase_xml_30

那我把bin创建出来 在这里面写脚本!! 这样的话 就不需要我再手动配置环境变量了!! 这是对规则的合理利用

hadoop高可用集群搭建hbase_分布式_31

#!/bin/bash

#1. 判断参数个数
if [ $# -lt 1 ]
then
  echo "Not Enough Arguement!"
  #退出当前脚本
  exit
fi

#2. 遍历集群所有机器
for host in hadoop103 hadoop104
do
  #3. 遍历所有目录,挨个发送
  for file in $@
  do
    #4. 判断文件是否存在
    if [ -e $file ]
    then
      #5. 获取父目录 同时防止传参是软链接
      pdir=$(cd -P $(dirname $file); pwd)
      #6. 获取当前文件的名称 因为我也可能传绝对路径进来
      fname=$(basename $file)
      #7.登录目标机器 创建统一的目录结果
      ssh $host "mkdir -p $pdir"
      #8.依次把要分发的文件和目录进行分发
      rsync -av $pdir/$fname $host:$pdir
    else
      #文件不存在
      echo "$file does not exists!"
      exit
    fi
  done
done

分发my_env给103 104

zcy[普通用户]相对my_env文件进行分发(肯定有写操作)

应该看后三位 发现根本没有权限

所以不能用刚刚写的脚本

用scp手动发一下就行

hadoop高可用集群搭建hbase_分布式_32

hadoop高可用集群搭建hbase_hadoop_33

分发完 同样要在103 104上source一下才生效

hadoop高可用集群搭建hbase_xml_34

3.3Hadoop集群规划

HDFS集群和yarn集群包含多个服务 启动在哪个机器 由自己来决定(改配置文件就行)

  • NameNode和SecondaryNameNode不要安装在同一台服务器
  • ResourceManager很消耗内存 不要和NameNode SecondaryNameNode配置在同一台机器上

3.4修改Hadoop配置文件

Hadoop配置文件介绍

集群规划完之后 就要搭建集群了(说白了就是要修改配置文件)hadoop的默认配置文件:

  • core-default.xml
  • hdfs-default.xml
  • mapread-default.xml
  • yarn-default.xml

hadoop提供可自定义的配置文件:

  • core-site.xml
  • hdfs-site.xml
  • mapread-site.xml
  • yarn-site.xml

当Hadoop集群启动后 先加载默认配置 然后再加载自定义配置文件 自定义的配置信息会覆盖默认配置

coresite.xml

vim /opt/module/hadoop-3.1.3/etc/hadoop/coresite.xml

<configuration>
        <!-- 指定NameNode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop102:9820</value>
    </property>
       <!-- 指定hadoop数据的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-3.1.3/data</value>
    </property>

       <!-- 配置HDFS网页登录使用的静态用户为zcy -->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>zcy</value>
    </property>

       <!-- 配置该atguigu(superUser)允许通过代理访问的主机节点 -->
    <property>
        <name>hadoop.proxyuser.zcy.hosts</name>
        <value>*</value>
    </property>
           <!-- 配置该atguigu(superUser)允许通过代理用户所属组 -->
    <property>
        <name>hadoop.proxyuser.zcy.groups</name>
        <value>*</value>
    </property>
           <!-- 配置该atguigu(superUser)允许通过代理的用户-->
    <property>
        <name>hadoop.proxyuser.zcy.groups</name>
        <value>*</value>
   </property>
</configuration>

hdfs-site.xml

vim /opt/module/hadoop-3.1.3/etc/hadoop/hdfs-site.xml

	<!-- nn web端访问地址-->
	<property>
        <name>dfs.namenode.http-address</name>
        <value>hadoop102:9870</value>
    </property>
	<!-- 2nn web端访问地址-->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop104:9868</value>
    </property>

yarn-site.xml

vim /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml

        <!-- 指定MR走shuffle -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
<!-- 指定ResourceManager的地址-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop103</value>
    </property>
<!-- 环境变量的继承 -->
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>
<!-- yarn容器允许分配的最大最小内存 -->
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>512</value>
    </property>
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>4096</value>
   </property>
<!-- yarn容器允许管理的物理内存大小 -->
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>4096</value>
    </property>
<!-- 关闭yarn对物理内存和虚拟内存的限制检查 -->
    <property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>false</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>

mapred-site.xml

vim /opt/module/hadoop-3.1.3/etc/hadoop/mapred-site.xml

	<!-- 指定MapReduce程序运行在Yarn上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

分发配置文件到103 104

hadoop高可用集群搭建hbase_大数据_35

hadoop高可用集群搭建hbase_大数据_36

3.5群起/群停集群

配置ssh免密登录

  • 之前做一些操作 经常需要我们输入密码 不方便
  • 配置免密登录之后 才能使用Hadoop提供的群起群停脚本

在102上 先生成密钥对

hadoop高可用集群搭建hbase_hadoop_37

然后给102 103 104 都授权

hadoop高可用集群搭建hbase_hadoop_38

hadoop高可用集群搭建hbase_xml_39

上面两步 同样的操作 在103 104都做一遍 在103上 先生成密钥对 然后授权给102 103 104 在104上 先生成密钥对 然后授权给102 103 104

配置workers文件

当我们用脚本启动的时候 肯定是在一台机器上执行这个脚本就行了 假如在102上群起hdfs 启动的时候一定会读取Hadoop的配置文件 它就知道在102上要启动nn但是并没有指定在哪台机器启动dn(yarn的nm也是一样的) 这个时候 脚本是通过读取 /opt/module/hadoop-3.1.3/etc/hadoop/workers来确定要在哪里启动dn和nm

hadoop高可用集群搭建hbase_hadoop_40

别忘记分发workers文件

hadoop高可用集群搭建hbase_hadoop_41

格式化

如果集群是第一次启动,需要在hadoop102节点格式化NameNode

如果集群在运行过程中报错 需要重新格式化NameNode的话 一定要先停止namenode和datanode进程 并且要删除所有机器的data和logs目录 然后再进行格式化 因为格式化NameNode 会产生新的集群id 导致NameNode和DataNode的集群id不一致 集群找不到已往数据

hdfs namenode -format

hadoop高可用集群搭建hbase_hadoop_42

群起集群

这些群起群停的脚本 都在sbin里

hadoop高可用集群搭建hbase_大数据_43

根据自己集群的规划来启动hdfs和yarn(先后无所谓 但是要在正确的位置执行)在hadoop102(nn在这)上启动hdfs start-dfs.sh

hadoop高可用集群搭建hbase_hadoop_44

在hadoop103(rm在这)上启动yarn start-yarn.sh

hadoop高可用集群搭建hbase_hadoop高可用集群搭建hbase_45

群停集群

在hadoop102(nn在这)上停止hdfs stop-dfs.sh

hadoop高可用集群搭建hbase_xml_46

在hadoop103(rm在这)上启动yarn stop-yarn.sh

hadoop高可用集群搭建hbase_分布式_47

查看Web端界面

http://hadoop102:9870 Web端查看HDFS的NameNode 查看HDFS上存储的数据信息

http://hadoop103:8088 Web端查看YARN的ResourceManager 查看YARN上运行的Job信息

完全分布式模式测试

hadoop高可用集群搭建hbase_hadoop_48

hadoop高可用集群搭建hbase_大数据_49


这里就有一个疑问

为什么同样的测试代码

这次就跑去找HDFS上的数据而不是本地Linux的数据了呢?

这和配置文件有关

hadoop高可用集群搭建hbase_分布式_50

hadoop高可用集群搭建hbase_分布式_51


本地模式:/wcinput被解析成file:///wcinput(配置文件没改 默认)

hadoop jar share/hadoop/...jar wordcount file:///wcinput file:///wcoutput

完全分布式模式:/wcinput被解析成hdfs://hadoop102:9820/wcinput /wcoutput被解析成hdfs://hadoop102:9820/wcoutput

hadoop jar share/hadoop/...jar wordcount hdfs://hadoop102:9820/wcinput hdfs://hadoop102:9820/wcoutput

当MR程序在集群运行的时候/代表的是HDFS的根目录 这是有core-site.xml中的配置信息决定的

<property>
				<name>fs.defaultFS</name>
				<value>hdfs://hadoop102:9820</value>
		    </property>

单点启动的指令

hadoop高可用集群搭建hbase_hadoop_52

hadoop高可用集群搭建hbase_xml_53