第三课 Hadoop 三大核心组件笔记
1️⃣ HDFS(Hadoop Distributed File System)分布式文件系统 架构
- NameNode:存储文件的元数据,包括文件名、目录结构、文件属性(生成时间、副本数、权限),以及每个文件的块列表和块所在的 DataNode。不存储实际数据,只管理文件系统的命名空间。
- DataNode:在本地文件系统存储文件块数据,以及块数据的校验和。负责处理客户端的读写请求,并定期向 NameNode 汇报块信息。
- Secondary NameNode:定期对 NameNode 的元数据进行备份,合并编辑日志(Edits)和镜像文件(FsImage),以辅助 NameNode 恢复。注意:它并非 NameNode 的热备节点,而是一个检查点服务。
2️⃣ MapReduce 分布式计算框架
核心思想是 将大规模数据处理任务拆分为两个阶段:
- - Map 阶段:对输入数据进行分片处理,每个分片由一个 Map 任务并行处理,生成中间键值对 (key, value)。
- - Shuffle 阶段:将 Map 输出的中间结果按照 key 进行分区、排序、合并,分发到对应的 Reduce 节点。
- - Reduce 阶段:对map结果进行汇总。对相同 key 的中间值进行聚合计算,生成最终结果并输出。
3️⃣ YARN(Yet Another Resource Negotiator)资源调度与管理系统 架构概述
- ResourceManager(RM):全局资源管理器,整个集群资源(内存、cpu等)的老大。处理客户端请求,启动和监控 ApplicationMaster。
- NodeManager(NM):单个节点服务器资源老大。每个节点上的代理,负责管理该节点上的资源和容器(Container)。定期向 RM 汇报节点健康状况和资源使用情况。
- ApplicationMaster:单个任务运行的老大。(1)负责数据的切分;(2)为程序应用申请资源并分配内部任务;(3)任务监控与容错。
- Container.容器,相当于一台独立的服务器,里面封装了任务运行所需要的资源,如内存、cpu、磁盘、网络等。
说明:客户端可以有多个;集群上可以运行多个ApplicationMaster;每个NodeManager上可以有多个Container。
核心作用:解耦了资源管理和任务调度,使得 Hadoop 可以运行多种计算框架(MapReduce、Spark、Flink 等),而不仅仅是 MapReduce。
Hadoop安装环境
一、启动Docker容器
1.加载镜像
实验使用的Docker镜像保存在/cg/images/hadoop_node.tar.gz文件中,执行如下命令加载该镜像:
docker load < /cg/images/hadoop_node.tar.gz用来将一个docker镜像从/cg/images/hadoop_node.tar.gz压缩包加载到本地docker环境中。
启动实验容器
打开终端通过实验环境的用户查看docker网卡的IP地址,如果获取到的IP是172.18.0.1/16的IP地址,可以执行以下命令创建容器,如果获取到的是172.17.0.1/16,就需要把下列命令当中的172.18的地方修改为172.17,否则后续hosts文件会错乱。
以下 4 条 Docker 命令用于创建并启动 1 个主节点(master)+3 个从节点(slave1/slave2/slave3)的 Hadoop 集群容器,每条命令为节点配置固定 IP、主机名映射、系统权限、目录挂载,并自动执行服务启动脚本,最终形成可直接使用的 Hadoop 分布式环境。
docker run --name master --privileged --ulimit nofile=65535:65535 --hostname master --ip 172.18.0.2 --add-host=slave1:172.18.0.3 --add-host=slave2:172.18.0.4 --add-host=slave3:172.18.0.5 -itd -v /cgsrc:/cgsrc:ro -v /headless/course/:/course hadoop_node /service_start.sh docker run --name slave1 --privileged --ulimit nofile=65535:65535 --hostname slave1 --ip 172.18.0.3 --add-host=master:172.18.0.2 --add-host=slave2:172.18.0.4 --add-host=slave3:172.18.0.5 -itd -v /cgsrc:/cgsrc:ro hadoop_node /service_start.sh docker run --name slave2 --privileged --ulimit nofile=65535:65535 --hostname slave2 --ip 172.18.0.4 --add-host=master:172.18.0.2 --add-host=slave1:172.18.0.3 --add-host=slave3:172.18.0.5 -itd -v /cgsrc:/cgsrc:ro hadoop_node /service_start.sh docker run --name slave3 --privileged --ulimit nofile=65535:65535 --hostname slave3 --ip 172.18.0.5 --add-host=master:172.18.0.2 --add-host=slave1:172.18.0.3 --add-host=slave2:172.18.0.4 -itd -v /cgsrc:/cgsrc:ro hadoop_node /service_start.shdocker run 是 Docker 的核心指令,用于创建并启动新容器。--name 用于为容器设置自定义名称,方便后续管理与操作。--privileged 用于赋予容器最高系统权限,解决 Hadoop 运行时的资源访问限制。--ulimit nofile=65535:65535 用于提升容器最大文件打开数量,避免 Hadoop 因文件句柄不足导致服务异常。--hostname 用于设置容器内部主机名,是 Hadoop 集群识别节点的关键配置。--ip 用于为容器分配固定 IP 地址,保障集群节点间网络通信稳定可靠。--add-host 用于手动配置容器的 hosts 文件,实现主机名与 IP 地址的直接映射,无需依赖外部 DNS 服务。-itd 是三个参数的组合,i 表示保持标准输入打开,t 表示分配伪终端方便操作,d 表示容器后台运行不占用当前终端。-v 用于实现宿主机与容器之间的目录挂载,末尾的 ro 表示挂载目录为只读权限,保障宿主机数据安全。hadoop_node 是本次集群使用的 Docker 镜像名称,需要提前加载到本地环境。/service_start.sh 是容器启动后自动执行的脚本,用于一键启动 Hadoop 相关服务。
2.查看启动的docker
docker psdocker ps -a查看所有
3.启动docker start master
docker start slave1
docker start slave2
docker start slave3
4.进入容器
docker exec -it --privileged $NAME /bin/bash将命令中的$NAME替换为对应的容器名称即可,比如进入master容器可以使用命令:
docker exec -it --privileged master /bin/bash二、配置Hadoop环境
1.配置JAVA环境
Hadoop是基于Java语言开发的,因此需要安装Java环境。在这里仅介绍master的配置方法,slave1、slave2和slave3都需要按照下面的步骤配置Java环境!
先用docker exec -it --privileged master /bin/bash进入master;在容器master(root@mster /)中使用如下命令从资源文件夹/cgsrc中将JDK安装包复制到/usr/local/java目录下:
mkdir /usr/local/java cp /cgsrc/jdk-8u171-linux-x64.tar.gz /usr/local/java/我们接下来切换到/usr/local/java目录下,将安装包解压,并删除用过的tar文件。
cd /usr/local/java/ tar -zxvf jdk-8u171-linux-x64.tar.gz rm -f jdk-8u171-linux-x64.tar.gz此时/usr/local/java目录下仅有一个jdk1.8.0_171目录(ls查看),这就是Java主目录。
接下来需要配置JAVA_HOME环境变量,为了方便起见,这里直接在~/.bachrc这个文件中进行设置,采用这种配置方式时,只对当前登录的单个用户生效,当该用户登录以及每次打开新的Shell时,它的环境变量文件.bashrc会被读取。输入下面命令打开当前登录用户的环境变量配置文件.bashrc:(/中输入命令)
vim ~/.bashrc在文件最后面添加如下3行(o/i插入模式),然后Esc :wq保存退出vim:
export JAVA_HOME=/usr/local/java/jdk1.8.0_171 export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar export PATH=$PATH:${JAVA_HOME}/bin接下来让环境变量生效,执行如下代码:
source ~/.bashrc执行上述命令后,可以检验一下是否设置正确:
echo $JAVA_HOME #检验变量值 java -version #查看java版本输出如下即表明配置Java环境成功:
java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0_171-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)