HDFS文件读取详解
客户端与HDFS文件读取
创建HDFS文件系统实例
FileSystem fs = FileSystem.get(new URI("hdfs://ns1"), new Configuration(),"root");
客户端通过调用FileSystem对象fs的Open()方法打开要读取的文件,DistributedFileSystem通过使用RPC来调用NameNode,以确定文件起始块的位置。
对于文件的每一个块,NameNode返回存有该块副本的DataNode地址。这些DataNode根据它们与客户端的距离来排序(根据集群中的网络拓扑)。如
果该客户端本身就是一个DataNode(例如在一个MapReduce任务中)并保存有相应数据块的一个副本时,该节点就会从本地DataNode读取数据。然后
DistributedFileSystem返回一个FSDataInputStream对象(支持文件定位的输入流)给客户端读取数据。FSDataInputStream类转而封装DFSInputStream
对象,该对象管理着DataNode和NameNode的I/O。
FSDataInputStream in = fs.open(new Path(dfsPath));
接着客户端对这个输入流调用read()方法读取,存储着文件起始位置的几个块的DataNode地址的DFSInputStream随机链接距离最近的DataNode。通过
对数据流反复调用read()方法,将数据从DataNode传输到客户端,到达快的末端时,DFSInputStream关闭与该DataNode的连接,然后寻找下一个块的
最佳DataNode,客户端只需要读取连续的流。客户端从流中读取数据时,块是按照打开DFSInputStream与DataNode新建连接顺序的读取的,它也会根
据需要询问NameNode来检索下一批数据块的DataNode的位置,一旦客户端读取完成就对DFSInputStream调用close()方法释放。在读取数据时,如果
DFSInputStream在与DataNode通信时遇到错误,会尝试从这个块的另外一个最邻近的DataNode读取数据。它也会记住那个故障的DataNode,以保证
以后不会从那个故障DataNode节点反复读取后续的块数据。DFSInputStream也会通过校验和确认从DataNode发来的数据是否完整。如果发现有损坏的
块,就在DFSInputStream试图从其他DataNode读取其副本之前通知NameNode。这个设计的一个重点是:NameNode告知客户端每个块中最佳的
DataNode,并让客户端直接连接到该最佳DataNode上检索数据。由于数据流分散在集群中的所有DataNode上,所以这种设计能使HDFS可扩展到大量
的并发客户端。同时,NameNode只需要响应块位置的请求(这些块位置信息存储在内存中,因而非常高效),无需响应数据请求,否则随着客户端数量
的增长,NameNode会很快成为瓶颈。
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(localPath)));
IOUtils.copyBytes(in, out, 4096, true); Hadoop的网络拓扑解释
在本地网络中,两个节点被称为“彼此近邻”是指:在海里数据处理中,其主要限制因素是节点之间数据的传输速率-带宽很稀缺。这里的想法是将两个
节点间的带宽作为军力的衡量标准。如果不用衡量节点间的带宽则很难实现(需要一个稳定的集群,并且在集群中两两节点对数量是节点数量的平方)。
Hadoop为此采用了一种简单的方法:把网络当做一棵树,两个节点间的距离是它们到最近共同祖先的距离综合。该书中的层次是没有预先设定的,但是相对
于数据中心、机架和正在运行的节点,通常可以设定等级。具体是针对以下每个场景,可用带宽一次递减,如下:
同一节点上的进程
同一机架上的不同节点
同一数据中心的不同机架上的节点
不同数据中心的节点
跨数据中心运行
目前到Hadoop-2.7仍然不适合跨数据中心运行。
HDFS文件读取详解的更多相关文章
- hdfs文件系统架构详解
hdfs文件系统架构详解 官方hdfs分布式介绍 NameNode *Namenode负责文件系统的namespace以及客户端文件访问 *NameNode负责文件元数据操作,DataNode负责文件 ...
- Hadoop(四)HDFS集群详解
前言 前面几篇简单介绍了什么是大数据和Hadoop,也说了怎么搭建最简单的伪分布式和全分布式的hadoop集群.接下来这篇我详细的分享一下HDFS. HDFS前言: 设计思想:(分而治之)将大文件.大 ...
- adoop(四)HDFS集群详解
阅读目录(Content) 一.HDFS概述 1.1.HDFS概述 1.2.HDFS的概念和特性 1.3.HDFS的局限性 1.4.HDFS保证可靠性的措施 二.HDFS基本概念 2.1.HDFS主从 ...
- 【史上最全】Hadoop 核心 - HDFS 分布式文件系统详解(上万字建议收藏)
1. HDFS概述 Hadoop 分布式系统框架中,首要的基础功能就是文件系统,在 Hadoop 中使用 FileSystem 这个抽象类来表示我们的文件系统,这个抽象类下面有很多子实现类,究竟使用哪 ...
- 【Linux学习】Linux下用户组、文件权限详解
原文地址:http://www.cnblogs.com/123-/p/4189072.html Linux下用户组.文件权限详解 用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在li ...
- C++文件读写详解(ofstream,ifstream,fstream)
C++文件读写详解(ofstream,ifstream,fstream) 这里主要是讨论fstream的内容: #include <fstream> ofstream //文件写操作 内存 ...
- Android的file文件操作详解
Android的file文件操作详解 android的文件操作要有权限: 判断SD卡是否插入 Environment.getExternalStorageState().equals( android ...
- Scrapy框架——介绍、安装、命令行创建,启动、项目目录结构介绍、Spiders文件夹详解(包括去重规则)、Selectors解析页面、Items、pipelines(自定义pipeline)、下载中间件(Downloader Middleware)、爬虫中间件、信号
一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...
- 史上最全的maven pom.xml文件教程详解
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
随机推荐
- How to configure Gzip for JBoss?---refer
Question: I think to try to speed up my Web App by reducing the size of transferred data. For exampl ...
- IIS rewrite映射规则语法格式
IIS rewrite映射规则语法格式,特殊符号:&请用& amp;代替,否则异常. <configuration> <system.webServer> &l ...
- [转] JS nodeType返回类型
将HTML DOM中几个容易常用的属性做下记录: nodeName.nodeValue 以及 nodeType 包含有关于节点的信息. nodeName 属性含有某个节点的名称. 元素节点的 node ...
- sass笔记-1|Sass是如何帮你又快又好地搞定CSS的
Sass学习笔记持续整理中,开篇不讲怎么安装,sass是什么,这些搜索引擎会告诉你,我们从sass的作用开始讲起,知道sass用来干什么,有什么作用,我们才能相信用sass的好处,并且时时刻刻想着sa ...
- MM32/STM32中断和事件梳理
Interrupt_event梳理 预备资料 MM32/stm32中文参考手册 Cortex-M3权威指南(深入了解中断和异常) MM32F103产品手册(配置GPIO的复用功能可能用到) 提出问题 ...
- 粘帖屏幕截图到web页面插件 screenshot-paste
在很多场合下,我们可能有这样的需求:提供个屏幕截图上传到系统,作为一个凭证.传统的操作方式是:屏幕截图,保存文件到本地,在web页面上选择本地文件并上传,这里至少需要三步.有没有可能直接将截图粘帖到w ...
- mongodb查询之模糊查询
mongodb的模糊查询是用正则表达式来实现的.例子如下: db.COMMODITY_COMMODITY_SHOP.find({name:{$regex :/南京/i}})
- 手机Web网站,设置拒绝电脑访问
最近一段时间,都在使用Jquery-Mobile + MVC做手机Web,有一些心得.体会 下面介绍如何拒绝电脑访问手机网站 电脑的浏览器,跟手机的浏览器内核不一样,这是我设置拒绝访问的思路. 下面是 ...
- android 检查网络是否可用,如果不可用弹出设置,让用户改变
/** * 校验网络,如果没有网络,返回true * * @return boolean */ @Override public boolean hasInternetConnected() { Co ...
- MyEclipse内存不足的问题
今早打开MyEclipse莫名其妙弹出提示框,然后我各种搜索,用了网上能查到的各种办法去试图解决问题,方法包括但不限于 修改eclipse.ini .设置Default VM Arguments . ...