例如,下面的代码演示了如何使用 listFiles() 方法来获取 HDFS 上的文件列表:
// 定义 HDFS 连接配置
Configuration conf = new Configuration()
// 获取 HDFS FileSystem 对象
FileSystem fs = FileSystem.get(conf)
// 定义要列举文件的目录
Path dirPath = new Path("/user/hadoop")
// 获取文件列表
RemoteIterator<LocatedFileStatus>fileIter = fs.listFiles(dirPath, true)
// 遍历文件列表
while (fileIter.hasNext()) {
// 获取当前文件信息
LocatedFileStatus fileStatus = fileIter.next()
// 输出文件名称和大小
System.out.println(fileStatus.getPath().getName() + " : " + fileStatus.getLen())
}
HDFS是Hadoop生态系统的根基,也是Hadoop生态系统中的重要一员,大部分时候,我们都会使用Linux shell命令来管理HDFS,包括一些文件的创建,删除,修改,上传等等,因为使用shell命令操作HDFS的方式,相对比较简单,方便,但是有时候,我们也需要通过编程的方式来实现对文件系统的管理。比如有如下的一个小需求,要求我们实现读取HDFS某个文件夹下所有日志,经过加工处理后在写入到HDFS上,或者存进Hbase里,或者存进其他一些存储系统。这时候使用shell的方式就有点麻烦了,所以这时候我们就可以使用编程的方式来完成这件事了,当然散仙在这里使用的是原生的Java语言的方式,其他的一些语言例如C++,PHP,Python都可以实现,散仙在这里不给出演示了,(其实散仙也不会那些语言,除了刚入门的Python) 。
下面,散仙给出代码,以供参考:
view sourceprint?
001package com.java.api.hdfs
002
003import java.io.BufferedReader
004import java.io.IOException
005import java.io.InputStream
006import java.io.InputStreamReader
007
008import org.apache.hadoop.conf.Configuration
009import org.apache.hadoop.fs.FileStatus
010import org.apache.hadoop.fs.FileSystem
011import org.apache.hadoop.fs.Path
012
013
014/**
015 * @author 三劫散仙
016 * Java API操作HDFS
017 * 工具类
018 *
019 * **/
020public class OperaHDFS {
021
022
023public static void main(String[] args)throws Exception {
024
025//System.out.println("aaa")
026// uploadFile()
027//createFileOnHDFS()
028//deleteFileOnHDFS()
029//createDirectoryOnHDFS()
030//deleteDirectoryOnHDFS()
031// renameFileOrDirectoryOnHDFS()
032//downloadFileorDirectoryOnHDFS()
033readHDFSListAll()
034}
035
036
037
038
039/***
040 * 加载配置文件
041 * **/
042 static Configuration conf=new Configuration()
043
044
045
046 /**
047 * 重名名一个文件夹或者文件
048 *
049 * **/
050 public static void renameFileOrDirectoryOnHDFS()throws Exception{
051
052FileSystem fs=FileSystem.get(conf)
053Path p1 =new Path("hdfs://10.2.143.5:9090/root/myfile/my.txt")
054Path p2 =new Path("hdfs://10.2.143.5:9090/root/myfile/my2.txt")
055fs.rename(p1, p2)
056
057fs.close()//释放资源
058System.out.println("重命名文件夹或文件成功.....")
059
060 }