Hadoop · 2020年4月30日

hadoop集群搭建完整教程

Apache Hadoop 是一个能够让用户轻松架构和使用的分布式计算框架,Hadoop 的强大之处在于它的离线数据处理,最重要的核心功能是数据的分布式海量存储。

一、分析

  1. 准备3台客户机(需要关闭防火墙、设置静态IP、修改主机名称);
  2. 给3台客户机安装SSH;
  3. 安装JDK1.8;
  4. 配置JDK环境变量;
  5. 安装 Hadoop;
  6. 配置 Hadoop 环境变量;
  7. 配置 Hadoop 集群;
  8. 启动 Hadoop 集群并进行简单测试。

二、软件准备

  1. 虚拟机:VMware® Workstation 15 Pro
  2. Linux 系统:CentOS-7-x86_64-Minimal-1804.iso
  3. JDK:jdk-8u241-linux-x64.tar.gz
  4. Hadoop:hadoop-2.7.7.tar.gz
  5. Xshell:Xshell 4

三、基本软件安装

1、虚拟机安装

关于虚拟机的安装可以在网上查找相关的教程进行安装。本文是设定你已经安装好虚拟机并且将虚拟机的防火墙关闭、设置静态IP、修改主机名、配置主机名和IP地址的映射。(建议这样做)

将其中一台虚拟机作为 master,一台虚拟机作为 slave01,另外一台作为 slave02。将这3台虚拟机设置处于同一局域网中。3台虚拟机可以相互 ping 对方的 IP 来测试它们之间的连通性。

在 Xshell 中使用 root 用户分别登录3台虚拟机(用户名使用 root,在练习或者测试环境可以这样使用,但最好不要这样用,以防在生产环境上操作失误造成重大损失。建议添加一个新用户如:hadoop)如在 master 节点主机上的 Xshell 中运行如下命令,测试是否能够成功连接到 slave01 节点主机:

ping slave01(也可以是你设置的静态IP地址)

如果出现下面信息,说明连接成功:

[root@master hadoop-2.7.7]# ping slave01
PING slave01 (192.168.108.5) 56(84) bytes of data.
64 bytes from slave01 (192.168.108.5): icmp_seq=1 ttl=64 time=0.574 ms
64 bytes from slave01 (192.168.108.5): icmp_seq=2 ttl=64 time=0.366 ms
......

为了能够在 Xshell 中区分3台虚拟机,建议修改其显示的主机名,执行如下命令:

# master 虚拟机上执行
systemctl set-hostname master
# slave01 虚拟机上执行
systemctl set-hostname slave01
# slave02 虚拟机上执行
systemctl set-hostname slave02

配置3台虚拟机主机名到IP的映射,修改3台虚拟机的 /etc/hosts 文件:

vi /etc/hosts
# 添加如下代码
192.168.108.4  master
192.168.108.5  slave01
192.168.108.6  slave02

2、配置 SSH 无密码登陆本机和访问集群虚拟机

3台虚拟机分别运行如下命令,测试是否连接到本地 localhost:

[root@master hadoop-2.7.7]# ssh localhost

如果登录成功则会显示如下信息:

Last login: Thu Apr 30 10:12:09 2020 from localhost

分别在3台虚拟机上使用如下命令生成 SSH 公钥:

# 生成 ssh 公钥
[root@master hadoop-2.7.7]# ssh-keygen -t rsa
# 将公钥分别发送到master、slave01、slave02虚拟机上
[root@master hadoop-2.7.7]# ssh-copy-id master
[root@master hadoop-2.7.7]# ssh-copy-id slave01
[root@master hadoop-2.7.7]# ssh-copy-id slave02

当你执行“ssh-copy-id master”命令时,需要你输入“yes”和密码

以上命令都是在 master 虚拟机上执行的,执行完毕后再使用如下命令检查现在从 master 主机登陆到 slave01、slave02 主机上是否需要输入密码:

[root@master hadoop-2.7.7]# ssh master
[root@master hadoop-2.7.7]# ssh slave01  #在 master 主机上登录到 slave01 主机上
Last login: Thu Apr 30 02:04:55 2020 from slave02
[root@slave01 ~]# hostname
slave01 # 成功登录到 slave01上
[root@master hadoop-2.7.7]# ssh slave02

3、JDK 和 Hadoop 安装

分别在 master 、slave01 和 slave02主机上安装 JDK 和 Hadoop,并配置系统环境变量。

安装JDK

  • 将 jdk-8u241-linux-x64.tar.gz 压缩包上传到 master 主机 /opt/software(如果没有此目录则创建该目录) 目录下;
  • 解压到 /opt/module 目录下:
[root@slave01 software]# tar -zxvf jdk-8u241-linux-x64.tar.gz -C /opt/module/
  • 配置JDK环境变量:
[root@slave01 software]# vi /etc/profile
# 在 /etc/profile 文件末尾添加如下代码:
# JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_241
export PATH=$PATH:$JAVA_HOME/bin
  • 使环境变量立即生效,执行如下代码:
[root@slave01 software]# source /etc/profile
  • 验证 JDK 是否安装成功,执行如下代码:
[root@slave01 software]# java -version # 输出如下信息则表示安装成功
java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)
  • 按照以上步骤安装 slave01、slave02虚拟机上的JDK。或者使用 scp 命令进行分发:
[root@slave01 module]# scp -r ./jdk1.8.0_241 slave01:/opt/module/
[root@slave01 module]# scp -r ./jdk1.8.0_241 slave02:/opt/module/
[root@master jdk1.8.0_241]# scp -r /etc/profile slave01:/etc/
[root@master jdk1.8.0_241]# scp -r /etc/profile slave02:/etc/
  • 分别在 slave01、slave02 主机上执行生效命令:source /etc/profile。则完成3台虚拟机JDK的安装。

安装 Hadoop

  • 和安装JDK类似,同样将 hadoop-2.7.7.tar.gz 安装包上传到 master 主机的/opt/software 目录下;
  • 解压到 /opt/module 目录下:
[root@master software]# tar -zxvf hadoop-2.7.7.tar.gz -C /opt/module/
  • 配置 Hadoop 环境变量:
[root@slave01 software]# vi /etc/profile
# 在 /etc/profile 文件末尾添加如下代码:
# HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
  • 使环境变量立即生效,执行如下代码:
[root@slave01 software]# source /etc/profile
  • 至此,hadoop 的安装已经完成,先别着急将 master 主机上 hadoop 安装包分发到 slave01 和 slave02 上,还需要配置hadoop文件。下面进入 hadoop 集群搭建。

四、Hadoop 集群搭建

修改 master 主机上的 hadoop 配置文件,这些配置文件都位于 $HADOOP_HOME/etc/hadoop 目录下。

1、集群配置

  • 先分别在 hadoop-env.sh、mapred-env.sh、yarn-env.sh 这3个文件中添加 JDK 路径,添加如下代码:
export JAVA_HOME=/opt/module/jdk1.8.0_241
  • 修改 slaves,把 datanode 的主机名,即 slave01、slave02,写入该文件中。这里让 master 节点仅作为 namenode 使用。
slave01
slave02
  • 修改 core-site.xml,添加如下代码:
<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-2.7.7/data/tmp</value>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
    </property>
</configuration>
  • 修改 hdfs-site.xml,添加如下代码:
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
</configuration>
  • 修改 mapred-site.xml(复制 mapred-site.xml.template,再修改文件名),添加如下代码:
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
  • 修改 yarn-site.xml,添加如下代码:
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>master</value>
    </property>
</configuration>
  • 配置好后,将 master 上的 /opt/module/hadoop-2.7.7 文件夹分发到slave01、slave02 节点上。在 master 节点主机上执行:
[root@master module]# cd /opt/module/
[root@master module]# scp -r ./hadoop-2.7.7 slave01:/opt/module/
[root@master module]# scp -r ./hadoop-2.7.7 slave02:/opt/module/
[root@master jdk1.8.0_241]# scp -r /etc/profile slave01:/etc/ # 将 profile文件发送到 slave01
[root@master jdk1.8.0_241]# scp -r /etc/profile slave02:/etc/ # 将 profile文件发送到 slave02

2、格式化集群并启动集群

在 master 主机上执行如下命令:

[root@master hadoop-2.7.7]# bin/hdfs namenode -format # 格式化集群
[root@master hadoop-2.7.7]# sbin/start-all.sh  #启动集群

运行后,在 master,slave01,slave02 运行 jps 命令,查看:

master 主机输出:

[root@master hadoop-2.7.7]# jps
6801 NameNode
7425 Jps
6997 SecondaryNameNode
7162 ResourceManager

slave01 节点输出:

[root@slave01 hadoop-2.7.7]# jps
3429 NodeManager
3319 DataNode
3564 Jps

slave02 节点输出:

[root@slave02 hadoop-2.7.7]# jps
3318 DataNode
3421 NodeManager
3565 Jps

至此,hadoop 集群搭建完毕。