准备
配置客户端hosts
关闭防火墙常用api
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.fs.permission.FsPermission;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class hadoopapi {
public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {
// 设置客户端属性
Configuration conf = new Configuration();
conf.set("dfs.replication", "2");
conf.set("dfs.blocksize", "32m");
// conf.addResource("myconf.xml"); //也可以把自定义属性写到xml里面, 然后读取
// 创建hdfs客户端
FileSystem hdfsClient = FileSystem.get(new URI("hdfs://hadoop-nn-01:9000/"), conf, "hadoop"); //要配置hosts
// 上传文件
hdfsClient.copyFromLocalFile(new Path("e:/TODO"), new Path("/TODO"));
// 下载文件
hdfsClient.copyToLocalFile(false, new Path("/TODO"), new Path("e:/todocopy"), true); // useRawLocalFoleSystem的意思是使用java操作本地文件系统, 这样可以避免一些权限错误
// 创建目录 fs.permission.umask-mode这个参数默认会将所属组和其他人的写权限去掉
hdfsClient.mkdirs(new Path("/my"), new FsPermission("777"));
// 删除 布尔值表示是否递归删除
hdfsClient.delete(new Path("/my"), true);
// 修改名称
hdfsClient.rename(new Path("/my"), new Path("/my_new"));
// 显示目录下文件
RemoteIterator<LocatedFileStatus> files = hdfsClient.listFiles(new Path("/my_new"), true); //好像不显示目录
while (files.hasNext()){
LocatedFileStatus file = files.next();
System.out.println(file.getPath());
}
FileStatus[] listStatus = hdfsClient.listStatus(new Path("/my_new")); // 显示目录, 只返回当前目录下的数据
for (FileStatus status: listStatus){
System.out.println(status.getPath());
}
// 以文件字节偏移量为参数获取数据, 在分布式计算获取数据的时候用到
FSDataInputStream inStream = hdfsClient.open(new Path("/TODO"));
inStream.seek(20); // 将偏移量定到20字节处
byte[] b = new byte[10];
int readLength = inStream.read(b); // 若readLength==-1, 则是未读取到数据
System.out.println(new String(b, "utf-8"));
inStream.close();
// 以流的形式追加数据到hdfs文件中
FSDataOutputStream outStream = hdfsClient.create(new Path("/test"), true); // 若不覆盖且文件已存在, 会报错
outStream.write("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa".getBytes());
outStream.write("ssssssssssssssssssssssssssssss".getBytes());
outStream.flush();
outStream.close();
hdfsClient.close();
}
}