大部分的HDFS程序对文件操作需要的是一次写多次读取的操作模式。

一个文件一旦创建、写入、关闭之后就不需要修改了。这个假定简单化了数据一致的问题和并使高吞吐量的数据访问变得可能。

1. 读文件

从上图可以看出,客户端读取数据时,

首先从namenode获取如下信息(这些元数据信息是在内存中,所以查询速度很快,这个过程对客户端是透明的):

a. 该文件有哪些数据块

b.这些数据块都放在哪里或者说是取哪个节点上的什么数据块

然后,客户端直接从datanode中以文件流的方式读取数据

最后,关闭这个文件流

一个问题:因为每个数据块都有三个备份,那么取哪个比较好?

选取读取代价最小的节点,首先会在同一个节点中选取(如果客户端也是datanode时),其次在同一个机架上的datanode中选取,最后再同一个机房中选取

hadoop会根据网络拓扑给每一个冗余数据块打分,原则就是考虑是否在同一个节点上,是否在相同的机架上,是否在同一个机房(目前hadoop不能跨机房部署)

2. 写文件

首先,客户端通知namenode:我要写文件了,确认客户端权限和没有相同的文件后,namenode创建一个新的文件记录

然后,将文件分成一个一个的数据块(默认大小是64M),通过文件流的方式往datanode中写数据,写数据时注意是会写冗余数据,冗余数据块的个数默认是3个

最后,只有冗余数据块全部写完,datanode再向客户端发出确认,然后客户端向namenode发出结束消息,并将文件的块信息存储在namenode中

一个问题:如何选datanode用来存储冗余数据块

这是一个权衡的问题:备份的可靠性,网络IO的代价,其实如果都存在不同的机房,这样的可靠性最高,但是网络IO的代价就会很高,因为跨机房的网络IO代价很大,如果都存储在一个节点上,则不需要网络IO,但是数据可靠性就会打折扣

所以hadoop默认的布局策略是:第一个随机在机房中选择一个负载较小的节点,然后在不同的机架上(例如选择了机架A)选择一个节点,再在相同的机架上随机选择一个节点(还是在机架A上)

hdfs: 数据流(二)的更多相关文章

  1. Mysql增量写入Hdfs(二) --Storm+hdfs的流式处理

    一. 概述 上一篇我们介绍了如何将数据从mysql抛到kafka,这次我们就专注于利用storm将数据写入到hdfs的过程,由于storm写入hdfs的可定制东西有些多,我们先不从kafka读取,而先 ...

  2. HDFS数据流-剖析文件读取及写入

    HDFS数据流-剖析文件读取及写入 文件读取 1. 客户端通过调用FileSystem对象的open方法来打开希望读取的文件,对于HDFS来说,这个对象是分布式文件系统的一个实例.2. Distrib ...

  3. 浅谈HDFS(二)之NameNode与SecondaryNameNode

    NN与2NN工作机制 思考:NameNode中的元数据是存储在哪里的? 假设存储在NameNode节点的硬盘中,因为经常需要随机访问和响应客户请求,必然效率太低,所以是存储在内存中的 但是,如果存储在 ...

  4. Hadoop之HDFS文件系统(二)

    HDFS客户端 通过IO流操作HDFS HDFS文件上传 @Test public void putFileToHDFS() throws Exception{ // 1 创建配置信息对象 Confi ...

  5. Hadoop HDFS编程 API入门系列之路径过滤上传多个文件到HDFS(二)

    不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs6; import java.io.IOException;import jav ...

  6. 脑波设备mindwave数据流二次开发示例

    数据流开发神念科技提供了两个文件ThinkGearStreamParse.h和ThinkGearStreamParse.cpp两个文件,主要接口为: 宏定义: /* Data CODE definit ...

  7. Hadoop HDFS (3) JAVA訪问HDFS之二 文件分布式读写策略

    先把上节未完毕的部分补全,再剖析一下HDFS读写文件的内部原理 列举文件 FileSystem(org.apache.hadoop.fs.FileSystem)的listStatus()方法能够列出一 ...

  8. HDFS(二)

    HDFS的I/O主要是三个方面: 一致性 HDFS在一致性上面主要是通过校验和(checksum)来实现:从client发起写入的时候会校验一下文件内容,但是发生在pipeline的最后一个节点的时候 ...

  9. Hadoop之HDFS(二)HDFS基本原理

    HDFS 基本 原理 1,为什么选择 HDFS 存储数据  之所以选择 HDFS 存储数据,因为 HDFS 具有以下优点: 1.高容错性 数据自动保存多个副本.它通过增加副本的形式,提高容错性. 某一 ...

随机推荐

  1. 连分数(分数类模板) uva6875

    //连分数(分数类模板) uva6875 // 题意:告诉你连分数的定义.求连分数,并逆向表示出来 // 思路:直接上分数类模板.要注意ai可以小于0 #include <iostream> ...

  2. CentOS搭建LAMP环境

    最近准备安装roundcube,需要先搭建一个 LAMP 运行环境,从网上搜索了一下,有不少资料.自己也按部就班安装了一遍,把过程整理了下来. LAMP 是Linux, Apache, MySQL, ...

  3. .net组件技术

    .NET是什么? •.NET是一个平台,而不是一种语言. •.NET是Microsoft的用以创建XML Web服务(下一代软件)平台,该平台将信息.设备和人以一种统一的.个性化的方式联系起来.   ...

  4. hadoop测试环境主配置简例

    1,mapred-site.xml 此配置文件主要是针对mapreduce的配置文件,配置的是jobtracker的地址和端口; <configuration> <property& ...

  5. HTML5每日一练之input新增加的URL类型与email类型应用

    1.URL类型: <form> <input name="urls" type="url" value="http://www.w3 ...

  6. [iOS基础控件 - 6.10.4] 项目启动原理 项目中的文件

    A.项目中的常见文件 1.单元测试Test   2.Frameworks(xCode6 创建的SingleView Project没有) 依赖框架   3.Products 打包好的文件   4. p ...

  7. SQL自定义函数split分隔字符串

    SQL自定义函数split分隔字符串 一.F_Split:分割字符串拆分为数据表 Create FUNCTION [dbo].[F_Split] ( @SplitString nvarchar(max ...

  8. C++中不常用关键字

    mutable关键字 关键字mutable是C++中一个不常用的关键字,他只能用于类的非静态和非常量数据成员.我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,对像的状态也会 ...

  9. checked 选中

    <input type="radio" name="singleAnswer" value="0" <s:property va ...

  10. linux 下httpd服务开机启动

    分类: 网站搭建2011-01-07 05:52 1164人阅读 评论(0) 收藏 举报 linuxapache 我的apache安装目录在 /usr/local/apache 有2种方法可以设置开机 ...