使用java的api操作hdfs在idea上
代码规范auther data description注释要写
如何写hdfs的程序:1.hdfs在哪用户名 2.获取一个代表分布式文件系统的对象 3.对象方法4.关闭对象
1配置信息对象
conf=new configration();配置文件对象
conf.set("副本,“8”);
2获取hdfs的对象
参数一 urI hdfs://hadoop:8020
参数2 配置信息
参数3 用户名
new filesystem(不能new就是静态方法)Filesystem.newInstance
操作
s
liststatus文件和文件夹的查看
rename重命名 和移动
文件上传
参数1 本地的路径参数2 hdfs的路经都要newpath(两个path无序带hdfs的网络路径)
/**
* @FileName: FsDemo1
* @Author: xiyuan
* @Date: 2020/8/14 10:28 上午
* @Description:第一个Hadoop代码,向hdfs上传文件
*/
public class FsDemo1 {
public static void main(String[] args) throws Exception {
Configuration entries = new Configuration();
//entries.s
Path path = new Path("/");
FileSystem root = FileSystem.newInstance(new URI("hdfs://hadoop01:8020"), entries, "root");
root.copyFromLocalFile(new Path("/Users/xiyuan/lice/untitled.jar"),path);
root.close();
}
进行工具类的封装获得filesystem文件
/**
* @FileName: DoitUitls
* @Author: xiyuan
* @Date: 2020/8/14 11:18 上午
* @Description:封装工具类
*/
public class DoitUitls {
/**
* 获取HDfs的客户端对象
* @return
*/
public static FileSystem getFs() throws Exception {
Configuration conf = new Configuration();
return FileSystem.newInstance(new URI("hdfs://hadoop01:8020"), conf, "root");
}
}
使用封装的工具类进行文件的下载
public class DownLoad {
public static void main(String[] args) throws Exception {
//由工具类获得所需要的file
FileSystem fs = DoitUitls.getFs();
//使用copyTolocalFile的方法下载,使用前必须确认是否配置环境变量
//四个参数的作用,是否删除被下载的文件(默认false),hdfs路径 ,本地路径, 是否不生成crc文件(默认false)
fs.copyToLocalFile(new Path("/Red.rar"),new Path("/Users/xiyuan/temp"));
}
}
创建文件夹
/**
* @FileName: MkdirDemo
* @Author: xiyuan
* @Date: 2020/8/14 3:25 下午
* @Description:创建文件夹
*/
public class MkdirDemo {
public static void main(String[] args) throws Exception {
FileSystem fs = DoitUitls.getFs();
// boolean exists = fs.exists(new Path());
fs.mkdirs(new Path("/hehe/yaya/666"));
}
}
递归删除文件夹
/**
* @FileName: DeleteDemo
* @Author: xiyuan
* @Date: 2020/8/14 3:30 下午
* @Description:递归删除所有文件
*/
public class DeleteDemo {
public static void main(String[] args) throws Exception {
FileSystem fs = DoitUitls.getFs();
fs.delete(new Path("/hehe/yaya"),true);
}
}
列举获得所有的文件
/**
* @FileName: ListFIlesDemo
* @Author: xiyuan
* @Date: 2020/8/14 3:05 下午
* @Description:列举所有的文件,其中获得
*/
public class ListFIlesDemo {
public static void main(String[] args) throws Exception {
FileSystem fs = DoitUitls.getFs();
Path path = new Path("/");
if (fs.getFileStatus(path).isDirectory()) {
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(path,false);
while (listFiles.hasNext()){
LocatedFileStatus fileStatus = listFiles.next();
Path p = fileStatus.getPath();
String group = fileStatus.getGroup();//获得文件所在的组
System.out.println(group);
System.out.println(fileStatus.getLen());//获得文件的大小
String name = p.getName();//获得文件的名字,名字实在获得路径之后
System.out.println(name);
System.out.println(fileStatus.getOwner());//获得文件的所有者
long blockSize = fileStatus.getBlockSize();
long modificationTime = fileStatus.getModificationTime();//修改的时间
System.out.println(modificationTime);
BlockLocation[] blockLocations = fileStatus.getBlockLocations();//获得文件时的所有切出来的块
for (BlockLocation blockLocation : blockLocations) {
System.out.println(blockLocation);
String[] hosts = blockLocation.getHosts();
long offset = blockLocation.getOffset();//偏移量起始位置
long length = blockLocation.getLength();//获得块的长度
System.out.println(length);
for (String host : hosts) {
System.out.println(host);
}
}
}
}
}
}
hdfs的写数据 append ,creat
append追加,creat创建一个文件并写入如果存在便覆盖
writeUTF写字符串 flush close 前面会有写一次的标识特殊的分隔符号
hdfs的数据不支持并发写不支持随机写不支持随机修改
writeUTF写字符串 flush close 前面会有写一次的标识特殊的分隔符号
流一定要刷新并关掉
/**
* @FileName: WriteDemo
* @Author: xiyuan
* @Date: 2020/8/14 4:20 下午
* @Description:
*/
public class WriteDemo {
public static void main(String[] args) throws Exception {
FileSystem fs = DoitUitls.getFs();
FSDataOutputStream creat = fs.create(new Path("/b.txt"));//创建一个文件并写入文件若存在文件则覆盖
FSDataOutputStream append = fs.append(new Path("/b.txt"));//在原有的文件上追加文字
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(creat));//使用缓冲字符流包装
bufferedWriter.write("hehe");//写入字符串记得刷新
bufferedWriter.write("yasyayaya");
bufferedWriter.flush();
bufferedWriter.close();
creat.close();
//fsDataOutputStream.writeUTF("hehehheheh");
// fsDataOutputStream.writeUTF("sudhushfushfuhsdufhus");
}
}
读数据 open
seek跳过字节
将字节流转化为缓冲字符流
/**
* @FileName: ReadDemo
* @Author: xiyuan
* @Date: 2020/8/14 4:13 下午
* @Description:读取数据
*/
public class ReadDemo {
public static void main(String[] args) throws Exception {
FileSystem fs = DoitUitls.getFs();
FSDataInputStream open = fs.open(new Path("/a.txt"));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(open));//缓冲字符流进行包装
String len=null;
while ((len = bufferedReader.readLine()) != null) {
System.out.println(len);
}
bufferedReader.close();
open.close();
}
}