1 简介

Apache Hadoop 是开源分布式存储 + 分布式计算大数据框架,核心由 HDFS、YARN、MapReduce 三大组件构成,面向海量离线批处理场景,适合 TB/PB 级 “一次写入、多次读取” 的数据处理。

1.HDFS(分布式文件系统):NameNode 管理元数据,DataNode 存放真实数据。

  • NameNode(NN,管理节点)
    保存元数据:目录树、文件名、权限、文件与 Block 映射;不存储真实业务数据。
    单点版本存在单点故障;HA 模式搭配 Standby NameNode、ZKFC、JournalNode 实现故障自动切换Apache Had…。
  • DataNode(DN,工作节点)
    存放切分后的真实数据块 Block(默认 128MB);定期上报心跳与块信息,执行读写、副本复制。
  • Client 客户端
    先访问 NameNode 获取元数据,直接和 DataNode 传输真实数据。
  • SecondaryNameNode
    辅助做元数据合并、Checkpoint,不能热切换顶替 NameNode。

在这里插入图片描述
✅ 写入流程(Write)

  1. Client 请求 NameNode 创建文件、分配 Block 存储位置
  2. Client 直连目标 DataNode 写入数据块
  3. DataNode 之间完成副本同步 Replication

✅ 读取流程(Read)

  1. Client 请求 NameNode,查询文件各个 Block 存放在哪些 DataNode
  2. Client 直接连接对应 DataNode 获取真实数据 Read

2.YARN:集群资源调度管理器,统一分配 CPU、内存,支持 Spark、Flink、MapReduce 多种计算引擎混跑。

  • ResourceManager(RM,全局主管理器)
    整个集群唯一的资源总调度中心:接收客户端任务提交、管理所有 NodeManager、分配资源、调度队列。
    普通版本存在单点故障;HA 模式配置 Active / Standby RM 实现高可用。
  • NodeManager(NM,节点代理,每台机器一个)
    每个计算节点上运行,负责本机资源管理:监控本机 CPU、内存;启动 / 销毁容器 Container;和 ResourceManager 保持心跳。
  • ApplicationMaster(AM,应用管理器)
    每个任务(Application)单独生成一个 AM。向 RM 申请资源,和 NM 通信启动执行容器,管控本任务运行、容错。
  • Container(资源容器)
    YARN 最小资源分配单元,封装 CPU、内存资源,真正运行计算任务。

在这里插入图片描述
✅ 工作流程

  1. Client 向 ResourceManager 提交作业
  2. ResourceManager 分配容器,启动 ApplicationMaster
  3. ApplicationMaster 向 ResourceManager 申请运行任务所需资源
  4. ResourceManager 根据各 NodeManager 上报的节点状态分配资源
  5. NodeManager 使用容器启动 MapTask、ReduceTask 等任务
  6. 任务运行期间持续上报任务状态,NodeManager 持续上报节点状态
  7. 作业全部任务执行完成,ApplicationMaster 释放占用资源

3.MapReduce:离线批计算编程模型,分为 Map 并行处理、Reduce 聚合结果两个阶段。

  • Input 输入分片:HDFS 上的文件按 Block 逻辑切分为输入分片,一个分片对应一个 Map 任务。
  • Map 阶段(映射)
    读取分片数据,自定义逻辑处理,输出 <key,value> 键值对;
    输出数据先写入本地磁盘(不是 HDFS),经过分区、排序、归并。
  • Shuffle 洗牌(Map → Reduce 中间过程,重中之重)
    分区数据通过网络传输到对应 Reduce 节点,完成分组排序,保证相同 key 的数据交给同一个 Reduce。
  • Reduce 阶段(归约)
    接收一组相同 key 的数据集,自定义聚合逻辑(求和、计数、去重等)。
  • Output 输出:最终结果写入 HDFS。

在这里插入图片描述

✅ 工作流程

  1. 输入文件进行分片,每个分片交由一个 map () 函数执行 Map 任务,输出键值对
  2. 对 Map 输出数据进行分区、排序、归并,相同 key 的数据分发至同一个 reduce ()
  3. reduce () 函数聚合处理分组数据,执行 Reduce 任务,最终产生输出文件

Hadoop VS MooseFS

特性MooseFS(MFS)Hadoop(HDFS)
接口FUSE,完整 POSIX,可直接 mount 挂载,普通程序无需改造非标准 POSIX,Java API/Shell 访问,不能直接挂载
核心定位通用分布式文件存储大数据配套存储,和计算引擎深度绑定
适用场景中小集群、小文件、共享存储、虚拟机镜像、媒体素材超大文件、离线日志分析、数据仓库、海量批计算
高可用Community 版单 Master,依赖 Pacemaker+SBD 实现 HA原生支持双 NameNode HA、Zookeeper 故障转移

2 单机伪分布式部署

官方文档:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html#Download
新建专用运行用户,部署 JDK 和 Hadoop 安装包、配置环境变量

[root@server1 ~]# useradd hadoop
[root@server1 ~]# passwd hadoop
[root@server1 ~]# mv hadoop-3.3.6.tar.gz jdk-8u181-linux-x64.tar.gz /home/hadoop/
[root@server1 ~]# su - hadoop
[hadoop@server1 ~]$ tar zxf hadoop-3.3.6.tar.gz
[hadoop@server1 ~]$ tar zxf jdk-8u181-linux-x64.tar.gz
[hadoop@server1 ~]$ ln -s hadoop-3.3.6 hadoop
[hadoop@server1 ~]$ ln -s jdk1.8.0_181 jdk
[hadoop@server1 ~]$ vim .bash_profile

在这里插入图片描述
workers 文件用来定义 DataNode 节点列表,伪分布式为 localhost

[hadoop@server1 ~]$ source .bash_profile
[hadoop@server1 ~]$ cd hadoop
[hadoop@server1 hadoop]$ cd etc/
[hadoop@server1 etc]$ cd hadoop/
[hadoop@server1 hadoop]$ cat workers

在这里插入图片描述
Hadoop 启动脚本必须知道 Java 路径,否则无法运行

[hadoop@server1 hadoop]$ vim hadoop-env.sh

在这里插入图片描述
bin/hadoop 是 Hadoop 的主入口命令脚本,整个 Hadoop 绝大多数功能都靠它调用

[hadoop@server1 hadoop]$ cd
[hadoop@server1 ~]$ cd hadoop
[hadoop@server1 hadoop]$ bin/hadoop

执行命令后显示bin/hadoop 命令的完整用法帮助说明
在这里插入图片描述
本地模式测试:不启动 HDFS,直接在单机本地跑 MapReduce,验证 jar 包、Java 环境是否正常

运行MapReduce官方示例

[hadoop@server1 hadoop]$ mkdir input
[hadoop@server1 hadoop]$ cp etc/hadoop/*.xml input
[hadoop@server1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar grep input output 'dfs[a-z.]+'
# 使用 Hadoop 自带的 grep MapReduce 示例程序,读取 input 目录里的配置文件,检索匹配 dfs[a-z.]+ 的字段,统计每个匹配词汇出现次数,最终结果自动生成到 output 目录
[hadoop@server1 hadoop]$ cd output/
[hadoop@server1 output]$ ls
[hadoop@server1 output]$ cat *

在这里插入图片描述
配置默认文件系统地址 hdfs://localhost:9000

[hadoop@server1 output]$ cd ..
[hadoop@server1 hadoop]$ cd etc/hadoop/
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@server1 hadoop]$ vim core-site.xml

在这里插入图片描述
配置文件副本数 dfs.replication=1(单机只能1副本)

[hadoop@server1 hadoop]$ vim hdfs-site.xml

在这里插入图片描述
配置免密

[hadoop@server1 hadoop]$ ssh-keygen
[hadoop@server1 hadoop]$ ssh-copy-id localhost
[hadoop@server1 hadoop]$ ssh localhost
# 切记 ctrl+d 退出!

初始化HDFS元数据,仅首次部署执行

[hadoop@server1 hadoop]$ cd ../..
[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ bin/hdfs namenode -format

在这里插入图片描述
一键启动 NameNode + DataNode,拉起HDFS分布式文件系统

[hadoop@server1 hadoop]$ sbin/start-dfs.sh

在这里插入图片描述
有警告,只需远程连接一下 server1 即可

[hadoop@server1 hadoop]$ ssh server1
[hadoop@server1 ~]$ logout

查看正在运行的 Java 进程

[hadoop@server1 hadoop]$ jps

在这里插入图片描述
查看本机 TCP 端口监听情况,均正常

[hadoop@server1 hadoop]$ netstat -antlp
  1. 9000(tcp 127.0.0.1:9000) → PID 32023 NameNode
    HDFS 默认通信端口(fs.defaultFS 使用的端口,客户端、DataNode 和 NameNode 交互)
  2. 9864 / 9866 → DataNode 内置监听端口
  3. 9867 / 9868 → SecondaryNameNode 端口
  4. 9870 → NameNode WebUI 端口(浏览器访问:http://server1:9870 查看 HDFS 管理页面)

在这里插入图片描述
访问前端网页
在这里插入图片描述
创建目录/user在分布式 HDFS 上,不是本地磁盘

[hadoop@server1 hadoop]$ pwd
/home/hadoop/hadoop
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user

在这里插入图片描述
在刚才建好的 /user 下,继续创建 /user/hadoop 目录

[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop

点击 user 即可看见
在这里插入图片描述
创建目录 /user/hadoop/input,用来存放 MR 任务的输入数据源,上传文件

[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir input
[hadoop@server1 hadoop]$ bin/hdfs dfs -put etc/hadoop/*.xml input
# 本地 etc/hadoop/ 下所有 .xml 配置文件,上传到 HDFS 的 /user/hadoop/input 目录里
[hadoop@server1 hadoop]$ bin/hdfs dfs -ls input

在这里插入图片描述
前端可以看见此目录
在这里插入图片描述
调用 hadoop 自带示例 jar,运行 WordCount 单词统计 MapReduce 程序:读取 HDFS /user/hadoop/input 里所有文件,分词统计每个单词出现次数,结果输出到 HDFS /user/hadoop/output

[hadoop@server1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount input output
[hadoop@server1 hadoop]$ bin/hadoop fs -cat output/*

在这里插入图片描述

区分:

  • 本地模式测试的input、output:在 Linux 本机磁盘(hadoop 安装目录下,本地文件夹),不需要启动 HDFS,ls 本地目录就能看见
  • 伪分布式的input、output: 在 HDFS 分布式文件系统,完整路径 /user/hadoop/input、/user/hadoop/output,只能用 bin/hdfs dfs -ls 查看,在服务器本地直接 ls 看不到这个 output 文件夹,在前端网页可以查看
    在这里插入图片描述
    在这里插入图片描述

关闭 HDFS 整个集群,依次停止三个进程

[hadoop@server1 hadoop]$ sbin/stop-dfs.sh
[hadoop@server1 hadoop]$ jps

在这里插入图片描述

2 多节点完全分布式部署

官方文档:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html#Download
新开虚拟机 server2 和 server3 ,添加解析,并进行时间同步

vim /etc/hosts

在这里插入图片描述
三个节点需要有相同的用户,uid 和 gid 都要相同
注意:不要随便修改用户的 uid 和 gid,会出现权限失效、看不见文件、读写报错、程序找不到数据的情况
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
三台机器均安装 nfs 用于共享数据

yum install -y nfs-utils

配置NFS共享目录,把远端访问权限映射为 hadoop,多节点挂载 /home/hadoop 共享目录时,客户端操作文件,归属人自动映射为服务端 hadoop 用户(uid=1000)
避免挂载后文件属主变成 nobody,出现权限报错、Hadoop 读写失败

[root@server1 ~]# vim /etc/exports

在这里插入图片描述
启动并开机自启NFS服务,查看本机对外发布的NFS共享目录

[root@server1 ~]# systemctl enable --now nfs
[root@server1 ~]# showmount -e

在这里插入图片描述
在 server2 查询 server1 上发布了哪些 NFS 共享目录

[root@server2 ~]# echo 123456 |passwd --stdin hadoop
# 最好每个节点密码相同
[root@server2 ~]# showmount -e server1

在这里插入图片描述
server3
在这里插入图片描述
server2 和 server3 挂载,共享文件

mount 192.168.40.141:/home/hadoop/ /home/hadoop/

在这里插入图片描述
在这里插入图片描述
server1 远程连接各节点,保证/etc/hosts解析正常,ssh 端口互通,所有节点 hadoop 用户密码有效,可以正常登录
在这里插入图片描述
指定整个集群默认文件系统为 server1 上端口 9000 的 HDFS

[hadoop@server1 ~]$ cd hadoop/etc/hadoop/
[hadoop@server1 hadoop]$ vim core-site.xml

在这里插入图片描述
存 2 份副本

[hadoop@server1 hadoop]$ vim hdfs-site.xml

在这里插入图片描述
定义集群中所有 DataNode(数据节点)主机名,启动脚本会远程在这些机器拉起 DataNode 进程

[hadoop@server1 hadoop]$ vim workers

在这里插入图片描述
初始化 HDFS 文件系统,生成 NameNode 元数据,仅首次搭建执行

[hadoop@server1 hadoop]$ cd ../..
[hadoop@server1 hadoop]$ bin/hdfs namenode -format

在这里插入图片描述
执行脚本一键启动 HDFS 集群(NameNode + 所有 workers 里配置的 DataNode)

[hadoop@server1 hadoop]$ sbin/start-dfs.sh

在这里插入图片描述
在前端可看到两个存活的节点
在这里插入图片描述
依旧使用官方示例测试

[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir /user/hadoop
[hadoop@server1 hadoop]$ bin/hdfs dfs -mkdir input
[hadoop@server1 hadoop]$ bin/hdfs dfs -put etc/hadoop/*.xml input

在这里插入图片描述
文件的数据块(Block 0)一共有 2 个副本,分别保存在 server2、server3 两台数据节点上
在这里插入图片描述
配置 MapReduce 运行调度框架为 YARN,并指定任务运行所需类库路径

[hadoop@server1 hadoop]$ vim etc/hadoop/mapred-site.xml

在这里插入图片描述
开启 MapReduce 所需的 shuffle 服务,配置 NodeManager 可传递至任务容器的环境变量白名单

[hadoop@server1 hadoop]$ vim etc/hadoop/yarn-site.xml

在这里插入图片描述
一键启动 YARN 集群(ResourceManager + 各节点 NodeManager)

[hadoop@server1 hadoop]$ sbin/start-yarn.sh

在这里插入图片描述

server2 和 server3 上也会开启 NodeManager
在这里插入图片描述
在这里插入图片描述
访问http://192.168.40.141:8088/ ResourceManager 前端监控界面,查看任务、节点资源
在这里插入图片描述

3 在线扩容

新开虚拟机 server4,各个节点同步解析,并进行时间同步

[root@server4 ~]# useradd hadoop
# 还是要保证 uid 和 gid 与其他节点相同
[root@server4 ~]# yum install -y nfs-utils
[root@server4 ~]# mount 192.168.40.141:/home/hadoop/ /home/hadoop/

所有节点之间相互免密
在这里插入图片描述

[root@server4 ~]# su - hadoop
[hadoop@server4 ~]$ cd hadoop
[hadoop@server4 hadoop]$ vim etc/hadoop/workers

在这里插入图片描述
后台独立启动当前节点的 DataNode 数据存储进程和 NodeManager 资源管理进程

[hadoop@server4 hadoop]$ bin/hdfs --daemon start datanode
[hadoop@server4 hadoop]$ bin/yarn --daemon start nodemanager

在这里插入图片描述
在这里插入图片描述
HDFS 文件副本数量改为3

[hadoop@server4 hadoop]$ vim etc/hadoop/hdfs-site.xml

在这里插入图片描述

更多推荐