本文主要介绍了如何使用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 class App1 { 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表示路径,结果如下:
当然,可以看到,这里不支持递归查询。