热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

你需要掌握的hdfs的基础知识

HDFS分布式文件系统HDFS简介HDFS文件存储机制HDFS数据读写过程HDFS简介HDFS(HadoopDistributedFileSystem)是Hadoop分布式文件系统


HDFS分布式文件系统



  • HDFS简介



    • HDFS文件存储机制



      • HDFS数据读写过程







HDFS简介

HDFS(Hadoop Distributed File System)是Hadoop分布式文件系统,是Hadoop三大核心之一,是针对谷歌文件系统GFS(Google File System)的开源实现(The Google File System, 2003)。HDFS是一个具有高容错性的文件系统,适合部署在廉价的机器上,HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。大数据处理框架如MapReduce、Spark等要处理的数据源大部分都存储在HDFS上Hive、HBase等框架的数据通常也存储在HDFS上。简而言之,HDFS为大数据的存储提供了保障。经过多年的发展,HDFS自身已经十分成熟和稳定,且用户群愈加广泛,HDFS逐渐成为分布式存储的事实标准。

HDFS文件系统的基本特征包括以下几个方面。

(1)高容错性:把硬件出错看做一种常态,HDFS设计了相应机
制能够快速自动进行错误检测和恢复。例如,一个节点出现故障,
它上面的数据在其它节点存在备份,并且会被自动补充。

(2)数据容量大:HDFS每个集群可以支持数百个节点,以支持
应用程序的大数据需求。

(3)可扩展性:水平扩展性强,数据节点可以根据需要进行增删。

(4)高吞吐量:数据传输速率高,支持高并发大数据应用程序。

(5)就近计算:客户请求尽可能在数据节点上直接完成计算任务,
这样在大数据的业务中可以降低网络负担,增加吞吐量。

HDFS体系架构
HDFS采用Master/Slave架构模型,一个HDFS集群包括一个NameNode和多个DataNode。名称节点NameNode为主节点,数据节点DataNode为从节点,文件被划分为一系列的数据块(Block)存储在从节点DataNode上NameNode是中心服务器,不存储数据,负责管理文件系统的命名空间(Namespace)以及客户端对文件的访问。

1. NameNode
NameNode运行在日常硬件上,通常只有一个,是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,包括文件/目录的元数据和每个文件对应的数据块列表,它负责接收用户的操
作请求。作为HDFS主服务节点的核心,它主要完成下面任务:

(1)管理命名空间(Namespace)。

(2)控制客户端对文件的读写。

(3)执行常见文件系统操作,比如文件的重命名、复制、移动、打
开、关闭以及目录操作。
1. NameNode
HDFS命名空间(NameSpace)支持传统的层次型文件组织结构,与大多数现有文件系统类似,用户可以创建、删除、移动或重命名文件。在HDFS中,NameNode负责管理分布式文件系统的命名空间,保存了两个核心数据结构:FsImage和EditLog。其中,FsImage用于维护文件系统树以及文件树中所有文件和目录的元数据;操作日志文件EditLog记录了所有针对文件的创建、删除、重命名等
操作。NameNode记录了每个文件中各个块所在的数据节点的位置信息,但是并不持久化存储这些信息,而是在系统每次启动时扫描所有数据节点重构得到这些信息。
2. DataNode
DataNode也运行在日常硬件上,通常有多个,它为HDFS提供真实文件数据的存储服务。HDFS数据存储在DataNode上,数据块的创建、复制和删除都在DataNode上执行DataNode将HDFS数据以文件的形式存储在本地的文件系统中,但并不知道有关HDFS文件的信息DataNode把每个HDFS数据块存储在本地文件系统的一个单独的文件中,并不在同一个目录创建所有的文件,实际上,它用试探的方法来确定每个目录的最佳文件数目,并且在适当的时候创建子目录。在同一个目录中创建所有的本地文件并不是最优的选择,这是因为本地文件系统可能无法高效地在单个目录中支持大量的文件。当一DataNode启动时,它会扫描本地文件系统,产生一个这些本地文件对应的所有HDFS数据块的列表,然后作为报告发送到NameNode,这个报告就是块状态报告。

严格地说,客户端并不算是HDFS的一部分。客户端可以支持打开读取、写入等常见操作,并且提供了类似Shell的命令行方式来访问HDFS中的数据,也提供了API作为应用程序访问文件系统的客户端编程接口。



HDFS文件存储机制

1. Block

HDFS中的数据以文件块Block的形式存储,Block是最基本的存储单
位,每次读写的最小单元是一个Block。对于文件内容而言,一个文
件的长度大小是N,那么从文件的0偏移开始,按照固定的大小,顺
序对文件进行划分并编号,划分好的每一个块称一个Block。

Hadoop 2.0中默认Block大小是128MB。不同于普通文件系统,
HDFS中如果一个文件小于一个数据块的大小,并不占用整个数据块
存储空间。

Block的大小可以根据实际需求进行配置,可以通过HDFS配置文件
hdfs-site.xml中的参数dfs.blocksize来定义块大小,但要注意,数字
必须是2K,文件的大小可以不是Block大小的整数倍,这时最后一个
块可能存在剩余。

1. Block

为什么HDFS数据块设置的这么大呢?

原因是和普通的本地磁盘文件系统不同,HDFS存储的是大数据文
件,通常会有TB甚至PB的数据文件需要管理,所以数据的基本单
元必须足够大才能提高管理效率。而如果还使用像Linux本地文件
系统EXT3的4KB单元来管理数据,则会非常低效,同时会浪费大
量的元数据空间。

2. Block副本管理策略

HDFS采用多副本方式对数据进行冗余存储,通常一个数据块的多个副本会被分布到不同的DataNode上。

HDFS提供可靠的算法实现在分布式环境中存储大量数据。简单来说,每个数据块Block都存在副本以提高容错性。默认情况下每个块存在3个副本。数据块的信息会定期由DataNode报送给NameNode,任何时候,当NameNode发现一个块的副本个数少于3个或者多于3个时都会进行补充或者删除。

副本放置的基本原则是保证并非所有的副本都在同一个机架(Rack)上。这样放置的好处在于提供高容错性的同时降低延时,注意一个Rack可能包含多个DataNode,而数据分布在不同DataNode可以提高数据读写并发。对于多于3个副本的情况,其它副本将会随机分布在不DataNode,同时保证同一个机架中最多存在两个副本。

可以通过配置文件hdfs-site.xml中的参数dfs.replication来定义Block副本数。



HDFS数据读写过程

数据读取过程

客户端读取HDFS上的文件时,需要调用HDFS Java API一些类的方法,从编程角度来看,主要经过以下几个步骤。

(1)客户端生成一个FileSystem实例(DistributedFileSystem对象),并使用此实例的open()方法打开HDFS上的一个文件。

(2)DistributedFileSystem通过RPC调用向NameNode发出请求,得到文件的位置信息,即数据块编号和所在DataNode地址,对于每一个数据块,元数据节点返回保存数据块的数据节点的地址,通常按照DataNode地址与客户端的距离从近到远排序。

(3)FileSystem实例获得地址信息后,生成一个FSDataInputStream对象实例返回给客户端,此实例封装了一个DFSInputStream对象,负责存储数据块信息和DataNode地址信息,并负责后续的文件内容读取工作。

(4)客户端向FSDataInputStream发出读取数据的read()调用。

(5)FSDataInputStream收到read()调用请求后,FSDataInputStream封装的DFSInputStream选择与第一个数据块最近的DataNode,并读取相应的数据信息返回给客户端,在数据块读取完成后,DFSInputStream负责关闭到相应DataNode的链接。

(6)DFSInputStream依次选择后续数据块的最近DataNode节点,并读取数据返回给客户端,直到最后一个数据块读取完毕,DFSInputStream从DataNode读取数据时,可能会碰上某个DataNode失效的情况,则会自动选择下一个包含此数据块的最近的DataNode去读取。

(7)客户端读取完所有数据块,然后调用FSDataInputStream的close()方法关闭文件。

数据写入过程

HDFS的设计遵循“一次写入,多次读取”的原则,所有数据只能添加不能更新。数据会被划分为等尺寸的块写入不同的DataNode中。每个块通常保存指定数量的副本(默认3个)。HDFS数据写入基本过程为:客户端向NameNode发送文件写请求,NameNode给客户分配写权限,并随机分配块的写入地址—

DataNode的IP,兼顾副本数量和块Rack自适应算法,例如副本因子是3,则每个块会分配到三个不同的DataNode,为了提高传输效率,客户端只会向其中一个DataNode复制一个副本,另外两个副本则DataNode传输到相邻DataNode。

数据写入过程

从编程角度来说,将数据写入HDFS主要经过以下几个步骤。

(1)创建和初始化FileSystem,客户端调用create()来创建文件

(2)FileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件,元数据节点首先确定文
件原来不存在,并且客户端有创建文件的权限,然后创建新文件。

(3)FileSystem返回DFSOutputStream,客户端开始写入数据。

(4)DFSOutputStream将数据分成块,写入data queue。data queue由Data Streamer读取,并通知名称节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个数据流管道(pipeline)里。Data Streamer将数据块写入pipeline中的第一个数据节点,一个数据节点将数据块发送给第二个数据节点,第二个数据节点将数据发送给第三个数据节点。

(5)DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。

(6)当客户端结束写入数据,则调用stream的close函数。此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。

(7)通知名称节点写入完毕。

数据写入可以看作是一个流水线pipeline过程,具体来说,客户端收到NameNode发送的块存储位置DataNode列表后,将做如下工作。

(1)选择DataNode列表中的第一个DataNode1,通过IP地址建立TCP连接。

(2)客户端通知DataNode1准备接收块数据,同时发送后续DataNode的IP地址给DataNode1,副本随后会拷贝到这些DataNode。

(3)DataNode1连接DataNode2,并通知DataNode2连接DataNode3,前一个DataNode发送副本数据给后一个DataNode,依次类推。

(4)ack确认消息遵从相反的顺序,即DataNode3收到完整块副本后返回确认给DataNode2,DataNode2收到完整块副本后返回确认给DataNode1。而DataNode1最后通知客户端所有数据块已经成功复制。对于3个副本,DataNode1会发送3个ack给客户端表示3个DataNode都成功接收。随后,客户端通知NameNode,完整文件写入成功NameNode更新元数据。

(5)当客户端接到通知流水线已经建立完成后,将会准备发送数据块到流水线中,然后逐个数据块按序在流水线中传输。这样以来,客户端只需要发送一次,所有备份将在不同DataNode之间自动完成,提高了传输效率。



推荐阅读
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • Hadoop的分布式架构改进与应用
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 阿里云大数据计算服务MaxCompute (原名 ODPS)
     MaxCompute是阿里EB级计算平台,经过十年磨砺,它成为阿里巴巴集团数据中台的计算核心和阿里云大数据的基础服务。去年MaxCompute做了哪些工作,这些工作背后的原因是什 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
author-avatar
华东师大中北文艺部
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有