通过FileSystem API读取数据
hadoop文件系统中通过Hadoop
Path对象(而非java.io.File对象)代表文件,可以将路径视为一个hadoop文件系统URI,如hdfs://localhost/user/tom/quangle.txt
FileSystem是一个通用的文件兄台你API,所以第一步是检索我们需要使用的文件系统实例,这里是HDFS,获取FileSystem实例有以下几个静态工厂方法;
public static FileSystem get(Confuration conf)throws IOException
public static FileSystem get(URI url,Configuration conf)throws IOException
public static FIleSystem get(URI url, Configuration conf,String user)throws IOException
COnfiguration 对象封装了客户端或者服务器的配置,通过配置文件读取类路径来实现(etc/hadoop/core-site.xml)
获取本地文件系统可以使用getLcal()方法;
public static LocalFileSystem getLocal(Configuration conf) throws IOException
有了FileSystem实例之后,我们调用open()函数来获取文件的输入流;
public FSDataInputStream open(Path f) throws IOException
public abstract FSDataInputStream open(Paht f,int buferSize) throws IOException
第一个方法默认缓冲区大小4kB
总的来说就是选取路径,选取文件系统配置(何种文件系统),然后由此创建FileSystem对象,将此对象的open方法作为输入流读取;然后字节读取,输出;
直接使用FIleSystem以标准的格式显示Hadoop文件系统中的文件
public class FileSystemCat
{
public static void main(String args[])
{
String uri=args[0];
Configuration conf =new Configuration();
FileSystem fs=new FileSystem(URI.create(uri),conf);
InputStream in=null;
in=fs.open(fs);
try{
IOUtil.copyBytes(in,System.out,4096,false)
}finally{
IOUtil.closeStream(in);
}
}
}
FSDataInputStream 对象不是标准的java.io类对象,而是继承了java.io.DataInputStream接口的一个特殊类,并支持随机访问,因此可以在流的任意位置读取数据;
该类支持了Seekable接口,所以可以通过文件的起始位置偏移量(getPos())来查询;定位位置的使用seek(long pos);
当调用seek()来定位大于文件长度的位置会引发IOException异常。与java.io.InputStream的skip()不同,seek可以移到文件中任意一个绝对位置,skip()则只能相对于当前位置定义另一个新位置;
public interface Seekable
{
void seek(long pos) throws IOException;
long getPos() throws IOException;
boolean seekToNewSource(long targetPos) throws IOException;
}
youle