111 发表于 2018-10-31 08:14:57

Hadoop初学指南(4)--使用java操作HDFS

  本文主要介绍了如何使用java的api来对HDFS进行操作。
  (1)URL方式访问Hadoop中的文件
  ①为了方便修改本机C盘的windows/system32/drivers/etc下的hosts文件

  前一个为虚拟机的ip地址,后一个为虚拟机的主机名
  ②打开eclipse,新建一个Java工程,在src下建立一个hdfs的文件夹

  ③导入hadoop-1.1.2源码包中主目录以及lib目录中的jar包
  ④新建一个java类,这里命令为App1

  ⑤开始编程
  代码如下:
package hdfs;  
import java.io.InputStream;
  
import java.net.URL;
  
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
  
import org.apache.hadoop.io.IOUtils;

  
public>  static final String PATH="hdfs://myhadoop:9000/hello";
  public static void main(String[] args) throws Exception{
  URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
  URL url = new URL(PATH);
  InputStream in =url.openStream();
  IOUtils.copyBytes(in, System.out, 1024, true);
  }
  
}
  这里IOUtils中的四个参数分别表示输入流,输出流,缓存大小以及在传输结束后是否关闭流。
  代码写完后执行即可看到HDFS中/hello的内容:

  这是直接用shell查看/hello的内容:

  内容完全一致。
  (2)利用hadoop自身的api进行操作
  如果涉及到上传,创建,删除等操作,那么URL的方式就显得力不从心了,这时就需要用到hadoop自身提供的api进行操作。
  在操作之前需要建立一个跟HDFS连接的FileSystem:
static final String PATH="hdfs://myhadoop:9000/";  
FileSystem fileSystem = FileSystem.get(new URI(PATH),new Configuration());
  创建完这个FileSystem之后,就可以用这个FileSystem进行操作
  ①创建文件夹
  代码如下:
fileSystem.mkdirs(new Path("/d1"));
  可以看见/d1文件夹已经创建好了。
  ②删除文件夹
  代码如下:
fileSystem.delete(new Path("/d1"),true);  这里要注意一下第二个参数,如果第一个参数为目录,那么此时必须为true;如果第一个参数为文件,那么true和false都可以。
  ③上传文件
  代码如下:
FSDataOutputStream out = fileSystem.create(new Path("/d1/hello"));  
FileInputStream in = new FileInputStream("H:/readme.txt");
  
IOUtils.copyBytes(in, out, 1024,true);
  上传完成之后,查看/d1下的hello内容如下:

  ④下载文件
FSDataInputStream in1 = fileSystem.open(new Path("/d1/hello"));  
IOUtils.copyBytes(in1, System.out, 1024,true);
  这里的out可以指定到本地硬盘,这里演示就直接输出到控制台了:

  ⑤浏览文件夹
  代码如下:
FileStatus[] listStatus = fileSystem.listStatus(new Path("/"));  
for (FileStatus fileStatus : listStatus) {
  String isDir=fileStatus.isDir()?"文件夹":"文件";
  String permission = fileStatus.getPermission().toString();
  short replication = fileStatus.getReplication();//副本数
  long len = fileStatus.getLen();
  String path = fileStatus.getPath().toString();
  System.out.println(isDir+"\t"+permission+"\t"+replication+"\t"+len+"\t"+path);
  
}
  这里的permission表示权限,replication表示副本数,len表示长度,path表示路径,结果如下:

  当然,可以看到,这里不支持递归查询。


页: [1]
查看完整版本: Hadoop初学指南(4)--使用java操作HDFS