熟练掌握HDFS的Java API接口访问
HDFS设计的主要目的是对海量数据进行存储,也就是说在其上能够存储很大量文件(可以存储TB级的文件)。HDFS将这些文件分割之后,存储在不同的DataNode上, HDFS 提供了两种访问接口:Shell接口和Java API 接口,对HDFS里面的文件进行操作,具体每个Block放在哪台DataNode上面,对于开发者来说是透明的。
通过Java API接口对HDFS进行操作,我将其整理成工具类,地址见底部
1、获取文件系统
/**
* 获取文件系统
*
* @return FileSystem
*/
public static FileSystem getFileSystem() {
//读取配置文件
Configuration conf = new Configuration();
// 文件系统
FileSystem fs = null; String hdfsUri = HDFSUri;
if(StringUtils.isBlank(hdfsUri)){
// 返回默认文件系统 如果在 Hadoop集群下运行,使用此种方法可直接获取默认文件系统
try {
fs = FileSystem.get(conf);
} catch (IOException e) {
logger.error("", e);
}
}else{
// 返回指定的文件系统,如果在本地测试,需要使用此种方法获取文件系统
try {
URI uri = new URI(hdfsUri.trim());
fs = FileSystem.get(uri,conf);
} catch (URISyntaxException | IOException e) {
logger.error("", e);
}
} return fs;
}
2、创建文件目录
/**
* 创建文件目录
*
* @param path
*/
public static void mkdir(String path) {
try {
// 获取文件系统
FileSystem fs = getFileSystem(); String hdfsUri = HDFSUri;
if(StringUtils.isNotBlank(hdfsUri)){
path = hdfsUri + path;
} // 创建目录
fs.mkdirs(new Path(path)); //释放资源
fs.close();
} catch (IllegalArgumentException | IOException e) {
logger.error("", e);
}
}
3、删除文件或者文件目录
/**
* 删除文件或者文件目录
*
* @param path
*/
public static void rmdir(String path) {
try {
// 返回FileSystem对象
FileSystem fs = getFileSystem(); String hdfsUri = HDFSUri;
if(StringUtils.isNotBlank(hdfsUri)){
path = hdfsUri + path;
} // 删除文件或者文件目录 delete(Path f) 此方法已经弃用
fs.delete(new Path(path),true); // 释放资源
fs.close();
} catch (IllegalArgumentException | IOException e) {
logger.error("", e);
}
}
3、根据filter获取目录下的文件
/**
* 根据filter获取目录下的文件
*
* @param path
* @param pathFilter
* @return String[]
*/
public static String[] ListFile(String path,PathFilter pathFilter) {
String[] files = new String[0]; try {
// 返回FileSystem对象
FileSystem fs = getFileSystem(); String hdfsUri = HDFSUri;
if(StringUtils.isNotBlank(hdfsUri)){
path = hdfsUri + path;
} FileStatus[] status;
if(pathFilter != null){
// 根据filter列出目录内容
status = fs.listStatus(new Path(path),pathFilter);
}else{
// 列出目录内容
status = fs.listStatus(new Path(path));
} // 获取目录下的所有文件路径
Path[] listedPaths = FileUtil.stat2Paths(status);
// 转换String[]
if (listedPaths != null && listedPaths.length > 0){
files = new String[listedPaths.length];
for (int i = 0; i < files.length; i++){
files[i] = listedPaths[i].toString();
}
}
// 释放资源
fs.close();
} catch (IllegalArgumentException | IOException e) {
logger.error("", e);
} return files;
}
4、文件上传至 HDFS
/**
* 文件上传至 HDFS
*
* @param delSrc
* @param overwrite
* @param srcFile
* @param destPath
*/
public static void copyFileToHDFS(boolean delSrc, boolean overwrite,String srcFile,String destPath) {
// 源文件路径是Linux下的路径,如果在 windows 下测试,需要改写为Windows下的路径,比如D://hadoop/djt/weibo.txt
Path srcPath = new Path(srcFile); // 目的路径
String hdfsUri = HDFSUri;
if(StringUtils.isNotBlank(hdfsUri)){
destPath = hdfsUri + destPath;
}
Path dstPath = new Path(destPath); // 实现文件上传
try {
// 获取FileSystem对象
FileSystem fs = getFileSystem();
fs.copyFromLocalFile(srcPath, dstPath);
fs.copyFromLocalFile(delSrc,overwrite,srcPath, dstPath);
//释放资源
fs.close();
} catch (IOException e) {
logger.error("", e);
}
}
5、从 HDFS 下载文件
/**
* 从 HDFS 下载文件
*
* @param srcFile
* @param destPath
*/
public static void getFile(String srcFile,String destPath) {
// 源文件路径
String hdfsUri = HDFSUri;
if(StringUtils.isNotBlank(hdfsUri)){
srcFile = hdfsUri + srcFile;
}
Path srcPath = new Path(srcFile); // 目的路径是Linux下的路径,如果在 windows 下测试,需要改写为Windows下的路径,比如D://hadoop/djt/
Path dstPath = new Path(destPath); try {
// 获取FileSystem对象
FileSystem fs = getFileSystem();
// 下载hdfs上的文件
fs.copyToLocalFile(srcPath, dstPath);
// 释放资源
fs.close();
} catch (IOException e) {
logger.error("", e);
}
}
6、获取 HDFS 集群节点信息
/**
* 获取 HDFS 集群节点信息
*
* @return DatanodeInfo[]
*/
public static DatanodeInfo[] getHDFSNodes() {
// 获取所有节点
DatanodeInfo[] dataNodeStats = new DatanodeInfo[0]; try {
// 返回FileSystem对象
FileSystem fs = getFileSystem(); // 获取分布式文件系统
DistributedFileSystem hdfs = (DistributedFileSystem)fs; dataNodeStats = hdfs.getDataNodeStats();
} catch (IOException e) {
logger.error("", e);
}
return dataNodeStats;
}
7、查找某个文件在 HDFS集群的位置
/**
* 查找某个文件在 HDFS集群的位置
*
* @param filePath
* @return BlockLocation[]
*/
public static BlockLocation[] getFileBlockLocations(String filePath) {
// 文件路径
String hdfsUri = HDFSUri;
if(StringUtils.isNotBlank(hdfsUri)){
filePath = hdfsUri + filePath;
}
Path path = new Path(filePath); // 文件块位置列表
BlockLocation[] blkLocations = new BlockLocation[0];
try {
// 返回FileSystem对象
FileSystem fs = getFileSystem();
// 获取文件目录
FileStatus filestatus = fs.getFileStatus(path);
//获取文件块位置列表
blkLocations = fs.getFileBlockLocations(filestatus, 0, filestatus.getLen());
} catch (IOException e) {
logger.error("", e);
}
return blkLocations;
}
8、文件重命名
/**
* 文件重命名
*
* @param srcPath
* @param dstPath
*/
public boolean rename(String srcPath, String dstPath){
boolean flag = false;
try {
// 返回FileSystem对象
FileSystem fs = getFileSystem(); String hdfsUri = HDFSUri;
if(StringUtils.isNotBlank(hdfsUri)){
srcPath = hdfsUri + srcPath;
dstPath = hdfsUri + dstPath;
} flag = fs.rename(new Path(srcPath), new Path(dstPath));
} catch (IOException e) {
logger.error("{} rename to {} error.", srcPath, dstPath);
} return flag;
}
9、判断目录是否存在
/**
* 判断目录是否存在
*
* @param srcPath
* @param dstPath
*/
public boolean existDir(String filePath, boolean create){
boolean flag = false; if (StringUtils.isEmpty(filePath)){
return flag;
} try{
Path path = new Path(filePath);
// FileSystem对象
FileSystem fs = getFileSystem(); if (create){
if (!fs.exists(path)){
fs.mkdirs(path);
}
} if (fs.isDirectory(path)){
flag = true;
}
}catch (Exception e){
logger.error("", e);
} return flag;
}
熟练掌握HDFS的Java API接口访问的更多相关文章
- 掌握HDFS的Java API接口访问
		
HDFS设计的主要目的是对海量数据进行存储,也就是说在其上能够存储很大量文件(可以存储TB级的文件).HDFS将这些文件分割之后,存储在不同的DataNode上, HDFS 提供了两种访问接口:She ...
 - Hadoop之HDFS(三)HDFS的JAVA API操作
		
HDFS的JAVA API操作 HDFS 在生产应用中主要是客户端的开发,其核心步骤是从 HDFS 提供的 api中构造一个 HDFS 的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS ...
 - Hadoop(五):HDFS的JAVA API基本操作
		
HDFS的JAVA API操作 HDFS在生产应用中主要是客户端的开发,其核心步骤是从HDFS提供的api中构造一个HDFS的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS上的文件. 主 ...
 - HDFS中JAVA API的使用
		
HDFS中JAVA API的使用 HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的 ...
 - HDFS的Java API
		
HDFS Java API 可以用于任何Java程序与HDFS交互,该API使我们能够从其他Java程序中利用到存储在HDFS中的数据,也能够使用其他非Hadoop的计算框架处理该数据 为了以编程方式 ...
 - API接口访问频次限制 / 网站恶意爬虫限制 / 网站恶意访问限制 方案
		
API接口访问频次限制 / 网站恶意爬虫限制 / 网站恶意访问限制 方案 采用多级拦截,后置拦截的方式体系化解决 1 分层拦截 1.1 第一层 商业web应用防火墙(WAF) 直接用商业服务 传统的F ...
 - 将JAVA API接口 改写成 Python
		
AsinSeedApi 不写注释的程序员-加密 将JAVA API接口 改写成 Python JAVA import com.alibaba.fastjson.JSON; import com.ali ...
 - Postman如何通过xmysql工具的Restful API 接口访问MySQL
		
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 导语 有时候用 Postman 接口测试需要获取MySQL的查询结果做接口输出的校验,这里介绍下 Postman 通过 R ...
 - Hadoop HDFS Basic JAVA API
		
org.apache.hadoop.fs.FileSystem 是HDFS的文件系统抽象,在分布式系统中管理HDFS文件和目录.文件内容存储在由多个相同大小的块(如64M)构成的datanode节 ...
 
随机推荐
- VC6.0中重载操作符函数无法访问类的私有成员
			
整理日: 2015年03月18日 在 C++ 中,操作符(运算符)可以被重载以改写其实际操作.同时我们可以定义一个函数为类的朋友函数(friend function)以便使得这个函数能够访问类的私有成 ...
 - 关于setCharacterEncoding报错
			
有时候,代码已搬家,就会报这个错,导致这个错误的原因是: HttpServletResponse存在于servlet-api.jar中, 2.3版本的servlet-api.jar中HttpServl ...
 - initWithCoder: 与initWithFrame:
			
之前一直用代码来编写画面,现在着手使用storyboard和xib来构筑画面,遇到initWithCoder方法, 故查了下,initWithCoder方法的调用,看了篇博客,链接如下: http:/ ...
 - C#转义字符总结
			
转义字符 \·一种特殊的字符常量:·以反斜线"\"开头,后跟一个或几个字符.·具有特定的含义,不同于字符原有的意义,故称“转义”字符.·主要用来表示那些用一般字符不便于表示的控制代 ...
 - WINDOWS下简单操作SQLITE3
			
有测试操作的时候,还是很好的说~~~ 找个sqlite3.txt下载 sqlite3.exe db.sqlite3 SQLite version 3.7.13 2012-06-11 02:05:22 ...
 - Microsd卡中植入NFC技术设计
			
NFC(Near Field Communication,近距离通信),是基于RFID技术发展起来的一种应用在手机上的近距离无线通信技术,主要应用在以下三种模式: 卡模拟状态:手机作为支付工具,可以模 ...
 - 《STL源码剖析》chapter2空间配置器allocator
			
为什么不说allocator是内存配置器而说是空间配置器,因为空间不一定是内存,也可以是磁盘或其他辅助介质.是的,你可以写一个allocator,直接向硬盘取空间.sgi stl提供的配置器,配置的对 ...
 - Robotium 不能同时跑多个case
			
最近在用robotium做android自动化测试,遇到单个case可以run成功.多个case run就会卡死到第二个case. 原因是在teardown的时候没有将打开的activity全部fin ...
 - BZOJ2134: 单选错位
			
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2134 题解:因为每个答案之间是互不影响的,所以我们可以挨个计算. 假设当前在做 i 题目,如果 ...
 - 硬盘安装RedHat Enterprise Linux 6(转载)
			
准备条件: (1)RedHat Enterprise Linux 6安装镜像 下载见文章末尾 (2)grub文件(用于引导安装) ...