使用Hadoop的Java客户端API操作分布式文件系统
#获取文件系统实现
//hdfs://master01:9000/
FileSystem get(URI uri[,Configuration conf[,String user]])
//fs.defaultFS
FileSystem newInstance(URI uri[,Configuration conf[,String user]])
#从配置中获取默认URI路径
URI getDefaultUri(Configuration conf)
#打开一个指向给定HDFS文件的输入流
FSDataInputStream open(Path path[,int bufferSize])
#移动(不同的目录参数时)或重命名(相同的目录参数时)一个HDFS文件,它相当于mv命令
boolean rename(Path src,Path dest)
#创建符号链接,第一个参数是被链接的目标文件,第二个参数是符号连接,第三个参数表示符号连接是否允许创建父级目录,
//此方法调用之前必须首先调用FileSystem.enableSymlinks()以保证符号连接可用
createSymlink(Path src, Path link, boolean createParent)
#本地文件的内容直接追加到HDFS文件中
FSDataOutputStream append(Path path[,int bufferSize])
#创建一个指向给定HDFS文件的输出流,使用该输出流可以向该文件中写入内容
FSDataOutputStream create(Path path[,boolean override[,int bufferSize]])
#删除指定的HDFS文件或文件夹,第二个参数表示是否可以递归删除,方法返回是否删除成功的逻辑类型
boolean delete(Path path[,boolean recursive])
#判断给定的HDFS文件或路径是否存在
boolean exists(Path path)
#获取给定HDFS文件块的实际块尺寸(字节)
long getBlockSize(Path path)
#获取HDFS文件块的默认尺寸(字节)
long getDefaultBlockSize()
#获取文件系统的默认端口
int getDefaultPort()
#获取给定HDFS文件的尺寸
long getLength(Path path)
#获取给定HDFS文件的文件状态信息
FileStatus getFileStatus(Path path)
#获取HDFS文件的实际副本数量
int getReplication()
#设置给定文件的副本数量
boolean setReplication(Path src,short replication)
#判断给定的文件是否是文件/目录
boolean isFile(Path path)/isDirectory(Path path)
#获取HDFS文件的默认副本数量
int getDefaultReplication()
#创建指定路径的HDFS目录
boolean mkdirs(Path path[,FsPermission permission])
#获取文件系统的使用量和容量的状态
FileStatus getStatus()
#列出给定目录中的文件和文件夹
FileStatus[] listStatus(Path path[,PathFilter pf])
#第二个参数表示是否递归,如果第一个参数是文件则返回文件的状态信息,如果第一个参数是目录则表示是否递归列出该目录中的文件(不含文件夹)
RemoteIterator<LocatedFileStatus> listFiles(Path path,boolean recursive)
#获取给定HDFS文件块所在的位置
BlockLocation[] getFileBlockLocations(Path path,int start,long len)
BlockLocation[] getFileBlockLocations(FileStatus file,int start,long len)
#返回文件系统中所有文件的总尺寸
long getUsed()
#将本地单个文件拷贝到HDFS文件系统中,前两个参数表示是否需要删除源文件,是否需要覆盖目标文件
copyFromLocalFile([boolean delSrc[,boolean override]]Path src,Path dst)
#重载,将本地多个文件拷贝到HDFS文件系统中
copyFromLocalFile(boolean delSrc,boolean override,Path[] srcs,Path dst)
#将HDFS文件拷贝到本地文件系统中,第1个参数表示是否需要删除源文件
copyToLocalFile([boolean delSrc,]Path src,Path dst)
#将HDFS文件或文件夹从一个路径拷贝到另一个路径
FileUtil.copy(FileSystem srcFS,Path srcPath,FileSystem dstFS,Path dstPath,boolean delSource,boolean override,Configuration conf)

测试代码

测试说明:

全都切换到hadoop用户下;在主机上启动hdfs集群;使用jps查看启动是否成功;

主机:master01

节点:slave01、slave02、slave03

本地机器的eclipse上的代码:(导入hadoop-2.7.3-All.jar包

package com.mmzs.hdfs.main;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator; /**
* @author hadoop
*
*/
public class HdfsMain { private static FileSystem fs;
private static Configuration conf;
static {
String uri = "hdfs://master01:9000/";
conf = new Configuration();
try {
fs = FileSystem.get(new URI(uri), conf, "hadoop");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
// mkdir("/data");
// uploadFile("/home/hadoop/test/1.txt");//本地文件路径
// downloadFile("/data/1.txt");//HDFS上的文件路径
// openFile("/data/2.txt");
try {
// writeFile("/data/1.txt");
// rename("/data/1.txt", "/data02/1-run.txt");
// rename("/data02/1-run.txt", "/data02/1copy.txt");
createLink("/data/1.txt", "/data/info");
// deleteFile("/data/2.txt");
// listFiles("/data");
// listFiles02("/data");
// copyFile("/data/1.txt", "/data/test/");
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 实现集群文件的拷贝
* @param src
* @param path
* @throws IOException
*/
public static void copyFile(String src, String path) throws IOException {
Path srcpath = new Path(src);
Path dstpath = new Path(path); Boolean flag = FileUtil.copy(fs, srcpath, fs, dstpath, false, false, conf);
if (flag) {
System.out.println("拷贝文件成功");
} else {
System.out.println("拷贝文件失败");
}
} /**
* 创建文件夹
* @param path
*/
public static void mkdir(String path) {
Path newpath = new Path(path);
try {
Boolean flag = fs.mkdirs(newpath);
if (flag) {
System.out.println("文件夹创建成功");
} else {
System.out.println("文件夹创建失败");
}
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 上传本地文件到HDFS集群
* @param path
*/
public static void uploadFile(String path) {
Path localFile = new Path(path);
Path clusterPath = new Path("/data/"); try {
fs.copyFromLocalFile(false, localFile, clusterPath);
System.out.println(" 上传成功!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /**
* 下载HDFS集群中的文件到本地系统中
* @param clusterPath
*/
public static void downloadFile(String clusterPath) {
Path clusterFile = new Path(clusterPath);
Path localPath = new Path("/home/hadoop/test/"); try {
fs.copyToLocalFile(false, clusterFile, localPath);
System.out.println("下载成功!");
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 打开集群文件并输出文件内容
* @param clusterFile
*/
public static void openFile(String clusterFile) {
Path clusterPath = new Path(clusterFile);
FSDataInputStream fis = null; try {
fis = fs.open(clusterPath,1024);
while (fis.available()>0) {//available表示测试是否可以读
// String line = fis.readUTF();
String line = fis.readLine();
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(null != fis)
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} /**
* 写一个文件到HDFS集群
* @param clusterFile
* @throws IOException
*/
public static void writeFile(String clusterFile) throws IOException {
Path destFile = new Path(clusterFile);
FSDataOutputStream fos = null;
if (fs.exists(destFile) && fs.isDirectory(destFile)) {
System.out.println("参数路径指向一个目录,无法写入数据");
return;
}
//如果文件存在则以追加的方式打开,否则直接创建文件并写入内容
if (fs.exists(destFile) && fs.isFile(destFile)) {
fos = fs.append(destFile);
}else {
fos = fs.create(destFile, true);
}
try{
fos.writeUTF("he is ligang\n");
fos.writeUTF("he is 65kg\n");
fos.writeUTF("he is eat\n");
fos.writeUTF("he is running\n");
fos.flush();//一定要flush啊!!!!!!!!
System.out.println("写入完成!");
}finally{
if(null != fs) fs.close();
}
} /**
* 移动(在不同目录下)或重命名文件(同一个目录下);
* @param path1 源文件路径
* @param path2 移动或重命名后的文件路径
* @throws IOException
*/
public static void rename(String path1, String path2) throws IOException {
Path file01 = new Path(path1);
Path file02 = new Path(path2);
if (!fs.exists(file01)) return; int index = path2.lastIndexOf('/');
String dir = path2.substring(0, index);
Path dstpath = new Path(dir); Boolean flag = null;
if (!fs.exists(dstpath)) {
flag = fs.mkdirs(dstpath);
} // if (flag) {
// return;
// } fs.rename(file01, file02);
} /**
* 创建集群文件快捷方式
* @param src
* @param link
* @throws IOException
*/
public static void createLink(String src, String link) throws IOException {
Path srcPath = new Path(src);
Path linkPath = new Path(link); //如果创建快捷方式的源文件不存在或者是一个目录就理它
if (!fs.exists(srcPath) || fs.isDirectory(srcPath)) return;
fs.createSymlink(srcPath, linkPath, true);
System.out.println("创建完成!");
} /**
* 删除集群文件或者目录
* @param path
* @throws IOException
*/
public static void deleteFile(String path) throws IOException {
Path dstPath = new Path(path);
Boolean flag = fs.delete(dstPath, true);
if (flag) {
System.out.println("删除成功");
}else {
System.out.println("删除失败");
}
} /**
* 查看给定参数集群路径下的文件或者文件夹
* @param path
* @throws IOException
*/
public static void listFiles(String path) throws IOException {
Path dstPath = new Path(path);
if(!fs.exists(dstPath) ||fs.isFile(dstPath)) {
return;
}
FileStatus[] filestatus = fs.listStatus(dstPath);
for(FileStatus fstatus:filestatus) {
if(fstatus.isFile()) {
//如果是文件打印出文件的大小尺寸(单位:byte)
long filelen = fstatus.getLen();
System.out.println(filelen);
//获取文件名
System.out.println("文件名:"+fstatus.getPath().getName());
//文件的路径
System.out.println("文件路径:"+fstatus.getPath().toString());
//获取文件块的信息
BlockLocation[] bls = fs.getFileBlockLocations(fstatus, 0, filelen);
//循环打印每一个块的信息
for(BlockLocation bl:bls) {
String[] hosts = bl.getHosts() ;
System.out.print("主机列表:"+"\n"+"hosts:");
for (int i = 0; i < hosts.length; i++) {
System.out.print(hosts[i]+"---");
}
System.out.println();
Long blockSize = bl.getLength();
System.out.println("blockSize:"+blockSize);
String[] blockPaths = bl.getTopologyPaths();
System.out.println("块路径列表:");
for (int i = 0; i < blockPaths.length; i++) {
System.out.println(blockPaths[i]+"---");
}
}
}else {
//获取文件名
String fileName = fstatus.getPath().getName();
//获取目录名
String filePath = fstatus.getPath().toString();
System.out.println("目录名字:"+fileName+"目录路径:"+filePath);
}
}
} /**
* 遍历指定路径下的问夹(不含文件夹)
* @param path
* @throws IOException
*/
public static void listFiles02(String path) throws IOException {
Path dstPath = new Path(path);
if(!fs.exists(dstPath) ||fs.isFile(dstPath)) {
return;
}
RemoteIterator<LocatedFileStatus> fss = fs.listFiles(dstPath, true);
while ( fss.hasNext() ) {
LocatedFileStatus fstatus = fss.next();
if(fstatus.isFile()) {
//如果是文件打印出文件的大小尺寸(单位:byte)
long filelen = fstatus.getLen();
System.out.println("文件大小尺寸 :"+filelen);
//获取文件名
System.out.println("文件名:"+fstatus.getPath().getName());
//文件的路径
System.out.println("文件路径:"+fstatus.getPath().toString());
//获取文件块的信息
BlockLocation[] bls = fs.getFileBlockLocations(fstatus, 0, filelen);
//循环打印每一个块的信息
for(BlockLocation bl:bls) {
String[] hosts = bl.getHosts() ;
System.out.print("主机列表:"+"\n"+"hosts:");
for (int i = 0; i < hosts.length; i++) {
System.out.print(hosts[i]+"---");
}
System.out.println();
Long blockSize = bl.getLength();
System.out.println("blockSize:"+blockSize);
String[] blockPaths = bl.getTopologyPaths();
System.out.println("块路径列表:");
for (int i = 0; i < blockPaths.length; i++) {
System.out.println(blockPaths[i]+"---");
}
}
}else {
//获取文件名
String fileName = fstatus.getPath().getName();
//获取目录名
String filePath = fstatus.getPath().toString();
System.out.println("目录名字:"+fileName+"目录路径:"+filePath);
}
} }
}

HdfsMain

然后在eclipse中直接诶运行即可。

然后使用:“hdfs dfs -ls /集群文件路径”   等操作来查看即可。

运行中可以查看运行状态:hdfs dfs admin -report

HDFS简单测试的更多相关文章

  1. hadoop运行wordcount实例,hdfs简单操作

    1.查看hadoop版本 [hadoop@ltt1 sbin]$ hadoop version Hadoop -cdh5.12.0 Subversion http://github.com/cloud ...

  2. TODO:Golang UDP连接简单测试慎用Deadline

    TODO:Golang UDP连接简单测试慎用Deadline UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interco ...

  3. .net orm比较之dapper和Entity Framework6的简单测试比较

    .net orm比较之dapper和Entity Framework6的简单测试比较

  4. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(37)-文章发布系统④-百万级数据和千万级数据简单测试

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(37)-文章发布系统④-百万级数据和千万级数据简单测试 系列目录 我想测试EF在一百万条数据下的显示时间! ...

  5. ORACLE 数据库简单测试

    ORACLE 数据库简单测试 操作系统:Windows 7 – ORACLE:oracle database 10.2.0.4 一.目的 测试 启动监听程序.数据库  非同一个用户的情况,用户是否可以 ...

  6. Javascript的简单测试环境

    在<JavaScript忍者秘籍>2.4测试条件基础知识中,作者给出了一个精简版的assert和assert组的实现,对于初学者而言,这无疑是一个很好的例子,既让我们得到了一个好用的小工具 ...

  7. struts2+hibernate+spring注解版框架搭建以及简单测试(方便脑补)

    为了之后学习的日子里加深对框架的理解和使用,这里将搭建步奏简单写一下,目的主要是方便以后自己回来脑补: 1:File--->New--->Other--->Maven--->M ...

  8. struts2+hibernate+spring配置版框架搭建以及简单测试(方便脑补)

    为了之后学习的日子里加深对框架的理解和使用,这里将搭建步奏简单写一下,目的主要是方便以后自己回来脑补: 1:File--->New--->Other--->Maven--->M ...

  9. [20190423]简单测试latch nowilling等待模式.txt

    [20190423]简单测试latch nowilling等待模式.txt --//我对这个问题的理解就是如果参数willing=0,表示无法获取该latch,直接退出,再寻找类似的latch.--/ ...

随机推荐

  1. Paper | 量化CV任务的关联性,寻找最佳迁移策略(Taskonomy)

    目录 1. 问题 2. 方法 3. 实验设计 3.1. 解决词典内部(一组已知)任务的能力 3.2. 解决新任务(少量标记数据)的能力 4. 讨论和启发 论文:Taskonomy: Disentang ...

  2. C++ boost.python折腾笔记

    为了让当年研究生时写的图像处理系统重出江湖起到更大的作用,应研究生导师的意见,对原有的c++框架做了python扩展处理,为了避免遗忘,备注如下: 一.boost 编译 下载boost源码,这里使用b ...

  3. PWM of STM32

    下面是STM32用来产生PWM得文件,分别是PWM.c和PWM.h /***************************************************************** ...

  4. Teradata Delete Database and Drop Database

    DELETE DATABASE and DELETE USER statements delete all data tables, views, and macros from a database ...

  5. 简析 __init__、__new__、__call__ 方法

    简析 __init__.__new__.__call__ 方法 任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建.初始化.使 用.垃圾回收,不同的 ...

  6. 记录一下msf的学习使用

    刚刚用Metasploit Pro scan了一下云端服务器.RHOST直接输IP就好. 得到反馈如下: [*] [2019.04.04-14:27:35] Scan initiated: Speed ...

  7. 黑群晖DS3617xs-DSM6.1.7up3/up2 开启ROOT用户,同时SATA改eSATA,挂载NTFS硬盘设置(二)

    这两天闲来没事在某宝上搞了个黑群晖主机就j1900/4G小主机系统是DCM 6.1.7up3 15284版 网上修改的教程很多,走了好多弯路终于搞定我的黑群NAS,现分享给各位道友,有不足的地方请给位 ...

  8. 在ASP.NET MVC里对Web Page网页进行权限控制

    我们在ASP.NET MVC开发时,有时候还是得设计ASP.NET的Web Page网页(.aspx和.aspx.cs),来实现一些ASP.NET MVC无法实现的功能,如此篇<Visual S ...

  9. 背水一战 Windows 10 (93) - 选取器: FileOpenPicker, FolderPicker, FileSavePicker

    [源码下载] 背水一战 Windows 10 (93) - 选取器: FileOpenPicker, FolderPicker, FileSavePicker 作者:webabcd 介绍背水一战 Wi ...

  10. 【CF429E】 Points and Segments(欧拉回路)

    传送门 CodeForces 洛谷 Solution 考虑欧拉回路有一个性质. 如果把点抽出来搞成一条直线,路径看成区间覆盖,那么一个点从左往右被覆盖的次数等于从右往左被覆盖的次数. 发现这个性质和本 ...