文章部分选自:https://blog.csdn.net/gwd1154978352/article/details/81095592


自己的话:层楼终究误少年,自由早晚乱余生
眼泪你别问,joker这个 “男人” 你别恨



Hadoop第五天–HDFS详解

先简单介绍一下Hadoop的结构以及各部分的组成和作用

hadoop的核心

1.HDFS: Hadoop Distributed File System 分布式文件系统

2.YARN: Yet Another Resource Negotiator 资源管理调度系统

3.Mapreduce:分布式运算框架


Hadoop的特点

扩容能力(Scalable):能可靠地(reliably)存储和处理千兆字节(PB)数据。

成本低(Economical):可以通过普通机器组成的服务器群来分发以及处理数据。这些服务器群总计可达数千个节点。

高效率(Efficient):通过分发数据,hadoop可以在数据所在的节点上并行地(parallel)处理它们,这使得处理非常的快速。

可靠性(Reliable):hadoop能自动地维护数据的多份副本,并且在任务失败后能自动地重新部署(redeploy)计算任务。


HDFS前言

·设计思想
分而治之:将大文件、大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析;

·在大数据系统中作用:
为各类分布式运算框架(如:mapreduce,spark,tez,……)提供数据存储服务

·重点概念:文件切块,副本存放,元数据


HDFS的概念和特性

首先,它是一个文件系统,用于存储文件,通过统一的命名空间——目录树来定位文件

其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色;

重要特性如下:
(1)HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M

(2)HDFS文件系统会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data

(3)目录结构及文件分块位置信息(元数据)的管理由namenode节点承担
——namenode是HDFS集群主节点,负责维护整个hdfs文件系统的目录树,以及每一个路径(文件)所对应的block块信息(block的id,及所在的datanode服务器)

(4)文件的各个block的存储管理由datanode节点承担
---- datanode是HDFS集群从节点,每一个block都可以在多个datanode上存储多个副本(副本数量也可以通过参数设置dfs.replication,默认是3)

(5)HDFS是设计成适应一次写入,多次读出的场景,且不支持文件的修改

(注:适合用来做数据分析,并不适合用来做网盘应用,因为,不便修改,延迟大,网络开销大,成本太高)


HDFS的shell(命令行客户端)操作

HDFS提供shell命令行客户端,使用方法如下:

命令行客户端支持的命令参数

        [-appendToFile <localsrc> ... <dst>][-cat [-ignoreCrc] <src> ...][-checksum <src> ...][-chgrp [-R] GROUP PATH...][-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...][-chown [-R] [OWNER][:[GROUP]] PATH...][-copyFromLocal [-f] [-p] <localsrc> ... <dst>][-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>][-count [-q] <path> ...][-cp [-f] [-p] <src> ... <dst>][-createSnapshot <snapshotDir> [<snapshotName>]][-deleteSnapshot <snapshotDir> <snapshotName>][-df [-h] [<path> ...]][-du [-s] [-h] <path> ...][-expunge][-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>][-getfacl [-R] <path>][-getmerge [-nl] <src> <localdst>][-help [cmd ...]][-ls [-d] [-h] [-R] [<path> ...]][-mkdir [-p] <path> ...][-moveFromLocal <localsrc> ... <dst>][-moveToLocal <src> <localdst>][-mv <src> ... <dst>][-put [-f] [-p] <localsrc> ... <dst>][-renameSnapshot <snapshotDir> <oldName> <newName>][-rm [-f] [-r|-R] [-skipTrash] <src> ...][-rmdir [--ignore-fail-on-non-empty] <dir> ...][-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]][-setrep [-R] [-w] <rep> <path> ...][-stat [format] <path> ...][-tail [-f] <file>][-test -[defsz] <path>][-text [-ignoreCrc] <src> ...][-touchz <path> ...][-usage [cmd ...]]

常用命令参数介绍

-help
功能:输出这个命令参数手册-ls
功能:显示目录信息
示例: hadoop fs -ls hdfs://hadoop-server01:9000/
备注:这些参数中,所有的hdfs路径都可以简写
-->hadoop fs -ls /   等同于上一条命令的效果-mkdir
功能:在hdfs上创建目录
示例:hadoop fs  -mkdir  -p  /aaa/bbb/cc/dd-moveFromLocal
功能:从本地剪切粘贴到hdfs
示例:hadoop  fs  -moveFromLocal  /home/a.txt  /aaa/bbb/cc/dd-moveToLocal
功能:从hdfs剪切粘贴到本地
示例:hadoop  fs  -moveToLocal   /aaa/bbb/cc/dd  /home/a.txt
提示:moveToLocal: Option '-moveToLocal' is not implemented yet.--appendToFile
功能:追加一个文件到已经存在的文件末尾
示例:hadoop  fs  -appendToFile  ./hello.txt  hdfs://hadoop-server01:9000/hello.txt
可以简写为:
Hadoop  fs  -appendToFile  ./hello.txt  /hello.txt-cat
功能:显示文件内容
示例:hadoop fs -cat  /hello.txt-tail
功能:显示一个文件的末尾
示例:hadoop  fs  -tail  /weblog/access_log.1-text
功能:以字符形式打印一个文件的内容
示例:hadoop  fs  -text  /weblog/access_log.1-chgrp
-chmod
-chown
功能:linux文件系统中的用法一样,对文件所属权限
示例:
hadoop  fs  -chmod  666  /hello.txt
hadoop  fs  -chown  someuser:somegrp   /hello.txt-copyFromLocal
功能:从本地文件系统中拷贝文件到hdfs路径去
示例:hadoop  fs  -copyFromLocal  ./jdk.tar.gz  /aaa/-copyToLocal
功能:从hdfs拷贝到本地
示例:hadoop fs -copyToLocal /aaa/jdk.tar.gz-cp
功能:从hdfs的一个路径拷贝hdfs的另一个路径
示例: hadoop  fs  -cp  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz.2-mv
功能:在hdfs目录中移动文件
示例: hadoop  fs  -mv  /aaa/jdk.tar.gz  /-get
功能:等同于copyToLocal,就是从hdfs下载文件到本地
示例:hadoop fs -get  /aaa/jdk.tar.gz-getmerge
功能:合并下载多个文件
示例:比getmerge    如hdfs的目录 /aaa/下有多个文件:log.1, log.2,log.3,...
hadoop fs -getmerge /aaa/log.* ./log.sum-put
功能:等同于copyFromLocal
示例:hadoop  fs  -put  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz.2-rm
功能:删除文件或文件夹
示例:hadoop fs -rm -r /aaa/bbb/-rmdir
功能:删除空目录
示例:hadoop  fs  -rmdir   /aaa/bbb/ccc-df
功能:统计文件系统的可用空间信息
示例:hadoop  fs  -df  -h  /-du
功能:统计文件夹的大小信息
示例:
hadoop  fs  -du  -s  -h /aaa/*-count
功能:统计一个指定目录下的文件节点数量
示例:hadoop fs -count /aaa/-setrep
功能:设置hdfs中文件的副本数量
示例:hadoop fs -setrep 3 /aaa/jdk.tar.gz补充:查看dfs集群工作状态的命令
hdfs dfsadmin -report

HDFS的架构

主从结构

     •主节点, namenode•从节点,有很多个: datanode

namenode负责:

     •接收用户操作请求•维护文件系统的目录结构•管理文件与block之间关系,block与datanode之间关系

datanode负责:

     •存储文件•文件被分成block存储在磁盘上•为保证数据安全,文件会有多个副本

Secondary NameNode负责:

     •合并fsimage和edits文件来更新NameNode的metedata

HDFS原理

概述
1.HDFS集群分为两大角色:NameNode、DataNode (Secondary Namenode)
2.NameNode负责管理整个文件系统的元数据
3.DataNode 负责管理用户的文件数据块
4.文件会按照固定的大小(blocksize)切成若干块后分布式存储在若干台datanode上
5.每一个文件块可以有多个副本,并存放在不同的datanode上
6.Datanode会定期向Namenode汇报自身所保存的文件block信息,而namenode则会负责保持文件的副本数量
7.HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向namenode申请来进行

NameNode

1.简介
namenode是整个文件系统的管理节点。他维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。

文件包括:
fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
edits:操作日志文件。
fstime:保存最近一次checkpoint的时间。

2.NameNode的工作特点
NameNode始终在内存中保存metedata,用于处理“读请求”,到有“写请求”到来时,NameNode首先会写editlog到磁盘,即向edits文件中写日志,成功返回后,才会修改内存,并且向客户端返回。

Hadoop会维护fsimage文件,也就是NameNode中metedata的镜像,但是fsimage不会随时与NameNode内存中的metedata保持一致,而是每隔一段时间通过合并edits文件来更新内容。Secondary NameNode就是用来合并fsimage和edits文件来更新NameNode的metedata的。

3.什么时候checkpoint
fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒。
fs.checkpoint.size 规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认大小是64M。

SecondaryNameNode

1.简介
执行过程:从NameNode上下载元数据信息(fsimage,edits),然后把二者合并,生成新的fsimage,在本地保存,并将其推送到NameNode,替换旧的fsimage.
默认在安装在NameNode节点上,但这样…不安全!

2.工作流程
(1)secondary通知namenode切换edits文件;
(2)secondary从namenode获得fsimage和edits(通过http);
(3)secondary将fsimage载入内存,然后开始合并edits;
(4)secondary将新的fsimage发回给namenode;
(5)namenode用新的fsimage替换旧的fsimage;

Datanode

1.DataNode工作机制
(1)一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
(2)DataNode启动后向namenode注册,通过后,周期性(1小时)的向namenode上报所有的块信息。
(3)心跳是每3秒一次,心跳返回结果带有namenode给该datanode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个datanode的心跳,则认为该节点不可用。
(4)集群运行中可以安全加入和退出一些机器
2.数据完整性
(1)当DataNode读取block的时候,它会计算checksum
(2)如果计算后的checksum,与block创建时值不一样,说明block已经损坏。
(3)client读取其他DataNode上的block.
(4)datanode在其文件创建后周期验证checksum


HDFS

(1)读过程

1.初始化FileSystem,然后客户端(client)用FileSystem的open()函数打开文件

2.FileSystem用RPC调用元数据节点,得到文件的数据块信息,对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。

3.FileSystem返回FSDataInputStream给客户端,用来读取数据,客户端调用stream的read()函数开始读取数据。

4.DFSInputStream连接保存此文件第一个数据块的最近的数据节点,data从数据节点读到客户端(client)

5.当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。

6.当客户端读取完毕数据的时候,调用FSDataInputStream的close函数。

7.在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。

8.失败的数据节点将被记录,以后不再连接。

(2)写过程

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,将ack queue中的数据块放入data queue的开始,当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。


Hadoop的split和block的区别和联系
hadoop在默认的情况下,split和hdfs的block的大小是一样的,这样容易造成误解认为两者是一样的,下面说下两者的区别和联系:

  1. split是MapReduce里的概念,是切片的概念,split是逻辑切片 ;而block是hdfs中切块的大小,block是物理切块;
  2. split的大小在默认的情况下和HDFS的block切块大小一致,为了是MapReduce处理的时候减少由于split和block之间大小不一致,可能会完成多余的网络之间的传输。
    可以通过配置文件进行设置:
    –minsize 默认大小为1mapreduce.input.fileinputformat.split.minsize
    –maxsize 默认大小为Long.MAXValue mapreduce.input.fileinputformat.split.maxsize
    在mapreduce的FileInputFormat类中有个getSplits() 方法对文件进行split,算法如下:
    Math.max(minSize,Math.min(maxSize, blockSize));其中maxSize是取得longValueMax的值
    1.如果blockSize小于maxSize && blockSize 大于 minSize之间,那么split就是blockSize;
    2.如果blockSize小于maxSize && blockSize 小于 minSize之间,那么split就是minSize;
    3.如果blockSize大于maxSize && blockSize 大于 minSize之间,那么split就是maxSize;

Hadoop第五天--HDFS详解相关推荐

  1. Hadoop之Yarn工作机制详解

    Hadoop之Yarn工作机制详解 目录 Yarn概述 Yarn基本架构 Yarn工作机制 作业提交全过程详解 1. Yarn概述 Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于 ...

  2. Hadoop之InputFormat数据输入详解

    Hadoop之InputFormat数据输入详解 Job提交流程和切片源码详解 FileInputFormat切片机制 CombineTextInputFormat切片机制 InputFormat接口 ...

  3. hadoop基础----hadoop理论(四)-----hadoop分布式并行计算模型MapReduce详解

    我们在前一章已经学习了HDFS: hadoop基础----hadoop理论(三)-----hadoop分布式文件系统HDFS详解 我们已经知道Hadoop=HDFS(文件系统,数据存储技术相关)+ M ...

  4. 万字长文的Redis五种数据结构详解(理论+实战),建议收藏。

    本文脑图 前言 Redis是基于c语言编写的开源非关系型内存数据库,可以用作数据库.缓存.消息中间件,这么优秀的东西一定要一点一点的吃透它. 关于Redis的文章之前也写过三篇,阅读量和读者的反映都还 ...

  5. Hadoop之OutputFormat数据输出详解

    Hadoop之OutputFormat数据输出详解 目录 OutputFormat接口实现类 自定义OutputFormat 1. OutputFormat接口实现类 OutputFormat是Map ...

  6. [转]Hadoop集群_WordCount运行详解--MapReduce编程模型

    Hadoop集群_WordCount运行详解--MapReduce编程模型 下面这篇文章写得非常好,有利于初学mapreduce的入门 http://www.nosqldb.cn/1369099810 ...

  7. 《Hadoop海量数据处理:技术详解与项目实战(第2版)》一2.8 小结

    本节书摘来异步社区<Hadoop海量数据处理:技术详解与项目实战(第2版)>一书中的第2章,第2.8节,作者: 范东来 责编: 杨海玲,更多章节内容可以访问云栖社区"异步社区&q ...

  8. 《Hadoop海量数据处理:技术详解与项目实战(第2版)》一第2章 环境准备

    本节书摘来异步社区<Hadoop海量数据处理:技术详解与项目实战(第2版)>一书中的第2章,第2.1节,作者: 范东来 责编: 杨海玲,更多章节内容可以访问云栖社区"异步社区&q ...

  9. Django新手入门(五)——Models详解

    Django新手入门(五)--Models详解 数据库 ORM Django中的ORM Django中的Models 定义models.py中的类 常用数据字段 常用设置选项 常用函数以及修饰词 其他 ...

最新文章

  1. 神经网络(Neural Network)
  2. 【Effective Java】3.单例
  3. ThinkPHP3.1快速入门(2)数据CURD
  4. 自然语言处理之神经网络基础(四)
  5. 充电桩系统php源码,源码 充电桩程序设计 - 下载 - 搜珍网
  6. 【转载保存】java静态方法继承与保存的问题
  7. TransR:实体和关系分开嵌入(知识图谱嵌入)2015 AAAI
  8. php mysql 拆分join_PHP拼接Sql,MySql拆分数据(substring_index())作为判断条件
  9. javascript Nested functions
  10. SharePoint 开发系列之三:开发工具和流程
  11. smarty课程---smarty的处理过程是怎样的
  12. bzoj千题计划269:bzoj2655: calc (拉格朗日插值)
  13. HTML- 锚点实例
  14. 卡巴斯基2010 授权文件可以使用一年
  15. Linux Ansible自动化运维 set_fact 模块
  16. 电脑硬件知识入门之内存篇
  17. 怎么可以快速解决网络劫持
  18. 使用ARouter进行Android模块化开发,详解系列文章
  19. 使用python打造一个中英互译软件(基于有道翻译)
  20. 推卸责任的 Chain of Responsibility模式

热门文章

  1. 常用ACM知识点清单(未完待续)
  2. Kafka 入门 (一)
  3. final、finalize 和 finally
  4. 【已解决】LaTeX调整图片大小
  5. excel查找空值快捷键_excel定位选取:再谈快捷键Ctrl+G的妙用
  6. 电脑上的设备驱动程序是什么(通俗解释)
  7. PCI设备初始化(一)
  8. 三角形 css_CSS三角形
  9. Linux常用命令简介
  10. 刀片服务器部署VMWare vSphere遇到的问题总结