一、首先自然是导包
$HADOOP_HOME/share/hadoop/common/*.jar
$HADOOP_HOME/share/hadoop/common/lib/*.jar
$HADOOP_HOME/share/hadoop/hdfs/*.jar
$HADOOP_HOME/share/hadoop/hdfs/lib/*.jar
二、代码如下
package com.stu.hdfs;
/**
*
* @author ysw28
* HDFS的API操作
*/
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.util.Arrays;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.apache.hadoop.io.IOUtils;
import org.junit.Test;
public class TestDemo319 {
@Test
// 创建目录
public void mkDir() {
try {
// 连接HDFS,设置副本数
Configuration conf = new Configuration();
conf.set("dfs.replication", "1");
// 创建一个客户端
FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");
// 创建目录
Path path = new Path("/Demo319");
client.mkdirs(path);
// 关闭客户端
client.close();
System.out.println("创建目录成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("创建目录失败");
}
}
@Test
// 删除目录,删除文件同理
public void delDir() {
try {
// 连接HDFS
Configuration conf = new Configuration();
// 创建客户端
FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");
// 删除目录
Path path = new Path("/Demo319");
if (client.exists(path)) {
client.delete(path, true);
// 关闭客户端
client.close();
System.out.println("删除目录成功");
} else {
System.out.println("没有这个文件");
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("删除目录失败");
}
}
@Test
// 上传文件
public void copyFromLocal() {
try {
// 连接HDFS,指定副本数
Configuration conf = new Configuration();
conf.set("dfs.replication", "1");
// 创建客户端
FileSystem client = FileSystem.get(new URI("hdfs://Hp110:9000"), conf, "root");
// 上传文件
client.copyFromLocalFile(new Path("C:\\Users\\ysw28\\Desktop\\hadoop-2.8.5.tar.gz"), new Path("/Demo319"));
// 关闭客户端
client.close();
System.out.println("上传文件成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("上传文件失败");
}
}
@Test
// 下载文件
public void copyToFrom() {
try {
// 连接HDFS
Configuration conf = new Configuration();
// 创建客户端
FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");
// 下载文件
client.copyToLocalFile(true, new Path("/Demo319/hadoop-2.8.5.tar.gz"), new Path("E://"), true);
// 关闭客户端
client.close();
System.out.println("上传文件成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("上传文件失败");
}
}
@Test
// 使用HDFS的IO流上传文件
public void putFileToHdfs() {
try {
// 连接HDFS,指定副本数
Configuration conf = new Configuration();
conf.set("dfs.replication", "1");
// 创建客户端
FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");
// 上传文件,构造一个输入流
InputStream input = new FileInputStream("E:\\hadoop-2.8.5.tar.gz");
// 构造一个输出流
OutputStream output = client.create(new Path("/Demo319/hadoop.tar.gz"));
// 构造一个缓存区
byte buffer[] = new byte[1024];
// 指定长度
int len = 0;
// 读取数据
while ((len = input.read(buffer)) > 0) {
// 写入数据
output.write(buffer, 0, len);
}
// 刷新
output.flush();
// 关闭流
output.close();
input.close();
// 关闭客户端
client.close();
System.out.println("通过HDFS的IO流上传文件成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("通过HDFS的IO流上传文件失败");
}
}
@Test
// 使用HDFS的IO流下载文件
public void getFileFromHdfs() {
try {
// 连接HDFS
Configuration conf = new Configuration();
// 创建客户端
FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");
// 下载文件,构造一个输入流
InputStream input = client.open(new Path("/Demo319/hadoop.tar.gz"));
// 构造一个输出流
OutputStream output = new FileOutputStream("E://1.tar.gz");
// 使用工具类
IOUtils.copyBytes(input, output, 1024);
// 关闭客户端
client.close();
System.out.println("通过HDFS的IO流下载文件成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("通过HDFS的IO流下载文件失败");
}
}
@Test
// 更改文件名,更改目录名同理
public void reName() {
try {
// 连接HDFS
Configuration conf = new Configuration();
// 创建客户端
FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");
// 更改文件名
Path oldpath = new Path("/Demo319/1.txt");
Path newPath = new Path("/Demo319/2.txt");
client.rename(oldpath, newPath);
// 关闭客户端
client.close();
System.out.println("更改文件名成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("更改文件名失败");
}
}
@Test
// 写入数据
public void writeFile() {
try {
// 连接HDFS,配置副本数
Configuration conf = new Configuration();
conf.set("dfs.replication", "1");
// 创建客户端
FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");
// 写入数据
FSDataOutputStream output = client.create(new Path("/Demo319/3.txt"));
output.writeUTF("我喜欢大数据");
// 关闭流
output.close();
// 关闭客户端
client.close();
System.out.println("写入文件成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("写入文件失败");
}
}
@Test
// 读取文件
public void readFile() {
try {
// 连接HDFS
Configuration conf = new Configuration();
// 创建客户端
FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");
// 读取文件
Path path = new Path("/Demo319/3.txt");
if (client.exists(path)) {
InputStream input = client.open(path);
// 构造一个缓存区
byte buffer[] = new byte[1024];
int foot = 0;// 指定数组的下标
int temp = 0;// 指定接受每次读取的字节数据
while ((temp = input.read()) != -1) {
buffer[foot++] = (byte) temp;
}
System.out.println(new String(buffer, 0, foot));
// 关闭流
input.close();
// 关闭客户端
client.close();
System.out.println("读取文件成功");
} else {
System.out.println("没有这个文件");
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("读取文件失败");
}
}
@Test
// 判断HDFS上是否存在某文件
public void hdfsFileExists() {
try {
// 连接HDFS
// 指定当前使用的用户是root
System.setProperty("HADOOP_USER_NAME", "root");
// 配置参数,指定NameNode地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://HP110:9000");
// 创建一个客户端
FileSystem client = FileSystem.get(conf);
// 判断是否存在某文件
if (client.exists(new Path("/Demo/1.txt"))) {
System.out.println("存在文件1.txt");
} else {
System.out.println("不存在文件1.txt");
}
System.out.println("没有出现错误");
} catch (Exception e) {
e.printStackTrace();
System.out.println("出现错误");
}
}
@Test
// 查看文件信息
public void getFileInfo() {
try {
// 连接HDFS
Configuration conf = new Configuration();
// 创建客户端
FileSystem client = FileSystem.get(new URI("hdfs://HP110:9000"), conf, "root");
// 查看文件信息
Path path = new Path("/");
RemoteIterator<LocatedFileStatus> listFiles = client.listFiles(path, true);
while (listFiles.hasNext()) {
LocatedFileStatus status = listFiles.next();
System.out.println(status.getPath().getName()); // 获取文件名
System.out.println(status.getGroup()); // 获取所在组
System.out.println(status.getLen());// 文件大小
System.out.println(status.getPermission());// 获取权限
// 获取数据块信息
BlockLocation[] blockLocations = status.getBlockLocations();
for (BlockLocation blockLocation : blockLocations) {
// 数据块所在主机名
String[] hosts = blockLocation.getHosts();
for (String host : hosts) {
System.out.println(host);
}
// 数据块所在主机IP
String[] names = blockLocation.getNames();
for (String name : names) {
System.out.println(name);
}
}
System.out.println("这是一个分割线-----------------------------");
}
System.out.println("查看文件信息成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("查看文件信息失败");
}
}
@Test
// 获取数据块信息
public void getBlockInfo() {
try {
// 连接HDFS
// 指定使用的用户是root
System.setProperty("HADOOP_USER_NAME", "root");
// 配置参数,指明NameNode的地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://HP110:9000");
// 创建一个客户端
FileSystem client = FileSystem.get(conf);
// 获取文件status信息
FileStatus fileStatus = client.getFileStatus(new Path("/Demo/100.txt"));
// 获取文件的数据块信息
BlockLocation locaktions[] = client.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
/*
* 将数组转换为字符串 语法:Arrays.toString(数组名);
*/
for (BlockLocation blockLocation : locaktions) {
System.out.println(
Arrays.toString(blockLocation.getHosts()) + "\t" + Arrays.toString(blockLocation.getNames()));
System.out.println(fileStatus);
}
// 关闭客户端
client.close();
System.out.println("获取数据块信息成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("获取数据块信息失败");
}
}
@Test
// 查看HDFS中所有的文件和内容,想看具体的话就在/后面累加文件的名字
public void getListFileInfo() {
try {
// 连接HDFS
// 指定当前用户是root
System.setProperty("HADOOP_USER_NAME", "root");
// 配置参数,指定NameNode地址
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://HP110:9000");
// 创建一个客户端
FileSystem client = FileSystem.get(conf);
// 指定查看地址
Path path = new Path("/Demo/100.txt");
FileStatus list[] = client.listStatus(path);
for (FileStatus fileStatus : list) {
System.out.println(fileStatus);
}
System.out.println("查看文件成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("查看文件失败");
}
}
}