hadoop2.7.2学习笔记05-hadoop文件系统API定义-hadoop文件系统类org.apache.hadoop.fs.FileSystem

2023-11-01

class org.apache.hadoop.fs.FileSystem

  抽象类FileSystem是访问hadoop文件系统的最原生态的方式;它的非抽象的子类用来实现hadoop支持的各个文件系统。

  所有基于此接口的的操作必须要支持相对路径,相对路径指相对于工作路径,工作路径由setWorkingDirectory()指定。

  对于每个客户端都有一个当前工作目录的概念,但是这个目录的改变并不会影响到文件系统,它只作用于客户端。

  对有效的文件系统的所有要求被区分为preconditions和postconditions,一个有效的文件系统上的所有操作的结果也需要是一个有效的文件系统。


  接下类定义一些反映状态的操作

boolean exists(Path p)

def exists(FS, p) = p in paths(FS)

boolean isDirectory(Path p)

def isDirectory(FS, p)= p in directories(FS)

boolean isFile(Path p)

def isFile(FS, p) = p in files(FS)

boolean isSymlink(Path p)

def isSymlink(FS, p) = p in symlinks(FS)

‘boolean inEncryptionZone(Path p)’

如果路径p的数据是加密过的则返回true,但元数据是未加密的

前提条件preconditions:

if not exists(FS, p) : raise FileNotFoundException
结束条件postconditions:

加密目录下的所有文件和目录也是加密的

forall d in directories(FS): inEncyptionZone(FS, d) implies
  forall c in children(FS, d) where (isFile(FS, c) or isDir(FS, c)) :
    inEncyptionZone(FS, c)
加密区域的所有文件的数据都是加密的,但是加密类型没有指定

  forall f in files(FS) where  inEncyptionZone(FS, c):
    isEncrypted(data(f))

FileStatus getFileStatus(Path p)

  返回路径的状态

  preconditions:

if not exists(FS, p) : raise FileNotFoundException
  postconditions:
result = stat: FileStatus where:
    if isFile(FS, p) :
        stat.length = len(FS.Files[p])
        stat.isdir = False
    elif isDir(FS, p) :
        stat.length = 0
        stat.isdir = True
    elif isSymlink(FS, p) :
        stat.length = 0
        stat.isdir = False
        stat.symlink = FS.Symlinks[p]
    if inEncryptionZone(FS, p) :
        stat.isEncrypted = True
    else
        stat.isEncrypted = False

Path getHomeDirectory()

  返回当前用户的home目录

  postconditions:

result = p where valid-path(FS, p)

FileSystem.listStatus(Path, PathFilter )

  如果路径满足筛选条件则返回true

  preconditions:

if not exists(FS, p) : raise FileNotFoundException
  postconditions:

if isFile(FS, p) and f(p) :
    result = [getFileStatus(p)]

elif isFile(FS, p) and not f(P) :
    result = []

elif isDir(FS, p):
   result [getFileStatus(c) for c in children(FS, p) where f(c) == True]

Atomicity and Consistency

  listStatus()方法返回时,并不能保证它的结果能够反映当前的状态。在进行listStatus操作的时候,一些目录的状态可能发生变化。

    路径p被创建后,在文件系统中发生任何其他改变之前,listStatus(p)必须找到文件并返回它的状态。

    路径p被删除后,listStatus(p)必须抛出FileNotFoundException。

    路径p被创建后,在文件系统中发生任何其他改变之前,listStatus(parent(p))的结果需要包括getFileStatus(p)的结果。

    路径p被删除后,在文件系统中发生任何其他改变之前,listStatus(parent(p))的结果必须不能包括getFileStatus(p)的结果。

List[BlockLocation] getFileBlockLocations(FileStatus f, int s, int l)

  preconditions:

if s < 0 or l < 0 : raise {HadoopIllegalArgumentException, InvalidArgumentException}
  对于无效的偏移量或长度,HDFS会抛出HadoopIllegalArgumentException,它继承自IllegalArgumentException。

  postconditions:

  如果文件系统是位置敏感的,它将返回block位置的清单。

if f == null :
    result = null
elif f.getLen()) <= s
    result = []
else result = [ locations(FS, b) for all b in blocks(FS, p, s, s+l)]
def locations(FS, b) = a list of all locations of a block in the filesystem

def blocks(FS, p, s, s +  l)  = a list of the blocks containing  data(FS, path)[s:s+l]
  目录的length(FS,f)结果为0,目录的getFileBlockLocations()结果是[]。

  如果文件系统是位置不敏感的,它需要返回

  [
    BlockLocation(["localhost:50010"] ,
              ["localhost"],
              ["/default/localhost"]
               0, F.getLen())
   ] ;

getFileBlockLocations(Path P, int S, int L)

  preconditions: 
if p == null : raise NullPointerException
if not exists(FS, p) : raise FileNotFoundException
  postconditions:

result = getFileBlockLocations(getStatus(P), S, L)

getDefaultBlockSize()

  postconditions:

result = integer >= 0

getDefaultBlockSize(Path P)

  postconditions:

result = integer  >= 0

getBlockSize(Path P)

  preconditions:

if not exists(FS, p) :  raise FileNotFoundException
  postconditions:

result == getFileStatus(P).getBlockSize()
  返回值需要和getFileStatus(P)的返回值相同

boolean mkdirs(Path p, FsPermission permission )

  创建一个目录和它所有的不存在的父目录。

  preconditions:

 if exists(FS, p) and not isDir(FS, p) :
     raise [ParentNotDirectoryException, FileAlreadyExistsException, IOException]
  postconditions:

FS' where FS'.Directories' = FS.Directories + [p] + ancestors(FS, p)
result = True  

FSDataOutputStream create(Path, ...)

FSDataOutputStream create(Path p,
      FsPermission permission,
      boolean overwrite,
      int bufferSize,
      short replication,
      long blockSize,
      Progressable progress) throws IOException;
preconditions:

  文件不能存在

if not overwrite and isFile(FS, p)  : raise FileAlreadyExistsException
  向目录写入需要报错

if isDir(FS, p) : raise {FileAlreadyExistsException, FileNotFoundException, IOException}
postconditions:

FS' where :
   FS'.Files'[p] == []
   ancestors(p) is-subset-of FS'.Directories'

result = FSDataOutputStream

FSDataOutputStream append(Path p, int bufferSize, Progressable progress)

  可能抛出UnsupportedOperationException

  preconditions:

if not exists(FS, p) : raise FileNotFoundException

if not isFile(FS, p) : raise [FileNotFoundException, IOException]
  postconditions:

FS
result = FSDataOutputStream

FSDataInputStream open(Path f, int bufferSize)

  可能抛出UnsupportedOperationException

  preconditions:

if not isFile(FS, p)) : raise [FileNotFoundException, IOException]

  在打开时需要确保文件的存在,但是在打开后的读取过程中不能保证文件和数据是否存在。

  postconditions

result = FSDataInputStream(0, FS.Files[p])

FileSystem.delete(Path P, boolean recursive)

  preconditions:

  存在子节点的目录只能使用循环删除

if isDir(FS, p) and not recursive and (children(FS, p) != {}) : raise IOException
  postconditions:

  如果路径不存在,则文件系统不会发生改变

if not exists(FS, p):
    FS' = FS
    result = False
  若是单个文件则会将其移除

if isFile(FS, p) :
    FS' = (FS.Directories, FS.Files - [p], FS.Symlinks)
    result = True
  若是空的根目录则不会改变文件系统

if isDir(FS, p) and isRoot(p) and children(FS, p) == {} :
    FS ' = FS
    result = (undetermined)
  删除一个空目录(非根目录)则会将其移除

if isDir(FS, p) and not isRoot(p) and children(FS, p) == {} :
    FS' = (FS.Directories - [p], FS.Files, FS.Symlinks)
    result = True
  循环删除根目录

  POSIX模型允许删除一切

if isDir(FS, p) and isRoot(p) and recursive :
    FS' = ({["/"]}, {}, {}, {})
    result = True
  HDFS不允许删除根目录,如果需要空的文件系统,可以将文件系统下线并格式化

 

if isDir(FS, p) and isRoot(p) and recursive :
    FS' = FS
    result = False
  循环删除空目录(非根目录)将会删除路径及其子路径

if isDir(FS, p) and not isRoot(p) and recursive :
    FS' where:
        not isDir(FS', p)
        and forall d in descendants(FS, p):
            not isDir(FS', d)
            not isFile(FS', d)
            not isSymlink(FS', d)
    result = True
  删除文件,删除空目录和循环删除目录必须是原子操作。

FileSystem.rename(Path src, Path d)

  重命名需要计算目标路径。如果目标存在且是一个目录,那么最后的结果将会是目标+源路径的文件名

let dest = if (isDir(FS, src) and d != src) :
        d + [filename(src)]
    else :
        d
  preconditions:

  源路径需要存在

exists(FS, src) else raise FileNotFoundException
  目标路径不能在源路径之下

if isDescendant(FS, src, dest) : raise IOException
  目标路径必须是根目录或存在某个父节点

isRoot(FS, dest) or exists(FS, parent(dest)) else raise IOException
  目标路径的父节点不能是文件

if isFile(FS, parent(dest)) : raise IOException
  目标路径不能是已经存在的文件

if isFile(FS, dest) : raise FileAlreadyExistsException, IOException
  postconditions:

  在自身上重命名一个目录在POSIX是不可以的,但在HDFS是可以的

if isDir(FS, src) and src == dest :
    FS' = FS
    result = (undefined)
  重命名一个文件给自身是可以的

 if isFile(FS, src) and src == dest :
     FS' = FS
     result = True
  重命名一个文件到目录会将文件移动到目标目录下并以源路径的文件名进行命名

if isFile(FS, src) and src != dest:
    FS' where:
        not exists(FS', src)
        and exists(FS', dest)
        and data(FS', dest) == data (FS, dest)
    result = True
  如果源路径是目录,目标也是目录,那么源路径下的所有子节点将会移动到目标目录,且源目录会被删除。

if isDir(FS, src) isDir(FS, dest) and src != dest :
    FS' where:
        not exists(FS', src)
        and dest in FS'.Directories]
        and forall c in descendants(FS, src) :
            not exists(FS', c))
        and forall c in descendants(FS, src) where isDir(FS, c):
            isDir(FS', dest + childElements(src, c)
        and forall c in descendants(FS, src) where not isDir(FS, c):
                data(FS', dest + childElements(s, c)) == data(FS, c)
    result = True
  目标路径是一个父节点不存在的路径,此时hadoop支持的不同文件系统会有些许差异

  对于hdfs,将会返回失败

FS' = FS; result = False
  对于本地文件系统、S3N,将会返回成功,并创建之前不存在的父节点

exists(FS', parent(dest))
  对于其他文件系统(包括Swift),将会明确拒绝这个操作,抛出FileNotFoundException

concat(Path p, Path sources[])

  将多个blocks合并成单个文件。几乎只有hdfs实现了这个功能。

  可能抛出UnsupportedOperationException

  preconditions:

if not exists(FS, p) : raise FileNotFoundException

if sources==[] : raise IllegalArgumentException
  所有源路径需要在同一个目录下

for s in sources: if parent(S) != parent(p) raise IllegalArgumentException
  所有的block的大小需要和目标的block大小相匹配

for s in sources: getBlockSize(FS, S) == getBlockSize(FS, p)
  没有重复的路径

not (exists p1, p2 in (sources + [p]) where p1 == p2)
  HDFS还要求所有的block都必须是完成状态的,除了最后一个

for s in (sources[0:length(sources)-1] + [p]):
  (length(FS, s) mod getBlockSize(FS, p)) == 0
  postconditions:

FS' where:
 (data(FS', T) = data(FS, T) + data(FS, sources[0]) + ... + data(FS, srcs[length(srcs)-1]))
 and for s in srcs: not exists(FS', S)

boolean truncate(Path p, long newLength)

  将文件p截断到指定的长度,可能会抛出UnsupportedOperationException。

  preconditions:

if not exists(FS, p) : raise FileNotFoundException

if isDir(FS, p) : raise [FileNotFoundException, IOException]

if newLength < 0 || newLength > len(FS.Files[p]) : raise HadoopIllegalArgumentException
  hdfs要求源文件需要是关闭的。执行操作时不能对文件进行写入操作。

  postconditions:

FS' where:
    len(FS.Files[p]) = newLength
  如果截断成功,且可以对文件进行写入操作。那么返回true。否则false。

  hdfs返回false时说明截断进程已经启动了,用户需要等待它执行完毕。



 




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hadoop2.7.2学习笔记05-hadoop文件系统API定义-hadoop文件系统类org.apache.hadoop.fs.FileSystem 的相关文章

  • Hadoop setInputPathFilter错误

    我正在使用 Hadoop 0 20 2 无法更改 并且我想向我的输入路径添加一个过滤器 数据如下 path1 test a1 path1 test a2 path1 train a1 path1 train a2 我只想处理所有文件trai
  • 使用 python 从 HDFS 获取文件名列表

    这里是 Hadoop 菜鸟 我搜索了一些有关 hadoop 和 python 入门的教程 但没有取得太大成功 我还不需要使用映射器和缩减器进行任何工作 但这更多是一个访问问题 作为Hadoop集群的一部分 HDFS 上有一堆 dat 文件
  • Cat 文件与 HDFS 中的模式不匹配?

    我正在尝试 cat 与 hadoop HDFS 中的以下模式不匹配的文件 hdfs dfs cat gz 如何捕获所有不以 gz 结尾的文件 编辑 抱歉 但我需要在 Hadoop 中管理文件 显然 hdfs 附带的命令非常少 编辑2 所有文
  • Sqoop Import --password-file 功能在 sqoop 1.4.4 中无法正常工作

    我使用的是hadoop 1 2 1 sqoop版本是1 4 4 我正在尝试运行以下查询 sqoop import connect jdbc mysql IP 3306 database name table clients target d
  • Hadoop:处理大型序列化对象

    我正在开发一个应用程序来使用 Hadoop 框架处理 和合并 几个大型 java 序列化对象 顺序 GB 大小 Hadoop 存储将文件块分布在不同的主机上 但由于反序列化需要所有块都存在于单个主机上 因此它会极大地影响性能 我该如何处理这
  • 将 hadoop fs 路径转换为 ​​EMR 上的 hdfs:// 路径

    我想知道如何将数据从 EMR 集群的 HDFS 文件系统移动到 S3 存储桶 我认识到我可以直接在 Spark 中写入 S3 但原则上 之后执行它也应该很简单 到目前为止 我还没有发现在实践中这是正确的 AWS 文档建议s3 dist cp
  • Curl下载到HDFS

    我有这个代码 curl o fileName csv url xargs hdfs dfs moveFromLocal 1 somePath 当我执行此代码时 curl 将请求中的值放入 fileName csv 中 该文件将移动到 HDF
  • Spark超时可能是由于HDFS中文件超过100万个的binary Files()

    我正在通过以下方式读取数百万个 xml 文件 val xmls sc binaryFiles xmlDir 该操作在本地运行良好 但在纱线上失败并显示 client token N A diagnostics Application app
  • 为什么组合器输入记录的数量比映射的输出数量多?

    Combiner 在 Mapper 之后 Reducer 之前运行 它将接收给定节点上的 Mapper 实例发出的所有数据作为输入 然后它将输出发送到Reducers 因此组合器输入的记录应小于映射输出的记录 12 08 29 13 38
  • Sqoop mysql错误-通信链路故障

    尝试运行以下命令 sqoop import connect jdbc mysql 3306 home credit risk table bureau target dir home sqoop username root password
  • 猪如何过滤不同的对(对)

    我是猪的新手 我有一个 Pig 脚本 它在两个元素之间生成制表符分隔的对 每行一对 例如 John Paul Tom Nik Mark Bill Tom Nik Paul John 我需要过滤掉重复的组合 如果我使用 DISTINCT 我会
  • 如何在 Hadoop 中将 String 对象转换为 IntWritable 对象

    我想转换String反对IntWritableHadoop 中的对象 任何过程都可以进行转换 IntWritable value new IntWritable Integer parseInt someString 并处理以下可能性par
  • 在 Amazon EMR 上使用 java 中的 hbase 时遇到问题

    因此 我尝试使用作为 MapReduce 步骤启动的自定义 jar 来查询 Amazon ec2 上的 hbase 集群 我的 jar 在地图函数内 我这样调用 Hbase public void map Text key BytesWri
  • 猪参考

    我正在学习 Hadoop Pig 并且我总是坚持引用元素 请查找下面的示例 groupwordcount group chararray words bag of tokenTuples from line token chararray
  • Hive - 线程安全的自动递增序列号生成

    我遇到一种情况 需要将记录插入到特定的 Hive 表中 其中一列需要是自动递增的序列号 即在任何时间点都必须严格遵循 max value 1 规则 记录从许多并行的 Hive 作业插入到这个特定的表中 这些作业每天 每周 每月批量运行 现在
  • 在映射器的单个输出上运行多个减速器

    我正在使用地图缩减实现左连接功能 左侧有大约 6 亿条记录 右侧有大约 2300 万条记录 在映射器中 我使用左连接条件中使用的列来创建键 并将键值输出从映射器传递到减速器 我遇到性能问题 因为两个表中的值数量都很高的映射器键很少 例如分别
  • 适用于 Hadoop 的 DynamoDB 输入格式

    我必须使用 Hadoop mapreduce 处理保留在 Amazon Dynamodb 中的一些数据 我在互联网上搜索 Dynamo DB 的 Hadoop InputFormat 但找不到它 我对 Dynamo DB 不熟悉 所以我猜测
  • Sqoop - 绑定到 YARN 队列

    因此 使用 MapReduce v2 您可以使用绑定到某些 YARN 队列来管理资源和优先级 基本上通过使用 hadoop jar xyz jar D mapreduce job queuename QUEUE1 input output
  • Talend 和 Apache Spark?

    我对 Talend 和 Apache Spark 在大数据生态系统中的定位感到困惑 因为 Apache Spark 和 Talend 都可以用于 ETL 有人可以用一个例子解释一下吗 Talend 是一种基于工具的大数据方法 通过内置组件支
  • Hadoop NoSuchMethodError apache.commons.cli

    我在用着hadoop 2 7 2我用 IntelliJ 做了一个 MapReduce 工作 在我的工作中 我正在使用apache commons cli 1 3 1我把库放在罐子里 当我在 Hadoop 集群上使用 MapReduceJob

随机推荐

  • 云服务器转租赁协议,关于云服务器的租赁协议

    关于云服务器的租赁协议 内容精选 换一换 本节操作指导用户关闭Windows操作系统云服务器的防火墙 以及防火墙添加例外端口的操作 本节操作以2012操作系统云服务器为例 防火墙开启和设置安全组是对云服务器的双重保护 如果选择关闭防火墙 建
  • 推荐几本对于Python初学者比较好的书籍(内含PDF)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 我们提供一个初学者最好的Python书籍列表 Python是一个初级程序员可以学习编程的最友好语言之一 为了帮助您开始使用Python编程 我们分享此列表 泡一杯茶 选一本
  • 重装系统后服务器无法正常开机,界面报System will find bootable device automatically,No bootable device

    原因 raid组大于2TB BIOS中的Boot Type未设置为 UEFI Boot Type 解决方案 重启服务器 进bios界面 修改启动类型为 UEFI 保存退出即可
  • 2023最新Chatgpt网站源码+是GPT-3.5版本/实测搭建可用

    正文 是GPT3 5版本的 真正的人工智能AI 很聪明 实测可用 输入密钥就可以使用了 密钥自己去官网获取等等 有兴趣的自行去安装体验吧 程序 wwegro lanzouw com iBsnV0t4dgtc 图片
  • Navicat将表生成pdm文件

    1 使用Navicat导出sql文件 选择相应的数据库 gt 点击右键 gt 转储到SQL文件 gt 仅结构 导出相应的sql文件 2 使用PowerDesigner工具将sql转换为pdm文件 选择File gt reverse engi
  • windows linux 效率,linux server 和 windows server 的性能比较

    近些天 上面要求找些linux和windows server的性能方面的优缺点比较 要求有数据支持 比较内容包括 mysql 方面的比较 tomcat方面的 以及操作系统方面的比较 在网上找了今天 找到的东西都是很空洞的 只是一句话概括 没
  • Linux基本使用

    Linux目录结构 Linux 文件系统是一个目录树的结构 文件系统结构从一个根目录开始 根目录下可以有任意多个文件和子目录 子目录中又可以有任意多个文件和子目录 bin 存放二进制可执行文件 ls cat mkdir等 bin usr b
  • kali下使用docker建立DVWA、CTFD靶机

    常规操作 apt get update apt get upgrade apt get dist upgrade 这一步一般不用 apt get clean 安装Docker apt get install docker docker co
  • Pytorch实现多分类问题 样例解释 通俗易懂 新手必看

    初学者学习Pytorch系列 第一篇 Pytorch初学简单的线性模型 代码实操 第二篇 Pytorch实现逻辑斯蒂回归模型 代码实操 第三篇 Pytorch实现多特征输入的分类模型 代码实操 第四篇 Pytorch实现Dataset数据集
  • 数学规划模型之线性规划

    一 数学规划模型简介 什么是优化问题 解决有限资源的最佳分配问题 即如何用 最好 的方法 使有限的资源能获取最佳的经济效益 数学规划模型分类 线性规划模型 LP 非线性规划模型 NLP 整数规划模型 IP 0 1规划模型 动态规划模型 DP
  • 前端八股文(3)53-84

    53 什么是 ARIA ARIA Accessible Rich Internet Applications 是能够让残障人士更加便利地访问 Web 内容和使用 Web 应用的一套机制 来自 W3C 的网络无障碍计划 Web Accessi
  • 基于wemos D1的无线遥控灯(433m无线模块)

    参考 基于wemos D1的无线遥控灯 433m无线模块 作者 一只小阿大 发布时间 2021 04 16 09 25 53 网址 https blog csdn net qq 44610809 article details 115747
  • 来,看一个真实的用户分析案例!

    大家好 我是小z 也可以叫我阿粥 今天给大家分享一个网易大客户分析的案例 一些思路和技巧 值得借鉴 在直播行业 用户的付费活跃规模及支付习惯与传统行业有很大的不同 直播大R付费是低频高arppu 可能一笔消费就达10万元 可能5分钟刷出10
  • unity3d网格(mesh)编程的研究

    关于unity3d 网格编程 建一个空物体 添加脚本MeshScript void Start gameObject AddComponent
  • 操作系统.存储器管理.简单杂记

    某计算机采用二级页表的分页存储管理方式 按字节编址 页面大小为1024B 每个页表项占2B 逻辑地址结构为 A 64 B 128 C 256 D 512 链接 https www nowcoder com questionTerminal
  • 计算机网络复习-04

    交换机以太网接口双工模式 单工 两个数据站之间只能沿单一方向传输数据 半双工 两个数据站之间可以双向数据传输 但不能同时进行 全双工 两个数据站之间可双向且同时进行数据传输 root localhost ethtool ens33 Sett
  • spring boot admin抛出"status":401,"error":"Unauthorized"异常

    打开spring boot admin的监控平台发现其监控的服务明细打开均抛出异常 Error timestamp 1502749349892 status 401 error Unauthorized message Full authe
  • 10-golang运算符

    文章目录 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 Go 语言内置的运算符有 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 算术运算符 运算符 描述 相加 相减 相乘 相除 求余 注意 自增 和 自减 在Go语言
  • Level Shift的影响及使用及位置

    H2L 一般放在Low Voltage 因为H2L LevelShift的supply Voltage是VDDL 如果放在High Voltage就需要将VDDL的power rail route到VDDH domain 如果高低电压差别不
  • hadoop2.7.2学习笔记05-hadoop文件系统API定义-hadoop文件系统类org.apache.hadoop.fs.FileSystem

    class org apache hadoop fs FileSystem 抽象类FileSystem是访问hadoop文件系统的最原生态的方式 它的非抽象的子类用来实现hadoop支持的各个文件系统 所有基于此接口的的操作必须要支持相对路