• Hadoop学习之HDFS理论知识


    在学习Hadoop过程中需要学的内容有:

    (1)Core:一套分布式文件系统以及支持Map-Reduce计算框架

    (2)AVro:定义了一种用于支持大数据应用的数据格式,并为这种格式提供了不同的编程语言的支持

    (3)HDFS:Hadoop分布式文件系统

    (4)Map/Reduce:是一个使用简易的软件框架,基于它写出来的应用程序能够运行在上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上TB级别的数据集。

    (5)ZooKeepper:是高可用的和可靠的分布式协同系统

    (6)Pig:建立于Hadoop Core之上,为并行计算环境提供了一套数据工作流语言和执行框架

    (7)Hive:是为提供简单的数据操作而设计的下一代分布式数据仓库。它提供了简单的类似SQL的语法和HiveQL语言进行数据查询

    (8)HBase:建立于Hadoop Core之上,提供一个可扩展的数据库系统

    (9)Flume:一个分布式、可靠、和高可用的海量日志聚合系统,支持在系统中定制各类数据发送方,用于收集数据

    (10)Mahout:是一套具有可扩充能力的机器学习类库

    (11)Sqoop:是Apache下用于RDBMS和HDFS互相导数据的工具

    今天来小结下HDFS:

    百度百科上是这么介绍的:

    Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。

    HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。HDFS是Apache Hadoop Core项目的一部分。

    HDFS有着高容错性(fault-tolerant)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以实现流的形式访问(streaming access)文件系统中的数据。

    个人描述:

    HDFS为了做到可靠性(reliability)创建了多份数据块(data blocks)的复制,并将它们放置在服务器的计算节点上(compute nodes),MapReduce就可以在它们所在的节点上处理这些数据了。

    一、HDFS架构:

    HDFS Client:HDFS客户端访问NameNode,再由NameNode请求转发到DataNode

    DataNode中的数据是进行分块存储(数据块,简称存储单元),不同的DataNode中都有相同的数据,这叫数据复制,数据都是一样的(不同的DataNode中的相同的颜色就是代表相同的数据),DataNode下面的是物理磁盘,存储在硬盘上。

    (1)NameNode:

    Namenode 管理者文件系统的Namespace。它维护着文件系统树(filesystem tree)以及文件树中所有的文件和文件夹的元数据(metadata)。管理这些信息的文件有两个,分别是Namespace 镜像文件(fsimage)和操作日志文件(edit log),这些信息被Cache在RAM中,当然,这两个文件也会被持久化存储在本地硬盘。Namenode记录着每个文件中各个块所在的数据节点的位置信息,但是他并不持久化存储这些信息,因为这些信息会在系统启动时从数据节点重建。

    (2)DataNode:

    DataNode文件系统的工作节点,根据需要存储和检索数据块,并且定期向namenode发送他们所存储的块的列表。一个文件上传后,被NameNode计算出切割成多个block,每一个block里面存放文件的部分内容,每一个DataNode还有一个block副本,默认是3个,但是为了防止数据的丢失,将block复制2份放在其他的DataNode上。

    简而言之:

    a.文件被切分成固定大小的数据块,默认数据块大小为64MB,可配置;若文件大小不到64MB,则单独存成一个block

    b.一个文件存储方式,按照大小被切分成若干个block,存储到不同的节点上,默认情况下每个block都有三个副本

    c.Block大小和副本数通过Client端上传文件时设置,文件上传成功后副本数可以变更,Block Size不可变更

    --启动DataNode线程的时候会向NameNode汇报block信息

    --通过向NameNode发送心跳保持与其联系(3秒一次),如果NameNode 10分钟没有收到DataNode的心跳,则认为DataNode已经丢失,并复制DataNode上的Block到其它DataNode

    Block的副本放置策略:(同一个机架使用的是同一个电源)

    -第一个副本:放置在上传文件的DataNode;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点

    -第二个副本:放置在与第一个副本不同的机架的节点上。

    -第三个副本:放置在与第二个副本相同的机架的节点上。

    (3)SecondeNameNode:

    不是NameNode的备份(但是可以做备份),它的主要工作是帮助NN(NameNode)合并edits.Log,减少NN(NameNode)启动时间

    SNN执行合并时机(什么时候合并)

    A.根据配置文件设置的时间间隔fs.checkpoint.period 默认是3600秒

    B.根据配置文件设置的edits.log大小fs.checkpoint.size 规定edits文件最大默认值为:64M

    实际上SNN就是为了提供NN的性能,减轻NN的压力,SNN 将信息进行合并,形成一个新的fsimage文件,再传送到NameNode上,替换原来的fsimage

    Edits文件和fsimage文件都是在磁盘上保存的

    SNN将NN中的edits日志文件和fsimage文件复制到SNN服务器上,于此同时NN服务器上的edits日志文件会产生一个新的edits日志文件,用于记录HDFS客户端的读写信息,等SNN 合并一个新的fsimage文件,然后再推送到NN上,NN就会替换原来的fsimage文件

    一般NameNode 和SecondeNameNode会放在不同的服务器上,如果一旦NameNode 挂掉,还可以在SecondeNameNode上找回部分数据

    二、HDFS读文件流程

    客户端读取小文件的流程(超大文件客户端接收不了,会内存溢出):

    客户端发送请求open函数,利用Distributed FileSystem 发送请求到NameNode获取Block位置信息,返回block的所有位置信息,再利用FSData InputStream 去并发的各个DataNode 里面的block读取对应的文件信息,读取完毕,在客户端合并成一个文件,再关闭流。

    三、HDFS写文件流程:

    客户端利用Distributed FileSystem发送文件create命令给NameNode ,NameNode会计算出文件大小,并且计算出要将文件切割成多个block,于此同时NameNode中的edits文件会记录日志信息(比如说上传了一个文件),然后间隔3600s后,Second NameNode 会将edits文件和fsimage文件复制到Second NameNode服务器上,Second NameNode将edits信息写入到fsimage中,然后返回fsimage文件给NameNode,所以NameNode会存放文件的基本信息,比如说文件的大小(也就是文件的元数据),NameNode会将存放的block地址信息返回给客户端,客户端再利用FSData OutputStream 往DataNode里面写文件内容,DataNode会起一个线程将block信息复制成3份副本到其它三个服务器上,最后DataNode会返回一个状态给客户端表示写入完毕,于此同时客户端关闭输出流,再向NameNode发送一个complete命令,表示文件写入成功!于此文件写入完毕!!!

    四、HDFS文件权限

    (1)与Linux文件权限类似

    (2)如果Linux系统用户张三使用Hadoop命令创建一个文件,那么这个文件在HDFS中owner就是张三

    (3)HDFS的权限目的:阻止好人做错事,而不是阻止坏人做坏事。HDFS只相信,你告诉我你是谁,我就认为你是谁。对文件进行操作,不需要密码认证,其安全性差!这是缺点!

    所以安全性不是很高的文件会存放到Hadoop中。

    五、安全模式

    (1)namenode启动的时候,首先将映像文件(fsimage)载入内存,并执行编辑日志edits中的各项操作

    (2)一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage(这个过程不需要SecondNameNode)和一个空的edit日志文件

    (3)此时NameNode运行在安全模式中,即:NameNode的文件系统对于客户端只读(显示目录,显示文件内容,但是写、删除、重命名操作都会失败,如果此时输入命令强制停止安全模式的话,文件信息会丢失掉)。

    (4)在此阶段NameNode收集各个DataNode的报告,当数据块block达到最小副本以上时,会被认为是安全的,在一定比例(可以设置)的数据块被确定为“安全”后,再经过若干时间,安全模式结束。

    (5)当检测到副本数不足的数据块block时,该block会被复制达到最小副本数,系统中的数据块的位置并不是NameNode维护的,而是以块列表形式存储在DataNode中。

  • 相关阅读:
    记一次小团队Git实践(下)
    记一次小团队Git实践(中)
    记一次小团队Git实践(上)
    Android拓展系列(12)--使用Gradle发布aar项目到JCenter仓库
    Android学习系列(43)--使用事件总线框架EventBus和Otto
    Android拓展系列(11)--打造Windows下便携的Android源码阅读环境
    Android学习系列(40)--Android主题和样式之系统篇(下)
    Android学习系列(42)--Android Studio实战技巧
    Android学习系列(41)--Android Studio简单使用
    Android学习系列(39)--Android主题和样式之系统篇(上)
  • 原文地址:https://www.cnblogs.com/yehuili/p/9392728.html
Copyright © 2020-2023  润新知