淘先锋技术网

首页 1 2 3 4 5 6 7

一、Hadoop

1.1、Hadoop介绍

  • 狭义上Hadoop指的是Apache软件基金会的一款开源软件。

    使用Java语言实现,开源
    允许用户使用简单的编程模型实现跨机器集群对海量数据进行分布式计算处理

  • Hadoop核心组件

    Hadoop Hdfs(分布式文件存储系统):解决海量数据存储
    Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度
    Hadoop MapReduce(分布式计算框架):解决海量数据计算

  • 广义上Hadoop指的是围绕Hadoop打造的大数据生态圈。
    在这里插入图片描述

1.2、Hadoop集群概述

  • Hadoop集群包括两个集群:HDFS集群、YARN集群
  • 两个集群逻辑上分离、通常物理上在一起
  • 两个集群都是标准的主从架构集群

HDFS集群:

  • 主角色:NameNode
  • 从角色:DataNode
  • 主角色辅助角色:SecondaryNameNode

YARN集群:

  • 主角色:ResourceManager
  • 从角色:NodeManager

二、HDFS(分布式文件存储系统)

2.1、文件系统

  • 文件系统是一种存储和组织数据的方法,实现了数据的存储、分级组织、访问和获取等操作,使得用户对文件访问和查找变得容易。
  • 文件系统使用属性目录的抽象逻辑概念代替了硬盘等物理设备使用数据块的概念,用户不必担心数据底层存在硬盘在哪里,只需要记住这个文件的所属目录和文件名即可。
  • 文件系统通常使用硬盘和光盘这样的存储设备,并维护文件在设备中的物理位置。

2.2、数据与元数据

  • 数据
    指:存储的内容本身,比如文件、视频、图片等,这些数据底层最终是存储在磁盘等存储介质上的,一般用户无需关心,只需要基于目录树进行增删改查即可,实际针对数据的操作有文件系统完成。
  • 元数据
    元数据(metadata):又称为解释性数据,记录数据的数据。
    文件系统元数据一般指:文件大小、最后修改时间、底层存储位置、属性、所属用户、权限等信息。例如下方图片(windows中文件系统元数据):
    在这里插入图片描述

2.3、分布式文件存储系统核心和优点

2.3.1、核心属性

  • 分布式存储
  • 元数据记录
  • 分块存储
  • 副本机制

2.3.2、优点

  • 分布式存储:无限扩展支持海量数据存储
  • 元数据记录;快速定位文件位置便于查找
  • 分块存储:针对块并行操作提高效率
  • 副本机制:冗余存储保证数据安全

2.3、HDFS介绍

  • HDFS(Hadoop Distributed File System),意为:Hadoop分布式文件系统。
  • 是Apache Hadoop核心组件之一,作为大数据生态圈最底层的分布式存储服务而存在。
  • HDFS主要是解决大数据如何存储问题的,分布式意味着是HDFS是横跨在多台计算机上的存储系统。
  • HDFS是一种能够在普通硬件上运行的分布式文件系统,它是高度容错的,适应于具有大数据集的应用程序,它非常适用于存储大型数据(TB、PB)。
  • HDFS使用多台计算机存储文件,并且提供同一的访问接口,像是访问一个普通文件系统一样使用分布式文件系统。

适合场景:

  • 大文件
  • 数据流式访问
  • 一次写入多次读取
  • 低成本部署,廉价PC
  • 高容错

不适合场景:

  • 小文件
  • 数据交互式访问
  • 频繁任意修改
  • 低延迟处理

2.3.1、整体概述

  • 主从架构
  • 分块存储
  • 副本机制
  • 元数据记录
  • 抽象同一的目录树结构(namespace)

(1)主从架构

  • HDFS集群是标准的master/slave主从架构集群。
  • 一般一个HDFS集群是有一个NameNode和一定数目的DataNode组成。
  • NameNode是HDFS主节点,DataNode是HDFS从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。
  • 官方架构图中是一主五从模式,其中五个从角色位于两个机架上(Rack)的不同服务器上。
    在这里插入图片描述

(2)分块存储

  • HDFS的文件在物理上是分块存储(block)的,默认大小是128M,不足128M则本身为一块。
  • 块的大小可以通过配置参数来规定,参数位于hdfs-default.xml中:dfs.blocksize。
    在这里插入图片描述

(3)副本机制

  • 文件的所有block都会有副本。副本系数可以在文件创建的时候指定,也可以在之后通过命令改变。
  • 副本数由参数dfs.replication控制,默认值为3,也就是会额外复制2份,连同本身总共3个副本。

(4)元数据管理

HDFS中,NameNode管理的元数据具有两种类型:

  • 文件自身属性信息
    文件名称、权限、修改时间、文件大小、复制因子、数据块大小
    在这里插入图片描述
  • 文件块位置映射信息
    记录文件块和DataNode之间的映射信息,即哪个块位于哪个节点上。
    在这里插入图片描述

(5)namespace

  • HDFS支持传统的层次性文件结构组织。用户可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
  • NameNode赋值维护文件系统的namespace命名空间,任何对文件系统名称空间或属性的修改都将被NameNode记录下来。
  • HDFS会给客户端提供一个同一的抽象目录树,客户端通过路径来访问文件。
  • 在这里插入图片描述

(6)数据库存储

  • 文件的各个block的具体存储管理有DateNode节点承担。
  • 每一个block都可以在多个DateNode上存储。

2.4、HDFS shell命令

2.4.1、创建文件夹

hadoop fs -mkdir [-p] < path> …

path为待创建的目录
-p会沿着路径创建父目录

2.4.2、查看指定目录下的内容

hadoop fs -ls [-h] [-R] < path> …

path为指定目录路径
-h为显示文件size更加人性化
-R递归查看指定目录及其子目录

2.4.3、上传文件到HDFS指定目录

hadoop fs -put [-f] [-p] < localsrc> < dst>

-f为覆盖目标文件
-p为保留访问和修改时间、所有权和权限
localsrc为本地文件系统路径文件
dst为HDFS文件系统路径

2.4.4、查看HDFS文件内容

hadoop fs -cat < src>

读取指定文件的全部内容,显示在控制台。
注意:对于大文件内容读取,慎用。

2.4.5、下载HDFS文件

hadoop fs -get [-f] [-p] < src> < localdst>

-f为覆盖目标文件
-p为保留访问和修改时间,所有权和权限。

2.4.6、拷贝HDFS文件

hadoop fs -cp [-f] < src> < localdst>

-f为覆盖目标文件

2.4.7、追加数据到HDFS文件(一般小文件使用)

hadoop fs -appendToFile < localdst> < dst>

将所有给定本地文件的内容追加到给定dst文件
dst文件如果不存在,将创建该文件

2.4.8、HDFS数据移动或重命名

hadoop fs -mv < src> < dst>

移动文件到指定文件夹下
也可重命名文件

2.5、HDFS角色和职责

2.5.1、NameNode

  • NameNode是Hadoop分布式文件系统的核心,架构中的主角色。
  • NameNode维护和管理文件系统元数据,包括名称空间目录树结构、文件和块的位置信息、访问权限等信息。
  • NameNode是访问HDFS的唯一入口。
  • NameNode内部通过内存和磁盘文件两种方式管理元数据。
    职责:
  • NameNode仅存储HDFS的元数据:文件系统中所有文件的目录树,并跟踪整个集群中的文件,不存才实际数据。
  • NameNode知道HDFS中任何给定文件的块列表及其位置。使用此信息NameNode知道如何从块中构建文件。
  • NameNode不持久化存储每个文件中各个块所在的DataNode的位置信息,这些信息会在系统启动时从DataNode重建。
  • NameNode是Hadoop集群中的单点故障。
  • NameNode所在机器通常会配置大量内存(RAM)

2.5.2、DataNode

  • DataNode是Hadoop HDFS中的从角色,负责具体的数据块存储。
  • DataNode的数量决定了HDFS集群的整体数据存储能力。通过和NameNode配合维护数据块。
    在这里插入图片描述
    职责:
  • DataNode负责最终数据块block的存储。
  • DataNode启动时,会将自己注册到NameNode并汇报自己持有的块列表。
  • 当某个DataNode关闭时,不会影响数据的可用性。NameNode会将安排由其他DataNode管理的块进行副本复制。
  • DataNode所在的机器通常配置有大量的硬盘空间,因为实际数据存储在DataNode中。

2.5.3、SecondaryNameNode

  • Secondary NameNode充当NameNode的辅助节点,但不能代替NameNode。
  • 主要是帮助主角色进行元数据文件的合并操作。可以理解为是主角色的“秘书”。
    在这里插入图片描述

2.6、pipeline、ACK概念

2.6.1、Pipeline管道

  • DataNode之间采用pipeline管道线性传输
  • 数据以管道的方式,顺序的沿着一个方向传输,这样能够充分利用每个机器的带宽,避免网络瓶颈和高延迟时的连接,最小化推送所有数据的延时。
  • 在线性推送模式下,每台机器所有出口宽带都用于以最快的速度传输数据,而不是在多个接受者之间分配宽带。
    在这里插入图片描述

2.6.2、ACK应答响应

  • ACK(Acknowledge character)即是确认字符,在数据通信中,接收方发给发送方的一种传输类控制字符。表示发来的数据已确认接收无误。
  • 在HDFS pipeline管道传输数据的过程中,传输的反方向会进行ACK校验,确保数据传输安全。
    在这里插入图片描述

2.6.3、默认3副本存储策略

  • 默认副本存储策略是由BlockPlacementPolicyDefault指定。
  • 第一块副本:优先客户端本机,否则随机。
  • 第二块副本:不同于第一块副本的不同机架(Rack)。
  • 第三块副本:第二块副本相同机架不同机器。
    在这里插入图片描述

若没有配置机架感知,则随机机器

2.7、HDFS写流程

在这里插入图片描述

  1. HDFS客户端创建对象实例DistributedFileSystem,该对象封装了与HDFS文件系统操作的相关方法。
  2. 调用DistributedFileSystem对象的create()方法,通过RPC请求NameNode创建文件。
    NameNode执行各种检查判断:目标文件是否存在、客户端是否具有创建该文件的权限。检查通过,NameNode就会为本次请求记下一条记录,返回FSDataOutputStream输出流对象给客户端用于写数据。
  3. 客户端通过FSDataOutoputStream输出流开始写入数据。
  4. 客户端写入数据是,将数据分次一个个数据包(packet 默认64KB),内部组件DataStreamer请求NameNode挑选出适合存储数据副本的一组DataNode地址,默认为3副本存储。
    DataStreamer将数据包流式传输到pipeline的第一个DataNode,该DataNode存储数据包并将它发送到pipeline的第二个DataNode。同样,第二个DataNode存储数据包并且发送给最后一个DataNode。
  5. 传输的反方向上,会通过ACK机制校验数据包阐述是否成功。
  6. 客户端完成数据写入后,在FSDataOutputStream输出流上调用close()方法关闭。
  7. DistributedFileSystem联系NameNode告知其文件写入完成,等待NameNode确认。
    因为namenode已经知道文件由哪些块组成(DataStream请求分配数据块),因此仅需等待最小复制块即可成功返回

    最小复制是由参数dfs.namenode.replication.min指定,默认是1。

2.7、HDFS读流程

在这里插入图片描述

  1. HDFS客户端创建对象实例DistributedFileSystem,调用该对象的open()方法来打开希望读取的文件。
  2. DistributedFileSystem使用RPC调用NameNode来确定文件中前几个块的块位置(分批次读取)信息。
    对于每个块,NameNode返回具有该块所有副本的DataNode位置地址列表,并且该地址列表是排序好的,与客户端的网络拓扑距离近的排序靠前。
  3. DistributedFileSystem将FSDataInputStream输入流返回客户端以供读取数据。
  4. 客户端在FSDataInputStream输入流上调用read()方法。然后,已存储DataNode地址的InputStream连接到文件中第一个块的最近的DataNode。数据从DataNode流回客户端,结果客户端可以在流上重复调用read()。
  5. 当该块结束时,FSDataInputStream将关闭与DataNoe的连接,然后寻找下一个block块的最佳DataNode位置。
    这些操作对于用户来说是透明的。所以用户感觉起来它是一直子读取一个连续的流。
    客户端从流中读取数据时,也会根据需要询问NameNode来检索下一批数据块的DataNode位置信息。
  6. 一旦客户端完成读取,就对FSDataInputStream调用close()方法。