研读HADOOP权威指南,从而得知,从Java接口中,可以根据hadoop url读取数据,并且也可以根据filesystem API 读取数据。
一.我们根据hadoop url 读取数据。
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
public class UrlCat {
static {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
public static void main(String[] args) throws Exception {
InputStream ins = null;
try {
ins = new URL("hdfs://192.168.1.1:9000/user/word.txt").openStream();
IOUtils.copyBytes(ins, System.out, 1024, false);
} finally {
IOUtils.closeStream(ins);
}
}
}
请copy代码的兄弟,适当的更改里面URL参数。其实根据URL.openStream得到InputStram流, 然后我们可以调用IOUtils类,并且在finally子句中关闭数据流,同时也可以在输入流和输出流中间复制数据(OutPutStream (System.out)),这样我们就在控制台上打印数据了。
二.根据FileSystem API读取数据
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
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 org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
public class HDFSUtilTest {
@Test
public void readHDFS() throws Exception {
Configuration conn = new Configuration();
conn.set("fs.defaultFS","hdfs://192.168.1.1:9000");
FileSystem fs = FileSystem.get(conn);
FSDataInputStream fis = fs.open(new Path("/user/word.txt"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
IOUtils.copyBytes(fis, baos, 1024);
fis.close();
System.out.println(new String(baos.toByteArray()));
}
首先强调一点,此文中Path导入的包import org.apache.hadoop.fs.Path ,而不是我们常规理解的Java.io,文件系统通过Hadoop Path对象来代表文件,我们可以将路径看作是hadoop文件系统的URL。FileSystem是一个通用的文件系统API,我们根据静态工厂方法获取实例,所以有FileSystem fs = FileSystem.get(conn);但是里面有一个参数 conn,这个参数Configuration对象,此对象封装了客户端或者服务器的配置,通过设置配置文件读取类路径来实现,剩下的又是输入流和输出流的事情。
浙公网安备 33010602011771号