研读 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 对象, 此对象封装了客户端或者服务器的配置, 通过设置配置文件读取类路径来实现, 剩下的又是输入流和输出流的事情.
来源: https://www.cnblogs.com/sirlijun/p/9545006.html