hadoop基础知识分享(一)

写在前面

今天学习hadoop部分的知识。

Hadoop 概述

Hadoop 是一个适合海量数据的分布式存储和分布式计算的平台。Hadoop 的处理思想是“分而治之”。它起源于 Google 的三篇文章:Google FS(GFS),MapReduce,BigTable。Hadoop 主要包含三个核心组件:

  • HDFS(Hadoop Distributed File System):一个分布式存储框架,适合海量数据存储。
  • MapReduce:一个分布式计算框架,适合海量数据计算。
  • YARN(Yet Another Resource Negotiator):一个资源调度平台,负责给计算框架分配计算资源。

Hadoop 分布式搭建

  1. 关闭防火墙并设置所有节点名称和相关映射。
  2. 设置免密钥。
  3. 上传 Hadoop 安装包并解压。
  4. 配置环境变量。
  5. 修改配置文件。
  6. 同步文件。
  7. 格式化并启动(仅第一次需要格式化)。

分布式存储

HDFS 主从结构

HDFS 具有主从架构。HDFS 集群由单个名称节点(NameNode)和许多数据节点(DataNode)组成:

  • NameNode:主节点,管理文件系统名称空间并控制客户端对文件的访问。
  • DataNode:从节点,管理实际的数据存储。

介绍

在分布式存储系统中,分散在不同节点中的数据可能属于同一个文件。为了组织众多的文件,可以将文件放到不同的文件夹中,文件夹可以一级一级地包含。这种组织形式称为命名空间(namespace)。命名空间管理整个服务器集群中的所有文件。

主从结构

  • 主节点(NameNode):负责命名空间和文件的元数据管理。
  • 从节点(DataNode):负责存储实际的数据,数据以块(block)的形式进行存储。

用户操作时,客户端首先与主节点交互,查询数据存储位置,然后从相应的从节点读取数据。主节点将整个命名空间信息保存在内存中,因此需要更多内存来处理更多的文件。

块(Block)

  • 块(Block):为了管理不同大小的文件,HDFS 将文件分成块(默认大小为128MB),每个块存储在不同的 DataNode 上。
  • 副本(Replication):为了数据的安全性,HDFS 会将数据块备份到多个节点上,减少数据丢失或访问失败的概率。

分布式计算

YARN(Yet Another Resource Negotiator)

YARN 负责资源调度和管理,采用主从结构:

  • 主节点(ResourceManager):负责集群资源的分配与调度。
  • 从节点(NodeManager):负责单节点资源的管理(CPU 和内存)。

资源管理

  • ResourceManager:负责全局资源调度和管理。
  • NodeManager:管理节点资源,并执行容器中的任务。

Container

  • 定义:Container 是 YARN 中资源的抽象,封装了某个节点上一定量的资源(CPU 和内存)。
  • 作用:由 ApplicationMaster 向 ResourceManager 申请,并在 NodeManager 上运行。

MR(MapReduce)

MapReduce 是一个依赖磁盘 I/O 的批处理计算模型,也具有主从结构:

  • 主节点(MRAppMaster):负责接收客户端提交的计算任务,并将任务分配给 NodeManager 的 Container 中执行。
  • 从节点(Task):具体的计算任务。

Hadoop 命令

集群管理

  • 启动所有进程:
    start-all.sh
    
  • 停止所有进程:
    stop-all.sh
    
  • 启动 HDFS 和 YARN 相关进程:
    start-dfs.sh
    start-yarn.sh
    
  • 停止 HDFS 和 YARN 相关进程:
    stop-dfs.sh
    stop-yarn.sh
    

单独启动和停止进程

  • 启动 HDFS:
    hadoop-daemon.sh start (namenode | datanode)
    
  • 停止 HDFS:
    hadoop-daemon.sh stop (namenode | datanode)
    
  • 启动 YARN:
    yarn-daemon.sh start (resourcemanager | nodemanager)
    
  • 停止 YARN:
    yarn-daemon.sh stop (resourcemanager | nodemanager)
    

文件操作

  • 上传文件:
    hdfs dfs -put 本地路径 HDFS路径
    hdfs dfs -copyFromLocal 本地路径 HDFS路径
    
  • 下载文件:
    hdfs dfs -get HDFS路径 本地路径
    hdfs dfs -copyToLocal HDFS路径 本地路径
    
  • 创建目录:
    hdfs dfs -mkdir HDFS路径
    
  • 查看文件内容:
    hdfs dfs -cat HDFS路径
    hdfs dfs -tail HDFS路径
    hdfs dfs -tail -f HDFS路径  # 监听 HDFS 中的文件内容
    hdfs dfs -text HDFS路径
    

文件管理

  • 追加内容:
    hdfs dfs -appendToFile 本地路径 HDFS路径
    
  • 删除文件:
    hdfs dfs -rm -r -f HDFS路径
    
  • 复制文件:
    hdfs dfs -cp 源路径 目标路径
    
  • 重命名文件:
    hdfs dfs -mv 源路径 目标路径
    
  • 修改文件权限:
    hdfs dfs -chmod 735 目标路径
    hdfs dfs -chmod -R 735 目标路径
    
  • 查看存储空间:
    hdfs dfs -df
    hdfs dfs -du -h /
    

HDFS 相关概念

HDFS 架构 - 元数据

  • fsimage:元数据镜像文件,存储 NameNode 内存中的元数据信息。
  • edits:操作日志文件,记录新增的元数据日志。
  • fstime:保存最近一次 checkpoint 的时间。

这些文件保存在 Linux 文件系统中,路径由 hdfs-site.xmldfs.namenode.name.dir 属性指定。

SecondaryNameNode 的作用

  • 功能:帮助 NameNode 完成元数据信息的合并。
  • 工作流程
    1. SecondaryNameNode 向 NameNode 发起 Checkpoint 请求。
    2. 从 NameNode 获取 fsimage 和 edits。
    3. 合并 edits。
    4. 将新的 fsimage 发回给 NameNode。
    5. NameNode 用新的 fsimage 替换旧的 fsimage。

Checkpoint 发起时机

  • fs.checkpoint.period:指定两次 checkpoint 的最大时间间隔,默认 3600 秒。
  • fs.checkpoint.size:规定 edits 文件的最大值,一旦超过此值则强制 checkpoint,默认大小为 64MB。

HDFS 架构 - Block 存储

  • Block 大小:HDFS 1.0 版本的默认块大小为 64MB,2.0 版本及以后为 128MB。可以在 hdfs-site.xml 中通过 dfs.blocksize 属性配置块大小。

HDFS API 使用

  • 文件操作

    • create:写文件
    • open:读取文件
    • delete:删除文件
  • 目录操作

    • mkdirs:创建目录
    • delete:删除文件或目录
    • listStatus:列出目录的内容
    • getFileStatus:显示文件系统的目录和文件的元数据信息
    • getFileBlockLocations:显示文件存储位置

RPC 协议

  • 定义:RPC(Remote Procedure Call)是一种通过网络从远程计算机程序上请求服务的协议,无需了解底层网络技术。RPC 采用客户端/服务器模式,客户端发送请求,服务器处理请求并返回结果。

Hadoop是什么,有哪些组件,分别介绍一下?

Hadoop 是一个处理海量数据的分布式存储和分布式计算平台,主要包括三个核心组件:HDFS、YARN 和 MapReduce。它们起源于谷歌发布的三篇文章:GFS 对应 HDFS,BigTable 对应 HBase,MapReduce 对应 Hadoop 中的 MapReduce。

HDFS架构?HDFS原理?

HDFS(Hadoop Distributed File System)

HDFS 是 Hadoop 中的分布式文件存储系统,它会将每个文件以“分而治之”的思想来放到不同的数据节点中。HDFS 采用主从结构:

  • 主节点(NameNode):负责存储数据的元数据信息,例如文件的大小、文件的路径、文件的名字和时间等。
  • 从节点(DataNode):负责真实数据的存储,这个存储是基于块(Block)来进行的。在 Hadoop 2.0 版本之后,一个块的默认大小是 128MB,这样也就意味着一个文件可能会被拆成多个块,分别放到不同的从节点上,实现分布式存储。

如果需要读取这些数据,需要通过主节点来获取这些块的具体位置,组装好文件才能完整地读到 HDFS 中的文件。主节点也是用户进行读写数据请求的桥梁。当客户端有读写请求的时候,客户端会首先通过 RPC 协调来远程调用 NameNode 来获取一个数据列表,这个列表中存储了每个 DataNode 中每个块的具体信息。

DataNode 的信息由 NameNode 管理,NameNode 也可以存在多个。如果 HDFS 中的 NameNode 掉线,只有一个主节点会使整个数据都不能用。创建第二个 NameNode 可以减少数据不能用的可能。Hadoop 中的机制会在 NameNode 掉线之后,找一个空闲的 DataNode 来充当 NameNode 继续运作,当然,这样做如果没有多副本,这个空闲的 DataNode 中的数据就无法读取了。

HDFS 初始化命令?

hdfs namenode -format

Yarn启动后有什么进程?Yarn的架构?

YARN(Yet Another Resource Negotiator)

YARN 是用来进行资源的管理和任务调度的一个框架,主要用于协调每个组件之间的资源调度,使每个进程都可以顺利运作。YARN 启动后,主节点会有一个 ResourceManager,从节点上会有 NodeManager。

YARN 架构

  • 主节点(ResourceManager):负责整个 Hadoop 集群中的资源分配和任务的调度。
  • 从节点(NodeManager):负责自己节点上的资源任务调度。

Container是什么?

YARN 中的 Container 是资源的抽象,它封装了某个节点上一定量的资源(CPU 和内存)。Container 由 ApplicationMaster 向 ResourceManager 申请,由 ResourceManager 中的资源调度器异步分配给 ApplicationMaster。Container 的运行是由 ApplicationMaster 向资源所在的 NodeManager 发起的。

Block大小为什么是128M?

Block 大小

块的默认大小为 128MB。这样做是为了优化分布式存储和计算框架的性能,减少元数据开销,并提高数据本地性,从而提升整体系统的效率和吞吐量。如果块的大小设置为 1MB,会存在多个块,计算时读写效率会降低。如果块的大小设置为 1GB,但有多个 100MB 的文件,会生成多个存储容量为 1GB 的块,这样块文件的空间利用率会很低。若块的大小小于 1MB,一个 1MB 的文件也会分配一个 1GB 的块,导致空间浪费。

SecondaryNameNode的作用?

SecondaryNameNode 的作用是帮助 NameNode 完成元数据信息合并,从角色上看,属于 NameNode 的“秘书”。它的工作流程如下:

  1. SecondaryNameNode 向 NameNode 发起 Checkpoint 请求。
  2. SecondaryNameNode 从 NameNode 获得 fsimage 和 edits 文件。
  3. SecondaryNameNode 将 fsimage 载入内存,然后开始合并 edits。
  4. SecondaryNameNode 将新的 fsimage 发回给 NameNode。
  5. NameNode 用新的 fsimage 替换旧的 fsimage。

文件说明

  • fsimage:元数据镜像文件,存储某一时段 NameNode 内存中的元数据信息。
  • edits:操作日志文件,记录 NameNode 启动后新增的元信息日志。
  • fstime:保存最近一次 Checkpoint 的时间。

MapReduce的架构?如何提交MR任务?

MapReduce 是一个依赖磁盘 I/O 的批处理计算模型,也具有主从结构:

  • 主节点(MRAppMaster):负责接收客户端提交的计算任务,把计算任务分给 NodeManager 的 Container 中执行,即任务调度,监控 Container 中 Task 的执行情况。
  • 从节点(Task):处理数据。这里的 MRAppMaster 并不在主节点上,因为计算是由 DataNode 来执行的,NameNode 只是管理这些 DataNode。

提交 MR 任务的步骤

  1. 编写 MapReduce 程序:编写 Java、Python 或其他支持的语言的 MapReduce 程序,定义 Mapper 和 Reducer 类。
  2. 编译程序:如果使用 Java,编译你的代码生成 .jar 文件。
  3. 上传数据到 HDFS:将输入数据上传到 HDFS。
  4. 提交任务:
    hadoop jar jar包名 主类名 -input /hdfs/input/path -output /hdfs/output/path
    
    这里的 your-program.jar 是你的程序的 JAR 文件,YourMainClass 是包含 main 方法的类,-input-output 分别是 HDFS 中的输入和输出路径。
  5. 查看任务状态:
    yarn application -status <applicationId>
    

hdfs读写过程是怎么样的?

读取数据

  1. 客户端创建读请求给 DFS,DFS 接到该请求后远程调用 NameNode。
  2. NameNode 会通过元数据信息来找到用户要读的数据对应的 DataNode 中的块。
  3. NameNode 校验文件是否存在等情况,只有校验通过才会读取块,否则会抛出异常。
  4. 所有准备工作完成后,开始进行数据的读取。
  5. 读取数据是通过一个一个的块来进行的,只有当一个文件的所有块都被读取到之后才会中断读连接。
  6. 如果在读取过程中出现了异常,比如某个块对应的 DataNode 掉线,则会去其他 DataNode 中重新读该块的副本,读取完毕后继续读下一个块。
  7. DFS 会将 DataNode 掉线的信息传递给 NameNode,以便下次读取数据时选择其他的 DataNode,跳过掉线的 DataNode。
  8. 所有块都成功读取后,客户端会收到写完的消息,最后关闭读连接。

写入数据

  1. 客户端创建写请求给 DFS,DFS 接到该请求后远程调用 NameNode。
  2. NameNode 校验文件状态,并创建新的块来写数据。
  3. 写入的数据首先会被分成块,每个块还会分成一个个 packet(实现断点重连)。一个个 packet 会组成一个 ack 队列,写入数据会按照队列先进先写。
  4. 只有当一个完整的块都写入到 DataNode 的块中才会进行各个 DataNode 的数据同步。
  5. 只有在有多副本的情况下才会同步。如果只有一个副本,数据只会存在一个 DataNode 上。如果在写入块的过程中出现错误,比如在写入某个块时 DataNode 掉线,会跳过该 DataNode 继续写入到其他 DataNode 的新块中,重新写入块,只有掉线的 DataNode 重新正常工作后才会进行数据同步恢复正常。未写入的旧块会被删除。
  6. 所有块都成功写入后,客户端会收到写完的消息,最后通知 NameNode 去记录这些 DataNode 中的块的信息。
posted @ 2024-09-08 22:16  ikestu小猪  阅读(63)  评论(0编辑  收藏  举报