耗时将近 1 天,终于搭好了 Hadoop 集群,现做教程分享出来。

本文基于 MacOS Big Sur 11.2.2 操作系统,配置 3 台 CentOS 7 虚拟机,部署 Hadoop-2.7.7

所有安装文件集合下载:百度网盘 提取码:o7k4

安装 VMWare Fusion 以及 TermiusSSH 客户端

  • VMware Fusion: 官网 https://www.vmware.com/cn/products/fusion/fusion-evaluation.html

  • Termius SSH: 官网 https://www.termius.com/mac-os

    我这里是通过这 2 款工具来搭建虚拟机并支持后续操作的,也可以使用其他虚拟机软件和 SSH 客户端,我是没找到 Mac 平台上能达到像 Windows 平台的 Xshell 那样的 SSH 工具。另外 Mac 也可以不使用第三方 SSH 客户端,毕竟自带的iterm2已经很强大了。

    文末有用 mac 自带的 iterm 终端 SSH 连接 Linux 主机的命令。

    安装以上软件没什么难度,基本下一步就好。


在虚拟机中安装 CentOS 7

  • 本教程所使用的虚拟机是用这个镜像安装的 CentOS-7-x86_64-Minimal-2009.iso

    下载地址:http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/

    然后选择和我一样的镜像版本下载下来。

    之前刚一开始是用的 CentOS 8,而且是全量安装,包含各种工具包,还有 GUI 图形界面,要是同时开三台虚拟机的话,16G 内存也不够,主要是 GUI 图形化窗口消耗了大量内存资源,导致系统卡顿,所以干脆就选择最小化安装了。而且安装后也不需要卸载系统自带的 OpenJDK,关键是安装也很快。

    Linux 玩的就是命令,要什么图形啊,服务器不都是跑的最小内核么?

  1. 打开 VMware Fusion,如下图,选择新建。

    dEqXbynUBJi7RDY

  2. 选择从光盘或映像中安装,然后点继续。

    image-20210418205811051

  3. 点击使用其他光盘或光盘映像。

    image-20210418205919425

  4. 在弹出的对话框中,选择刚刚下载的 CentOS 7 iso 镜像文件,然后点击打开。

    image-20210418210055428

  5. 返回后,点击继续。

    image-20210418210138690

  6. 选择 UEFI 引导,毕竟现在的机子都是 UEFI 了,传统引导很快就会被淘汰的,不过虚拟机选啥其实无所谓,看心情喽!

    image-20210418210251260

  7. 然后点击自定设置。

    image-20210418210430002

  8. 选择一个自己觉得合适的位置,更改个名字,将虚拟机保存,点击存储。最好放到固态硬盘中,加载速度会快些

    image-20210418210625760

  9. 在弹出的对话框中,选择处理器和内存,然后更改内存至少为 2048M 。我因为 16G 内存,所以设置了 4G,大一点系统响应速度快一些,如果电脑内存是 8G 的,那么最好设置 2048M 内存,Linux 应为没有图形化界面所以比较省内存,其实 2048M 足够了。

    image-20210418211124299

  10. 然后点击显示全部,返回顶层页面,点击硬盘。将硬盘大小设置为 60G , 这里视情况而定,一般至少 20G,推荐 60G,点击应用。

    image-20210418211414178

  11. 最后点击虚拟机的运行按钮,打开虚拟机。

    image-20210418211546728

  12. 选择第一项,安装 CentOS 7,然后回车等待加载。

    image-20210418211650207

  13. 加载完成后,进入安装界面,语言选择中文简体,点击继续。

    image-20210418211905841

  14. 然后点击安装位置,以确认全盘安装。

    image-20210418212009893

  15. 点击左上角的完成。

    image-20210418212056274

  16. 点击网络和主机名,配置网络和主机名。

    image-20210418212153419

  17. 按下图示操作,记得拍照记录图示信息。

    image-20210418212658852

  18. 然后点击 IPv4 设置,将方法改为手动,目的是为了固定 IP 地址,方便以后远程连接以及 Hadoop 集群间的通信。然后点击 Add 添加地址,将地址栏填为刚刚拍照记录下来的 IPv4 地址,子网掩码同样填刚刚拍下来的子网掩码,网关其实就是路由器的 IP 了,这里填写刚刚拍下来的默认路由的 IP 地址。继续修改 DNS 服务器,我这里用阿里云的公共 DNS,将 223.5.5.5,223.6.6.6 复制粘贴到 DNS 服务器那一栏,然后勾选需要 IPv4 地址完成这个链接,最后点保存。

    image-20210418213139120

  19. 将主机名改为 master,我们这里现配置 master 主机,其余节点后面直接复制虚拟机即可,然后点应用。

    image-20210418213834765

  20. 按下图检查配置是否有误,无误请点击完成。

    image-20210418214010400

  21. 然后点击开始安装。

    image-20210418214053618

  22. 在安装的同时,设置 ROOT 用户和密码,点击 ROOT 密码,进入设置。

    image-20210418214120168

  23. 务必记住此密码,我这里设置为 000000 学习使用,简单点无所谓,然后点击 2 次完成,因为密码过于简单,系统会有提醒。

    image-20210418214307450

  24. 安装完成,点击重启,在 master login 后输入用户名 root ,然后回车,输入密码 000000。这里密码输入是不显示的,不要惊讶,以为键盘坏了!!!

    image-20210418215056395

  25. 当出现下图所示,则表示安装成功。

    image-20210418215151079

  26. 然后输入以下命令,测试虚拟机是否与互联网相连。

    ping www.baidu.com

    出现如下图所示则表示外网链接成功:

    image-20210418215850418

    ctrl + c 结束 ping 命令。

  27. 至此,CentOS 安装成功。


配置 CentOS 7

  1. 现在是联网状态,最好更新一下yum源,运行命令 yum -y update

    image-20210428222252678

  2. 当看到complete提示信息时表明yum更新成功,这些都属于刚安装Linux系统的常规操作。如下图所示:

    image-20210428222811494

  3. 接下来关闭系统防火墙,不要担心,现在系统不再公网上,关闭防火墙一般也是不会被黑进来的,放心大胆的关闭吧,而且Hadoop集群间后面通信过程中也是要求关掉防火墙的,局域网内通信没必要开防火墙。

    • 临时关闭防火墙 systemctl stop firewalld.service
    • 永久关闭防火墙 systemctl disable firewalld.service

    先输入临时关闭防火墙的命令,将当前系统的防火墙关闭,然后再输入永久关闭防火墙命令,这个是防止重启系统防火墙自动开启。

    image-20210428223749872

    image-20210428223840012

  4. 接着关闭Linux系统安全内核SELinux。输入命令 vi /etc/selinux/config ,进入编辑selinux的配置文件。

    这里作为补充,说明一下vi/vim命令,vi是编辑文本的命令,后面跟文本的路径,这条命令的意思是在终端中编辑selinux下的config文件,回车后会看到如下图所示页面。

    image-20210428224424133

    目前是查看状态不能编辑,按下键盘上的字母键 i ,才会进入编辑模式,如下图所示,(左下角会提示当前为INSERT状态,表明可修改内容):

    image-20210428224656486

    找到 SELINUX=enforcing 这一行,将 = 后面的 enforcing 修改为 disabled 。然后按下键盘的 esc 键,如下图所示:

    image-20210428225227902

    注意当按下esc键后,左下角的 insert 会消失,然后按下键盘的 : 键,进入指令状态,如下图所示:

    image-20210428225425870

    会发现左下角有 : 显示,证明现在是指令状态,然后输入 wqw 指令表示写入文件,q 表示退出 vi 编辑模式,如下图所示:

    image-20210428225634048

    然后按回车,执行刚刚的指令,就回到了初始的命令界面,然后我们检查一下刚才的操作,输入 cat /etc/selinux/config 命令,查看配置文件是否被正常修改,如下图所示。(养成编辑后就检查的习惯后面会省很多事)

    image-20210428230018418

  5. 输入 reboot 回车重启系统,使以上命令生效。

  6. 重启后输入 /usr/sbin/sestatus -v 查看SELinux是否被禁用。

    image-20210428231223773

  7. 输入 yum install vim -y 安装 vim 编辑器,这个和 vi 命令一样,是 vi 命令的增强版,有语法高亮功能,对后面修改Hadoop配置会有所帮助。

  8. 修改hosts文件,将后面会配置的虚拟机的ip先添加到hosts文件中。

    输入 vim /etc/hosts 编辑hosts文件

    image-20210428232342194

    这里的ip地址要和之前安装虚拟机时拍照所得的ip的网段要一致,第一个master主机为当前虚拟机的ip,后面的s1,s2分别在ip地址的末尾加1,我这里master的ip就是安装虚拟机时拍照所记录的ip,按照当时的ip配置master即可,然后将s1,s2的ip也添加到hosts文件中,我这里分别是 .7.8 。前面的 192.168.141 要和master主机相同,这样3台主机才会在同一个网段内,才能ping通。

    修改完成后,保存退出。

  9. 新建Hadooptools文件夹,后面所有文件均在该文件夹下存放。

    在root用户根目录新建Hadooptools文件夹,依次输入以下命令:

    cd /root

    mkdir Hadooptools

    cd Hadooptools

    TFI2xu

  10. 下载本文开始所提供的百度网盘资料

  11. 通过mac自带的terminal上传到服务器

    打开Mac终端,然后输入以下命令,注意路径和ip换成自己的

    sudo scp /Users/wcooper/Downloads/jdk-8u171-linux-x64.tar.gz root@192.168.141.6:/root/Hadooptools/

    sudo scp /Users/wcooper/Downloads/jdk-8u171-linux-x64.tar.gz root@192.168.141.6:/root/Hadooptools/

    这里上传Hadoop和jdk的安装包,scp 命令用法如下:

    scp local_file remote_username@remote_ip:remote_folder

    local_file 在这里就是下载到的文件路径,直接将文件拖到终端里就会自动填入路径,我这里是在Downloads文件夹内。后面接着远程主机要连接的用户名和IP地址或主机名,因为我们这里没有在mac的host文件中配置远程主机,所以直接用ip即可,用户名和ip之间用@隔开,然后冒号后跟上要存在远程主机的那个目录的路径即可,这里统一用/root/Hadooptools/

    在执行命令中,会问到是否连接,输入yes同意后回车即可,然后输入root用户的密码回车,同样这里的密码输入也是不显示的,当看到进度变为100%,即表示上传成功,如下图:

    CxG1Cc

    iHCDCb

  12. 回到虚拟机,cd到Hadooptools文件夹,然后查看是否有刚刚上传的文件:

    cd /root/Hadooptools

    ls

    nCMKUn

  13. 分别解压2个压缩包:

    tar -zxvf hadoop-2.7.7.tar.gz

    tar -zxvf jdk-8u171-linux-x64.tar.gz

    cUJVrh

    kxrduZ

  14. 安装jdk

    先cd到root用户根目录

    cd ~

    image-20210502202820299

    然后用 vim 编辑 .bash_profile

    vim .bash_profile

    8IQkjL

    将以下内容添加到文件中:

    export JAVA_HOME=/root/Hadooptools/jdk1.8.0_171
    export PATH=$JAVA_HOME/bin:$PATH

    8KB2KQ

    保存后,输入以下命令使修改的配置生效:

    source .bash_profile

    然后输入java -version 查看java版本,检验安装是否成功,如果能出现下图所示,即表示配置成功。

    IWXE1j

  15. 至此centos 7 配置完毕,准备关机复制虚拟机,组成3台虚拟机集群。

    输入 shutdown now 立即关闭虚拟机


复制虚拟机,完善ip与主机名配置

  1. 将我们目前的虚拟机名字修改为 master 方便识别,如下图所示(右键点击虚拟机名称,然后点击重命名):

    image-20210428233425241

  2. 之后右键点击 master 然后点 创建完整克隆 ,复制我们当前的虚拟机2次,将复制得到的虚拟机分别命名为 s1s2 ,如下图所示:

    image-20210428233812987

    image-20210428234023385

  3. 将3台虚拟机依次启动,然后修改ip

    先进入s1虚拟机,然后输入以下命令,编辑网络配置文件:

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

    将其ip设置为 192.168.141.7 ,保存后,输入 service network restart 使配置生效。

    ZX0tqk

    同样的命令配置好s2,配置其ip地址为 192.168.141.8 ,然后保存,输入命令使配置生效。

    这里的ip地址与安装Linux系统时拍照记录的ip地址有关,前面的 192.168.141 与装系统时的ip地址完全一致,后面一位和上文配置centos7里的第8小步一致,配置的hosts文件保持一致。

  4. 接下来修改主机名,输入以下命令:

    S1: hostnamectl set-hostname s1

    S2: hostnamectl set-hostname s2

    完成后分别在s1,s2做用户登出,输入命令:

    logout

    然后再输入用户名root,密码,登入系统,这时会看到如下图所示位置已经变成了 root@s1,s2。说明主机名修改成功。

    Qb9LIG

  5. 分别测试是否能ping通

    master 主机上分别输入以下命令:

    ping master
    ping s1
    ping s2

    如果能正确收到数据包,说明master与s1,s2能正常连接

    接下来依次在s1,s2上分别做以上验证,保证能够正常ping通即可。


使用termius连接3台虚拟机

  1. 打开termius,选择新建group

    image-20210503104915700

  2. 填写group名,这里以hadoop集群为例,然后点击save保存。

    termius中Hadoop-group

  3. 双击进入刚刚新建的group

    855CbU

  4. 点击新建host,依次新建master、s1、s2,设置好ip并输入用户名密码即可,然后点击save保存

    X6s6yq

    QocAY1

  5. 双击新建的host,然后选择add and continue 即可成功连接到虚拟机

    DBaiX6

  6. 成功连接3台虚拟机后,命令就可以直接在这里输入,不必再从虚拟机的页面里输入了,但是虚拟机要保持开机状态,关机就没办法连接了。


制作免密码登陆

  1. 在termius中打开与三台虚拟机的连接,在master中输入以下命令:

    ssh-keygen -t rsa

    然后一路按回车,直到命令运行结束。同样操作,在s1,s2中依次执行一遍。

    b3wGzH

    qRP4bV

    UQRNBd

  2. 在master依次输入以下命令:

    ssh-copy-id master
    ssh-copy-id s1
    ssh-copy-id s2

    然后根据提示输入master,s1,s2的密码。这里是为了实现master通过ssh登陆s1,s2和自己免密。

    ec2nZq

    rOs2nm

    UzEJK7

  3. 在s1中依次输入以下命令:

    ssh-copy-id master
    ssh-copy-id s2

    ljrYR9

    pxVoY0

  4. 在s2中依次输入以下命令:

    ssh-copy-id master
    ssh-copy-id s1

    6MnztU

    Y8gsj7

  5. 通过ssh命令测试互相登陆,如果相互登陆都不需要密码的话,表示免密码登陆设置成功。

    测试命令:

    ssh 主机名

    eYpTWi

    sgaWcD

    wMg0uF


配置时间同步

  1. 在master中,输入命令:crontab -e

  2. 输入:0 1 * * * /usr/sbin/ntpdate cn.pool.ntp.org ,然后保存退出。

    khvsr1

  3. 输入命令 clock 检查时间是否正确

    hnYnD2

  4. 其余2台虚拟机重复上述操作


配置 Hadoop

以下修改操作全部在master上进行,也就是只修改master里的文件,然后将master上的文件全部复制到s1,s2上即可。

修改hadoop-env.sh

  1. cd到 hadoop-2.7.7 文件夹下

    cd /root/Hadooptools/hadoop-2.7.7/etc/hadoop/

  2. 输入命令,修改 hadoop-env.sh

    vim hadoop-env.sh

    将原来export JAVA_HOME那一项修改为以下值(指明本机JAVA_HOME的路径),然后wq保存退出:

    # The java implementation to use.
    export JAVA_HOME=/root/Hadooptools/jdk1.8.0_171

修改yarn-env.sh

  1. cd到 hadoop-2.7.7 文件夹下

    cd /root/Hadooptools/hadoop-2.7.7/etc/hadoop/

  2. 输入命令,修改 yarn-env.sh

    vim yarn-env.sh

    同样修改 JAVA_HOME ,然后wq保存退出

    # some Java parameters
    # export JAVA_HOME=/home/y/libexec/jdk1.6.0/
    if [ "$JAVA_HOME" != "" ]; then
    #echo "run java in $JAVA_HOME"
    JAVA_HOME=/root/Hadooptools/jdk1.8.0_171

    HvjObK

修改core-site.xml

  1. cd到 hadoop-2.7.7 文件夹下

    cd /root/Hadooptools/hadoop-2.7.7/etc/hadoop/

  2. 输入命令,修改 core-site.xml

    vim core-site.xml

  3. 将以下内容复制粘贴到文件中,然后保存退出

    <configuration>
    <property>
    <name>fs.default.name</name>
    <value>hdfs://master:9000</value>
    <description>配置NameNode的URL</description>
    </property>
    <!--用来指定hadoop运行时产生的存放目录 -->
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/root/Hadooptools/hadoop-tmp</value>
    </property>
    </configuration>

    p3cauw

    这里将hadoop运行时的临时文件存放目录设置为/root/Hadooptools/hadoop-tmp,目前系统中是没有这个目录的,后面需要新建这个目录。

修改hdfs-site.xml

  1. cd到 hadoop-2.7.7 文件夹下

    cd /root/Hadooptools/hadoop-2.7.7/etc/hadoop/

  2. 输入命令,修改 hdfs-site.xml

    vim hdfs-site.xml

  3. 将以下内容添加到文件,然后保存退出:

    <configuration>
    <property>
    <name>dfs.replication</name>
    <value>2</value>
    </property>
    </configuration>

    KI0reH

修改mapred-site.xml

  1. cd到 hadoop-2.7.7 文件夹下

    cd /root/Hadooptools/hadoop-2.7.7/etc/hadoop/

  2. 输入命令,修改 mapred-site.xml

    vim mapred-site.xml

  3. 将以下内容复制粘贴到文件中,保存退出

    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <!--
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License. See accompanying LICENSE file.
    -->

    <!-- Put site-specific property overrides in this file. -->

    <configuration>
    <!-- 指定mr框架为yarn方式 -->
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
    </configuration>

修改yarn-site.xml

  1. cd到 hadoop-2.7.7 文件夹下

    cd /root/Hadooptools/hadoop-2.7.7/etc/hadoop/

  2. 输入命令,修改 yarn-site.xml

    vim yarn-site.xml

  3. 将以下内容复制粘贴到文件中:

    <configuration>

    <!-- Site specific YARN configuration properties -->
    <property>
    <!--指定yarn的老大resoucemanager的地址-->
    <name>yarn.resourcemanager.hostname</name>
    <value>master</value>
    </property>
    <!--NodeManager 获取数据的方式-->
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    </configuration>

    UQKtCS

修改slaves

  1. cd到 hadoop-2.7.7 文件夹下

    cd /root/Hadooptools/hadoop-2.7.7/etc/hadoop/

  2. 输入命令,修改 slaves

    vim slaves

    复制粘贴以下内容到文件:

    master
    s1
    s2

    LmHbS1

建立hadoop-tmp文件夹

  1. cd到 Hadooptools 文件夹下

    cd /root/Hadooptools/

  2. 输入命令 mkdir hadoop-tmp 新建文件夹

删除s1,s2上的Hadooptools文件夹

  1. 依次在 s1s2 上执行一下命令,千万别删错了,不要删除在master上的文件夹:

    rm -rf /root/Hadooptools/

  2. master 上的 Hadooptools文件夹复制到s1,s2上。

    依次运行以下命令:

    scp -r /root/Hadooptools root@s1:/root/
    scp -r /root/Hadooptools root@s2:/root/

配置系统环境变量

  1. 用vim打开系统环境变量配置文件

    vim /root/.bash_profile

  2. 将以下内容添加到文件中

    export HADOOP_HOME=/root/Hadooptools/hadoop-2.7.7
    export PATH=$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:

    XgXFEH

    然后执行命令 source /root/.bash_profile 使配置生效。

    重复上述操作将s1,s2虚拟机的环境变量也配置成这样。

  3. 格式化hadoop文件系统

    该命令只能在master上执行,且只能执行一次,不可多次执行。

    hdfs namenode -format

    5HQJCj

    当看到如上图中所示 successfully 提示信息则表示格式化成功。


一行命令启动 Hadoop 集群

  1. start-all.sh

    Y7KhT1

  2. 根据提示信息,输入yes

    Q93lGN

  3. 用宿主机浏览器访问 http://192.168.141.6:50070 查看启动是否成功。

    EBb8fP

    找到网页中的summary,点开livenodes查看现在是否有3台节点同时在线,如果不是3台,则说明配置有问题,需要重新排错,按照教程前面内容仔细检查,如果显示是3台主机在线,则表明配置成功。

    opuNAa

  4. 登陆yarn的WebUI http://192.168.141.6:8088/


安装spark

  1. 登陆Apache spark官网下载spark

    地址:http://spark.apache.org/downloads.html

    选择如下图所示版本进行下载

    1MPzP1

  2. 将下载的压缩包上传到master主机

    在mac终端中输入:

    scp /Users/wcooper/Downloads/spark-3.1.1-bin-hadoop2.7.tgz root@192.168.141.6:/root/Hadooptools/

    注意下载路径换成自己的。

    nvU8WW

  3. 用termius登陆master主机,解压刚刚上传的压缩包

    • 先cd到Hadooptools目录 cd /root/Hadooptools

    • 然后执行解压缩命令tar -zxvf spark-3.1.1-bin-hadoop2.7.tgz

      J5WfHX

  4. 将spark-3.1.1-bin-hadoop2.7文件夹名字修改成spark

    mv spark-3.1.1-bin-hadoop2.7 spark

    mAk8Dk

  5. 修改环境变量,添加spark

    先输入命令编辑.bash_profile vim /root/.bash_profile

    然后在末尾添加以下内容:

    export SPARK_HOME=/root/Hadooptools/spark
    export PATH=${SPARK_HOME}/bin:$PATH

    OBLA68

  6. 输入命令使修改的配置生效:

    source /root/.bash_profile

    Dq9Vow

  7. 编辑spark-env.sh

    • 先进入conf文件夹 cd /root/Hadooptools/spark/conf/

    • 首先复制一份spark-env.sh,并将其改名 cp spark-env.sh.template spark-env.sh

    • 编辑spark-env.sh vim spark-env.sh

      将以下内容添加到文件中:

      export JAVA_HOME=/root/Hadooptools/jdk1.8.0_171
      export SPARK_MASTER_IP=192.168.141.6
      export SPARK_WORKER_MEMORY=1g
      export HADOOP_CONF_DIR=/root/Hadooptools/hadoop-2.7.7/etc/hadoop

      14UX9m

  8. 添加s1,s2节点信息

    vim /root/Hadooptools/spark/conf/slaves

    5PIz3i

  9. 将spark文件夹复制到s1,s2

    依次运行下面的命令:

    cd /root/Hadooptools

    scp -r spark root@s1:/root/Hadooptools/

    scp -r spark root@s2:/root/Hadooptools/
  10. 进入spark文件夹,启动spark

    依次运行以下命令:

    cd /root/Hadooptools/spark/sbin/

    ./start-all.sh

    9z2Shc

  11. 在宿主机的浏览器中访问地址:http://192.168.141.6:8080 ,查看是否能成功访问,如果可以,则spark启动成功。

    iTMWqW

  12. 测试spark运行是否正常

    依次运行以下命令:

    cd /root

    ./Hadooptools/spark/bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 /root/Hadooptools/spark/examples//jars/spark-examples_2.12-3.1.1.jar 100

    然后打开spark的WebUI查看运行情况

    http://192.168.141.6:8080

    uUJPdq

附录

用mac自带的iterm连接虚拟机

输入命令 ssh root@192.168.141.6

kaIFRS