文章目录

简介

  • 保姆级入门教程:图片讲解 + 各种问题解决方案
  • 集群服务器:hadoop102、hadoop103和hadoop104
  • 虚拟机版本:CentOS7-1804
  • 资源分享处(文章最后)提供CentOS7和Hadoop各组件压缩包(也可以自行下载,要注意版本兼容的问题),有需要自取~

内容&流程

1, 模板虚拟机准备
2, 克隆三台虚拟机,作为完全分布式集群
3, Hadoop完全分布式环境搭建
4, ZooKeeper & HBase & Maven & IDEA安装

一、模板虚拟机准备

安装模板虚拟机

注:下方未出现的步骤,选择默认选项即可

1,选择 - 自定义(高级)

在这里插入图片描述

2,稍后安装操作系统(也可以选择直接安装,没有太大区别)

在这里插入图片描述

3,虚拟机名称只作标识该虚拟机的作用,自定义即可

在这里插入图片描述

4,处理器数量1,内核数量2

在这里插入图片描述

5, 内存4G & 硬盘50G

(此虚拟机只为演示Hadoop完全分布式环境搭建过程所用,4G内存基本够用)

在这里插入图片描述

硬盘50G
(安装内容包含JDK、Hadoop、ZooKeeper、HBase、Maven和IDEA,50G够用)

在这里插入图片描述

6,自定义硬件

在这里插入图片描述
6.1 选择ISO映像文件

选择稍后安装的要在这一步选择自定义硬件,添加ISO映像文件

在这里插入图片描述

6.2 USB兼容性 - USB 3.1

在这里插入图片描述

7,开启此虚拟机,选择install centos 7(对应选项呈白色)

在这里插入图片描述

8,语言 - 中文 - 简体中文

(在操作体验上,与选择英语差别不大,建议英语不太好的童靴选择中文

在这里插入图片描述

进入安装信息摘要界面

在这里插入图片描述

9,日期和时间:亚洲-上海

在这里插入图片描述

10,软件选择:只选择GNOME桌面

在这里插入图片描述

11,安装位置:自动配置分区

选择自动配置分区即可
(若想要手动分区,则点击 我要配置分区 - 完成,就会出现手动分区的界面)

在这里插入图片描述

12,网络和主机名

12.1 选择配置

在这里插入图片描述

12.2 查看个人虚拟机的相关信息

  • 虚拟机 - 编辑选项卡 - 虚拟网络编辑器
    在这里插入图片描述

  • 选择NAT模式
    在这里插入图片描述

  • NAT设置 - 查看子网掩码和网关
    在这里插入图片描述

  • DHCP设置 - 查看IP地址范围

    • 之后在配置静态IP地址时,所有的IP地址都必须在这个范围之内
      在这里插入图片描述
  • 回到配置界面 - 选择IPv4配置 - 点击 Add

    • 根据前面的步骤,地址填IP地址范围内的地址,子网掩码和网关照填即可在这里插入图片描述

    • 附加DNS服务器:填入与网关IP相同的地址
      在这里插入图片描述

  • 点击保存 - 回到配置界面 - 打开网络
    在这里插入图片描述

☭问题1:打开网络后出现DNS1或者无法连接网络

出现DNS1:检查网关地址是否正确
无法连接网络:检查IP地址是否在起始和终止的IP地址范围之内

  • 点击完成
13, 开始安装

在这里插入图片描述

将出现以下界面:

在这里插入图片描述

14, 设置ROOT密码

建议密码不要太复杂

在这里插入图片描述

15, 创建用户
  • 创建一个普通用户,名称可自定义(我创建的用户名称是hadoop,之后用此名称指代普通用户)
  • 目的: 在搭建项目的过程中,所有的项目有关的操作都由普通用户来执行,以此与超级用户(root用户)作区别,来维护系统的安全性(防止一些涉及到系统内核的操作被执行)。
  • 建议密码不要太复杂

在这里插入图片描述

模板虚拟机环境准备

1, 配置静态网络

Q: 为什么使用静态IP地址?
A: 在使用虚拟机的时候,默认情况下使用的DHCP协议分配的动态IP地址,使得每次打开虚拟机后当前的IP地址都会发生变化,这样不方便管理。为了能够给当前虚拟机设置一个静态IP地址,方便后期使用XShell连接工具进行连接,以及配置各种服务。所以,我们需要为虚拟机设置一个静态IP地址。

1.1 打开终端,查看网卡名称 - 我的网卡名称为ens33,如下图所示

[root@bogon ~]$ ip addr

在这里插入图片描述

1.2 修改网卡配置文件(记得后面要改成自己的网卡名称)

[root@bogon ~]$ vi /etc/sysconfig/network-scripts/ifcfg-ens33
  • 修改以下选项
BOOTPROTO='dhcp' -> 'static'
ONBOOT='no' -> 'yes'
  • 如果在前面安装过程中,设置 网络和主机名 没有出错,那下列选项应该没有问题
IPADDR='要设置的IP地址'
PREFIX='子网掩码'
GATEWAY='网关IP'
DNS1='网关IP'


1.3 重启网络

[root@bogon ~]$ service network restart
2,设置hostname
  • 设置主机名很重要,我设置的模板机的主机名为hadoop100,之后集群服务器中的主机名为hadoop102、hadoop103和hadoop104
  • 下面的命令按自己的主机名来
[root@bogon ~]$ hostnamectl set-hostname 主机名

例如:hostnamectl set-hostname hadoop100


2.1 查看hostname

[root@bogon ~]$ cat /etc/hostname
hadoop100


2.2 编辑hosts文件

目的: 修改/etc/hosts 文件,该文件主要用于映射 IP 地址和域名之间的连接

[root@bogon ~]$ vi /etc/hosts
  • 在第二行添加:原本第二行如果有内容删除即可;
  • 之后保存退出
IP地址 主机名

例如:
我设置的IP地址为xxx.xxx.xxx.130,那么我要添加的内容就是
xxx.xxx.xxx.130 hadoop100

在这里插入图片描述

☭问题2:主机名变为bogon如何解决?
# 执行su命令
[root@bogon ~]$ su
[root@localhost ~]$ 
3,SSH免密登录
# hadoop 普通用户
[root@localhost ~]$ su hadoop

# 第一次配置免密登录,执行下面这个命令后点三次回车即可
[hadoop@localhost root]$ ssh-keygen
[hadoop@localhost root]$ ssh-copy-id localhost
[hadoop@localhost root]$ ssh localhost
Last login: Web Feb 8 21:43:26 2023
[hadoop@localhost ~]$ 

在这里插入图片描述

4,安装工具包
[root@localhost ~]$ yum install -y epel-release
...
已安装:
 epel-release.noarch 0:7-11

完毕!

[root@localhost ~]$ yum install -y net-tools
[root@localhost ~]$ yum install -y vim
☭问题3:报错14: curl#6 - “Could not resolve host: mirrorlist.centos.org; 未知的错误”

CentOS7下报错14: curl#6 - “Could not resolve host: mirrorlist.centos.org; 未知的错误”-解决方法

5,关闭防火墙,并设置关闭防火墙开机自启
[root@localhost ~]$ systemctl stop firewalld
[root@localhost ~]$ systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

# 查看防火墙是否已关闭
[root@localhost ~]$ systemctl list-unit-files |grep firewalld
firewalld.service disabled
6,修改/etc/sudoers文件,使hadoop用户(普通用户)具有 root 权限,方便后期加 sudo 执行 root 权限的命令
[root@localhost ~]$ vim /etc/sudoers

在%wheel 这行下面添加一行,其他为文件本身内容,不要改动

## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
hadoop ALL=(ALL) NOPASSWD:ALL
7,在/opt 目录下创建 module、software 文件夹

7.1 module文件夹存放解压后的文件,software文件夹存放待解压的压缩包

[root@localhost ~]$ mkdir /opt/module /opt/software


7.2 修改两个目录的所属组和所有者均为hadoop用户

[root@localhost ~]$ chown -R hadoop:hadoop /opt/module
[root@localhost ~]$ chown -R hadoop:hadoop /opt/software


7.3 查看 module、software 文件夹的所有者和所属组

[root@localhost ~]$ cd /opt/
[root@localhost opt]$ ll
总用量 0
drwxr-xr-x. 2 hadoop hadoop 6 2月 8 21:53 module
drwxr-xr-x. 2 root root     6 9月 7 2017 rh
drwxr-xr-x. 2 hadoop hadoop 6 2月 8 12:53 software
8,卸载虚拟机自带JDK并重启虚拟机
[root@localhost opt]$ rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
[root@localhost opt]$ reboot

8.1 查看JDK版本(看是否卸载干净)

[root@hadoop100 ~]$ java -version
bash: java: 未找到命令...

二、克隆虚拟机准备

使用VMware自带的克隆功能,利用模板虚拟机克隆三台虚拟机:

主机名分别为hadoop102、hadoop103和hadoop104

IP地址为xxx.xxx.xxx.132、xxx.xxx.xxx.133和xxx.xxx.xxx.134(根据自己虚拟机的IP地址范围配置,下面有具体配置过程)

注意:克隆时,要先关闭hadoop100

1,修改克隆机 IP

以下过程以hadoop102为例,三台虚拟机都需要做

1.1 修改网卡配置文件(记得后面要改成自己的网卡名称)

[root@hadoop100 ~]$ vi /etc/sysconfig/network-scripts/ifcfg-ens33
UUID='原来的UUID' -> '新生成的UUID'
IPADDR='原来的IP地址' -> '要设置的IP地址'


1.2 重启网络

[root@hadoop100 ~]$ service network restart

2,修改克隆机主机名

以下过程以hadoop102为例,三台虚拟机都需要做

[root@hadoop100 ~]$ vim /etc/hostname
hadoop102

3,修改/etc/hosts文件

以下过程以hadoop102为例,三台虚拟机都需要做

[root@hadoop100 ~]$ vim /etc/hosts

3.1 添加如下内容

依然是IP地址要修改成你自己的:
尤其是hadoop102~104,对应的IP地址为你要设置的IP

192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108

4,重启虚拟机

以下过程以hadoop102为例,三台虚拟机都需要做

[root@hadoop100 ~]$ reboot

4.1 重启之后,打开终端发现主机名已经修改成功

[root@hadoop102 ~]$

5,修改 windows 的主机映射文件

5.1 如果操作系统是window7,可以直接修改

  • 进入C:\Windows\System32\drivers\etc 路径
  • 打开hosts 文件并添加如下内容,然后保存
192.168.10.100 hadoop100
192.168.10.101 hadoop101
192.168.10.102 hadoop102
192.168.10.103 hadoop103
192.168.10.104 hadoop104
192.168.10.105 hadoop105
192.168.10.106 hadoop106
192.168.10.107 hadoop107
192.168.10.108 hadoop108


5.2 如果操作系统是window10,先拷贝出来,修改保存以后,再覆盖即可

  • 进入C:\Windows\System32\drivers\etc 路径
  • 拷贝hosts 文件到桌面
  • 打开桌面 hosts 文件并添加同上内容
  • 将桌面 hosts 文件覆盖 C:\Windows\System32\drivers\etc 路径 hosts 文件

修改完毕后,就可以在windows环境下使用xshell连接虚拟机了,操作会方便很多哦~
附:XShell免费版的安装配置教程以及使用教程(超级详细、保姆级)

6,在hadoop102上安装JDK

6.1 首先确保虚拟机自带JDK卸载干净

[root@hadoop102 ~]$ java -version
bash: java: 未找到命令...


6.2 解压JDK到/opt/module

  • 提示1:xshell中可以使用rz命令将本地文件上传至虚拟机,或者建立共享文件夹也有同样效果。
  • 提示2:文章末尾提供JDK8等各组件的安装包,需要自取~
  • 进入/opt/software文件夹,查看压缩包名称
[root@hadoop102 ~]$ cd /opt/software
[root@hadoop102 software]$ ls

在这里插入图片描述

  • 解压JDK压缩包
[root@hadoop102 software]$ su hadoop
[hadoop@hadoop102 software]$ sudo tar -zxvf jdk-8u211-linux-x64.tar.gz -C /opt/module


6.3 修改JDK安装包名称

[hadoop@hadoop102 software]$ cd ../module
[hadoop@hadoop102 module]$ ls
jdk1.8.0_211

[hadoop@hadoop102 module]$ mv jdk1.8.0_211 jdk
[hadoop@hadoop102 module]$ ls
jdk


6.4 配置 JDK 环境变量

[hadoop@hadoop102 module]$ sudo vim /etc/profile.d/my_env.sh
  • 添加以下内容:
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk
export PATH=$PATH:$JAVA_HOME/bin
  • 刷新shell环境,让环境变量生效
[hadoop@hadoop102 module]$ source /etc/profile
  • 查看JDK版本信息
[hadoop@hadoop102 module]$ java -version

在这里插入图片描述

☭问题4:执行 source /etc/profile命令时,报错:bash: #: 未找到命令

首先再仔细检查一下 /etc/profile.d/my_env.sh 文件,尤其是注释前面的 # 有没有省略,以及HOME目录有没有配错。

7,在hadoop102安装Hadoop

7.1 进入/opt/software文件夹,解压Hadoop到/opt/module

[hadoop@hadoop102 software]$ sudo tar -zxvf hadoop-2.6.0-cdh5.14.2.tar.gz -C /opt/module


7.2 修改Hadoop安装包名称

[hadoop@hadoop102 module]$ ls
hadoop-2.6.0-cdh5.14.2 jdk

[hadoop@hadoop102 module]$ mv hadoop-2.6.0-cdh5.14.2 hadoop
[hadoop@hadoop102 module]$ ls
hadoop jdk

# 确保hadoop用户具有操作module目录下文件的权限
[hadoop@hadoop102 module]$ cd ..
[hadoop@hadoop102 opt]$ chown -R hadoop:hadoop module


7.3 将 Hadoop 添加到环境变量

[hadoop@hadoop102 module]$ sudo vim /etc/profile.d/my_env.sh
  • 添加以下内容:
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
  • 刷新shell环境,让环境变量生效
[hadoop@hadoop102 module]$ source /etc/profile
  • 查看Hadoop版本信息
[hadoop@hadoop102 module]$ hadoop version

在这里插入图片描述

三、完全分布式环境部署

1,本地测试

里面有些步骤与后续内容相关,尽量不要跳过

#创建hello.txt文件,用来测试hadoop自带的wordcount程序
[hadoop@hadoop102 module]$ mkdir /hadoop/wcinput
[hadoop@hadoop102 module]$ cd /hadoop/wcinput
[hadoop@hadoop102 wcinput]$ vim hello.txt

1.1 在hello.txt文件中填入任意内容即可,举例:

hello world
hello java
I'm MOSS


1.2 运行wordcount程序

注:在$HADOOP_HOME/share/hadoop/mapreduce/目录下找对应jar包

[hadoop@hadoop102 hadoop]$ pwd
/opt/module/hadoop

[hadoop@hadoop102 hadoop]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.2.jar wordcount wcinput wcoutput
[hadoop@hadoop102 hadoop]$ cat wcoutput/part-r-00000

2,编写集群分发脚本 xsync

2.1 执行以下命令同步jdk和hadoop文件到hadoop103和hadoop104,顺便测试scp和rsync命令

注意执行各命令的服务器

[hadoop@hadoop102 hadoop]$ scp -r /opt/module/jdk hadoop@hadoop103:/opt/module

[hadoop@hadoop103 hadoop]$ scp -r hadoop@hadoop102:/opt/module/hadoop /opt/module/
[hadoop@hadoop103 hadoop]$ scp -r hadoop@hadoop102:/opt/module/* hadoop@hadoop104:/opt/module

# 在hadoop103上删除wcinput目录,执行rsync同步命令后,hadoop103上wcinput目录恢复
[hadoop@hadoop103 hadoop]$ rm -rf wcinput/
[hadoop@hadoop102 opt]$ rsync -av hadoop/ hadoop@hadoop103:/opt/module/hadoop/


2.2 编写xsync脚本

  • 期望脚本在任何路径都能使用(脚本放在声明了全局环境变量的路径):
[hadoop@hadoop102 opt]$ echo $PATH
[hadoop@hadoop102 opt]$ cd /home/hadoop
[hadoop@hadoop102 ~]$ mkdir bin
  • 将/home/hadoop/bin目录添加到全局环境变量中
[hadoop@hadoop102 ~]$ sudo vim /etc/profile.d/my_env.sh
  • 添加以下内容:
#XSYNC_HOME
export XSYNC_HOME=/home/hadoop
export PATH=$PATH:$XSYNC_HOME/bin
  • 刷新shell环境,让环境变量生效
[hadoop@hadoop102 ~]$ source /etc/profile

# 查看发现全局环境变量中已有/home/hadoop/bin目录
[hadoop@hadoop102 ~]$ echo $PATH
  • 在/home/hadoop/bin目录下编写xsync脚本
[hadoop@hadoop102 ~]$ cd bin
[hadoop@hadoop102 bin]$ vim xsync
  • 在该文件中编写如下代码
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
 echo Not Enough Arguement!
 exit;
fi
#2. 遍历集群所有机器
for host in hadoop102 hadoop103 hadoop104
do
 echo ==================== $host ====================
 #3. 遍历所有目录,挨个发送
 for file in $@
 do
 #4. 判断文件是否存在
 if [ -e $file ]
 then
 #5. 获取父目录
 pdir=$(cd -P $(dirname $file); pwd)
 #6. 获取当前文件的名称
 fname=$(basename $file)
 ssh $host "mkdir -p $pdir"
 rsync -av $pdir/$fname $host:$pdir
 else
 echo $file does not exists!
 fi
 done
done


2.3 修改脚本 xsync 具有执行权限

[hadoop@hadoop102 bin]$ chmod +x xsync


2.4 测试脚本

[hadoop@hadoop102 bin]$ xsync /home/hadoop/bin


2.5 同步环境变量配置
注意:如果用了 sudo,那么 xsync 一定要给它的路径补全。

[hadoop@hadoop102 ~]$ sudo ./bin/xsync /etc/profile.d/my_env.sh


2.6 让环境变量生效

[hadoop@hadoop103 bin]$ source /etc/profile
[hadoop@hadoop104 bin]$ source /etc/profile

3,ssh免密登录

3.1 生成公钥和私钥

[hadoop@hadoop102 ~]$ cd /home/hadoop/.ssh
[hadoop@hadoop102 .ssh]$ ssh-keygen -t rsa


3.2 将公钥拷贝到要免密登录的目标机器上

[hadoop@hadoop102 .ssh]$ ssh-copy-id hadoop102
[hadoop@hadoop102 .ssh]$ ssh-copy-id hadoop103
[hadoop@hadoop102 .ssh]$ ssh-copy-id hadoop104

注意:

  • 还需要在 hadoop103 上采用 hadoop 账号配置一下无密登录到 hadoop102、hadoop103、 hadoop104 服务器上;
  • 还需要在 hadoop104 上采用 hadoop 账号配置一下无密登录到 hadoop102、hadoop103、 hadoop104 服务器上;
  • 还需要在 hadoop102 上采用 root 账号,配置一下无密登录到 hadoop102、hadoop103、hadoop104。

    接下来就可以通过ssh 主机名命令免密登录到别的服务器了~
    以下为测试:
[hadoop@hadoop102 .ssh]$ ssh hadoop103
Last login: Tue Feb 14 11:57:09 2023 from hadoop102

[hadoop@hadoop103 ~]$ pwd
/home/hadoop
[hadoop@hadoop103 ~]$ exit
登出
Connection to hadoop103 closed.
[hadoop@hadoop102 .ssh]$ 

4,集群配置

4.1 集群部署规划

  • 元数据节点、资源管理器和从元数据节点分别安装在三台服务器上
  • 数据节点和节点管理器在三台服务器上均安装

在这里插入图片描述

4.2 配置集群

  • 核心配置文件配置 core-site.xml
[hadoop@hadoop102 .ssh]$ cd $HADOOP_HOME/etc/hadoop
[hadoop@hadoop102 hadoop]$ vim core-site.xml
  • core-site.xml修改内容如下:

注意这个hadoop数据存储目录哦,如果没有指定的话,hadoop会在HOME目录下生成一个tmp目录,现在我们指定了,就变成 /opt/module/hadoop/data目录

所以如果在进行hadoop的格式化之前要删除的tmp目录和logs目录,就变成了data目录和logs目录了。

附:如何重新格式化Hadoop文件系统

<configuration>
    <!-- 指定 NameNode 的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop102:8020</value>
    </property>
    <!-- 指定 hadoop 数据的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop/data</value>
    </property>
    <!-- 配置 HDFS 网页登录使用的静态用户为 hadoop -->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>hadoop</value>
    </property>
</configuration>
  • HDFS 配置文件-配置 hdfs-site.xml
[hadoop@hadoop102 hadoop]$ vim hdfs-site.xml
  • hdfs-site.xml修改内容如下:
<configuration>
    <!-- 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>
</configuration>
  • YARN 配置文件-配置 yarn-site.xml
[hadoop@hadoop102 hadoop]$ vim yarn-site.xml
  • yarn-site.xml修改内容如下:
<configuration>
    <!-- 指定 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_CO
            NF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAP
            RED_HOME</value>
    </property>
</configuration>
  • MapReduce 配置文件-配置 mapred-site.xml
[hadoop@hadoop102 hadoop]$ vim mapred-site.xml
  • mapred-site.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <!-- 指定 MapReduce 程序运行在 Yarn 上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>


4.3 在集群上分发配置好的 Hadoop 配置文件

[hadoop@hadoop102 hadoop]$ xsync /opt/module/hadoop/etc/hadoop/


4.4 去103 和 104上查看文件分发情况

[hadoop@hadoop103 ~]$ cat /opt/module/hadoop/etc/hadoop/core-site.xml
[hadoop@hadoop104 ~]$ cat /opt/module/hadoop/etc/hadoop/core-site.xml

5,群起集群

5.1 配置 slaves(hadoop3.0之后版本改为workers)

[hadoop@hadoop102 hadoop]$ vim /opt/module/hadoop/etc/hadoop/slaves
  • 文件内容如下:(原本的内容要删除)
hadoop102
hadoop103
hadoop104
  • 同步所有节点配置文件:
[hadoop@hadoop102 hadoop]$ xsync /opt/module/hadoop/etc


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

[hadoop@hadoop102 hadoop]$ hdfs namenode -format
  • 启动HDFS:
[hadoop@hadoop102 hadoop]$ start-dfs.sh
  • 在配置了 ResourceManager 的节点(hadoop103)启动 YARN:
[hadoop@hadoop103 hadoop]$ start-yarn.sh

6,配置历史服务器

  • 目的: 为了查看程序的历史运行情况
  • Hadoop自带了一个历史服务器,可以通过历史服务器在web端查看已经运行完的Mapreduce作业记录,比如用了多少个Map、用了多少个Reduce、作业提交时间、作业启动时间、作业完成时间等信息
  • 所以修改mapreduce的配置文件以配置历史服务器

6.1 配置 mapred-site.xml

[hadoop@hadoop102 hadoop]$ vim mapred-site.xml 
  • 在该文件里面增加如下配置:
    <!-- 历史服务器端地址 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop102:10020</value>
    </property>
    <!-- 历史服务器 web 端地址 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop102:19888</value>
    </property>


6.2 分发配置

[hadoop@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/mapred-site.xml


6.3 在 hadoop102启动历史服务器

在hadoop2.0和hadoop3.0上,启动和终止历史服务器的命令有区别,以下为2.0版本
附:hadoop3.x集群:配置、启动历史服务(history server,端口19888)

[hadoop@hadoop102 hadoop]$ mr-jobhistory-daemon.sh start historyserver


6.4 查看历史服务器是否启动

[hadoop@hadoop102 hadoop]$ jps 

在这里插入图片描述

7,配置日志的聚集

  • 目的: 可以方便的查看到程序运行详情,方便开发调试(在102的HDFS上)

7.1 配置 yarn-site.xml

[hadoopu@hadoop102 hadoop]$ vim yarn-site.xml 
  • 在该文件里面增加如下配置
    <!-- 开启日志聚集功能 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <!-- 设置日志聚集服务器地址 -->
    <property>
        <name>yarn.log.server.url</name>
        <value>http://hadoop102:19888/jobhistory/logs</value>
    </property>
    <!-- 设置日志保留时间为 7 天 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
    </property>


7.2 分发配置

[hadoop@hadoop102 hadoop]$ xsync $HADOOP_HOME/etc/hadoop/yarn-site.xml


7.3 关闭 NodeManager 、ResourceManager和 HistoryServer

[hadoop@hadoop103 hadoop]$ stop-yarn.sh
[hadoop@hadoop102 hadoop]$ mr-jobhistory-daemon.sh stop historyserver  


7.4 启动 NodeManager 、ResourceManage 和 HistoryServer

[hadoop@hadoop103 hadoop]$ start-yarn.sh
[hadoop@hadoop102 hadoop]$ mr-jobhistory-daemon.sh start historyserver


7.5 测试

  • 上传hello.txt文件
[hadoop@hadoop102 hadoop]$ pwd
/opt/module/hadoop
[hadoop@hadoop102 hadoop]$ hadoop fs -mkdir /input
[hadoop@hadoop102 hadoop]$ hadoop fs -put wcinput/hello.txt /input
  • 执行 WordCount 程序
[hadoop@hadoop102 hadoop]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.2.jar wordcount /input /output

# 查看运行结果
[hadoop@hadoop102 hadoop]$ hadoop fs -text /out*/p*

在这里插入图片描述

7.6 查看日志

  • 历史服务器地址:地址
  • 历史任务列表
    在这里插入图片描述
  • 查看任务运行日志
    在这里插入图片描述
  • 运行日志详情
    在这里插入图片描述

8,编写 Hadoop 集群常用脚本

8.1 Hadoop 集群启停脚本(包含 HDFS,Yarn,Historyserver)

[hadoop@hadoop102 ~]$ cd /home/hadoop/bin
[hadoop@hadoop102 bin]$ vim myhadoop.sh
  • 编写myhadoop.sh脚本内容
#!/bin/bash
if [ $# -lt 1 ]
then
 echo "No Args Input..."
 exit ;
fi
case $1 in
"start")
 echo " =================== 启动 hadoop 集群 ==================="
 echo " --------------- 启动 hdfs ---------------"
 ssh hadoop102 "/opt/module/hadoop/sbin/start-dfs.sh"
 echo " --------------- 启动 yarn ---------------"
  ssh hadoop103 "/opt/module/hadoop/sbin/start-yarn.sh"
 echo " --------------- 启动 historyserver ---------------"
 ssh hadoop102 "/opt/module/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver"
;;
"stop")
 echo " =================== 关闭 hadoop 集群 ==================="
 echo " --------------- 关闭 historyserver ---------------"
 ssh hadoop102 "/opt/module/hadoop/sbin/mr-jobhistory-daemon.sh stop historyserver"
 echo " --------------- 关闭 yarn ---------------"
 ssh hadoop103 "/opt/module/hadoop/sbin/stop-yarn.sh"
 echo " --------------- 关闭 hdfs ---------------"
 ssh hadoop102 "/opt/module/hadoop/sbin/stop-dfs.sh"
;;
*)
 echo "Input Args Error..."
;;
esac
  • 保存后退出,然后赋予脚本执行权限
[hadoop@hadoop102 bin]$ chmod +x myhadoop.sh


8.2 查看三台服务器 Java 进程脚本

[hadoop@hadoop102 ~]$ cd /home/hadoop/bin
[hadoop@hadoop102 bin]$ vim jpsall
  • 输入如下内容
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
 echo =============== $host ===============
 ssh $host jps
done
  • 保存后退出,然后赋予脚本执行权限:
[hadoop@hadoop102 bin]$ chmod +x jpsall 


8.3 分发/home/hadoop/bin 目录,保证自定义脚本在三台机器上都可以使用:

# 先确保一下文件所属
[hadoop@hadoop102 ~]$ chown -R hadoop:hadoop bin

# 分发bin目录
[hadoop@hadoop102 ~]$ xsync /home/hadoop/bin/


8.4 测试

[hadoop@hadoop102 ~]$ myhadoop.sh stop
[hadoop@hadoop102 ~]$ jpsall

9,时间同步

如果服务器在公网环境(能连接外网),可以不采用集群时间同步,因为服务器会定期和公网时间进行校准;

​如果服务器在内网环境,必须要配置集群时间同步,否则时间久了,会产生时间偏差, 导致集群执行任务时间不同步。

因为我没有配置,所以需要配置时间同步的童靴请自行搜索 Hadoop集群时间同步配置

四、安装ZooKeeper、HBase、MAVEN和IDEA

ZooKeeper完全分布式部署

1,解压安装

1.1 解压 Zookeeper 安装包到/opt/module/目录下

[hadoop@hadoop102 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/

# 在/opt/module目录下修改ZK文件包名称
[hadoop@hadoop102 software]$ cd /opt/module
[hadoop@hadoop102 module]$ mv zookeeper-3.4.10 zookeeper
[hadoop@hadoop102 module]$ ls
hadoop jdk zookeeper

# 修改其所属为hadoop用户
[hadoop@hadoop102 module]$ sudo chown -R hadoop:hadoop zookeeper


1.2 同步/opt/module/zookeeper 目录内容到 hadoop103、hadoop104

[hadoop@hadoop102 module]$ xsync zookeeper/
2,配置服务器编号

2.1 在/opt/module/zookeeper/这个目录下创建 zkData

[hadoop@hadoop102 zookeeper]$ mkdir zkData


2.2 在/opt/module/zookeeper/zkData 目录下创建一个 myid 的文件

[hadoop@hadoop102 zkData]$ touch myid

添加 myid 文件,注意一定要在 linux 里面创建,在 notepad++里面很可能乱码

2.3 编辑 myid 文件

[hadoop@hadoop102 zkData]$ vim myid
  • 在文件中添加与 server 对应的编号:
2


2.4 拷贝配置好的 zookeeper 到其他机器上

[hadoop@hadoop102 zkData]$ xsync myid
  • 并分别在 hadoop103、hadoop104 上修改 myid 文件中内容为 3、4
  • 注意:使用xsync分发文件会使目标服务器上的文件与本服务器文件完全一致。进行Hadoop完全分布式环境搭建的时候,如果分发的目录或文件中包含myid文件,一定记得修改目标服务器上的myid文件,否则可能导致zookeeper无法启动等问题。
3,配置 zoo.cfg 文件

3.1 重命名/opt/module/zookeeper/conf 这个目录下的 zoo_sample.cfg 为 zoo.cfg

[hadoop@hadoop102 conf]$ mv zoo_sample.cfg zoo.cfg


3.2 修改 zoo.cfg 文件

[hadoop@hadoop102 conf]$ vim zoo.cfg
  • 修改数据存储路径配置:
dataDir=/opt/module/zookeeper/zkData
  • 增加如下配置:
#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
  • 配置参数解读
server.A=B:C:D
  • A 是一个数字,表示这个是第几号服务器; 集群模式下配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面有一个数据就是A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息 较从而判断到底是哪个 server;
  • B 是这个服务器的地址;
  • C 是这个服务器 Follower 与集群中的 Leader 服务器交换信息的端口;
  • D 是万一集群中的 Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。


3.3 同步 zoo.cfg 配置文件

[hadoop@hadoop102 conf]$ xsync zoo.cfg


3.4 删除hadoop103和hadoop104上的多余文件

# hadoop103
[hadoop@hadoop103 conf]$ pwd
/opt/module/zookeeper/conf
[hadoop@hadoop103 conf]$ rm -rf zoo_sample.cfg

# hadoop104
[hadoop@hadoop104 conf]$ rm -rf zoo_sample.cfg
☭问题5:启动ZooKeeper报错 mkdir: 无法创建目录".": 权限不够 ?

注意:ZK有启动成功,只是在启动时返回这样一条报错信息,那么只需要把集群中的zoo_sample.cfg文件删除即可。

☭问题6:Zookeeper启动显示成功,zkServer.sh status报错?
4,集群操作

4.1 将ZooKeeper目录所在路径添加到环境变量,方便全局调用命令

[hadoop@hadoop102 conf]$ sudo vim /etc/profile.d/my_env.sh
[hadoop@hadoop102 conf]$ source /etc/profile
  • 添加以下内容:
#ZOOKEEPER_HOME
export ZOOKEEPER_HOME=/opt/module/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
export PATH=$PATH:$ZOOKEEPER_HOME/sbin


4.2 编写ZooKeeper启动脚本
注意:集群中全部服务器上的Zookeeper均启动成功,才能正常运行

[hadoop@hadoop102 conf]$ cd /home/hadoop/bin
[hadoop@hadoop102 bin]$ vim myzk.sh
  • 编写myzk.sh脚本内容
#!/bin/bash
if [ $# -lt 1 ]
then
 echo "No Args Input..."
 exit ;
fi
case $1 in
"start")
 echo " =================== 启动 zookeeper ==================="
 echo " --------------- hadoop102 ---------------"
 ssh hadoop102 "/opt/module/zookeeper/bin/zkServer.sh start"
 echo " --------------- hadoop103 ---------------"
 ssh hadoop103 "/opt/module/zookeeper/bin/zkServer.sh start"
 echo " --------------- hadoop104 ---------------"
 ssh hadoop104 "/opt/module/zookeeper/bin/zkServer.sh start"
;;
"stop")
 echo " =================== 关闭 zookeeper ==================="
 echo " --------------- hadoop104 ---------------"
 ssh hadoop104 "/opt/module/zookeeper/bin/zkServer.sh stop"
 echo " --------------- hadoop103 ---------------"
 ssh hadoop103 "/opt/module/zookeeper/bin/zkServer.sh stop"
 echo " --------------- hadoop102 ---------------"
 ssh hadoop102 "/opt/module/zookeeper/bin/zkServer.sh stop"
;;
*)
 echo "Input Args Error..."
;;
esac
  • 保存后退出,然后赋予脚本执行权限
[hadoop@hadoop102 bin]$ chmod +x myzk.sh


4.3 分发/home/hadoop/bin 目录,保证自定义脚本在三台机器上都可以使用

# 进入bin的上级目录/home/hadoop
[hadoop@hadoop102 bin]$ cd ..

# 先确保一下文件所属
[hadoop@hadoop102 ~]$ chown -R hadoop:hadoop bin

# 分发bin目录
[hadoop@hadoop102 ~]$ xsync bin/


4.4 运行ZooKeeper

[hadoop@hadoop102 ~]$ myzk.sh start


4.5 查看状态

[hadoop@hadoop102 zookeeper]$ zkServer.sh status
[hadoop@hadoop103 zookeeper]$ zkServer.sh status
[hadoop@hadoop104 zookeeper]$ zkServer.sh status

HBase安装

1,Zookeeper 正常部署

首先保证 Zookeeper 集群的正常部署,并启动之

# 启动过就不要再启动了
[hadoop@hadoop102 zookeeper]$ myzk.sh start
2,Hadoop 正常部署

Hadoop 集群的正常部署并启动

[hadoop@hadoop102 hadoop]$ myhadoop.sh start
3,HBase 的解压

3.1 解压 HBase 到指定目录

[hadoop@hadoop102 software]$ tar -zxvf hbase-1.2.0-cdh5.14.0.tar.gz -C /opt/module


3.2 修改文件包名称和所属

[hadoop@hadoop102 module]$ mv hbase* hbase
[hadoop@hadoop102 module]$ sudo chown -R hadoop:hadoop hbase

# 进入conf目录,之后需修改配置文件
[hadoop@hadoop102 module]$ cd hbase/conf
[hadoop@hadoop102 conf]$ 
4,HBase 的配置文件

4.1 修改 hbase-env.sh

  • 修改内容如下:分别在27和128行左右
export JAVA_HOME=/opt/module/jdk
export HBASE_MANAGES_ZK=false
☭问题7:HBase启动警告:Java HotSpot™ 64-Bit Server VM warning

警告内容:
Java HotSpot™ 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot™ 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0

解决方案:
hbase-env.sh文件中45行左右有注释说明下面两个export在JDK8+版本可以被安全地移除,注释掉即可
在这里插入图片描述


4.2 hbase-site.xml 修改内容

<configuration>
    <property> 
        <name>hbase.rootdir</name> 
        <value>hdfs://hadoop102:8020/hbase</value> 
    </property>
    <property> 
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
    <!-- 0.98后的新变动,之前版本没有.port,默认端口为60000 -->
    <property>
        <name>hbase.master.port</name>
        <value>16000</value>
    </property>
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
    </property>
    <property> 
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/opt/module/zookeeper/zkData</value>
    </property>
</configuration>


4.3 regionservers文件内容如下:原内容删去

regionservers文件列出了所有运行HRegionServer进程服务器,对该文件的配置与Hadoop中对slaves或者workers文件的配置相似,需要在文件的每一行指定一台服务器,当HBASE启动时会读取该文件,将文件指定的所有服务器启动HRegionServer进程,当HBASE停止的时候,也会同时停止他们。

因此,在启动hbase后,主服务器hadoop102将启动两个节点HMaster和HRegionServer,其余各服务器启动一个节点HRegionServer。

hadoop102
hadoop103
hadoop104


4.4 软连接 hadoop 配置文件到 hbase:

[hadoop@hadoop102 module]$ ln -s /opt/module/hadoop/etc/hadoop/core-site.xml /opt/module/hbase/conf/core-site.xml
[hadoop@hadoop102 module]$ ln -s /opt/module/hadoop/etc/hadoop/hdfs-site.xml /opt/module/hbase/conf/hdfs-site.xml
5,HBase 远程发送到其他集群
[hadoop@hadoop102 module]$ xsync hbase/
6,HBase 服务的启动

6.1 添加环境变量

[hadoop@hadoop102 module]$ sudo vim /etc/profile.d/my_env.sh
[hadoop@hadoop102 module]$ source /etc/profile
  • 添加内容如下
#HBASE_HOME
export HBASE_HOME=/opt/module/hbase
export PATH=$PATH:$HBASE_HOME/bin


6.2 分发环境变量文件

[hadoop@hadoop102 module]$ sudo /home/hadoop/bin/xsync /etc/profile.d/my_env.sh

# 使文件在各服务器上生效
[hadoop@hadoop103 module]$ source /etc/profile
[hadoop@hadoop104 module]$ source /etc/profile


6.3 测试

[hadoop@hadoop102 module]$ start-hbase.sh
[hadoop@hadoop102 module]$ jpsall
[hadoop@hadoop102 module]$ hbase shell

在这里插入图片描述

☭问题8:HBase启动报错 错误:找不到或无法加载主类 org.jruby.Main

这里提供一个特别zz的解决方案:
我在后续把IDEA的目录添加到环境变量中时,因为错把$IDEA_HOME写成$HBASE_HOME(复制粘贴的锅),导致环境变量中$HBASE_HOME被IDEA的目录所覆盖,因此出现如上报错。

所以可以先仔细检查环境变量文件,我当时就是没有全部看一遍,导致困扰许久。


6.4 关闭集群顺序

[hadoop@hadoop102 module]$ stop-hbase.sh
[hadoop@hadoop102 module]$ myhadoop.sh stop
[hadoop@hadoop102 module]$ myzk.sh stop

# 查看各服务器上的进程,正常关闭后,各服务器上均只剩下一个进程jps
[hadoop@hadoop102 module]$ jpsall

安装MAVEN & IDEA

1,解压安装
# 解压安装
## MAVEN
[hadoop@hadoop102 software]$ tar -zxvf apache-maven-3.6.3-bin.tar.gz -C /opt/module
## IDEA
[hadoop@hadoop102 software]$ tar -zxvf ideaIU-2017.2.7.tar.gz -C /opt/module

# 修改目录名和所属
[hadoop@hadoop102 module]$ mv apache* maven
[hadoop@hadoop102 module]$ mv idea* idea
[hadoop@hadoop102 module]$ sudo chown -R hadoop:hadoop maven idea
[hadoop@hadoop102 module]$ ll
2,设置环境变量
[hadoop@hadoop102 module]$ sudo vim /etc/profile.d/my_env.sh
[hadoop@hadoop102 module]$ source /etc/profile
  • 添加下列内容
#MAVEN_HOME
export MAVEN_HOME=/opt/module/maven
export PATH=$PATH:$MAVEN_HOME/bin
#IDEA_HOME
export IDEA_HOME=/opt/module/idea
export PATH=$PATH:$IDEA_HOME/bin
3,测试 MAVEN
# 输入名令 mvn -v 可以查看版本号
[hadoop@hadoop102 module]$ mvn -v
4,修改MAVEN配置文件,使用阿里的镜像地址
[hadoop@hadoop102 conf]$ pwd
/opt/module/maven/conf
[hadoop@hadoop102 conf]$ vim settings.xml
  • 找到mirrors标签,插入
id=alimaven
name=aliyun maven
url=http://maven.aliyun.com/nexus/content/groups/public/
mirrorOf=central
  • 修改前:
    在这里插入图片描述
  • 修改后:
    在这里插入图片描述
5,运行IDEA
[hadoop@hadoop102 conf]$ idea.sh

参考资料

教程相关
【1】尚硅谷大数据技术之 Hadoop(入门)
【2】hadoop3.x集群:配置、启动历史服务(history server,端口19888)
【3】【尚硅谷】大数据全套教程下载
【4】centos7安装IDEA配置Maven
【5】如何重新格式化Hadoop文件系统
【6】同一个局域网内如何共享文件夹(含共享打印机操作方法)
【7】在本地用idea连接虚拟机上的hbase集群

报错相关
【1】Hbase启动警告
【2】linux 终端启动图形化程序界面时报错:No protocol specified
【3】stop-hbase.sh一直处于等待状态

知识相关
【1】【hadoop 的坑】hadoop的配置文件slaves/workers
【2】Hadoop配置文件详解
【3】Zookeeper学习笔记
【4】Hbase的集群模式安装配置(笔记)
【5】maven-porm.xml详解
【6】hadoop3.x——历史服务器
【7】UUID详细介绍

实战项目
【1】HBase快速入门系列 (九)| HBase 的实战案例(微博)

资源分享

链接:https://pan.baidu.com/s/1YnO6NQYrU4gGgx1kEVy1jA
提取码:MNZX


以上过程希望对你有所帮助!
欢迎评论区交流指教!
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐