文章目录

  • 前言
  • 1. Hadoop 集群搭建模式
  • 2. 伪分布式集群搭建环境准备
  • 2.1 SSH免密登录设置
  • 2.2 Java 环境准备
  • 2.3 Hadoop环境准备
  • 2.4 其他环境准备
  • 3. Hadoop初始配置
  • 3.1 创建Hadoop用户
  • 3.2 创建目录
  • 3.3 认识Hadoop相关配置文件
  • 3.3.1 配置文件的优先级
  • 3.3.2 配置Hadoop守护进程环境变量
  • 3.3.3 配置Hadoop核心属性(core-site.xml)
  • 3.3.4 配置Mapreduce(mapred-site.xml)
  • 3.3.5 配置Yarn(yarn-site.xml)
  • 3.3.6 配置HDFS(hdfs-site.xml)
  • 4. 操作集群
  • 4.1 格式化集群
  • 4.2 启动HDFS与YARN集群
  • 4.3 关闭HDFS与YARN集群
  • 5. 伪分布式集群虚拟机环境
  • 总结


前言

为了保证应用高可用性,一般我们都会搭建一个应用的集群环境,这样即使其中一个应用出现故障,集群中的其他应用仍可继续对外提供访问。本章将介绍如何安装和配置一个伪分布式集群。

以下是本章主要内容:

  • hadoop环境准备
  • 搭建一个简单的伪分布式Hadoop集群
  • 操作hadoop集群
  • 使用hadoop运行测试程序

1. Hadoop 集群搭建模式

官方给我们提供了三种安装Hadoop集群的方式如下图所示:

hadoop伪分布式jps只有一个jps进程 运行hadoop伪分布式实例_分布式

  • 单机模式(Standalone )

hadoop默认情况是以非分布式单机方式运行的,所有的Hadoop服务都是运行在一个JVM虚拟机上,这种模式下Hadoop采用操作系统本地文件而不是HDFS(Hadoop File System)进行数据的存储。此种模式适合开发人员进行代码测试工作。

  • 伪分布式(Pseudo-Distributed )

此模式可以模拟真实的多节点集群,可以让Hadoop守护进程(DataNode、NameNode和ResourceManager)运行在单一服务器上,但这也意味着这种单节点的Hadoop集群无法保证高可用性与数据的安全性,生产环境不推荐使用。

  • 全分布式(Fully-Distributed)

Hadoop守护进程(DataNode、NameNode和ResourceManager)在不同的机器上运行着,这种模式可以保证Hadoop集群的高可用性、数据安全性。常应用在生产环境中。

2. 伪分布式集群搭建环境准备

在实际安装集群前,必须满足如下要求,才能够成功在Linux环境下安装软件。

2.1 SSH免密登录设置

Hadoop应用提供了很多脚本用来管理和维护Hadoop守护进程,这其中就用了SSH登录相关命令,所以这里需要配置一个免密登录localhost的配置,具体步骤如下:

  • 生成SSH密钥
## 生成密钥命令:ssh-keygen -t rsa
[root@hadoop104 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:81ORH1ajaBDTFlQPo+yWLWTVXzeVe9QWooqqYbSbRr4 root@hadoop104
The key's randomart image is:
+---[RSA 2048]----+
|         ++oo*.oB|
|          +o=.*=B|
|          .Oo.o+*|
|        . * o+ oo|
|   .   .S. =... .|
|  ... .  o...    |
|  o+ .    o      |
|  .o=      .     |
|  .E.            |
+----[SHA256]-----+
  • 拷贝公钥
## 将公钥拷贝到~/.ssh/authorized_keys 下
[root@hadoop104 ~]# ssh-copy-id root@localhost
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:YjPIJdatopqmPsZtdK/5JyTSgahk7tdP+QIuLbuw81U.
ECDSA key fingerprint is MD5:02:6f:99:e3:62:3b:e1:28:d8:05:34:70:dc:d3:99:89.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@localhost's password:
## 输入用户名与密码
Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@localhost'"
and check to make sure that only the key(s) you wanted were added.
  • 使用ssh免密登录本地
## 免密登录
[root@hadoop104 ~]# ssh root@localhost
Last login: Wed Sep 28 12:08:58 2022 from 192.168.10.1
## 退出当前连接
[root@hadoop104 ~]# exit
logout
Connection to localhost closed.
[root@hadoop104 ~]#

2.2 Java 环境准备

hadoop 3.x版本目前要求最低的JDK版本为1.8版本,所以这里我们在服务器配置一下JDK环境即可:

hadoop伪分布式jps只有一个jps进程 运行hadoop伪分布式实例_java_02


这里可以直接访 oracle 官网 直接下载JDK8,也可以使用我提供的百度云网址如下:

链接:https://pan.baidu.com/s/10e19hoiDjW61rHrhh-KtBQ?pwd=zyk5
提取码:zyk5

然后将JDK安装包上传到Linux服务器上,解压并配置Java环境变量。具体操作步骤如下:

  • 创建目录
# 1. 创建安装包保存路径与解压安装包路径
[root@hadoop104 ~]# mkdir -p /soft/{service,packages}
  • 上传安装包
    - 解压安装包
# 解压到指定目录
[root@hadoop104 packages]# tar -zxvf jdk-8u341-linux-x64.tar.gz -C /soft/service/
  • 配置环境变量
[root@hadoop104 ~]# vim /etc/profile.d/java.sh

编辑环境脚本内容如下:

hadoop伪分布式jps只有一个jps进程 运行hadoop伪分布式实例_hadoop_03

## 刷新环境变量
[root@hadoop104 ~]# source /etc/profile
## 验证JDK环境
[root@hadoop104 ~]# java -version
java version "1.8.0_341"
Java(TM) SE Runtime Environment (build 1.8.0_341-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.341-b10, mixed mode)
[root@hadoop104 ~]#

2.3 Hadoop环境准备

## 设置Hadoop环境变量
[hdfs@hadoop104 hadoop]$ vim /etc/profile.d/hadoop.sh

hadoop伪分布式jps只有一个jps进程 运行hadoop伪分布式实例_大数据_04

2.4 其他环境准备

  • 安装epel-release
yum install -y epel-release
  • 安装vim
yum install -y vim*
  • 安装 net-tools
yum install -y net-tools
  • 同步时间
yum install -y ntpdate
ntpdate ntp4.aliyun.com
  • 停用防火墙
systemctl stop firewalld
## 查看防火墙状态
firewall-cmd --state

3. Hadoop初始配置

首先我们需要从官网上下载Hadoop安装包,这里选用3.1.4版本进行安装。

cd /soft
 wget https://archive.apache.org/dist/hadoop/common/hadoop-3.1.4/hadoop-3.1.4.tar.gz

解压安装包:

## 将hadoop3.1.4安装包解压到/soft/service 目录下
[root@hadoop104 packages]# tar -zxvf hadoop-3.1.4.tar.gz -C /soft/service/

配置Hadoop环境变量:

export HADOOP_HOME=/soft/service/hadoop-3.1.4
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

验证hadoop是否安装成功:

## 查看hadoop安装版本
[root@hadoop104 hadoop-3.1.4]# hadoop version

输出如下结果则Hadoop安装成功

hadoop伪分布式jps只有一个jps进程 运行hadoop伪分布式实例_hdfs_05

3.1 创建Hadoop用户

hadoop每个关键的守护进程都需要造单独的用户下运行,所以这里创建三个用户用来对应不同的hadoop守护进程:

用户

说明

yarn

用来管理ResourceManager服务

mapred

用来管理MapReduce服务

hdfs

用来管理HDFS文件系统

## 创建hadoop组
[root@hadoop104 packages]# groupadd hadoop
## 创建yarn用户
[root@hadoop104 packages]# useradd -g hadoop yarn
## 创建hdfs用户
[root@hadoop104 packages]# useradd -g hadoop hdfs
## 创建mapred用户
[root@hadoop104 packages]# useradd -g hadoop mapred

3.2 创建目录

在Hadoop中我们需要明确 NameNodeSecondaryNameNodeDataNode 的数据目录以及日志目录,下面创建以下目录

  • 创建NameNode数据目录
mkdir -p /soft/data/hadoop/hdfs/nn
  • 创建SecondaryNameNode数据目录
mkdir -p /soft/data/hadoop/hdfs/snn
  • 创建DataNode数据目录
mkdir -p /soft/data/hadoop/hdfs/dn
  • 授权目录给hdfs用户
chown -R  hdfs:hadoop /soft/data/hadoop/
  • 创建yarn用户日志目录
mkdir -p /soft/log/hadoop/logs
  • 授权目录给yarn用户
chown -R  yarn:hadoop /soft/log/hadoop/

3.3 认识Hadoop相关配置文件

Hadoop使用了多个配置文件,且每一个都会影响集群操作的不同方面,如HDFS操作、Yarn操作、MapReduce操作,每一个操作都有与之对应的配置文件,这些配置文件基本上都是XML格式的,Hadoop的配置文件有很多参数,如果没有自定义配置参数的值,大部分都会使用默认值,总的来说Hadoop中一共有以下类型的配置文件:

  • 环境变量文件
  • hadoop伪分布式jps只有一个jps进程 运行hadoop伪分布式实例_java_06

  • Hadoop为启动和停止Hadoop应用提供了以上三个环境变量脚本,其中 hadoop-env.sh用来设置hadoop运行环境相关的配置mapred-env.sh用来指定mapReduce操作环境相关配置、yarn-env.sh是用来指定yarn使用的环境变量的值。
  • 默认配置文件

    默认配置文件如上,顾名思义当我们没有在自定义配置文件中配置参数对应的值,则默认以xx.default.xml配置的值为准,否则以自定义xx.site的值为准,下面介绍每个配置文件的作用:
  • core-default.xml:hadoop核心配置文件,可以在core-site.xml中设置变量来覆盖此文件的默认配置值。
  • hdfs-default.xml :HDFS相关服务的默认配置文件,可以设置hdfs-site.xml覆盖此文件中的默认配置值。
  • yarn-default.xml:YARN默认配置文件,可以设置yarn-site.xml覆盖此文件中默认配置值。
  • mapred-default.xml:MapReduce默认配置文件,可以设置mapred-site.xml覆盖此文件中默认配置值。
  • site专用配置文件
  • hadoop伪分布式jps只有一个jps进程 运行hadoop伪分布式实例_分布式_07

  • site自定义配置文件是我们在实际中需要经常打交道的配置文件,此类型文件设置的值会默认覆盖xx-default.xml中配置的默认值。

3.3.1 配置文件的优先级

主节点上的 hdfs-site.xmlyarn-site.xmlhdfs-default.xmlyarn-default.xml 并不是唯一可以配置HDFSYARN的方法,假设已经在hdfs-site.xml文件中将:dfs.replication参数设置值为3,即设置文件副本个数为6。如果在客户端的代码中配置了此参数的值为6。实际上文件上传后文件副本个数为3,在Hadoop中配置文件参数的优先级从大到小如下:

hadoop伪分布式jps只有一个jps进程 运行hadoop伪分布式实例_java_08


如果有时候并不希望客户端修改配置的参数值,即让上图中优先级为4服务器自定义配置文件参数值优先级最高,例如我们设置文件副本个数为3,客户端不可修改。只需要在hdfs-site.xml中这样配置:

<property>
    <name>fs.replication</name>
    <value>3</value>
    <final>true</final>
  </property>

如果在生产开发中,遇到了有些参数客户端不可修改的需求时,这个时候就可以将参数标记为final即可。

3.3.2 配置Hadoop守护进程环境变量

hadoop中默认为我们设置了 hadoop-env.shmapred-env.shyarn-env.sh,可以使用如下参数配置每个hadoop守护程序:

参数

说明

YARN_RESOURCEMANAGER_OPS

设置ResourceManager JVM变量值

YARN_NODEMANAGER_OPS

设置NodeManagerJVM变量值

HADOOP_NAMENODE_OPS

设置NameNode JVM变量值

HADOOP_DATANODE_OPS

设置DataNode JVM变量值

HADOOP_SECONDARYNAMENODE_OPS

设置SecondaryNameNodeJVM变量值

例如设置上述每一个守护进程最大堆内存大小为2g:

YARN_RESOURCEMANAGER_OPS = Xmx2g
YARN_NODEMANAGER_OPS = Xm2g
HADOOP_NAMENODE_OPS = Xmx2g
HADOOP_DATANODE_OPS = Xmx2g
HADOOP_SECONDARYNAMENODE_OPS = Xmx2

3.3.3 配置Hadoop核心属性(core-site.xml)

  • fs.defaultFS

设置文件系统的名称以及NameNode所在主机和端口信息:

<property>
   <name>fs.defaultFS</name>
   <value>hdfs://hadoop104:8020</value>
</property>
  • hadoop.http.staticuser.user

设置操作hdfs为用户为hdfs:

<property>
  <name>hadoop.http.staticuser.user</name>
  <value>hdfs</value>
</property>
  • hadoop.tmp.dir

设置hadoop本地数据存储目录:

<property>
   <name>hadoop.tmp.dir</name>
   <value>/soft/data/hadoop/tmpDir</value>
</property>
  • fs.trash.interval

设置Hadoop文件存储在垃圾箱中的时间,默认值为0,即永久删除被删除的所有文件库,这里我们默认设置1440分钟(1天)

<property>
  <name>fs.trash.interval</name>
  <value>1440</value>
</property>

3.3.4 配置Mapreduce(mapred-site.xml)

  • mapreduce.framework.name

设置hadoop使用YARN作为执行MapReduce的框架。

<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
 </property>
  • yarn.app.mapreduce.am.env

指定mapruce APP MASTER 环境变量

<property>
    <name>yarn.app.mapreduce.am.env</name>
    <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
  </property>
  • mapreduce.map.env

指定mapreduce Reuce Task 环境变量

<property>
    <name>mapreduce.map.env</name>
    <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
  </property>
  • mapreduce.reduce.env

指定mapreduce Reuce Task 环境变量

<property>
    <name>mapreduce.reduce.env</name>
     <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
  </property>

3.3.5 配置Yarn(yarn-site.xml)

  • yarn.nodemanager.aux-services

此属性可以让NodeManager指定MapReduce容器从map任务到reduce任务所需要执行的shuffle操作,只有设置了这个值才可以运行MapReduce任务。

<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  • yarn.nodemanager.aux-services.mapreduce_shuffle.class

设置YARN使用这个设置值对应的类执行shuffle操作

<property>
    <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </property>
  • yarn.nodemanager.resource.memory-mb

设置YARN在每一个节点消耗的总内存值单位MB

<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>2048</value>
  </property>
  • yarn.scheduler.minimum-allocation-mb

设置每一个启动的容器节点最小内存单位MB

<property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>512</value>
  </property>
  • yarn.scheduler.maximum-allocation-mb

设置每一个启动容器最大的内存单位MB

<property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>1024</value>
  </property>
  • yarn.nodemanager.vmem-pmem-ratio

设置容器虚拟内存与真实物理内存直接比率

<property>
    <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>2</value>
  </property>

3.3.6 配置HDFS(hdfs-site.xml)

  • dfs.namenode.secondary.http-address

设置SecondaryNameNode运行主机和端口

<property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>hadoop104:9868</value>
  </property>
  • dfs.replication

此参数配置默认的文件块数量为3,但我们这里搭建伪分布式所以需要设置为1

<property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  • dfs.datanode.data.dir

设置DataNode数据快本地存储目录

<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/soft/data/hadoop/hdfs/dn</value>
  </property>
  • dfs.namenode.name.dir

设置NameNode核心文件如fsimage如edit日志文件存储位置,只有NameNode服务可以读取和写入这些文件。

<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/soft/data/hadoop/hdfs/nn</value>
  </property>
  • dfs.namenode.checkpoint.dir

指定SecondaryNameNode存储元数据文件位置

<property>
    <name>dfs.namenode.checkpoint.dir</name>
    <value>file:/soft/data/hadoop/hdfs/snn</value>
  </property>

4. 操作集群

上面的配置文件配置好了,接下来就是来启动集群了,不过在正常启动集群前还需要进一步操作

4.1 格式化集群

使用hdfs用户执行NameNode格式化,需要注意的是NameNode的格式化只需要做一次就够了。

[hdfs@hadoop104 hadoop]$ hdfs namenode -format

执行完后如果有下图 successfully format 字样,则表明格式化成功

hadoop伪分布式jps只有一个jps进程 运行hadoop伪分布式实例_大数据_09


可以看到在 /soft/data/hadoop/hdfs/nn 目录下已经有格式化好的current文件夹如下所示:

hadoop伪分布式jps只有一个jps进程 运行hadoop伪分布式实例_hdfs_10

4.2 启动HDFS与YARN集群

  • 启动NameNode
hdfs --daemon start namenode
  • 启动DataNode
hdfs --daemon start secondarynamenode
  • 启动SecondaryNameNode
hdfs --daemon start secondarynamenode
  • 启动ResourceManager
yarn --daemon start resourcemanager
  • 启动NodeManager
yarn --daemon start nodemanager

查看进程:

hadoop伪分布式jps只有一个jps进程 运行hadoop伪分布式实例_java_11


访问HDFS管理端地址:http://192.168.10.128:9870/管理端首页如下:

hadoop伪分布式jps只有一个jps进程 运行hadoop伪分布式实例_java_12


访问 Yarn管理端地址:http://192.168.10.128:8088/cluster

hadoop伪分布式jps只有一个jps进程 运行hadoop伪分布式实例_hadoop_13

4.3 关闭HDFS与YARN集群

  • 启动NameNode
hdfs --daemon stop namenode
  • 启动DataNode
hdfs --daemon stop secondarynamenode
  • 启动SecondaryNameNode
hdfs --daemon stop secondarynamenode
  • 启动ResourceManager
yarn --daemon stop resourcemanager
  • 启动NodeManager
yarn --daemon stop nodemanager

5. 伪分布式集群虚拟机环境

链接:https://pan.baidu.com/s/1MdUQp96yiR9EnFknhGekKQ?pwd=id4n
提取码:id4n

总结

本文中我们使用一台机器完成了Hadoop的伪分布式集群部署,在实际的生成活动中,此种模式只能用于开发人员进行测试使用,下一章将介绍如何搭建一个Hadoop的完全分布式集群,敬请期待。