DateNode的功能主要分为三大类:和DFSClient的交互;和NameNode的交互;本身提供数据存储的功能。

DataNode引用了FSDataset来提供数据存储功能, FSDataset是这个存储结构的入口,对于DataNode上面所有的Block的操作都要经过FSDataset,由此管理在此DataNode上存储的block。FSDataset的类图如下:

DataStorage

DataStorage主要提供存储元信息,如文件目录,存储目录的状态转移管理,Version文件等等。

DataStorage内部有一个List<StorageDirectory>数据结构,表示此DataNode的存储目录,DataNode的存储目录可以是多个的,这样的好处是一个目录坏了不至于把整个DataNode都下线了,这样还可以在DataNode上挂载不同的文件系统,数据写入不同的文件系统。这个目录列表是在hdfs-site.xml中配置的dfs.data.dir的值。

DataStorage的重头戏是存储目录的状态转移管理,在DataNode启动的时候可以带上参数:

  • FORMAT("-format"):格式化系统
  • REGULAR("-regular"):正常启动
  • UPGRADE("-upgrade"):升级
  • ROLLBACK("-rollback"):回滚
  • FINALIZE("-finalize"):提交
  • IMPORT("-importCheckpoint"):从Checkpoint恢复

这样就可以做相应的操作,在做这些操作时有可能会中途失败,所以DataNode需要管理具体的状态以便在下次启动操作时可以先处理之前的异常状态,当异常状态处理不了的时候,需要抛出异常。状态转移大致如下:

图中展现出DataNode升级和回滚时的一些状态转移。

当DataNode启动时,DataStorage就会调用recoverTransitionRead方法检查dfs.data.dir配置的每个文件目录,首先分析每个目录现在的子目录的存在情况(DataStorage.analyzeStorage),返回StorageState;根据返回的StorageState会做相应的操作(DataStorage.doRecover),就是做上图展现的一系列操作。

FSDataset

FsDataset包含FSVolumeSet,FSVolumeSet包含FSVolume的数组,一般来说dfs.data.dir配置的每一个目录都对应着一个FSVolume,每个FSVolume落实到文件系统上至少包含了如下文件夹:current,tmp,detach,blocksBeingWritten目录;current目录表示当前正常block的存储目录,tmp目录表示datanode之间复制时block临时存储目录,blocksBeingWritten表示DFSClient写数据或者替换block时block临时存储目录,detach目录表示copy-on-write时候copy出来的block的存储目录,用于DFSClient append一个已有的block时使用。

current目录是一个FSDir类表示的结构,FsDir有一个FsDir的数组,表示FsDir的子目录,每个FsDir可以存储dfs.datanode.numblocks个Block,如果存不下就需要存在子FsDir中了。

转载于:https://www.cnblogs.com/nod0620/archive/2012/08/10/2624785.html

DataNode内部的各种数据结构相关推荐

  1. NameNode和DataNode中重要的数据结构解析

    NameNode中的数据结构 一.NameNode在导入fsimage文件时,会生成的目录文件树状结构图,假设存在文件"/tmp/file1",存在目录"/tmp/tmp ...

  2. 《MySQL》- MySQL内部组件及数据结构

    MySQL内部组件 Server层 主要包括连接器.查询缓存.分析器.优化器.执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期.时间.数学和加密函数等),所有跨存储引擎的功 ...

  3. 数据结构排序算法 内部排序(冒泡、鸡尾酒、选择、简单插入、二分插入、快排、希尔、归并、堆排)C语言实现

    文章目录 排序 冒泡排序 鸡尾酒排序 选择排序: 简单插入排序: 二分插入排序 快速排序: 希尔排序: 归并排序: 堆排序: 排序 点击以下图片查看大图: 冒泡排序 1.比较相邻的元素,如果前一个比后 ...

  4. 内存区划分;内存分配;堆、栈概念分析;动态内存管理数据结构及程序样例;核心态与用户态...

    一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初 ...

  5. 结构体中vector自动为0_面试题:你是如何选择顺序存储数据结构的?

    作者:Tarun Telang 来源:https://dzone.com/articles/arraylist-or-linkedlist 本文为Java开发人员选择适当的顺序数据结构提供指导. Ar ...

  6. c++ 未定义标识符string_Redis之String的数据结构

    今天来聊个关于redis的话题,redis的数据结构,我之前的一篇文章,专门写过Redis的数据类型,及其简单的应用场景.今天这篇文章来专门聊一下Redis的数据结构,它的底层是如何存储的. Redi ...

  7. 【知识索引】【数据结构(C语言)】

    数据结构(C语言)知识索引 本文为[数据结构(C语言)]知识索引 文章目录 数据结构(C语言)知识索引 1.[数据结构(C语言)]数据结构-表 2.[数据结构(C语言)]数据结构-树 3.[数据结构( ...

  8. 01-Redis核心数据结构和高性能原理

    Redis核心数据结构和高性能原理 Redis安装 核心数据结构以及用法 String结构 字符串常用操作 原子加减 应用场景 Hash结构 Hash常用操作 Hash应用场景 Hash结构优缺点 L ...

  9. 在计算机内部除顶点,西交17年3月课程考试《CADCAM》作业考核试题答案 1.通常我们将数据的物理结构称为数据 ......

    西交17年3月课程考试<CADCAM>作业考核试题答案 作业内容 答案请进无忧答案网下载www.op5u.com 一.单选题(共30道试题,共60分.)V1.通常我们将数据的物理结构称为数 ...

最新文章

  1. Silverlight Telerik控件学习:带CheckBox复选框的树形TreeView控件
  2. 【翻译自mos文章】怎么正确的计算一个ip地址的subnet id?
  3. 面向对象 - 继承性
  4. 讨厌麻烦的ora 01722无效数字
  5. Android学习笔记——Menu(二)
  6. 去除aspx生成的页面最开始的空行
  7. poj 4468Spy(kmp算法)
  8. 【报告分享】2021最具价值中国品牌100强报告.pdf(附下载链接)
  9. ubuntu上 grafana + influxdb + telegraf 安装配置
  10. [转载] JAVA从菜鸟【入门】到新手【实习】一一一一Python 内置函数,标准库与第三方库(拓展库),常用框架
  11. 2019年上半年计算机水平,2019年上半年全国计算机等级考试通过秘诀分享
  12. 新浪微博数据采集以及分析方法(干货)
  13. 20年,中国互联网主流产品的演变和逻辑
  14. 高频引力波数值计算matlab,李刚李莉张雏黄敬霞受热变形及系统优化分析J光.doc...
  15. 某程序员吐槽阿里给自己侮辱性薪资!阿里定级P6+,目前薪资33k,阿里才给35k,没有股票!...
  16. php 屏蔽鼠标右键 复制,FLEX屏蔽鼠标右键
  17. 网格交易法策略优化-解决单边下跌问题,降低破网率
  18. 第七周PCL学习--点云配准(七)
  19. element-ui 滚动条样式修改
  20. 正态分布 密度函数与分布函数

热门文章

  1. 【Android】关于Android控件EditText的属性InputType的一些经验
  2. allegro怎么设置孔的属性_两种在Allegro中增加过孔的方法
  3. linux下安装Apache,php,Mysql
  4. PHP中获取当前页面的完整URL
  5. pstools psexec 执行文件
  6. 从操作系统的PV操作理解JAVA的synchronized同步方法,同步代码块实现,及比较
  7. 关于WDM驱动开发的不错资料(来自codeproject)
  8. ARM指令中STM和LDM的理解误区
  9. 概率论-3.1 多位随机变量及其联合分布
  10. [BUUCTF-pwn]——pwn1_sctf_2016