从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权威指南》