java API操作HDFS文件
package com.immoc.hadoop.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URI;
/**
* Hadoop HDFS java API操作
*/
public class HDFSApp {
//HDFS文件系统操作对象
FileSystem fileSystem=null;
//配置对象
Configuration configuration=null;
//HDFS文件系统服务器的地址以及端口
public static final String HDFS_PATH="hdfs://hadoop000:8020";
/**
* 准备环境
* 单元测试之前
*/
@Before
public void setUp() throws Exception {
configuration=new Configuration();
// 第一参数是服务器的URI,第二个参数是配置对象,第三个参数是文件系统的用户名
fileSystem=FileSystem.get(new URI(HDFS_PATH), configuration,"hadoop");
System.out.println("HDFSApp.setUp");
}
/**
* 创建HDFS目录
*/
@Test
public void mkdir() throws Exception {
// 需要传递一个Path对象
fileSystem.mkdirs(new Path("/hdfsapi/test"));
}
/**
* 创建文件
*/
@Test
public void create()throws Exception{
//创建文件夹
FSDataOutputStream output=fileSystem.create(new Path("/hdfsapi/test/a.txt/"));
// 写入一些内容到文件中
output.write("hello hadoop".getBytes());
output.flush();//刷新
output.close();//关闭
}
/**
* 查看HDFS里某个文件的内容
*/
@Test
public void cat() throws Exception {
// 读取文件
FSDataInputStream in=fileSystem.open(new Path("/hdfsapi/test/a.txt"));
// 将文件内容输出到控制台上,第三个参数表示输出多少字节的内容
IOUtils.copyBytes(in,System.out,1024);
in.close();//关闭
}
/**
* 重命名文件
*/
@Test
public void rename()throws Exception{
Path oldPath=new Path("/hdfsapi/test/a.txt");
Path newPath=new Path("/hdfsapi/test/b.txt");
fileSystem.rename(oldPath,newPath );
}
/**
* 上传到HDFS
*/
@Test
public void copyFromLocalFile()throws Exception{
Path localPath=new Path("C:\\Learning\\bigData\\10 hours to get started with big data\\hello.txt");
Path hdfsPath=new Path("/hdfsapi/test/");
// 第一个参数是本地文件的路径,第二个则是HDFS的路径
fileSystem.copyFromLocalFile(localPath,hdfsPath);
}
/**
* 上传大文件到HDFS
*/
@Test
public void copyFromLocalFileWithProgress()throws Exception{
Path localPath=new Path("C:\\Learning\\java\\idea\\jdk-8u181-windows-x64-demos.zip");//大文件夹路径
Path hdfsPath=new Path("/hdfsapi/test/");
fileSystem.copyFromLocalFile(localPath,hdfsPath);
//大文件夹通过流来处理
InputStream in=new BufferedInputStream(new FileInputStream(String.valueOf(localPath)));//本地文件夹输入流
FSDataOutputStream output=fileSystem.create(new Path("/hdfsapi/test/jdk"), new Progressable() {//输出流
@Override
public void progress() {
System.out.println(".");//带进度条提醒信息
}
});
IOUtils.copyBytes(in,output,4096);//输出到文件夹中
}
/**
* 下载HDFS文件
*/
@Test
public void copyToLocalFile() throws Exception{
Path localPath=new Path("C:\\Learning\\bigData\\b.txt");
Path hdfsPath=new Path("/hdfsapi/test/b.txt");
fileSystem.copyToLocalFile(false,hdfsPath,localPath,true);
}
/**
* 查看某个目录下的所有文件
*/
@Test
public void listFiles() throws Exception{
FileStatus []fileStatuses=fileSystem.listStatus(new Path("/hdfsapi/test/"));
for(FileStatus fileStatus:fileStatuses){
String isDir=fileStatus.isDirectory() ? "文件夹" : "文件";//判断是文件还是文件夹
short replication=fileStatus.getReplication();//查看副本数量
long len=fileStatus.getLen();//查看文件大小
String path=fileStatus.getPath().toString();//查看文件路径
System.out.println("一个"+isDir+"\t"+"副本系数:"+replication+"\t"+"大小:"+len+"\t"+"路径"+path);
}
}
/**
* 删除文件
*/
@Test
public void delete() throws Exception{
// 第二个参数指定是否要递归删除,false=否,true=是
fileSystem.delete(new Path("/hdfsapi/test/"),true);
}
/**
* 清理资源文件和资源文件的关闭操作
* 释放资源
* 单元测试之后
*/
@After
public void tearDown() {
configuration = null;
fileSystem = null;
System.out.println("HDFSApp.tearDown");
}
}
通过Java API
上传:文件 3
0 hdfs://hadoop000:8020/hdfsapi/test
通过hdfs shell
上传:文件 1
40762 hdfs://hadoop000:8020/install.log
我们已经在hdfs-site.xml中设置了副本系数为1,但是当使用Java API
上传,则副本系数为3,因为在本地并没有手工设置副本系数,所以采用的是hadoop默认的副本系数3