hdfs上文件的读取和写入

从HDFS集群上读取数据文件:

详情解析:

(1)、Hadoop 文件系统中是通过Hadoop path来代表文件的,不是java.io.file,因为要准守hdfs这个协议嘛,所以当然就是path啦!例如:hdfs:\\ubuntu:9000/result.

(2)、要想得到FileSystem的实例,不是new,而是使用FieSystem的几个静态工厂方法来构建。

①在虚拟机上以用户身份运行:

FileSystem fs=FileSystem.get(conf);

②在本地机上运行就要和虚拟机之间取得通信:

conf.set("fs.defaultFS","hdfs://ubuntu:9000");

FileSystem fs =FileSystem.get(new URI("hdfs://ubuntu:9000"),conf,"oycc ");

(3)有了FileSystem实例,我们可以用open()方法来打开数据流,open()方法

传的是文件的路径,也就是path。

(4)FSDataInputStream对象:FSDataInputStream这个类继承了java.io.DataInputStream接口的一个特殊类,并且支持随机访问,可以从流的任意位置读取;

还继承了positionedReadable接口,可以使用参数来设置读取的字节数。

(5)seek()方法可以找到流中任意绝对位置,但是开销大,少用。多用流数据来建立应用的访问模式,如(mapreduce)

代码实现:

public class GetFile{

   public static void main(String[] args)

       throws URISyntaxException, IOException,

       InterruptedException{

       //获得hdfs的uri地址,以及用户名,

       // 也就是使用什么权限去访问hdfs集群上的文件。

       Configuration conf=new Configuration();

       FileSystem fs=

           FileSystem.get(conf);

       //获得输入数据流对象。

       FSDataInputStream is=

           fs.open(new Path("/result"));

       //获得输出流对象

       FileOutputStream fos=

           new FileOutputStream(

                newFile("E://weather_result.txt"));

       //利用IOUtils进行复制

       IOUtils.copyBytes(fis,fos,1024,true);

       fis.seek(0);//回到文件的开头

       IOUtils.copyBytes(fis,fos,1024,true);           

 

    }

}

向hdfs写入数据文件

详情解析:

1、大部分上面读取数据文件都已经涉及到了,就是还有一个如何向hdfs集群上建立一个输入流,这里就是调用create(Path path)方法。在hdfs上建立一个文件并向这个文件输出数据。

代码实现:

importorg.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataOutputStream;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IOUtils;

import java.io.*;

 

public class PutFile {

   public static void main(String[] args) throws IOException {

       Configuration conf = new Configuration();

       FileSystem fs = FileSystem.get(conf);//构建实例

       FileInputStream fis= new FileInputStream(newFile("/home/oycc/file_example"));//获得输入流对象

       FSDataOutputStream fos  =fs.create(new Path("/example1"));//获得向hdfs集群输出流对象

       IOUtils.copyBytes(fis,fos,1024,true);

    }

 

}

                                                                                                                                                        2018年4月22日

                                                                                                                                                       学习《hadoop权威指南》

猜你喜欢

转载自blog.csdn.net/qq_40898500/article/details/80041030