package com.aimuti.hadoop.hdfs;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
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.junit.Before;
import org.junit.Test;
/*
* 用客户端的JavaAPI实现增删改查
*/
public class HdfsClientDemo {
Configuration conf;
FileSystem fs;
@Before
public void init() throws IOException, InterruptedException, URISyntaxException {
/**
* 初始化操作应该获得一个分布式系统的客户端
* 利用分布式系统的JavaAPI拿到客户端实现通信
* 构造一个配置参数对象,设置参数:我们访问HDFS的uri
* 从而FileSystem.get()方法就知道应该去构造一个
* 访问HDFS文件系统的客户端,以及new Configuration()
* 的时候,它会去加载jar包的hdfs-default.xml然后加载
* classpath下的hdfs-site.xml
*/
conf = new Configuration();
/*
* 参数优先级: 1.客户端代码中设置的值 2.classpath下用户自定义配置
* 3.服务器默认配置
*/
conf.set("dfs.replication", "2");
conf.set("dfs.block.size", "64m");
fs = FileSystem.get(new URI("hdfs://cdh:9000"), conf, "root");
}
// 本地文件上传hdfs
@Test
public void testUpload() throws IllegalArgumentException, IOException {
fs.copyFromLocalFile(new Path("C:\\Hello.java"), new Path("/Hello_copy"));
fs.close();
}
// hdfs文件下载到本地
@Test
public void testDownload() throws IllegalArgumentException, IOException {
// true是指调用本地Java的IO流进行写数据
fs.copyToLocalFile(false, new Path("/Hello_copy"), new Path("D:\\"), true);
fs.close();
}
// 文件的创建 多级文件目录的创建
@Test
public void testMkdir() throws IllegalArgumentException, IOException {
boolean mkdirs = fs.mkdirs(new Path("/BBB/bbb/ccc"));
System.out.println(mkdirs);
}
// 文件的删除
@Test
public void testDelete() throws IllegalArgumentException, IOException {
// true:指的是是否递归删除
boolean delete = fs.delete(new Path("/BBB/bbb"), false);
System.out.println(delete);
}
// 查询指定目录下的所有子文件
@Test
public void testList() throws FileNotFoundException, IllegalArgumentException, IOException {
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), false);
while (listFiles.hasNext()) {
LocatedFileStatus fileStatus = listFiles.next();
System.out.println("blockSize:"+fileStatus.getBlockSize());
System.out.println("owner:"+fileStatus.getOwner());
System.out.println("Replication:"+fileStatus.getReplication());
System.out.println("permission:"+fileStatus.getPermission());
System.out.println("name:"+fileStatus.getPath().getName());
}
}
}
package com.aimuti.hadoop.hdfs;
/*
* 用流的方式来操作hdfs上的文件,可以实现读取指定偏移量范围内的数据
*/
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.URI;
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Before;
import org.junit.Test;
public class HdfsStreamAccess {
Configuration conf;
FileSystem fs;
@Before
public void init() throws Exception {
// 初始化操作应该获取一个分布式系统客户端
// 利用分布式系统的JavaAPI获取客户端实现通信
conf = new Configuration();
fs = FileSystem.get(new URI("hdfs://cdh:9000"), conf, "root");
}
// 通过流的方式进行文件上传
@SuppressWarnings("resource")
@Test
public void testUpload() throws Exception{
// true:代表是否覆盖(重写)
FSDataOutputStream outputStream = fs.create(new Path("/luban"), true);
// 要想将数据写到输出流,首先要在本地写个输入流
FileInputStream inputStream = new FileInputStream("D:\\后裔.txt");
// 用commons.io.utils比较方便,边读边写
IOUtils.copy(inputStream, outputStream);
}
// 通过流的方式指定下载部分文件
@SuppressWarnings("resource")
@Test
public void testRandomAcess() throws Exception {
FSDataInputStream inputStream = fs.open(new Path("/luban"));
// 将指针拨到6个字节处 从此开始读
inputStream.seek(6);
FileOutputStream outputStream = new FileOutputStream("D:\\后裔");
IOUtils.copy(inputStream, outputStream);
}
// 显示hdfs上文件的内容,相当于cat功能
@Test
public void test() throws Exception {
FSDataInputStream inputStream = fs.open(new Path("/luban"));
IOUtils.copy(inputStream,System.out);
}
}