庞双玉
摘 要 本文讨论JAVA语言中的流机制在HDFS分布式文件系统读写操作中的应用,通过对比JAVA中的输入和输出流机制和HDFS的读写操作,阐述java流思想的本质,以及Java在分布式系统开发中的优越性。
【关键词】Java 分布式系统 数据
1 引言
Apache Hadoop是一个分布式开源的软件系统框架。它被用于分布文式文件系统和用MAP/REUDUCE机制处理的大数据处理模型中。它包含多个由通用商业硬件组成的计算机集群。Hadoop中所有的模块设计都基于一个基本的假设即硬件错误是普遍发生并且可以自动被处理的。
Hadoop的核心包括分布式的文件系统存储即HDFS。Hadoop是用Java语言开发的,本文讨论Java语言中的流机制在HDFS文件系统设计中的应用。
2 Java语言中的流机制
流是java语言所特有的机制,把数据的存取想象成从一个源源不断的数据流中读取,在Java中,创建输入和输出流对象时,以要操作的文件对象或者数据源头作为构造方法参数,将输入和输出流与操作对象关联。
流的一端可以是数据、设备、网络、内存,根据数据的流向,数据从网络,设备,内存等到创建好的流,称为输入流,数据从创建好的流到网络,设备,内存等,称为输出流。如图1、图2所示。
3 Hadoop和HDFS文件系统
Hadoop是Apach公司实现的一个框架,用Java语言开发,从本质上说,hadoop实现了一个分布式集群,这个集群中有一个master节点和多个slave节点,核心机制是Map/Reduce数据处理机制和HDFS文件系统,HDFS是分布式文件系统,它采用数据块和多节点备份机制,保证了高可靠性和容错性。
4 对HDFS文件系统的访问
对HDFS文件系统的访问,有两种方式,一种通过java.net.URL访问,一种是通过FileSystem来访问。
通过URL访问代码:
HDFS的API使用:
public class ExCat {
static{
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
public static void main(String[] args) {
InputStream input=null;
try {
input = new URL(args[0]).openStream();
//使用java.net.URL对象打开数据流
IOUtils.copyBytes(input,System.out,4096,false);
//IOUtils类实现字节复制,将URL所在的文件内容输出到控制台
} catch (Exception e) {
System.err.println("Error");
}finally{
IOUtils.closeStream(input);
}
}
}
需要注意的是,程序中的static block代码块,这个代码块的作用是,将URL地址转换为一个HDFS地址,但是JVM只能调用一次这样的代码块。
通过java文件系统来访问代码:
packageTestHdfs;
importjava.io.BufferedInputStream;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.URI;
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.FSDataOutputStream;
importorg.apache.hadoop.fs.FileSystem;
importorg.apache.hadoop.fs.Path;
importorg.apache.hadoop.io.IOUtils;
public class FileCopyFromLocal {
public static void main(String[] args) throws Exception {
String sr="/usr/local/filecontent/exmple";
//本地路徑文件
String des="hdfs://neusoft-master:9000/data/test";
//HDFS的路徑
InputStream in = new BufferedInputStream(new FileInputStream(sr));
//HDFS读写的配置文件
Configuration con = new Configuration();
FileSystemfs = FileSystem.get(URI.create(des),con);
OutputStream out = fs.create(new Path(des));
IOUtils.copyBytes(in, out, 4096, true);
}
}
从上面两种方式,我们可以看出,对HDFS文件系统的访问,无论采用以上哪种,都利用java数据流方式来访问和读写数据。流式数据访问的优点在于,一次写入,多次去读取。
5 结论
Hadoop平台本身就是用java实现的,Java语言跨平台的天然特性,使其分别适合于分布式开发,java中的流数据访问机制,正是hadoop中HDFS分布式文件系统数据访问的思想原型,流数据访问特别适合于需要持续生成动态数据的场景。流式数据访问,解决了寻址耗时比较长的问题,更易于实现对数据的动态的处理,并节省机器硬盘空间。
作者单位
深圳技师学院 广东省深圳市 518000