ITPub博客

首页 > 大数据 > Hadoop > Hadoop:HDFS—文件IO 喝no一j#

Hadoop:HDFS—文件IO 喝no一j#

Hadoop 作者:mcf1980 时间:2014-03-04 18:40:05 0 删除 编辑
    这里将深入探索Hadoop的Filesystem类:与Hadoop的某一文件系统进行交互的API。这个概念类似于Unix编程中的open,read和write等操作文件系统的接口函数。
**************************************************************************************************
从Hadoop URL读取数据
    要从Hadoop文件系统中读取文件,最简单的方法是使用java.net.URL对象打开数据流,进而读取数据。具体格式如下:
Hadoop:HDFS—文件IO
========================================================================
cat
    让Java程序能够识别Hadoop的hdfs URL方案需要额外的操作。这里采用的方法是通过FrUrlStreamHandlerFactory实例调用URL中的setURLStreamHandlerFactory方法。下面的程序完成了一个类似与Unix中的cat命令:
Hadoop:HDFS—文件IO
    程序的执行流程参考http://blog.sina.com.cn/s/blog_ac9fdc0b0101rxam.html。使用命令如下:
Hadoop:HDFS—文件IO
    唯一需要注意的是IOUtils.copyBytes函数,第三个参数指定缓冲区的大小,第四个参数指定结束后是否关闭输入流。
*************************************************************************************************
通过FileSystem API读取数据
    上面的setURLStreamHandlerFactory在Java虚拟机中只能调用一次,这意味着如果已经在其它组件声明URLStreamHandlerFactory实例,将无法再使用上面的方法从Hadoop中读取数据。这种情况下需要使用FileSystem API来打开一个文件的输入流。
=======================================================================
cat
    下面是使用新的方法来重写上面的实例:
Hadoop:HDFS—文件IO
(1)Hadoop文件系统通过Hadoop Path对象来代表文件。可以将一条路径视为一个Hadoop文件系统URI,如hdfs://localhost:9000/user/chenhuan/readme.txt
(2)Configuration对象封装了客户端或服务器的配置,通过设置配置文件读取类路径实现
(3)FileSystem.get(),检索我们需要使用的文件系统实例,这里是HDFS。实际上有两种方法:
    public static FileSystem get(Configuration conf) throws IOException
    public static FileSystem get(URI uri, Configuration conf) throws IOException
(4)获得FileSystem实例后,使用open函数获取文件的输入流
**************************************************************************************************
FSDataInputStream
    实际上,FileSystem对象中的open()方法返回的是FSDataInputStream对象,而不是标准的java.io类对象。这个类继承了java.io.DataInputStream接口的一个特殊类,并支持随机访问,因此可以从任何位置读取数据。
=============================================================================
FSDataInputStream类型的声明如下:
    Hadoop:HDFS—文件IO
=============================================================================
Seekable接口的声明如下:
Hadoop:HDFS—文件IO
===============================================================================
seek
    下面的例子展示了,通过上面的功能,将同一个文件输出到屏幕中两次:
Hadoop:HDFS—文件IO
显示的结果如下:
Hadoop:HDFS—文件IO
*************************************************************************************************
写入数据
    FileSytem类有一系列的创建文件的方法。最简单的方法就是给准备创建的文件指定一个Path对象,然后返回一个用于写入数据的输入流:
    public FSDataOutputStream create(Path f) throws IOException
===========================================================================
    还有一个重载方法Progressable,用于传递回调接口,这样可以把数据写入结点的进度通知到你的应用:
    package org.apache.util;
    public interface Progressable
    {
        public void process();
    }

============================================================================
    使用append()方法可以在一个已有文件末尾追加数据:
    public FSDataOutputStream append(Path f) throws IOException
============================================================================
copy
    下面的程序展示了将本地的文件copy到HDFS中,其实就是类似于命令:hadoop fs -put localFile hdfsFile
Hadoop:HDFS—文件IO
结果如下:
Hadoop:HDFS—文件IO
*************************************************************************************************
FSDataOutputStream对象
    FileSystem实例create()方法返回一个FSDataOutputStream对象,与FSDataInputStream类似,它也有一个查询当前位置的方法。
    package org.apache.hadoop.fs;
    public class FSDataOutputStream extends DataOutputStream implements Syncable
    {
        public long getPos() throws IOException
        {
         }
     }

<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7392876/viewspace-1120577/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论