hadoop: hdfs API示例

利用hdfs的api,可以实现向hdfs的文件、目录读写,利用这一套API可以设计一个简易的山寨版云盘,见下图:

为了方便操作,将常用的文件读写操作封装了一个工具类:

  1 import org.apache.hadoop.conf.Configuration;
  2 import org.apache.hadoop.fs.*;
  3 import org.apache.hadoop.io.IOUtils;
  4
  5 import java.io.ByteArrayOutputStream;
  6 import java.io.IOException;
  7 import java.io.InputStream;
  8 import java.io.OutputStream;
  9
 10 /**
 11  * HDFS工具类
 12  * Author: 菩提树下的杨过(http://yjmyzz.cnblogs.com)
 13  * Since: 2015-05-21
 14  */
 15 public class HDFSUtil {
 16
 17
 18     private HDFSUtil() {
 19
 20     }
 21
 22     /**
 23      * 判断路径是否存在
 24      *
 25      * @param conf
 26      * @param path
 27      * @return
 28      * @throws IOException
 29      */
 30     public static boolean exits(Configuration conf, String path) throws IOException {
 31         FileSystem fs = FileSystem.get(conf);
 32         return fs.exists(new Path(path));
 33     }
 34
 35     /**
 36      * 创建文件
 37      *
 38      * @param conf
 39      * @param filePath
 40      * @param contents
 41      * @throws IOException
 42      */
 43     public static void createFile(Configuration conf, String filePath, byte[] contents) throws IOException {
 44         FileSystem fs = FileSystem.get(conf);
 45         Path path = new Path(filePath);
 46         FSDataOutputStream outputStream = fs.create(path);
 47         outputStream.write(contents);
 48         outputStream.close();
 49         fs.close();
 50     }
 51
 52     /**
 53      * 创建文件
 54      *
 55      * @param conf
 56      * @param filePath
 57      * @param fileContent
 58      * @throws IOException
 59      */
 60     public static void createFile(Configuration conf, String filePath, String fileContent) throws IOException {
 61         createFile(conf, filePath, fileContent.getBytes());
 62     }
 63
 64     /**
 65      * @param conf
 66      * @param localFilePath
 67      * @param remoteFilePath
 68      * @throws IOException
 69      */
 70     public static void copyFromLocalFile(Configuration conf, String localFilePath, String remoteFilePath) throws IOException {
 71         FileSystem fs = FileSystem.get(conf);
 72         Path localPath = new Path(localFilePath);
 73         Path remotePath = new Path(remoteFilePath);
 74         fs.copyFromLocalFile(true, true, localPath, remotePath);
 75         fs.close();
 76     }
 77
 78     /**
 79      * 删除目录或文件
 80      *
 81      * @param conf
 82      * @param remoteFilePath
 83      * @param recursive
 84      * @return
 85      * @throws IOException
 86      */
 87     public static boolean deleteFile(Configuration conf, String remoteFilePath, boolean recursive) throws IOException {
 88         FileSystem fs = FileSystem.get(conf);
 89         boolean result = fs.delete(new Path(remoteFilePath), recursive);
 90         fs.close();
 91         return result;
 92     }
 93
 94     /**
 95      * 删除目录或文件(如果有子目录,则级联删除)
 96      *
 97      * @param conf
 98      * @param remoteFilePath
 99      * @return
100      * @throws IOException
101      */
102     public static boolean deleteFile(Configuration conf, String remoteFilePath) throws IOException {
103         return deleteFile(conf, remoteFilePath, true);
104     }
105
106     /**
107      * 文件重命名
108      *
109      * @param conf
110      * @param oldFileName
111      * @param newFileName
112      * @return
113      * @throws IOException
114      */
115     public static boolean renameFile(Configuration conf, String oldFileName, String newFileName) throws IOException {
116         FileSystem fs = FileSystem.get(conf);
117         Path oldPath = new Path(oldFileName);
118         Path newPath = new Path(newFileName);
119         boolean result = fs.rename(oldPath, newPath);
120         fs.close();
121         return result;
122     }
123
124     /**
125      * 创建目录
126      *
127      * @param conf
128      * @param dirName
129      * @return
130      * @throws IOException
131      */
132     public static boolean createDirectory(Configuration conf, String dirName) throws IOException {
133         FileSystem fs = FileSystem.get(conf);
134         Path dir = new Path(dirName);
135         boolean result = fs.mkdirs(dir);
136         fs.close();
137         return result;
138     }
139
140     /**
141      * 列出指定路径下的所有文件(不包含目录)
142      *
143      * @param conf
144      * @param basePath
145      * @param recursive
146      */
147     public static RemoteIterator<LocatedFileStatus> listFiles(FileSystem fs, String basePath, boolean recursive) throws IOException {
148
149         RemoteIterator<LocatedFileStatus> fileStatusRemoteIterator = fs.listFiles(new Path(basePath), recursive);
150
151         return fileStatusRemoteIterator;
152     }
153
154     /**
155      * 列出指定路径下的文件(非递归)
156      *
157      * @param conf
158      * @param basePath
159      * @return
160      * @throws IOException
161      */
162     public static RemoteIterator<LocatedFileStatus> listFiles(Configuration conf, String basePath) throws IOException {
163         FileSystem fs = FileSystem.get(conf);
164         RemoteIterator<LocatedFileStatus> remoteIterator = fs.listFiles(new Path(basePath), false);
165         fs.close();
166         return remoteIterator;
167     }
168
169     /**
170      * 列出指定目录下的文件\子目录信息(非递归)
171      *
172      * @param conf
173      * @param dirPath
174      * @return
175      * @throws IOException
176      */
177     public static FileStatus[] listStatus(Configuration conf, String dirPath) throws IOException {
178         FileSystem fs = FileSystem.get(conf);
179         FileStatus[] fileStatuses = fs.listStatus(new Path(dirPath));
180         fs.close();
181         return fileStatuses;
182     }
183
184
185     /**
186      * 读取文件内容
187      *
188      * @param conf
189      * @param filePath
190      * @return
191      * @throws IOException
192      */
193     public static String readFile(Configuration conf, String filePath) throws IOException {
194         String fileContent = null;
195         FileSystem fs = FileSystem.get(conf);
196         Path path = new Path(filePath);
197         InputStream inputStream = null;
198         ByteArrayOutputStream outputStream = null;
199         try {
200             inputStream = fs.open(path);
201             outputStream = new ByteArrayOutputStream(inputStream.available());
202             IOUtils.copyBytes(inputStream, outputStream, conf);
203             fileContent = outputStream.toString();
204         } finally {
205             IOUtils.closeStream(inputStream);
206             IOUtils.closeStream(outputStream);
207             fs.close();
208         }
209         return fileContent;
210     }
211 }

View Code

简单的测试了一下:

 1     @Test
 2     public void test() throws IOException {
 3         Configuration conf = new Configuration();
 4         String newDir = "/test";
 5         //01.检测路径是否存在 测试
 6         if (HDFSUtil.exits(conf, newDir)) {
 7             System.out.println(newDir + " 已存在!");
 8         } else {
 9             //02.创建目录测试
10             boolean result = HDFSUtil.createDirectory(conf, newDir);
11             if (result) {
12                 System.out.println(newDir + " 创建成功!");
13             } else {
14                 System.out.println(newDir + " 创建失败!");
15             }
16         }
17         String fileContent = "Hi,hadoop. I love you";
18         String newFileName = newDir + "/myfile.txt";
19
20         //03.创建文件测试
21         HDFSUtil.createFile(conf, newFileName, fileContent);
22         System.out.println(newFileName + " 创建成功");
23
24         //04.读取文件内容 测试
25         System.out.println(newFileName + " 的内容为:\n" + HDFSUtil.readFile(conf, newFileName));
26
27         //05. 测试获取所有目录信息
28         FileStatus[] dirs = HDFSUtil.listStatus(conf, "/");
29         System.out.println("--根目录下的所有子目录---");
30         for (FileStatus s : dirs) {
31             System.out.println(s);
32         }
33
34         //06. 测试获取所有文件
35         FileSystem fs = FileSystem.get(conf);
36         RemoteIterator<LocatedFileStatus> files = HDFSUtil.listFiles(fs, "/", true);
37         System.out.println("--根目录下的所有文件---");
38         while (files.hasNext()) {
39             System.out.println(files.next());
40         }
41         fs.close();
42
43         //删除文件测试
44         boolean isDeleted = HDFSUtil.deleteFile(conf, newDir);
45         System.out.println(newDir + " 已被删除");
46
47     }

View Code

注:测试时,不要忘记了在resources目录下放置core-site.xml文件,不然IDE环境下,代码不知道去连哪里的HDFS

输出结果:

/test 已存在!
/test/myfile.txt 创建成功
/test/myfile.txt 的内容为:
Hi,hadoop. I love you
--根目录下的所有子目录---
FileStatus{path=hdfs://172.28.20.102:9000/jimmy; isDirectory=true; modification_time=1432176691550; access_time=0; owner=hadoop; group=supergroup; permission=rwxrwxrwx; isSymlink=false}
FileStatus{path=hdfs://172.28.20.102:9000/test; isDirectory=true; modification_time=1432181331362; access_time=0; owner=jimmy; group=supergroup; permission=rwxr-xr-x; isSymlink=false}
FileStatus{path=hdfs://172.28.20.102:9000/user; isDirectory=true; modification_time=1431931797244; access_time=0; owner=hadoop; group=supergroup; permission=rwxr-xr-x; isSymlink=false}
--根目录下的所有文件---
LocatedFileStatus{path=hdfs://172.28.20.102:9000/jimmy/input/README.txt; isDirectory=false; length=1366; replication=1; blocksize=134217728; modification_time=1431922483851; access_time=1432174134018; owner=hadoop; group=supergroup; permission=rw-r--r--; isSymlink=false}
LocatedFileStatus{path=hdfs://172.28.20.102:9000/jimmy/output/_SUCCESS; isDirectory=false; length=0; replication=3; blocksize=134217728; modification_time=1432176692454; access_time=1432176692448; owner=jimmy; group=supergroup; permission=rw-r--r--; isSymlink=false}
LocatedFileStatus{path=hdfs://172.28.20.102:9000/jimmy/output/part-r-00000; isDirectory=false; length=1306; replication=3; blocksize=134217728; modification_time=1432176692338; access_time=1432176692182; owner=jimmy; group=supergroup; permission=rw-r--r--; isSymlink=false}
LocatedFileStatus{path=hdfs://172.28.20.102:9000/test/myfile.txt; isDirectory=false; length=21; replication=3; blocksize=134217728; modification_time=1432181331601; access_time=1432181331362; owner=jimmy; group=supergroup; permission=rw-r--r--; isSymlink=false}
/test 已被删除

用spring-mvc结合hdfs api仿造hadoop的文件浏览管理界面,做了一个山寨版:(只完成了文件列表功能)

源代码托管在taobao开源平台上了,有需要的可以参考下:

http://code.taobao.org/p/hdfs-web-client/src/trunk/

时间: 2024-11-03 05:07:19

hadoop: hdfs API示例的相关文章

HTTPFS: 基于HTTP操作hadoop hdfs文件系统

一.HTTPFS简介     1:httpfs是cloudera公司提供的一个hadoop hdfs的一个http接口,通过WebHDFS REST API 可以对hdfs进行读写等访问       2:与WebHDFS的区别是不需要客户端可以访问hadoop集群的每一个节点,通过httpfs可以访问放置在防火墙后面的hadoop集群       3:httpfs是一个Web应用,部署在内嵌的tomcat中       用这种方式在数据共享给其他系统时,网络安全上更容易实现,使用请参考: htt

Hadoop HDFS 用户指南

This document is a starting point for users working with Hadoop Distributed File System (HDFS) either as a part of a Hadoop cluster or as a stand-alone general purpose distributed file system. While HDFS is designed to "just work" in many enviro

Hadoop (HDFS)分布式文件系统基本操作

Hadoop HDFS提供了一组命令集来操作文件,它既可以操作Hadoop分布式文件系统,也可以操作本地文件系统.但是要加上theme(Hadoop文件系统用hdfs://,本地文件系统用file://) 1. 添加文件,目录 HDFS文件系统(需要加hdfs://): 因为我们在core-site.xml中配置了fs.default.name 所以所有和HDFS打交道的命令都不需要加上前缀hdfs://192.168.129.35:9000 比如我们要在Hadoop 文件系统中创建一个目录叫

Contact Manager Web API 示例[4] 异常处理(Exception Handling)

联系人管理器web API是一个Asp.net web api示例程序,演示了通过ASP.NET Web API 公开联系信息,并允许您添加和删除联系人,示例地址http://code.msdn.microsoft.com/Contact-Manager-Web-API-0e8e373d. Contact Manager Web API 示例[1]CRUD 操作 已经做了一个基本的介绍, Contact Manager Web API 示例[2] Web API Routing 介绍Web AP

Hadoop HDFS RPM包安装方案

文章出处:http://netkiller.github.io/storage/hdfs.html   5.2. Hadoop HDFS RPM包安装方案 你是不是感觉Hadoop 安装太复杂呢? 下面是无障碍,无门槛安装方案,非常适合不懂Java得系统管理. HDFS:       NameNode  :管理节点       DataNode  :数据节点       SecondaryNamenode : 数据源信息备份整理节点 MapReduce        JobTracker  :任

开源Hadoop HDFS高可用性介绍、安装与配置

那么 CAMP 服务器对开源 Hadoop 的高可用性是否支持?答案是 肯定的.本文将介绍如何在 CAMP 服务器上使用 PLinux 操作系统实现开源 Hadoop HDFS 的高可用性.Hadoop 是目前最热门的大数据计算系统,它实现了一个可扩展的分布式文件系统 HDFS 作为海量数据的存储系统.HDFS 是主从式的分布式系统(如图 1),NameNode 管理整个文件系统的元数据,负责数据的分配,并管理着 DataNode:而 DataNode 负责存储数据块,按块(用户可设置,默认是

php版微信小店调用api示例代码_php技巧

本文实例讲述了php版微信小店调用api的方法.分享给大家供大家参考,具体如下: 刚开始调用微信小店api的时候,可能大家会遇到问题.系统总是提示system error,归根结底还是发送的参数不正确. 下面给出几个调用例子: 例子写得不全. <?php function cUrlRequest($url,$data = null){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CU

基于key/value+Hadoop HDFS 设计的存储系统的shell命令接口

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   对于hadoop HDFS 中的所有命令进行解析(其中操作流程是自己的想法有不同意见欢迎大家指正) 接口名称 功能 操作流程 get 将文件复制到本地文件系统 .如果指定了多个源文件,本地目的端必须是一个目录. (1)按照上述机制,在Config server上的存储引擎中逐层读取K-V,直到获得文件名(或大文件元数据信息): (2)根据文件名(或大文件元数据信

输入输出-hadoop hdfs 挂载报错

问题描述 hadoop hdfs 挂载报错 hadoop hdfs挂载在linux上市报错fuse-dfs didn't recognize /hadoop/hdfs,-2,然后打开/hadoop/hdfs时报输入输出目录错误 解决方案 http://blog.csdn.net/knowledgeaaa/article/details/25896581