从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);
}
}
学习《hadoop权威指南》
2018年4月22日