一、使用hadoop url读取数据
从hadoop中的hdfs分布式文件系统中来读取数据,最简单的方法是通过使用java.net.URL对象来打开一个数据流,并从中读取数据,因此,一般的调用格式如下:
InputStream in = null;
try
{
in = new URL("hfs:///文件路径").openStream();
}
finally
{
IOUtils.closeStream(in);
}
这里需要注意的是,通过FsUrlStreamHandlerFactory实例来调用url中的setURLStreamHandlerFactory方法。这种方法在一个java虚拟机中只能调用一次,因此放在一个静态方法中来执行。因此如果程序的其他部分也设置了同样的这个对象,那么就会导致无法从hadoop读取数据。
接下来从hdfs上读取/data/input/test.log中的数据,采用如下代码实现:
public class URLCat
{
static
{
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); //放在static中
}
public static void main(String[] args) throws Exception
{
InputStream in = null;
try
{
in = new URL(args[0]).openStream(); //其中args[0]表示的就是在命令行中输入的要访问的url的地址
IOUtils.copyBytes(in,System.out,4096,false); //使用hadoop中简洁的IOUtils类来关闭finally子句中的数据流,同时复制了输出流之间的字节(System.out),用到了copyBytes方法,其中4096参数表示的是复制缓冲区的大小,false表示的是复制后关闭数据流。
}
finally
{
IOUtils.closeStream(in);
}
}
}
上述代码通过打jar包后,放在hadoop运行,且第一个参数表示的是需要查看的文件的url地址,注意要使用hdfs:///表示
二、使用FileSystem API读取数据