HDFS读流程
客户端先与NameNode通信,获取block位置信息,之后线性地先取第一个块,然后接二连三地获取,取回一个块时会进行MD5验证,验证通过后会使read顺利进行完,当最终读完所有的block块之后,拼起来就是一个完整的源文件,数据本地化读取是分布式计算中计算向数据移动的一大特征,block块有偏移量和位置信息,HDFS分布式文件系统优化了读取性能,客户端会根据block的信息来分辨这些副本中,哪些副本距离客户端自身最近,那么本地、同机架、以及其他DataNode会是一个由近及远的排序,后面我们再分析MapReduce源代码的时候,会再进行分析这一优化特性。请先记住HDFS读流程的两个重要特性:
(1) block信息的MD5验证
(2) 读取block时距离优先顺序的优化。

图1.8 HDFS读流程来自《Hadoop:The Definitive Guide》一书
读取文件的具体方式如下:
1. 从Hadoop URL读取数据
要从Hadoop文件系统中读取文件,最简单的方法是使用java.net.URl对象打开数据流,从中读取文件。但是,如何让java程序能够识别Hadoop的hdfs URL呢?这里采用的方法是通过调用java.net.URL对象的setURLStreamHandlerFactory方法,方法中传入FsUrlStreamHandlerFactory的一个实例,就可以让java程序可以识别hadoop的hdfs URL。每个java虚拟机只能调用一次这个setURLStreamHandlerFactory方法,因此通常将其卸载静态方法中。
示例程序:在hdfs中存在着/install.log,
public class test {
static {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
@Test
public void readByUrl() {
InputStream in = null;
try {
in = new URL("hdfs://node1:9000/install.log").openStream();
} catch (IOException e) {
}finally{
IOUtils.closeStream(in);
}
}
}
连不上集群。需要将core-site和hdfs-site放入到src目录下。
2.通过FileSysem API读取数据
正如前一小节所解释,有时不可能在应用程序中设置URLStreamhandlerFactory实例,这种情况下,需要用到FileSystem API来打开一个文件的输入流。Hadoop文件系统中通过Hadoop Path对象来代表文件。FileSystem是一个通用的文件系统API,这个类第一步是检索我们需要使用的文件系统实例,这里是HDFS。利用FileSystem.get()获取FilsSystem实例。Configuration对象封装了客户端或服务器的配置,一般讲hdfs的配置文件(将core-site.xml和hdft-site.xml放到项目的src目录下,configuration实例化的时候就会自动获取)。具体代码如下。
示例程序:在hdfs中存在着/install.log,
@Test
public void readByFileSystem() throws Exception{
String Url = "hdfs://node1:9000/install.log";
//FileSystem fs = FileSystem.get(URI.create(Url), conf);
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
InputStream in = null;
in = fs.open(new Path(Url));
IOUtils.copyBytes(in, System.out, 4096,true);
}
HDFS读流程的更多相关文章
- 大数据系列文章-Hadoop的HDFS读写流程(二)
在介绍HDFS读写流程时,先介绍下Block副本放置策略. Block副本放置策略 第一个副本:放置在上传文件的DataNode:如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点. 第二 ...
- 【转】HDFS读写流程
概述开始之前先看看其基本属性,HDFS(Hadoop Distributed File System)是GFS的开源实现. 特点如下: 能够运行在廉价机器上,硬件出错常态,需要具备高容错性流式数据访问 ...
- Hadoop之HDFS读写流程
hadoophdfs 1. HDFS写流程 2. HDFS写流程 1. HDFS写流程 HDFS写流程 副本存放策略: 上传的数据块后,触发一个新的线程,进行存放. 第一个副本:与client最近的机 ...
- HDFS读写流程(转载)
概述开始之前先看看其基本属性,HDFS(Hadoop Distributed File System)是GFS的开源实现.特点如下: 能够运行在廉价机器上,硬件出错常态,需要具备高容错性 ...
- RPC简介与hdfs读过程与写过程简介
1.RPC简介 Remote Procedure Call 远程过程调用协议 RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些 ...
- 超详细的HDFS读写流程详解(最容易理解的方式)
HDFS采用的是master/slaves这种主从的结构模型管理数据,这种结构模型主要由四个部分组成,分别是Client(客户端).Namenode(名称节点).Datanode(数据节点)和Seco ...
- Raid1源代码分析--读流程(重新整理)
五.Raid1读流程分析 两个月前,刚刚接触raid1,就阅读了raid1读流程的代码,那个时候写了一篇博客.现在回过头看看,那篇的错误很多,并且很多地方没有表述清楚.所以还是决定重新写一篇以更正之前 ...
- Raid1源代码分析--读流程
这篇博文不足之处较多,重新整理了一下,链接:http://www.cnblogs.com/fangpei/p/3890873.html 我阅读的代码的linux内核版本是2.6.32.61.刚进实验室 ...
- HDFS读写流程learning
有许多对流程进行描述的博客,但是感觉还是应当学习一遍代码,不然总感觉怪怪的,https://blog.csdn.net/popsuper1982/article/details/51615285,首先 ...
随机推荐
- java单元测试之如何实现异步接口的测试案例
测试是软件发布的重要环节,单元测试在实际开发中是一种常用的测试方法,java单元测试主要用junit,最新是junit5,本人开发一般用junit4.因为单元测试能够在软件模块组合之前尽快发现问题,所 ...
- 测量MySQL的表达式和函数的速度
测量MySQL的表达式和函数的速度,可以调用benchmark()函数.语法格式是benchmark(loop_count,expr).运行的返回值是0,但是mysql会打印一行显示语句大概要执行多长 ...
- (转)SQLAlchemy入门和进阶
URL:https://zhuanlan.zhihu.com/p/27400862 https://www.cnblogs.com/mrchige/p/6389588.html---SQLAlchem ...
- QT中添加图片资源
1.在ui设计界面中添加label,用于显示图片 2.添加QT资源文件 往项目中添加新文件,选择QT分类中的资源文件,名称为"myImage",其他选项默认. 3.添加资源 在项目 ...
- 【Redis】Redis 事务
Redis 事务介绍 Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败 ...
- LeetCode_415. Add Strings
415. Add Strings Easy Given two non-negative integers num1 and num2 represented as string, return th ...
- TortoiseGit 查看单个文件日志显示全部提交记录了 解决办法
右击文件,Show log.后来在界面上发现,“显示整个工程”的选项.才发现不能勾这个. 去掉勾选,就可以看到单个文件日志了,如果勾选"All Branches"就可以看到该文件在 ...
- [LeetCode] 3.Longest Substring Without Repeating Characters 最长无重复子串
Given a string, find the length of the longest substring without repeating characters. Example 1: In ...
- [LeetCode] 93. Restore IP Addresses 复原IP地址
Given a string containing only digits, restore it by returning all possible valid IP address combina ...
- C# .NET 私钥 RSA2,SHA256,签名
私钥长度2048 -- /// <summary> /// 生成签名 /// </summary> /// <param name="str"> ...