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仍然不适合跨数据中心运行。    
时间: 2024-12-16 01:38:35

HDFS文件读取详解的相关文章

Java研究之文件路径的读取详解

 记得在操作系统中了解到文件读取有两种方式,当然这在各编程语言中也是通用的,所以java路径也分,相对和绝对路径.上章我们分享了Java研究之学习设计模式-组合模式详解有兴趣的朋友可以去看下. 绝对路径 绝对路径URI ,听着和URL很相似,那我们就来看看吧. URI(Uniformresource Identifier)统一资源标示符.URL统一资源定位符,是一个定位器,还说明了具体如何找到资源.所以他们就有一种抽象和继承的关系.URI抽象的说明了统一资源表示符号,而URL是具体的标识符的

Java开发之I/O读取文件实例详解

在java开发或者android开发中,读取文件是不可避免的,以下对java开发中读取文件做了归纳和详解: 1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void readFileByBytes(String fileName) { File file = new File(fileN

Linux文件权限详解

在Linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录. 通过设定权限可以从以下三种访问方式限制访问权限:只允许用户自己访问:允许一个预先指定的用户组中的用户访问:允许系统中的任何用户访问.同时,用户能够控制一个给定的文件或目录的访问程度.一个文件活目录可能有读.写及执行权限.当创建一个文件时,系统会自动地赋予文件所有者读和写的权限,这样可以允许所有者能够显示文件内容和修改文件.文件所有者可以将这些权限改变为任何他想指定的权限.一个文件也许只有读权限

C++文件读写详解(ofstream,ifstream,fstream)

c++bufferiosiostreamfilestream 目录(?)[+] 在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结: 这里主要是讨论fstream的内容: [java] view plaincopyprint? #include <fstream> ofstream         //文件写操作 内存写入存储设备 ifstream         //文件读操作,存储设

Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解

?? 上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态. mode有下列几种形态字符串: r 打开只读文件,该文件必须存

PHP解压缩文件函数详解

欲使用本函数库需先安装 zlib,可到 http://www.zlib.net/ 取得该函数库. ) zclose: 关闭压缩文件. gzeof: 判断是否在压缩文件尾. gzfile: 读压缩文件到数组中. gzgetc: 读压缩文件中的字符. gzgets: 读压缩文件中的字符串. gzgetss: 读压缩文件中的字符串,并去掉 HTML 指令. gzopen: 打开压缩文件. gzpassthru: 解压缩指针后全部资料. gzputs: 资料写入压缩文件. gzread: 压缩文件读出指

Android的file文件操作详解

Android的file文件操作详解 android的文件操作要有权限: 判断SD卡是否插入 Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED); 获得sd卡根目录 File skRoot = Environment.getExternalStorageDirectory(); 获得私有根目录 File fileRoot = Context.getFilesDir()+""

Linux文件权限详解 文件和目录权限概述

Linux文件权限详解 文件和目录权限概述 在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录. 通过设定权限可以从以下三种访问方式限制访问权限:只允许用户自己访问:允许一个预先指定的用户组中的用户访问:允许系统中的任何用户访问.同时,用户能够控制一个给定的文件或目录的访问程度.一个文件活目录可能有读.写及执行权限.当创建一个文件时,系统会自动地赋予文件所有者读和写的权限,这样可以允许所有者能够显示文件内容和修改文件.文件所有者可以将这些权限改变

Windows DIB文件操作详解-4.使用DIB Section

前面讲了为了提高DIB的显示性能和效率,我们将DIB转换成DDB,但是这又遇到一个问题,如果我想操作DIB的数据的话,显然是不能使用DDB:一是因为DIB转DDB时发生了颜色转换,再就是DDB无法直接提取指定像素点的数据.那么我们怎么办呢,Windows使用一种折中的方式来达到这一目标(既提高了显示效率和性能,又可以直接操作像素点). 1.DIB Section存储和显示 Windows使用DIB块(DIB Section)来存储DIB数据,其内存结构示意图如下 其实,和我们自己读入DIB数据到