目录
1. API 操作流程说明
Configuration 类
功能:
解析并封装参数
加载 默认配置文件 core-default.xml、hdfs-default.xml
加载 自定义配置文件 resources目录下 core-site.xml、hdfs-site.xml
FileSystem 类
功能:
文件系统的抽象基类,它的实现可以是分布式文件系统、也可以是”本地“文件系统
常用实现类:
LocalFileSystem : 本地文件系统
DistributedFileSystem : 分布式文件系统
2. 相关API
2.1 创建目录
使用默认权限创建(drwxr-xr-x)
public boolean mkdirs(Path f)
使用指定权限创建
public boolean mkdirs(Path f, FsPermission permission)
tips: 1.当目录存在时,会返回true(不会报错哦)
2.当发生写入失败,没有权限(Permission denied: user=worker01),可以看这里 传送门
代码示例:
test("创建目录") {
// 1. 获取客户端
val conf = new Configuration()
val fs = FileSystem.get(
new URI("hdfs://worker01:8020"),
conf, "worker01"
)
// 2.1 创建目录(使用默认权限 drwxr-xr-x)
val bool = fs.mkdirs(new Path("/csv/dir"))
// 2.2 创建目录(使用指定权限)
// val bool = fs.mkdirs(new Path("/dawang/tmp/demo5")
// , new FsPermission(100644))
// 3. 关闭资源
fs.close()
println(s"是否创建成功:$bool")
}
2.2 上传文件
public void copyFromLocalFile(boolean delSrc, boolean overwrite,Path src, Path dst)
public void copyFromLocalFile(boolean delSrc, Path src, Path dst)
public void copyFromLocalFile(Path src, Path dst)
delSrc – 是否删除本地的源文件(默认为false)
overwrite – 是否覆盖现有文件(默认为true)
src – path 本地文件路径
dst – path hdfs文件路径
FAQ: 报错: File /dawang/3.txt could only be written to 0 of the 1 minReplication nodes. There are 1 datanode(s) running and 1 node(s) are excluded in this operation.
看这里: 传送门
代码示例:
test("上传文件") {
// 1 获取文件系统
val conf = new Configuration()
// 指定 文件副本个数
conf.set("dfs.replication", "4")
val fs = FileSystem.get(
new URI("hdfs://worker01:8020"),
conf, "root"
)
// 2 上传文件
fs.copyFromLocalFile(
new Path("src/main/resources/data/1.txt"), // 指定本地路径
new Path("/dawang/4.txt") // 指定hdfs路径
)
// 3 关闭资源
fs.close()
println("上传成功~")
}
2.3 下载文件
public void copyToLocalFile(boolean delSrc, Path src, Path dst,boolean useRawLocalFileSystem)
public void copyToLocalFile(boolean delSrc, Path src, Path dst)
public void copyToLocalFile(Path src, Path dst)
delSrc – 是否删除hdfs的源文件(默认为false)
src – path 指定hdfs路径
dst – path 指定本地路径
useRawLocalFileSystem – 是否使用RawLocalFileSystem作为本地文件系统(默认为false),
当为true时,会在本地生成 xxx.crc 校验文件
代码示例:
test("下载文件") {
// 1 获取文件系统
val conf = new Configuration()
val fs = FileSystem.get(
new URI("hdfs://worker01:8020"),
conf, "root"
)
// 2 下载文件
fs.copyToLocalFile(
false,
new Path("/dawang/4.txt"), // 指定hdfs路径
new Path("src/main/resources/data/2.txt"), // 指定本地路径
false
)
// 3 关闭资源
fs.close()
println("下载成功~")
}
2.4 更名&移动文件
public boolean rename(Path src, Path dst)
tips:
操作成功,返回true
操作失败,返回false
代码示例:
test("更名&移动文件") {
// 1 获取文件系统
val conf = new Configuration()
val fs = FileSystem.get(
new URI("hdfs://worker01:8020"),
conf, "root"
)
// 2 移动文件
val bool = fs.rename(
new Path("/dawang/3.txt"), // 指定hdfs路径
new Path("/tmp/dawang_2.txt") // 指定hdfs路径
)
// 3 关闭资源
fs.close()
println(s"操作完成: $bool")
}
2.5 删除文件或目录
public boolean delete(Path f, boolean recursive)
参数:
recursive: 是否递归删除(true-递归,false-不递归)
结果:
返回 false,删除失败
返回 true, 删除成功
tips:
生产环境慎用(尤其是递归删除)💀😱!!!!
代码示例:
test("删除文件或目录") {
// 1 获取文件系统
val conf = new Configuration()
val fs = FileSystem.get(
new URI("hdfs://worker01:8020"),
conf, "root"
)
// 2 删除文件
val bool = fs.delete(
new Path("/001"), // 指定hdfs路径
true // 递归删除
)
// 3 关闭资源
fs.close()
println(s"操作结果: $bool")
}
2.6 查看文件详情
public RemoteIterator<LocatedFileStatus> listFiles(final Path f, final boolean recursive)
功能:
返回 指定路径下 文件的信息(文件名称、权限、长度、块信息等)
参数:
recursive – 是否递归遍历子目录(true-递归,false-不递归)
结果:
返回 LocatedFileStatus的迭代器(LocatedFileStatus对象封装了文件的元数据信息)
代码示例:
test("查看文件详情") {
// 1 获取文件系统
val conf = new Configuration()
val fs = FileSystem.get(
new URI("hdfs://worker01:8020"),
conf, "root"
)
// 2 获取文件详情
val listFiles: RemoteIterator[LocatedFileStatus] = fs.listFiles(
new Path("/dawang"), // 指定hdfs路径
true // 递归子目录
)
while (listFiles.hasNext) {
val fileStatus = listFiles.next
// 获取文件路径信息
println("getPath:" + fileStatus.getPath)
// 获取文件权限信息
println("getPermission:" + fileStatus.getPermission)
// 获取文件所有者
println("getOwner:" + fileStatus.getOwner)
// 获取文件组
println("getGroup:" + fileStatus.getGroup)
// 获取文件大小(bytes)
println("getLen:" + fileStatus.getLen)
// 获取文件最近修改时间(时间戳)
println("getModificationTime:" + fileStatus.getModificationTime)
// 获取文件副本个数
println("getReplication:" + fileStatus.getReplication)
// 获取文件块的大小(bytes)
println("getBlockSize:" + fileStatus.getBlockSize)
// 获取文件名称
println("getName:" + fileStatus.getPath.getName)
// 获取块信息
val blockLocations: Array[BlockLocation] = fileStatus.getBlockLocations
blockLocations.foreach(println(_))
println("")
println("----------------------------------------------")
}
// 3 关闭资源
fs.close()
println("操作成功~")
}
执行结果:
2.7 对 文件和目录的 判断
代码示例:
test("对 文件和目录的 判断") {
// 1 获取文件系统
val conf = new Configuration()
val fs = FileSystem.get(
new URI("hdfs://worker01:8020"),
conf, "root"
)
// 2 对 文件和目录的 判断
val fileStatuses: Array[FileStatus] = fs.listStatus(
new Path("/dawang") // 指定hdfs路径
)
fileStatuses.foreach(
file => {
// 判断是否是文件
if (file.isFile)
println(file.getPath + " 是文件")
else
println(file.getPath + " 是目录")
}
)
// 3 关闭资源
fs.close()
println("操作成功~")
}
执行结果: