文档章节

使用FileSystem API读取数据

超人学院
 超人学院
发布于 2015/03/16 14:06
字数 1418
阅读 61
收藏 0
点赞 0
评论 0

如前一小节所解释的,有时不能在应用中设置URLStreamHandlerFactory。这时,我们需要用FileSystem API来打开一个文件的输入流。

文件在Hadoop文件系统中显示为一个Hadoop Path对象(不是一个java.io.File对象,因为它的语义与本地文件系统关联太紧密)。我们可以把一个路径视为一个Hadoop文件系统URI,如hdfs://localhost/user/tom/quangle.txt

FileSystem是一个普通的文件系统API,所以首要任务是检索我们要用的文件系统实例,这里是HDFS。取得FileSystem实例有两种静态工厂方法:

1.  public static FileSystem get(Configuration conf) 
throws IOException  

2.  ublic static FileSystem get(URI uri, 
Configuration conf) throws IOException 

Configuration对象封装了一个客户端或服务器的配置,这是用从类路径读取而来的配置文件(conf/core-site.xml)来设置的。第一个方法返回的是默认文件系统(conf/core-site.xml中设置的,如果没有设置过,则是默认的本地文件系统)。第二个方法使用指定的URI方案及决定所用文件系统的权限,如果指定URI中没有指定方案,则退回默认的文件系统。

有了FileSystem实例后,我们调用open()来得到一个文件的输入流:

1.  public FSDataInputStream open(Path f) throws IOException  

2.  ublic abstract FSDataInputStream open(Path f, 
int bufferSize) throws IOException 

第一个方法使用默认4 KB的缓冲大小。

将它们合在一起,我们可以在例3-2中重写例3-1

3-2:直接使用FileSystem以标准输出格式显示Hadoop文件系统的文件

1.  public class FileSystemCat {  

2.    public static void main(String[] args) throws Exception {  

3.      String uri = args[0];  

4.      Configuration conf = new Configuration();  

5.      FileSystem fs = FileSystem.get(URI.create(uri), conf);  

6.      InputStream in = null;  

7.      try {  

8.        in = fs.open(new Path(uri));  

9.        IOUtils.copyBytes(in, System.out, 4096, false);  

10.     } finally {  

11.       IOUtils.closeStream(in);  

12.     }  

13.   }  

14.

程序运行结果如下:

1.      % hadoop FileSystemCat hdfs://localhost/user/tom/quangle.txt  

2.  On the top of the Crumpetty Tree  

3.  The Quangle Wangle sat,  

4.  But his face you could not see,  

5.  On account of his Beaver Hat.  

6.  FSDataInputStream 

FileSystem中的open()方法实际上返回的是一个FSDataInputStream,而不是标准的java.io类。这个类是java.io.DataInputStream的一个子类,支持随机访问,这样就可以从流的任意位置读取数据了。

1.      package org.apache.hadoop.fs;  

2.   

3.  public class FSDataInputStream extends DataInputStream  

4.       implements Seekable, PositionedReadable {  

5.       // implementation elided  

6. 

Seekable接口允许在文件中定位,并提供一个查询方法,用于查询当前位置相对于文件开始处的偏移量(getPos())

1.  public interface Seekable {  

2.    void seek(long pos) throws IOException;  

3.    long getPos() throws IOException;  

4.    boolean seekToNewSource(long targetPos) throws IOException;  

5. 

调用seek()来定位大于文件长度的位置会导致IOException异常。与java.io.InputStream中的skip()不同,seek()并没有指出数据流当前位置之后的一点,它可以移到文件中任意一个绝对位置。

应用程序开发人员并不常用seekToNewSource()方法。此方法一般倾向于切换到数据的另一个副本并在新的副本中寻找targetPos指定的位置。HDFS内部就采用这样的方法在数据节点故障时为客户端提供可靠的数据输入流。

3-3是例3-2的简单扩展,它将一个文件两次写入标准输出:在写一次后,定位到文件的开头再次读入数据流。

3-3:通过使用seek两次以标准输出格式显示Hadoop文件系统的文件

1.  public class FileSystemDoubleCat {  

2.   

3.    public static void main(String[] args) throws Exception {  

4.      String uri = args[0];  

5.      Configuration conf = new Configuration();  

6.      FileSystem fs = FileSystem.get(URI.create(uri), conf);  

7.      FSDataInputStream in = null;  

8.      try {  

9.        in = fs.open(new Path(uri));  

10.       IOUtils.copyBytes(in, System.out, 4096, false);  

11.       in.seek(0); // go back to the start of the file  

12.       IOUtils.copyBytes(in, System.out, 4096, false);  

13.     } finally {  

14.       IOUtils.closeStream(in);  

15.     }  

16.   }  

17.

在一个小文件上运行得到以下结果:

1.      % hadoop FileSystemDoubleCat hdfs://localhost/user/tom/quangle.txt  

2.  On the top of the Crumpetty Tree  

3.  The Quangle Wangle sat,  

4.  But his face you could not see,  

5.  On account of his Beaver Hat.  

6.  On the top of the Crumpetty Tree  

7.  The Quangle Wangle sat,  

8.  But his face you could not see,  

9.  On account of his Beaver Hat. 

FSDataInputStream也实现了PositionedReadable接口,从一个指定位置读取一部分数据:

1.  public interface PositionedReadable {  

2.   

3.    public int read(long position, byte[] buffer, 
int offset, int length)  

4.          throws IOException;  

5.   

6.    public void readFully(long position, byte[] 
buffer, int offset, int length)  

7.          throws IOException;  

8.   

9.    public void readFully(long position, byte[] 
buffer) throws IOException;  

10.

read()方法从指定position读取指定长度的字节放入缓冲buffer的指定偏离量offset。返回值是实际读到的字节数:调用者需要检查这个值,它有可能小于指定的长度。readFully()方法会读出指定字节由length指定的数据到buffer中或在只接受buffer字节数组的版本中,再读取buffer.length字节(这儿指的是第三个函数),若已经到文件末,将会抛出EOFException

所有这些方法会保留文件当前位置并且是线程安全的,因此它们提供了在读取文件(可能是元数据)的主要部分时访问其他部分的便利方法。其实,这只是使用Seekable接口的实现,格式如下:

1.      long oldPos = getPos();  

2.  try {  

3.    seek(position);  

4.    // read data  

5.  } finally {  

6.    seek(oldPos);  

7. 

最后务必牢记,seek()是一个相对高开销的操作,需要慎重使用。我们需要依靠流数据构建应用访问模式(如使用MapReduce),而不要大量执行seek操作。

更多分享请关注:bbs.superwu.cn

© 著作权归作者所有

共有 人打赏支持
超人学院
粉丝 106
博文 335
码字总数 388917
作品 0
昌平
CTO(技术副总裁)
HDFS的基本操作(增删查)

本片文章主要介绍利用FileSystem API对HDFS进行相关操作,如增删查等——HDFS不支持对文件在任意位置修改。 1 从HDFS中读取数据 从HDFS中读取数据,主要是从存放在HDFS中的文件中读取数据,可...

lu__peng
01/05
0
0
探索HTML5之本地文件系统API - File System API

日期:2012-4-12 来源:GBin1.com 新的HTML5标准给我们带来了大量的新特性和惊喜,例如,画图的画布Canvas,多媒体的audio和video等等。除了上面我们提到的,还有比较新的特性 - File Syste...

gbin1
2012/04/13
0
0
【教程】使用PAI深度学习tensorflow读取OSS教程

在PAI上, 使用TensorFlow读取OSS文件 作者: 万千钧 转载需注明出处 本文适合有一定TensorFlow基础, 且准备使用PAI的同学阅读 目录 1. 如何PAI上读取数据 2. 如何减少读取的费用开支 3. 使用O...

傲海
2017/08/23
0
0
MySql中explain的时候出现using filesort,优化之

在使用order by关键字的时候,如果待排序的内容不能由所使用的索引直接完成排序的话,那么mysql有可能就要进行文件排序。 【这个 filesort 并不是说通过磁盘文件进行排序,而只是告诉我们进行...

rudy_gao
2015/07/24
0
0
python操作数据库之读取数据库数据方法

自动化测试经常会往数据库里写数据,然后从数据库里读取数据。 下面讲下从数据库里读取数据的方法。 前提:已安装mysql.connector模块 已建立的数据库为(在test数据库的tet表下): 一、 使用...

niedongri
2017/10/25
0
0
SPSS Modeler与数据库的链接查询

浩彬老撕曾经在《IBM SPSS Modeler最强工具书收藏系列(四)-数据读取奥秘》中提到怎么利用spss读取各种来源的数据,其中也重点介绍了如何通过odbc读取数据库数据。 考虑到数据库的数据读取相...

浩彬老撕
01/17
0
0
Java NIO AsynchronousFileChannel

原文链接 , 原文作者:Jakob Jenkov, 翻译:Neil Hao 在Java 7,AsynchronousFileChannel 被添加到了Java NIO中。使用AsynchronousFileChannel可以实现异步地读取和写入文件数据。 创建一个A...

Neil_Hao
01/20
0
0
为解析共享内存转储构建一个 Python 应用程序

内存转储 呈现运行过程中某一点上 Working Memory 的记录状态。这是系统管理中的一个重要工具,因为他们提供系统状况的 “可靠” 证据。 开始之前 我使用 Python 2.4 版本编写本文中的指导和...

IBMdW
2011/07/05
630
0
HTML5 之 web本地存储

客户端存储数据的2种新方式 以前我们都使用cookie存储客户端不只一次使用的数据,html5又带来了2种新方式:localStorage 与 sessionStorage,比cookie存储机制更有优势。 sessionStorage ses...

w-rain
2016/03/17
1K
3
Node.js Stream 流的使用及实现总结

流的概念 流是一组有序的,有起点和终点的字节数据传输手段 它不关心文件的整体内容,只关注是否从文件中读到了数据,以及读到数据之后的处理 流是一个抽象接口,被 Node 中的很多对象所实现...

张文梦
06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Tomcat中JAVA JVM内存溢出及合理配置

一、Java JVM内存介绍 JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创...

學無止境
2分钟前
0
0
centOS7.4+nginx 1.12.2负载均衡

centOS7.4+nginx 1.12.2负载均衡 2018年04月10日 09:24:51 阅读数:58 1:参数信息 三台 centOS7.4 A,B,C A作为主服务器,B C作为分流的服务器 都搭建 nginx 1.12.2 一:安装 nginx 1:下载...

linjin200
7分钟前
0
0
分布式之抉择分布式锁

前言: 目前网上大部分的基于zookpeer,和redis的分布式锁的文章都不够全面。要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫。坦白说,这种老题材,很难写出新创意,博...

Java大蜗牛
12分钟前
0
0
rm: cannot remove `xxx’: Operation not permitted

rm: cannot remove `xxx': Operation not permitted可以先用lsattr xxx查看文件的隐藏属性。如果看到-----a-------的情况,可以用chattr -a xxx去除a属性,然后再进行删除就可以了....

殘留回憶
13分钟前
0
0
oracle 如何查看当前用户的表空间名称

如何查询当前用户的表空间名称?因为oracle建立索引,需要知道当前用户的表空间,查找了一下资料 --查询语法-- select default_tablespace from dba_users where username='登录用户' 如,...

youfen
17分钟前
0
0
MicroPython-TPYBoard开发板DIY小型家庭气象站

对于喜欢登山的人来说,都会非常关心自己所处的高度跟温度,海拔高度的测量方法,海拔测量一般常用的有两种方式,一是通过GPS全球定位系统,二是通过测出大气压,根据气压值算出海拔高度。 ...

bodasisiter
17分钟前
0
0
抓取沪A股票资金流向数据

library(rvest)mydata<-list()day1<-Sys.Date()day2<-Sys.Date()-7stock<-c("600695","600734","603693","601990","603650","603045","603895","600735","601999","603970","600619"......

cuyi
17分钟前
0
0
Java中mqtt消息队列发送和订阅消息

1.首先本地建立mqtt协议的服务器 2.直接上代码 package io.powerx.test;import java.util.Date;import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;import org.eclipse.p......

江湖鱼大虾
19分钟前
0
0
数据结构-树的学习

1. 相关连接 维基-二叉搜索树 维基-红黑树 思否-红黑树

liuyan_lc
21分钟前
0
0
Dubbo 源码解读——自定义 Classloader 之 ExtensionLoader

众所周知,Dubbo 是阿里巴巴公司自主研发开源的一个高性能的服务框架(现已捐献给 Apache 基金会组织),应用之间可以通过 RPC 的方式来互相调用并返回结果。主要基于 Java 语言开发,它提供...

Ryan-瑞恩
30分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部