1 实验目的

本次实验预估耗时较长,因此将给出所有详细步骤,如若不能及时完成可在课后完成。

通过本次实验,你应该完成以下部分:

  • 组内合作完成 Hadoop & Spark单机版环境搭建
  • 组内合作完成 Hadoop & Spark分布式环境搭建

最终需搭建相关详细环境如下:

  • 操作系统:centOS 7.6.64
  • 图形界面:GNOME
  • 语言环境:python 3.6.8
  • 相关软件:Hadoop 2.8.5Spark 2.4.4

2 实验准备

本次实验将详细介绍三种方式来搭建 Hadoop & Sapak分布式环境 :

  • 云服务器分布式搭建
  • 伪分布式搭建
  • 多台机器分布式搭建

考虑到大家IP是动态分配(DHCP), 没有使用固定IP。使用第三种方式 多台实际机器搭建 不方便。因此推荐大家使用前两种方式:云服务器分布式搭建、伪分布式搭建进行环境搭建。

3 云服务器分布式搭建

出于最简化演示目的,本次搭建将采用两台云服务器进行Hadoop+Spark 详细搭建记录。

:slightly_smiling_face: 如果小组成员>2,分布式搭建过程大同小异聪明如你应该知道怎么做。

首先记录下小组组员各自服务器的 内网IP&公网IP ,例如我的:

主机名 内网IP 外网IP
master 172.30.0.7 129.28.154.240
slave01 172.16.0.4 134.175.210.3

3.1 Spark单机版搭建

:warning: 请注意,3.1.1 部分需在小组成员在所有云服务器上完成。3.1.2~3.1.4 小节只需在台云服务器完成即可(作为master节点那台服务器)。

在进行Hadoop、Spark环境搭建前,我们需要进行一些准备工作。

3.1.1 准备工作

1 配置用户

该小节主要是创建Hadoop 用户。

  1. 创建用户

    1
    useradd -m hadoop -s /bin/bash          

    同时设置用户密码:(如 123456)

    1
    passwd hadoop
  2. 配置权限

    为了方便,给用户 hadoop 等同root 权限:

    1
    visudo            # 执行 visudo命令进入vim编辑

    找到如下位置,添加红框那一行配置权限:

    1575371320579

  3. 切换用户

    配置完成后,我们切换到hadoop用户下:

    1
    su hadoop   # 注意,不要使用root用户,以下全部切换到hadoop用户下操作

    :warning: 如非特殊说明,接下来所有命令都是Hadoop用户下完成!

2 配置SSH

为什么要配置ssh?

因为集群、单节点模式都需要用到 ssh登陆。同时每次登陆ssh都要输入密码是件蛮麻烦的事 ,我可以通过生成公钥配置来面密码登陆。

  1. 生成密钥

    为了生成 ~/.ssh 目录,我们直接通过执行下面命令会直接生成

    1
    ssh localhost   # 按提示输入yes,然后键入hadoop密码

    然后开始生成密钥

    1
    2
    cd ~/.ssh/          # 切换目录到ssh下
    ssh-keygen -t rsa # 生成密钥

    生成密钥过程会有三个提示,不用管全部回车。

  2. 授权

    1
    cat id_rsa.pub >> authorized_keys  # 加入授权
  3. 修改权限

    如果不修改文件authorized_keys权限为600,会出现访问拒绝情况

    1
    chmod 600 ./authorized_keys    # 修改文件权限
  4. 测试

    1
    ssh localhost   # ssh登陆

    不用输入密码,直接登陆成功则说明配置正确。

    1579770536641

3 配置yum源

官方网站下载实在太慢,我们可以先配置一下阿里源来进行下载。

  1. 切换到yum 仓库

    1
    cd /etc/yum.repos.d/
  2. 备份下原repo文件

    1
    sudo mv CentOS-Base.repo CentOS-Base.repo.backup
  3. 配置清华云repo文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    sudo vim /etc/yum.repos.d/CentOS-Base.repo #sudo 扩大权限
    i #修改文件

    #配置文件具体内容如下
    [base]
    name=CentOS-$releasever - Base
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/$basearch/
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

    #released updates
    [updates]
    name=CentOS-$releasever - Updates
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/updates/$basearch/
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

    #additional packages that may be useful
    [extras]
    name=CentOS-$releasever - Extras
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/extras/$basearch/
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

    #additional packages that extend functionality of existing packages
    [centosplus]
    name=CentOS-$releasever - Plus
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/centosplus/$basearch/
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
    gpgcheck=1
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

    防止权限不足使用sudo 命令。

  4. 生成缓存

    1
    2
    yum clean all
    yum makecache
  5. 升级yum更新包

    1
    sudo yum update
4 配置Java环境

最开始下载的是 1.7版本的JDK,后面出现的问题,重新下载 1.8 版本 JDK。

hadoop2 基于 java 运行环境,所以我们先要配置java 运行环境。

  1. 安装 JDK

    执行下面命令,经过实际测试前面几分钟一直显示镜像错误不可用。它会进行自己尝试别的源,等待一会儿就可以下载成功了。

    1
    sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel

    :warning: 此时默认安装位置是 /usr/lib/jvm/java-1.8.0-openjdk

    其实,查找安装路径,可以通过以下命令:

    1
    rpm -ql java-1.8.0-openjdk-devel | grep '/bin/javac'
    • rpm -ql <RPM包名> :查询指定RPM包包含的文件
    • grep <字符串> : 搜索包含指定字符的文件
  2. 配置环境变量

    1
    vim ~/.bashrc  # vim编辑配置文件

    在文件最后面添加如下单独一行(指向 JDK 的安装位置),并保存:

    1
    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk

    1575379864251

    最后是环境变量生效,执行:

    1
    source ~/.bashrc 
  3. 测试

    1
    echo $JAVA_HOME     # 检验变量值

    正常会输出 2.环境变量JDK配置路径。

    1
    java -version

    正确配置会输出java版本号。

5 安装python

这里清华yum更新包中python已经为python3

  1. yum查找python3

    查找仓库存在的python3安装包

    1
    yum list python3

    1575423838102

  2. yum 安装python3

    1
    sudo yum install python3.x86_64

3.1.2 hadoop 安装

本文使用 wget 命令来下载 hadoop了解更多wget

使用的是清华镜像站 , 下载 hadoop

1575378514451

  1. 下载

    1
    sudo wget -O hadoop-2.10.1.tar.gz https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.10.1/hadoop-2.10.1.tar.gz
    • wget -O <指定下载文件名> <下载地址>
  2. 解压

    1
    sudo tar -zxf hadoop-2.10.1.tar.gz -C /usr/local

    把下载好的文件 hadoop-2.10.1.tar.gz 解压到 /usr/local 目录下

  3. 修改文件

    1
    2
    3
    cd /usr/local/   # 切换到解压目录下
    sudo mv ./hadoop-2.10.1/ ./hadoop # 将加压的文件hadoop-2.10.1重命名为hadoop
    sudo chown -R hadoop:hadoop ./hadoop # 修改文件权限
  4. 测试

    1
    2
    cd /usr/local/hadoop     # 切换到hadoop目录下
    ./bin/hadoop version # 输出hadoop版本号

    1579771673582

3.1.3 spark安装

在前我们已经安装了 hadoop ,现在我们来开始进行spark 安装。

这次下载根据官网推荐使用的清华源。

  1. 下载

    建议到官网下载地址:官网下载

    1575381612542

    • 这样选择的版本可以使用于大部分 hadoop版本,但需要时间上,我下了3个小时
    1
    sudo wget -O spark-3.3.1-bin-without-hadoop.tgz https://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-3.3.1/spark-3.3.1-bin-without-hadoop.tgz 
  2. 解压

    同前解压到 /usr/local 目录下

    1
    sudo tar -zxf spark-3.3.1-bin-without-hadoop.tgz -C /usr/local
  3. 设置权限

    1
    2
    3
    cd /usr/local   # 切换到解压目录
    sudo mv ./spark-3.3.1-bin-without-hadoop ./spark # 重命名解压文件
    sudo chown -R hadoop:hadoop ./spark # 设置用户hadoop为目录spark拥有者
  4. 配置spark环境

    先切换到 /usr/local/spark ,(为了防止没权限,下面用sudo

    1
    2
    cd /usr/local/spark
    cp ./conf/spark-env.sh.template ./conf/spark-env.sh

    编辑 spark-env.sh 文件 :

    1
    vim ./conf/spark-env.sh

    在第一行添加下面配置信息,使得Spark可以从Hadoop读取数据。

    1
    export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)
  5. 配置环境变量

    1
    vim ~/.bashrc

    .bashrc文件中添加如下内容:

    1
    2
    3
    4
    5
    6
    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk  # 之前配置的java环境变量
    export HADOOP_HOME=/usr/local/hadoop # hadoop安装位置
    export SPARK_HOME=/usr/local/spark
    export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.10.7-src.zip:$PYTHONPATH
    export PYSPARK_PYTHON=python3 # 设置pyspark运行的python版本
    export PATH=$HADOOP_HOME/bin:$SPARK_HOME/bin:$PATH

    最后为了使得环境变量生效,执行:

    1
    source ~/.bashrc
  6. 测试是否运行成功

    1
    2
    cd /usr/local/spark
    bin/run-example SparkPi

    执行会输出很多信息,也可以选择执行:

    1
    bin/run-example SparkPi 2>&1 | grep "Pi is"

    1579771989587

3.1.4 测试

  1. 启动pyspark

    1
    2
    cd /usr/local/spark
    bin/pyspark

    1579772051676

  2. 简单测试

    1
    2
    >>> 8 * 2 + 5
    >>>exit() #退出

    使用exit() 命令可退出。

3.2 Hadoop+Spark 分布式环境搭建

3.2.1 准备工作

1 修改主机名

两台服务器一台作为master,一台作为slave。为了以示区分,我们分别修改它们的主机名:

  • 在master

    1
    2
    sudo vim /etc/hostname
    sudo reboot #不要忘了

    编辑修改为:master

  • 在 slave01

    1
    2
    sudo vim /etc/hostname
    sudo reboot #不要忘了

编辑修改为:slave01

最后使用命令 sudo reboot重启,便会生效。

2 修改host

修改hosts目的:可以使用云服务器名字访问,而不直接使用IP地址

首先上自己的云服务器,记录下三台服务器的 内网IP&公网IP

主机名 内网IP 外网IP
master 172.30.0.7 129.28.154.240
slave01 172.16.0.4 134.175.210.3

:warning: 警告,下面有个史前大坑。因为云服务器默认访问本身是用内网IP地址

  • 在master上

    1
    2
    su hadoop
    sudo vim /etc/hosts

    编辑hosts文件如下(以前的全部删除,改成下面这样):

    1
    2
    3
    127.0.0.1 localhost
    172.30.0.7 master # master必须用内网IP
    134.175.210.3 slave01 # slave01用外网IP
  • 在 slave01上

    1
    2
    su hadoop
    sudo vim /etc/hosts
    1
    2
    3
    127.0.0.1 localhost
    129.28.154.240 master # master必须用外网IP
    172.16.0.4 slave01 # slave01用内网IP
3 SSH互相免密

在之前我们搭建Spark单机版环境时,我们配置ssh可以 无密码 本地连接:

1
ssh localhost   # 保证两台服务器都可以本地无密码登陆

现在我们还要让 master主机免密码登陆 slave01、slave02 。因此我们要将master主机的id_rsa.pub 分别传递给两台slave主机。

  1. master上scp传递公钥

    第一次传要输入slave01@hadoop用户密码,例如之前设置为123456

    1
    scp ~/.ssh/id_rsa.pub hadoop@slave01:/home/hadoop/  
  2. 在slave01上加入验证

    1
    ls /home/hadoop/   # 查看master传送过来的 id_rsa.pub文件

    将master公钥加入免验证:

    1
    2
    cat /home/hadoop/id_rsa.pub >> ~/.ssh/authorized_keys
    rm /home/hadoop/id_rsa.pub
  3. 测试

    现在我们切换到master主机上,尝试能否免密登陆:

    1579772937348

    验证可以免密登陆后切换回master主机

    1
    ssh master   # 要输入master@hadoop用户密码

3.2.2 Hadoop集群配置

原本我们需要同时在master和slave节点安装配置Hadoop集群,但是我们也可以通过仅配置master节点Hadoop,然后将整个配置好的Hadoop文件传递给各个子节点。

master节点配置

我们需要修改master主机上hadoop配置文件。

  1. 切换目录

    配置文件在 /usr/local/hadoop/etc/hadoop 目录下:

    1
    cd /usr/local/hadoop/etc/hadoop

    1579834732792

  2. 修改文件 slaves

    master主机作为NameNode ,而 slave01 作为 DataNode

    1
    vim slaves

    修改如下:

    1
    slave01
  3. 修改文件 core-site.xml

    1
    vim core-site.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <configuration>
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoop/tmp</value>
    <description>Abase for other temporary directories.</description>
    </property>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://master:9000</value>
    </property>
    </configuration>

    1575551770594

  4. 修改hdfs-site.xml

    1
    vim hdfs-site.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <configuration>
    <property>
    <name>dfs.replication</name>
    <value>3</value>
    </property>
    <property>
    <name>mapred.job.tracker</name>
    <value>master:9001</value>
    </property>
    <property>
    <name>dfs.namenode.http-address</name>
    <value>master:50070</value>
    </property>
    </configuration>
  5. 修改 mapred-site.xml.template

    :warning: 首先复制它产生一个新复制文件并命名为:mapred-site.xml

    1
    cp mapred-site.xml.template mapred-site.xml

    然后修改文件 vim mapred-site.xml

    1
    2
    3
    4
    5
    6
    <configuration>
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
    </configuration>
  6. 修改yarn-site.xml

    1
    vim yarn-site.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <configuration>
    <!-- Site specific YARN configuration properties -->
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>master</value>
    </property>
    </configuration>
slave节点配置

当然你也可以尝试在slave节点上重复一遍master节点上的配置,而非通过传送文件。(建议方法二,省事)

:black_flag: 方法1:通过scp将上述变动文件发送至slave(可以大幅度减少传送时间)

  1. 传送已修改的配置文件

    在master上节点上,使用如下命令将yarn-site.xml等发送到从机上。

    1
    2
    3
    4
    5
    # on master
    scp /usr/local/hadoop/etc/hadoop/core-site.xml hadoop@slave01:/usr/local/hadoop/etc/hadoop/
    scp /usr/local/hadoop/etc/hadoop/hdfs-site.xml hadoop@slave01:/usr/local/hadoop/etc/hadoop/
    scp /usr/local/hadoop/etc/hadoop/mapred-site.xml hadoop@slave01:/usr/local/hadoop/etc/hadoop/
    scp /usr/local/hadoop/etc/hadoop/yarn-site.xml hadoop@slave01:/usr/local/hadoop/etc/hadoop/
  1. 检查文件变更

    通过cat命令检查slave上的相关文件是否变更。

    1
    2
    # on slave
    cat /usr/local/hadoop/etc/hadoop/core-site.xml # 确认文件是否传送正确

    输出中含有上一步中修改后的信息,则确认正确。比如,core-site.xml文件输出如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <!-- Put site-specific property overrides in this file. -->

    <configuration>
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoop/tmp</value>
    <description>Abase for other temporary directories.</description>
    </property>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://master:9000</value>
    </property>
    </configuration>

:black_flag: 方法2: 压缩拷贝整个hadoop目录

  • 在master节点上执行

    1
    2
    3
    4
    5
    cd /usr/local/
    rm -rf ./hadoop/tmp # 删除临时文件
    rm -rf ./hadoop/logs/* # 删除日志文件
    # 压缩./hadoop文件,并重名为hadoop.master.tar.gz
    tar -zcf ~/hadoop.master.tar.gz ./hadoop

    将压缩好的文件传递给 slave01:

    1
    2
    cd ~
    scp ./hadoop.master.tar.gz slave01:/home/hadoop

    :slightly_smiling_face: 传递速度有点慢,大概要半小时。等待时间你可以先撰写部分实验报告,或者尝试浏览接下来实验步骤。

  • 在slave01节点上

    (如果有)删除原有hadoop文件夹

    1
    sudo rm -rf /usr/local/hadoop/

    解压传过来的文件到指定目录 /usr/local

    1
    sudo tar -zxf /home/hadoop/hadoop.master.tar.gz -C /usr/local

    设置解压出来的hadoop文件夹权限:

    1
    sudo chown -R hadoop /usr/local/hadoop
集群启动测试
  1. master上启动集群

    1
    2
    3
    cd /usr/local/hadoop
    bin/hdfs namenode -format # 注意,仅在第一次启动集群时使用该命令格式化!
    sbin/start-all.sh
  2. 测试

    • 在master上

      1
      jps

      master节点出现以下4个进程则配置成功:

      1579789502573

    • 在 slave01上

      1
      jps

      slave节点出现以下3个进程则配置成功:

      1579789532062

常见问题汇总

Q1: slave节点没有 DataNode 进程 / master节点没有 namenode 进程 ?

这个问题一般是由于在启动集群多次执行格式化命令:

1
bin/hdfs namenode -format

导致hodoop目录下 tmp/dfs/name/current文件下的VERSION中的namespaceId不一致。

首先我们 在master节点上 停止集群:

1
2
cd /usr/local/hadoop  # 切换到你的hadoop目录下
sbin/stop-all.sh # 关闭集群
  • slave节点删除 tmp

    删除slave节点的临时 tmp 文件

    1
    2
    cd /usr/local        # 切换到hadoop目录
    rm -rf ./hadoop/tmp

    删除 tmp 文件 , 如法炮制在 其它节点 进行一样的操作:

    1
    rm -rf ./hadoop/tmp   # 后面格式化会重新生成,大胆删除
  • 在master节点删除 tmp

    1
    2
    cd /usr/local 
    rm -rf ./hadoop/tmp
  • 重新启动集群

    master节点执行以下操作:

    1
    2
    3
    cd /usr/local/hadoop
    bin/hdfs namenode -format # 重新格式化
    sbin/start-all.sh
  • 验证

    master 节点执行以下操作:

    1
    2
    cd ~
    jps

    1575945505887

    在子节点再次输入 jps 命令 :

    1
    2
    cd ~
    jps

    1575942873563

    ok~

Q2:启动集群后发现,Slave 节点没有 NodeManager进程

1580466394703

:warning: 建议先尝试 Q1 方法,一般能解决大部分问题。

启动集群时可以知道,启动 slave01 节点 notemanager 进程相关日志在(最后不是.out.log) :

/usr/local/hadoop/logs/yarn-hadoop-nodemanager-slave01.log

1580466585098

  1. 查看日志

    slave01 节点下

    1
    vim /usr/local/hadoop/logs/yarn-hadoop-nodemanager-slave01.log

    日志太多,我们在命令模式下,输入 :$ ,直接跳到最后一行:

    1580467310994

    • 很显然,显示端口8040被占用
  2. 查看谁占用8040端口

    1
    netstat -tln | grep 8040

    1580467453929

    果然8040 端口已经被占用

  3. 释放端口

    1
    sudo lsof -i :8040  # 查询占用8040端口进程pid

    1580467535705

    杀死相应进程:

    1
    sudo kill -9 16961
  4. 测试

    重新启动集群

    1
    2
    3
    cd /usr/local/hadoop
    sbin/stop-all.sh
    sbin/start-all.sh

    再次输入 jps命令,发现 slave01 节点 NodeManager 进程已经出现!

    1580467671457

3.2.3 Spark集群配置

以下步骤都建立在是我们三台云服务器已经搭建好Spark单机版环境 & hadoop集群。

Spark配置
  1. 切换配置目录

    1
    cd /usr/local/spark/conf
  2. 配置 slaves 文件

    1
    cp slaves.template slaves  # 先把模板文件复制重命名

    开始编辑 vim slaves,将默认内容 localhost 替换为以下:

    1
    slave01
  3. 配置 spark-env.sh 文件

    1
    sudo cp spark-env.sh.template spark-env.sh

    开始编辑,添加下面内容:

    1
    vim spark-env.sh
    1
    2
    3
    export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)
    export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
    export SPARK_MASTER_IP=172.30.0.7 # 注意,使用的master内网IP!!
  4. 复制Spark文件到各个slave节点

    1
    2
    3
    4
    cd /usr/local/
    tar -zcf ~/spark.master.tar.gz ./spark
    cd ~
    scp ./spark.master.tar.gz slave01:/home/hadoop
  5. 节点替换文件

    以下操作是在 slave节点上:

    1
    2
    3
    sudo rm -rf /usr/local/spark/          # 删除节点原有Spark文件(如果有)
    sudo tar -zxf /home/hadoop/spark.master.tar.gz -C /usr/local # 解压到local
    sudo chown -R hadoop /usr/local/spark # 设置spark文件权限拥有者是hadoop
启动Spark集群

在master主机上执行以下操作

  1. 先启动hadoop集群

    1
    2
    cd /usr/local/hadoop/
    sbin/start-all.sh
  2. 启动master节点

    1
    2
    cd /usr/local/spark/
    sbin/start-master.sh

    master上运行 jps 命令可以看到:

    1579791236779

  3. 启动所有slave节点

    1
    2
    3
    sbin/start-slaves.sh
    #建议使用下面这个
    sbin/start-slave.sh spark://<master内网ip>:7077 # 指定master内网ip启动slaves节点

    slave节点上运行 jps 命令可以看到:

    1579791260120

  4. web UI查看

    打开腾讯云控制台,选择VNC登陆服务器,在浏览器上输入:master:8080

    如果出现下面界面则表示 Hadoop+Spark 分布式环境搭建成功!

    1579791486348

    :warning: 如果前面一切正常,Web UI 却无法正常正常显示worker。

    查看slave节点相关spark日志发现报错:无法访问<master外网ip>:7070 ,多次连接失败。请尝试:

    • 关闭集群,重启启动集群,执行如下命令

      1
      2
      sbin/start-master.sh  # 先启动master
      sbin/start-slave.sh spark://<master内网ip>:7077 # 指定master内网ip启动slaves节点
    • 如果依旧不行,考虑:登陆控制台 —> 创建安全组(选择放通所有端口) —> 将master加入刚创建的安全组

    • 重新按第一步启动集群,一般都可以正常显示了

    相关的一些的讨论也可参考: issue#3 @trevery

    :tada: :tada: 聪明如你终于做到这步了,第一个实验完结,撒花 :tada: :tada:

    4 伪分布式搭建

:slightly_smiling_face: 选择伪分布式搭建的同学,每一个组员都需要在各自服务器上独立完成环境搭建。

4.1 Spark单机版搭建​

在进行Hadoop、Spark环境搭建前,我们需要进行一些准备工作。

4.1.1 准备工作

1 配置用户

该小节主要是创建Hadoop 用户。

  1. 创建用户

    1
    useradd -m hadoop -s /bin/bash          

    同时设置用户密码:(如 123456)

    1
    passwd hadoop
  2. 配置权限

    为了方便,给用户 hadoop 等同root 权限:

    1
    visudo            # 执行 visudo命令进入vim编辑

    找到如下位置,添加红框那一行配置权限:

    1575371320579

  3. 切换用户

    配置完成好,我们切换到hadoop用户下:

    1
    su hadoop

    :warning: 如非特殊说明,接下来所有命令都是Hadoop用户下完成!

2 配置SSH

为什么要配置ssh?

因为集群、单节点模式都需要用到 ssh登陆。同时每次登陆ssh都要输入密码是件蛮麻烦的事 ,我可以通过生成公钥配置来面密码登陆。

  1. 生成密钥

    为了生成 ~/.ssh 目录,我们直接通过执行下面命令会直接生成

    1
    ssh localhost   # 按提示输入yes,然后键入hadoop密码

    然后开始生成密钥

    1
    2
    cd ~/.ssh/          # 切换目录到ssh下
    ssh-keygen -t rsa # 生成密钥

    生成密钥过程会有三个提示,不用管全部回车。

  2. 授权

    1
    cat id_rsa.pub >> authorized_keys  # 加入授权
  3. 修改权限

    如果不修改文件authorized_keys权限为600,会出现访问拒绝情况

    1
    chmod 600 ./authorized_keys    # 修改文件权限
  4. 测试

    1
    ssh localhost   # ssh登陆

    不用输入密码,直接登陆成功则说明配置正确。

    1579835835458

3 配置yum源

官方网站下载实在太慢,我们可以先配置一下阿里源来进行下载。

  1. 切换到yum 仓库

    1
    cd /etc/yum.repos.d/
  2. 备份下原repo文件

    1
    sudo mv CentOS-Base.repo CentOS-Base.repo.backup
  3. 下载阿里云repo文件

    1
    sudo wget -O /etc/yum.repos.d/CentOS-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo

    防止权限不足使用sudo 命令。

  4. 设置为默认repo文件

    就是把阿里云repo文件名修改为 CentOS-Base.repo

    1
    sudo mv  CentOS-7.repo CentOS-Base.repo  # 输入y
  5. 生成缓存

    1
    2
    yum clean all
    yum makecache
4 配置Java环境

最开始下载的是 1.7版本的JDK,后面出现的问题,重新下载 1.8 版本 JDK。

hadoop2 基于 java 运行环境,所以我们先要配置java 运行环境。

  1. 安装 JDK

    执行下面命令,经过实际测试前面几分钟一直显示镜像错误不可用。它会进行自己尝试别的源,等待一会儿就可以下载成功了。

    1
    sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel

    :warning: 此时默认安装位置是 /usr/lib/jvm/java-1.8.0-openjdk

    其实,查找安装路径,可以通过以下命令:

    1
    rpm -ql java-1.8.0-openjdk-devel | grep '/bin/javac'
    • rpm -ql <RPM包名> :查询指定RPM包包含的文件
    • grep <字符串> : 搜索包含指定字符的文件
  2. 配置环境变量

    1
    vim ~/.bashrc  # vim编辑配置文件

    在文件最后面添加如下单独一行(指向 JDK 的安装位置),并保存:

    1
    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk

    1575379864251

    最后是环境变量生效,执行:

    1
    source ~/.bashrc 
  3. 测试

    1
    echo $JAVA_HOME     # 检验变量值

    正常会输出 2.环境变量JDK配置路径。

    1
    java -version

    正确配置会输出java版本号。

5 安装python

CentOS自带python2版本过低,我们进行python3安装。

  1. yum查找python3

    查找仓库存在的python3安装包

    1
    yum list python3

    1575423838102

  2. yum 安装python3

    1
    sudo yum install python3.x86_64

    如果最开始会显示没有,等一会自动切换阿里源就可以进行安装了,同时还会安装相关依赖

4.1.2 hadoop 安装

本文使用 wget 命令来下载 hadoop了解更多wget

使用的是北理工镜像站 , 下载 hadoop

1575378514451

  1. 下载

    为防止证书验证出现的下载错误,加上 --no-check-certificate ,相关讨论可见 issue#1

    1
    sudo wget -O hadoop-2.8.5.tar.gz https://mirrors.cnnic.cn/apache/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz  --no-check-certificate 
    • wget -O <指定下载文件名> <下载地址>
  2. 解压

    1
    sudo tar -zxf hadoop-2.8.5.tar.gz -C /usr/local

    把下载好的文件 hadoop-2.8.5.tar.gz 解压到 /usr/local 目录下

  3. 修改文件

    1
    2
    3
    cd /usr/local/   # 切换到解压目录下
    sudo mv ./hadoop-2.8.5/ ./hadoop # 将加压的文件hadoop-2.8.5重命名为hadoop
    sudo chown -R hadoop:hadoop ./hadoop # 修改文件权限
  4. 测试

    1
    2
    cd /usr/local/hadoop     # 切换到hadoop目录下
    ./bin/hadoop version # 输出hadoop版本号

    1579836302968

4.1.3 spark安装

在前我们已经安装了 hadoop ,现在我们来开始进行spark 安装。

这次下载根据官网推荐使用的清华源。

  1. 下载

    官网下载地址:官网下载

    1575381612542

    • 这样选择的版本可以使用于大部分 hadoop版本

    点击上述链接,根据跳转的页面提示选择清华源下载:

    注意,版本号可能发生变化,建议打开上述官网链接查看当前存在的版本。如我查看到只支持2.4.7版本(2020/09/17),那么需修改下面版本号:2.4.4-->2.4.7

    1
    sudo wget -O spark-2.4.7-bin-without-hadoop.tgz http://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.4.7/spark-2.4.7-bin-without-hadoop.tgz  # 版本号发生变化记得替换,下同
  2. 解压

    同前解压到 /usr/local 目录下

    1
    sudo tar -zxf spark-2.4.7-bin-without-hadoop.tgz -C /usr/local
  3. 设置权限

    1
    2
    3
    cd /usr/local   # 切换到解压目录
    sudo mv ./spark-2.4.7-bin-without-hadoop ./spark # 重命名解压文件
    sudo chown -R hadoop:hadoop ./spark # 设置用户hadoop为目录spark拥有者
  4. 配置spark环境

    先切换到 /usr/local/spark ,(为了防止没权限,下面用sudo

    1
    2
    cd /usr/local/spark
    cp ./conf/spark-env.sh.template ./conf/spark-env.sh

    编辑 spark-env.sh 文件 :

    1
    vim ./conf/spark-env.sh

    在第一行添加下面配置信息,使得Spark可以从Hadoop读取数据。

    1
    export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)
  5. 配置环境变量

    1
    vim ~/.bashrc

    .bashrc文件中添加如下内容:

    1
    2
    3
    4
    5
    6
    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk  # 之前配置的java环境变量
    export HADOOP_HOME=/usr/local/hadoop # hadoop安装位置
    export SPARK_HOME=/usr/local/spark
    export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.10.7-src.zip:$PYTHONPATH
    export PYSPARK_PYTHON=python3 # 设置pyspark运行的python版本
    export PATH=$HADOOP_HOME/bin:$SPARK_HOME/bin:$PATH

    最后为了使得环境变量生效,执行:

    1
    source ~/.bashrc
  6. 测试是否运行成功

    1
    2
    cd /usr/local/spark
    bin/run-example SparkPi

    执行会输出很多信息,也可以选择执行:

    1
    bin/run-example SparkPi 2>&1 | grep "Pi is"

    1579836510461

4.1.4 测试

  1. 启动pyspark

    1
    2
    cd /usr/local/spark
    bin/pyspark

    1579836544818

  2. 简单测试

    1
    >>> 8 * 2 + 5

    1579772128608

    使用exit() 命令可退出。

4.2 Hadoop+Spark 分布式环境搭建

4.2.1 Hadoop集群配置

Hadoop文件配置

我们需要修改hadoop配置文件。

  1. 切换目录

    配置文件在 /usr/local/hadoop/etc/hadoop 目录下:

    1
    cd /usr/local/hadoop/etc/hadoop

    1579834721166

  2. 修改文件 core-site.xml

    1
    vim core-site.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <configuration>
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoop/tmp</value>
    <description>Abase for other temporary directories.</description>
    </property>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://0.0.0.0:9000</value>
    </property>
    </configuration>

    :warning: 实际测试必须要 hdfs://0.0.0.0:9000 才能使用 hdfs 服务。

    :warning: 有可能依旧报错:Error JAVA_HOME is not set and could not be found -

    • 配置hadoop-env.sh

      1
      2
      cd /usr/local/hadoop/etc/hadoop
      vim hadoop-env.sh

      配置 JAVA_HOME 路径如下:

      1580121482205

  3. 修改hdfs-site.xml

    1
    vim hdfs-site.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <configuration>
    <property>
    <name>dfs.replication</name>
    <value>1</value>
    </property>
    <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
    </configuration>
集群启动测试
  1. 启动集群

    1
    2
    3
    cd /usr/local/hadoop
    bin/hdfs namenode -format # 注意,仅在第一次启动集群时使用该命令格式化!
    sbin/start-all.sh
  2. 测试

    1
    jps

    出现以下6个进程则配置成功:

    1579836734674

4.2.2 Spark集群配置

Spark配置
  1. 切换配置目录

    1
    cd /usr/local/spark/conf
  2. 配置 spark-env.sh 文件

    1
    cp spark-env.sh.template spark-env.sh

    开始编辑,添加下面内容:

    1
    vim spark-env.sh
    1
    2
    3
    export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)
    export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
    export SPARK_MASTER_IP=localhost
启动Spark集群

执行以下操作

  1. 先启动hadoop集群

    1
    2
    cd /usr/local/hadoop/
    sbin/start-all.sh
  2. 启动spark集群

    1
    2
    cd /usr/local/spark/
    sbin/start-all.sh

    运行 jps 命令可以看到:

    1579851551123

  3. web UI查看

    打开腾讯云控制台,选择VNC登陆服务器,在浏览器上输入:master:8080

    如果出现下面界面则表示 Hadoop+Spark 分布式环境搭建成功!

    1579791486348

    :warning: 如果前面一切正常,Web UI 却无法正常正常显示worker。

    查看slave节点相关spark日志发现报错:无法访问<master外网ip>:7070 ,多次连接失败。请尝试:

    • 关闭集群,重启启动集群,执行如下命令

      1
      2
      sbin/start-master.sh  # 先启动master
      sbin/start-slave.sh spark://<master内网ip>:7077 # 指定master内网ip启动slaves节点
    • 如果依旧不行,考虑:登陆控制台 —> 创建安全组(选择放通所有端口) —> 将master加入刚创建的安全组

    • 重新按第一步启动集群,一般都可以正常显示了

    相关的一些的讨论也可参考: issue#3 @trevery

    :tada: :tada: 聪明如你终于做到这步了,第一个实验完结,撒花 :tada: :tada: