HDFS API操作实践
本文提供几个简单的实例,来说明如何使用hadoop的java API针对HDFS进行文件上传、创建、重命名、删除操作
本文地址:http://www.cnblogs.com/archimedes/p/hdfs-api-operations.html,转载请注明源地址。
1.上传本地文件到HDFS
通过FileSystem.copyFromLocalFile(Path src, Path dst)可将本地文件上传到HDFS指定的位置上,其中src和dst均为文件的完整路径
在《hadoop实战--搭建开发环境及编写Hello World》一文中的myHelloWorld项目下新建一个文件CopyFile.java,添加代码:
import java.util.*;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path; public class CopyFile {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
FileSystem hdfs = FileSystem.get(conf); Path src =new Path("/home/wu/copy.txt"); //完整路径
Path dst =new Path("hdfs://localhost:9000/user/wu/in/");
hdfs.copyFromLocalFile(src, dst);
System.out.println("Upload to" + conf.get("fs.default.name")); FileStatus files[] = hdfs.listStatus(dst);
for(FileStatus file : files) {
System.out.println(file.getPath());
}
}
}
copy.txt为自己新建的一个测试文件,关于dst路径,可以双击in文件中的test1.txt,就会出现完整路径名(hdfs://localhost:9000/user/wu/in)
注意:main后面加上throws Exception,否则会报错

运行结果可以在控制台和文件夹中验证,控制台显示:
Upload tohdfs://localhost:9000/
hdfs://localhost:9000/user/wu/in/copy.txt
hdfs://localhost:9000/user/wu/in/test1.txt
hdfs://localhost:9000/user/wu/in/test2.txt
刷新项目,可以看到in文件下夹多了一个copy.txt文件

2.创建HDFS文件
通过FileSystem.creat(Path f)可在HDFS上创建文件,其中f为文件的完整路径。
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class CreateFile {
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
byte[] buff = "hello world, hello wu!".getBytes();
FileSystem hdfs = FileSystem.get(conf);
Path dfs = new Path("hdfs://localhost:9000/user/wu/in/copy.txt");
FSDataOutputStream outputStream = hdfs.create(dfs);
outputStream.write(buff,0, buff.length);
}
}
双击查看in文件夹中的copy.txt文件,内容如预期所示:

3.重命名HDFS文件
通过FileSystem.rename(Path src, Path dst)可为指定的HDFS文件重命名,其中src和dst均为文件的完整路径。
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class RenameFile {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Configuration conf = new Configuration();
FileSystem hdfs = FileSystem.get(conf);
Path frPath = new Path("hdfs://localhost:9000/user/wu/in/copy.txt");
Path toPath = new Path("hdfs://localhost:9000/user/wu/in/RenameFile.txt");
boolean isRenameFile = hdfs.rename(frPath, toPath);
}
}
运行后的结果如下图:

4.删除HDFS上的文件
通过FileSystem.delete(Path f,Boolean recursive)可删除指定的HDFS文件,其中f为需要删除文件的完整路径,recursive用来确定是否进行递归删除。
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class RenameFile {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Configuration conf = new Configuration();
FileSystem hdfs = FileSystem.get(conf);
Path delpath = new Path("hdfs://localhost:9000/user/wu/in/RenameFile.txt"); boolean isDeleted = hdfs.delete(delpath, false);
System.out.println("delete?" + isDeleted);
}
}
运行后的结果如下图:

5.查看HDFS文件的最后修改时间
通过FileStatus.getModificationTime()可以查看指定HDFS文件的修改时间。
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;
public class GetLTime {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Configuration conf = new Configuration();
FileSystem hdfs = FileSystem.get(conf);
Path fpath = new Path("hdfs://localhost:9000/user/wu/in/hdfstest.txt");
FileStatus fileStatus = hdfs.getFileStatus(fpath);
long modificationTime = fileStatus.getModificationTime();
System.out.println("Modification time is " + modificationTime);
}
}
运行结果如下:
Modification time is 1418719100449
6.查看某个HDFS文件是否存在
通过FileSystem.exists(Path f)可查看指定HDFS文件是否存在,其中f为文件的完整路径。
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;
public class CheckFile {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Configuration conf = new Configuration();
FileSystem hdfs = FileSystem.get(conf);
Path findfile = new Path("hdfs://localhost:9000/user/wu/in/hdfstest.txt");
boolean isExists = hdfs.exists(findfile);
System.out.println("is exists? " + isExists);
}
}
运行结果如下:
is exists? true
7.查看某个文件的HDFS集群位置
通过FileSystem.getFileBlockLocation(FileStatus file,long start,long len)可查找指定文件在HDFS集群上的位置,其中file为文件的完整路径,start和len来标识查找文件的路径。
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;
public class FileLoc {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Configuration conf = new Configuration();
FileSystem hdfs = FileSystem.get(conf);
Path fpath = new Path("hdfs://localhost:9000/user/wu/in");
FileStatus filestatus = hdfs.getFileStatus(fpath);
BlockLocation[] blkLocations = hdfs.getFileBlockLocations(filestatus, 0, filestatus.getLen());
int blockLen = blkLocations.length;
System.out.println(blockLen);
for(int i = 0; i < blockLen; i++) {
String[] hosts = blkLocations[i].getHosts();
System.out.println("block " + i + "location:" + hosts[i]);
}
} }
参考资料
《实战Hadop:开启通向云计算的捷径.刘鹏》
HDFS API操作实践的更多相关文章
- HDFS简单介绍及用C语言訪问HDFS接口操作实践
一.概述 近年来,大数据技术如火如荼,怎样存储海量数据也成了当今的热点和难点问题,而HDFS分布式文件系统作为Hadoop项目的分布式存储基础,也为HBASE提供数据持久化功能,它在大数据项目中有很广 ...
- Hadoop学习记录(3)|HDFS API 操作|RPC调用
HDFS的API操作 URL方式访问 package hdfs; import java.io.IOException; import java.io.InputStream; import java ...
- 对Hadoop分布式文件系统HDFS的操作实践
原文地址:https://dblab.xmu.edu.cn/blog/290-2/ Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)是Hadoop核 ...
- HDFS api操作
import java.net.URI;import java.util.Iterator;import java.util.Map.Entry; import org.apache.hadoop.c ...
- Hadoop 之 HDFS API操作
1. 文件上传 @Slf4j public class HDFSClient { @Test public void testCopyFromLocalFile() throws Exception{ ...
- Java 封装 HDFS API 操作
代码下载地址:点击下载 一:环境介绍 hadoop:2.6 Ubuntu:15.10 eclipse:3.8.1 二:操作包含 推断某个目录是否存在 isExist(fold ...
- HDFS API 操作实例(一) HDFS读写操作
1. 读取HDFS文件 1.1 字符读取HDFS上的文件 Configuration conf = new Configuration(); Path path = new Path(pathstr) ...
- HDFS API 操作实例(二) 目录操作
1. 递归读取文件名 1.1 递归实现读取文件名(scala + listFiles) /** * 实现:listFiles方法 * 迭代列出文件夹下的文件,只能列出文件 * 通过fs的listFil ...
- HDFS基础和java api操作
1. 概括 适合一次写入多次查询情况,不支持并发写情况 通过hadoop shell 上传的文件存放在DataNode的block中,通过linux shell只能看见block,看不见文件(HDFS ...
随机推荐
- T1,T2,T3 三个线程顺序执行
T1,T2,T3 三个线程顺序执行 现在有 T1.T2.T3 三个线程,你怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后执行?(T1->T2->T3) 这个线程问题通常会 ...
- nhibernate 比较运算符
比较运算符 HQL运算符 QBC运算符 含义 = Restrictions.eq() 等于 <> Restrictions.not(Exprission.eq()) 不等于 > Re ...
- Qt中translate、tr关系 与中文问题
原文请看:http://hi.baidu.com/dbzhang800/item/d850488767bdc3cdee083d43 题外话:何时使用 tr ? 在论坛中漂,经常遇到有人遇到tr相关的问 ...
- Android之 服务(1)
1 简介 服务是Android四大组件之一.不过与Activity不同的是,服务不会直接与用户交互,而是摸摸地在后台运行. 有两种方式来启动系统服务. 一种是调用 Context.startServi ...
- Mybatis 源码分析之一二级缓存
一级缓存 其实关于 Mybatis 的一级缓存是比较抽象的,并没有什么特别的配置,都是在代码中体现出来的. 当调用 Configuration 的 newExecutor 方法来创建 executor ...
- MPI - 缓冲区和非阻塞通信
转载自: Introduction to MPI - Part II (Youtube) Buffering Suppose we have ) MPI_Send(sendbuf,...,,...) ...
- TCP/IP——IP网络协议简记
IP提供不可靠.无连接的数据报传送服务 不可靠:不保证IP数据报能成功到达目的地,当发生错误时,IP的做法是丢弃这个数据报,然后发送ICMP消息报给信息源. 无连接:IP不维护任何关于后续数据报的状态 ...
- log4j log for java
1.log4j简介 1.如果程序中出现异常,我们怎么解决? 01.使用异常处理机制===>异常 (但是使用原则是,能不用异常处理机制,最好不用,怎么办?) 02.通过debug调试 (必须掌握) ...
- 理解裸机部署过程ironic
部署物理机跟部署虚拟机的概念在nova来看是一样,都是nova通过创建虚拟机的方式来触发,只是底层nova-scheduler和nova-compute的驱动不一样.虚拟机的底层驱动采用的libvir ...
- Java创建线程的三种主要方式
Java创建线程的主要方式 一.继承Thread类创建 通过继承Thread并且重写其run(),run方法中即线程执行任务.创建后的子类通过调用 start() 方法即可执行线程方法. 通过继承Th ...