HDFS知识梳理

应用背景

  1. 当数据集的大小超过一台独立物理计算机的存储能力时,有必要对它进行分区并存储到若干台单独的计算机上
  2. 管理网络中跨多台计算机存储的文件系统称为分布式文件系统
  3. 分布式文件系统架构于网络之上,必然会引入网络编程的复杂性,分布式文件系统比普通磁盘文件系统更加复杂
  4. Hadoop有一个抽象的文件系统概念,HDFS是其中的一个实现

简介

分布式存储系统HDFS(Hadoop Distributed File System)是一个文件系统,类似于Linux的文件系统。HDFS有目录,目录下可以存储文件,但它是一个分布式的文件系统。

基本原理

  1. 将文件切分成等大的数据块,分别存储到多台机器上
  2. 每个数据块存在多个备份
  3. 数据切分、容错、负载均衡等功能透明化
  4. 可将HDFS看成是一个巨大的、具有容错性的磁盘

优点

  • 处理超大文件
  • 流式访问数据
  • 运行于廉价的商用集群上

缺点

  • 不适合存储大量小文件
  • 不适合低延迟数据访问
  • 不支持多用户写入和任意修改文件

设计

HDFS以流式数据访问模式来存储超大文件,运行于商用硬件集群上

  • 超大文件
  • 几百MB、GB、TB大小的文件,现已有Hadoop集群存储PB级数据
  • 流式数据访问
  • 一次写入,多次读取是最高效的访问模式
  • 数据集通常由数据源生成或者从数据源复制而来,会长时间在此数据集上进行分析,每次均会涉及大部分或者全部数据,读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要
  • 商用硬件
  • HDFS设计运行在商用硬件上,即在各种零售店都能买到的普通硬件
  • 节点故障几率高
  • HDFS被设计成在遇到故障时能够继续运行,不让用户察觉到明显的中断
  • 某些应用领域不适合使用HDFS
  • 低延迟的数据访问
  • HDFS为高数据吞吐量应用优化,以增加时间延时为代价
  • 要求几十毫秒低时间延迟访问的应用,不适合在HDFS上运行,更适合于HBase
  • 大量的小文件
  • NameNode将存储文件系统的元数据存储在内存中,该文件系统所能存储的文件总数受限于NameNode的内存容量
  • 每个文件、目录和数据块的存储信息大约占150字节
    存储上百万个文件是可行的,存储十亿个文件就超出了当前硬件的能力
  • 多用户写入,任意修改文件
  • 文件写入只支持单个写入者,不支持多个写入者
  • 写操作以“只添加”的方式在文件末尾写数据,不支持在文件任意位置进行修改
  • 以后可能支持这些操作,但相对比较低效

概念

HDFS架构图

doris 对比 hadoop CDH hadoop fs hadoop dfs hdfs dfs_Hadoop

注:Rack-机架 Replication-副本 Block-数据块 Metadata-元数据

  • 数据块
  • 每个磁盘有默认的数据块大小,是磁盘进行数据读写的最小单位
  • 构建于单个磁盘之上的文件系统通过磁盘块来管理该文件系统中的块,该文件系统块的大小可以是磁盘块的整数倍
  • HDFS同样有块(Block)的概念,默认为128MB
  • 与单一磁盘上的文件系统相似,HDFS上的文件也被划分为块大小的多个分块(Chunk),作为独立的存储单元
  • 与其他文件系统不同,HDFS中小于一个块大小的文件不会占据整个块的空间
  • 优点
  • 一个大文件不用存储于整块磁盘上,可以分布式存储
  • 使用块抽象而非整个文件作为存储单元,大大简化了存储子系统的设计,对于故障种类繁多的分布式系统尤为重要
  • 显示块信息的命令hdfs fsck / -files -blocks
  • NameNode
  • HDFS架构中的主节点
  • 管理各个从节点(DataNode)的状态
  • 记录存储在HDFS上所有数据的元数据信息,如Block存储的位置、文件大小、文件权限、文件层级等
  • 上述信息以两个文件的形式永久保存于本地磁盘
  • 命名空间镜像文件(FsImg)
    FsImage是HDFS文件系统存于硬盘中的元数据检查点,里面记录了自最后一次检查点之前HDFS文件系统中所有目录和文件的序列化信息
  • 编辑日志文件(Edit-logs)
  • 保存了自最后一次检查点之后所有针对HDFS文件系统的操作,如增加文件、重命名文件、删除目录等
  • NameNode将改动写入Edit-logs是由DataNode的写操作触发的,
  • 记录存储在HDFS上文件的所有变化
  • 接受DataNode的心跳和DataNode上的Blocak报告信息,确认DataNode是否存活
  • 负责处理所有块的复制因子
  • 如果DataNode节点宕机,NameNode会选择另外一个DataNode均衡复制因子,并做负载均衡
  • 可参考官网
  • DataNode
  • DataNode是HDFS架构的从节点,管理各自节点的Block信息
  • 文件内的数据实际存储于DatNode
  • DataNode分别运行于独立的节点
  • DataNode执行客户端级别的读写请求
  • DataNode向NameNode发送心跳(默认设置为3秒),报告各自节点的健康状况
  • Secondary NameNode
  • Secondary NameNode是NameNode的助手,不是其备份
  • Secondary NameNode在HDFS中提供Chekpoint Node,因此也称之为Chekpoint Node
  • 定时从NameNode获取Edit-logs,更新到自己的FsImage上
  • 一旦Secondary NameNode有新的FsImage文件,就将其拷贝回NameNode,NameNode在下次重启时会使用新的FsImage文件,从而减少重启时间
  • 复制因子
  • 复制因子使得HDFS提供可靠存储
  • 默认复制因子为3
  • DataNode定时发送心跳给NameNode,汇报各自节点的Block信息,NameNode手机这些信息后,对超出复制因子的Block进行删除,对复制份数不足的Block进行赋值
  • 机架感知
  • 分布式集群通常包含非常多的机器,收到机架槽位和交换机网口的限制,通常大型分布式集群会跨好几个机架
  • 机架内机器之间的网络速度通常会高于跨机架机器之间的网络速度
  • 机架之间机器的网络通信通常受到上层交换机间网络带宽的限制
  • 文件块的放置
  • 假设一个Block有3份备份
  • 一份放在NameNode指定的DataNode上,一份放在与指定DataNode不在同一台机器上的DataNode上,最后一份放在与指定DataNode同一机架的DataNode上
  • 备份的目的是为了数据安全,采用这种配置方式主要是考虑同一机架内机器宕机的情况,以及不同机架之间进行数据复制会带来的性能降低问题
  • 客户端(Client)
  • 客户端是一个需要获取分布式文件系统文件的应用程序
  • 客户端代表用户通过NameNode和DataNode访问整个文件系统
  • 客户端提供一个类似于POSIX(可移植操作系统界面)的文件系统接口,用户在编程时无需知道NameNode和DataNode也可实现其功能
  • 假设data.txt文件大小为238MB,现需要将其写入HDFS中,假设HDFS块大小设置为默认值128MB,则客户端会将此文件拆分成两个块,第一个块是128MB,第二个块是110MB

读写流程

文件写入

  1. 客户端向NameNode发起写入文件请求
  2. NameNode根据文件大小和文件块配置情况,以及结合了DataNode的健康状态、复制因子、机架感知等因素,将可以写入数据的DataNode的IP地址列表返回给客户端,赋予客户端写权限
  3. 客户端将文件划分为多个块,根据所得的DataNode地址信息,按序将其写入DataNode块中

第3步的数据复制流程分为以下3个阶段

doris 对比 hadoop CDH hadoop fs hadoop dfs hdfs dfs_分布式文件系统_02

  1. 流水线建立
    写入数据前,客户端要确认所得的IP列表是否准备好接收数据,然后连接各个块的IP列表创建流水线
  2. 复制数据
    客户端向流水线写入数据时,将块复制到第一个DataNode节点,其他DataNode节点的复制是在DataNode节点之间完成
  3. 关闭流水线
    当数据复制到所有的DataNode后,按照IP地址列表相反的方向依次写入成功信息,第一个DataNode节点将成功信息反馈给NameNode,NameNode更新编辑日志文件中的元数据信息,客户端将流水线关闭

注意:多个Block的写入是并行进行的,即多个Block同时写入

文件读取

  1. 客户端向NameNode发起文件写入请求
  2. NameNode根据自己的元数据信息,将一个DataNode列表的信息(其块存储了该文件)返回给客户端
  3. 客户端连接DataNode,读取块中的数据
  4. 客户端将多个块中的数据进行合并

命令行接口

  1. appendToFile
    hadoop fs -appendToFile <localsrc> ... <dst> 添加(追加)一个或多个源文件到目标文件中,或者将标准输入中的数据写入目标文件
  2. balancer
hdfs balancer [-threshold <threshold>] [-policy <policy>] [-exclude [-f <hosts-file> | <comma-separated list of hosts>]] [-include [-f <hosts-file> | <comma-separated list of hosts>]] [-idleiterations <idleiterations>]
  1. 用于平衡Hadoop集群中各DataNode中的文件块分布,以避免出现部分DataNode磁盘占用率高的问题

选项名称

说明

-threshold <threshold>

表示平衡的阀值,取值范围在0%到100%之间

即每个DataNode中空间使用率与HDFS集群总的空间使用率的差距百分比

-policy <policy>

平衡策略,默认DataNode

应用于重新平衡HDFS存储的策略,默认DataNode策略平衡了DataNode 级别的存储,这类似于之前发行版的平衡策略

BlockPool 策略平衡了块池级别和DataNode级别的存储,BlockPool策略仅适用于Federated HDFS服务

-exclude/include

参数-exclude-include是用来选择Balancer时,可以指定哪几个DataNode之间重分布

也可以从HDFS集群中排除哪几个节点不需要重分布

-idleiterations <iterations>

迭代检测的次数

  1. cat
    hadoop fs -cat URI [URI ...] 将路径指定文件的内容输入到stdout
  2. chgrp
    hadoop fs -chgrp [-R] GROUP URI [URI ...] 改变文件或目录的组信息
  3. chmod
    hadoop fs -chmod [-R] <MODE[,MODE] ... | OCTALMODE> URI [URI ...] 修改文件权限,修改者必须拥有该目录权限,或者是拥护者的父用户
    -R表示递归
  4. chwon
    hadoop fs -chwon [-R] [OWNER] [:[GROUP]] URI [URI ...] 修改文件拥有者,修改者必须拥有该文件或者是其父用户
    -R表示递归
  5. copyFromLocal
    hadoop fs -copyFromLocal <localsrc> URI 拷贝本地文件到HDFS,类似于put命令,但可以拷贝目录
    -f表示覆盖原来已存在目录
  6. copyToLocal
    hadoop fs -copyToLocal [-ignorecrc] [-crc] URI <localdst> 拷贝HDFS文件到本地,类似于get命令,但可以拷贝目录
  7. count``
    hadoop fs -count [-q] [-h] [-v] <paths> 统计目录下的文件数和空间占用情况
    -h表示输出格式化后的信息
    -v表示输出表头

-count

-count -q

输出列

说明


QUOTA

命名空间quota(创建的文件数目)


REMAINING_QUOTA

剩余的命名空间quota(剩余能创建的文件数目)


SPACE_QUOTA

物理空间quota(限制磁盘空间占用大小)


REMAININNG_SPACE_QUOTA

剩余的物理空间



DIR_COUNT

目录数目



FILE_COUNT

文件数目



CONTEXT_SIZE

目录逻辑空间大小



PATHNAME

路径

  1. cp
    hadoop fs -cp [-f] [-p | -p[topax]] URI [URI ...] <dest> 将文件从源路径复制到目标路径
    该命令允许有多个源路径,此时目标路径必须是一个目录
    -f表示如果目标目录已存在,则覆盖之前的目录
  2. distcp
    hadoop distcp <param> <src> 分布式拷贝(DistCp)是用于大规模集群内部和集群之间拷贝的工具
    它使用Map/Reduce实现文件分发、错误处理和恢复以及报告生成
    它把文件和目录的列表作为Map任务的输入,每个任务会完成源列表中部分文件的拷贝
    由于使用了Map/Reduce方法,这个工具在语义和执行上都会有特殊的地方

标识

描述

备注

-p[rbugp]

Preserve

r:replication number

b:blocak size

u:user

g:group

p:permission

修改次数不会被保留

当指定-update时,更新的状态不会被同步,除非文件大小不同,比如文件被重新创建

-i

忽略失败

该选项回避默认情况提供关于拷贝的更精确的统计,同时它还将保留失败拷贝操作的日志,这些日志信息可以用于调试

如果一个Map失败了,但并没完成所有分块任务的尝试,这不会导致整个作业的失败

-log <logdir>

记录日志到<logdir>

DisCp为每个文件的每次尝试拷贝操作都记录入职,并把日志作为Map的输出

如果一个Map失败了,当重新执行时这个日志不会被保留

-m <num_maps>

同时拷贝的最大数目

指定了拷贝数据时Map的数目

并不是Map越多吞吐量越大

-overwrite

覆盖目标

如果一个Map失败并且没有使用i选项,不仅仅那些拷贝失败的文件,这个分块任务中的所有文件都会被重新拷贝

它会改变生成目标路径的语义,用户需要小心使用该选项

-update

如果源和目标的大小不一样则进行覆盖

这不是“同步”操作,是否执行覆盖的唯一标准是源文件和目标文件大小是否相同

如果不同,则源文件替换目标文件

它会改变生成目标路径的语义,用户需要小心使用该选项

-f <urilist_uri>

使用<urilist_uri>作为源文件列表

等价于把所有文件名列在命令行中

urilist_uri列表应该是完整合法的URI

参考官网 12. df
hadoop fs -df [-h] URI [URI ...] 显示目录空闲空间
-h表示转换为更加易读的方式,比如67108864用64M代替
13. dfsadmin
hadoop dfsadmin [GENERIC_OPTIONS]hadoop dfsadmin支持一些和HDFS管理相关的操作
hadoop dfsadmin -help能列出所有当前支持的命令

命令选项

描述

-report

报告文件系统的基本信息和统计信息

-safemode enter | leave | get | wait

安全模式维护命令

安全模式是NameNode的一个状态,在这种状态下,NameNode不接受对名字空间的更改(只读),并且不复制或者删除块

NameNode会在启动时自动进入安全模式,当配置的块最小百分比数满足最小的副本数条件时,会自动离开安全模式

安全模式可以手动进入,但是这样的话也必须手动关闭安全模式

-refreshNodes

重新读取hosts和exclude文件

更新允许连到NameNode的或那些需要退出或入编的DataNode的集合

-finalizeUpgrade

中街HDFS的升级操作,DataNode删除前一个版本的工作目录,之后NameNode也删除前一个版本的工作目录

这个操作完结整个升级过程

-upgradeProgress status | details | force

请求当前系统的升级状态以及状态细节,或者强制进行升级操作

-metasave filename

保存NameNode的主要数据结构到hadoop.log.dir属性指定的目录下的<filename>文件

对于下面每一项,<filename>中均有一行内容与之对应

1. NameNode收到的DataNode心跳信号

2. 等待被复制的块

3. 正在被复制的块

4. 等待被删除的块

-setQuota <quota> <dirname> … <dirname>

为每个目录<dirname>设定配额<quota>,目录配额是一个长整型整数,强制限定了目录树下的名字个数

下列情况之一会报错

1. N不是一个正整数

2. 用户不是管理员

3. 这个目录不存在或者是文件

4. 目录会马上超出新设定的配额

-clrQuota <dirname> … <dirname>

为每个目录<dirname>清除配额设定

下列情况之一会报错

1. 这个目录不存在或者是文件

2. 用户不是管理员

如果目录原来没有配额则不会报错

  1. expunge
    hadoop fs -expunge 清空回收站
  2. fsck
    hdfs fsck <path> [-list-corruptfileblocks |[-move | -delete | -openforwrite] [-files [-blocks [-locations | - racks]]] [-includeSnapshots] [-storagepolicies] [-blockId <blk_Id>] 检查HDFS上文件和目录的健康状态、获取文件的Block信息和位置信息等

选项名

说明

-list -corruptfileblocks

查看文件中损坏的块

-move

将损坏的文件移动至 /lost+found 目录

-delete

删除损坏的文件

-files

检查并列出所有文件状态

-openforwrite

检查并打印正在被打开执行写操作的文件

-blocks

打印文件的Block报告(需要和-files一起使用)

-locations

打印文件块的位置信息(需要和-files -blocks一起使用)

-racks

打印文件块位置所在的机架信息

  1. get
    hadoop fs -get [-ignorecrc] [-crc] <src> <localdst> 复制文件到本地文件系统
  2. getConf
    hdfs getconf <COMMAND_OPTION> 用于获取HDFS配置信息

命令选项

说明

path

从此路径开始检查

-delete

删除损坏的文件

-files

打印出正在检查的文件

-files -blocks

打印块报告

-files -blocks -locations

打印每个块的位置

-files -blocks -racks

打印出DataNode位置的网络拓扑

-includeSnapshots

如果给定路径指示快照表目录或其下有快照表目录,则包含快照数据

-list -corruptfileblocks

打印出丢失的块和它们所属的文件的列表

-move

将损坏的文件移至 /lost+found

-openforwrite

打印出已打开以供写入的文件

-storagepolicies

打印出块的存储策略摘要

-blockId

打印出该块的信息

参考官网

  1. getmerge
    hadoop fs -getmerge <src> <localhost> [addnl] 接受一个源目录和一个目标作为输入,并且将源目录中所有的文件连接成本地目标文件
    addnl是可选的,用于指定在每个文件结尾添加一个换行符
  2. ls
    hadoop fs -ls <args>
  3. lsr
    hadoop fs -lsr <args>ls命令的递归版本,类似于Unix中ls -R
  4. mkdir
    hadoop fs -mkdir <paths> 接受路径指定的URI作为参数,创建这些目录
    其行为类似于Unix的mkdir -p,它会创建路径中的各级父目录
  5. mv
    hadoop fs -mv URI [URI ...] <dest> 将文件从源路径移动到目标路径
    该命令允许有多个源路径,此时目标路径必须是一个目录
    不允许在不同的文件系统间移动文件
  6. oev
    hdfs oev [OPTIONS] i INPUT_FILE -o OUTPUT_FILE 用于查看edits文件

参数名

说明

必选参数

可选参数

-i, –inputFile <arg>

输入edits文件,如果是xml后缀,表示XML格式,其他表示二进制


-o,–outputFile <arg>

输出文件,如果已存在,则会覆盖原文件


-p,–processor <arg>

指定转换类型:binary (二进制格式),xml (默认,XML格式),stats (打印edits文件的静态统计信息)


-f, –fix -txids

重置输入edits文件中的transaction IDs


-r, –recover

使用recovery模式,跳过eidts中的错误记录


-v, –verbose

打印处理过程的输出


  1. oiv
    hdfs oiv [OPTIONS] -i INPUT_FILE 用于将FsImage文件转换成其他格式文件,如文本文件、XML文件
    参数名 | 说明 | 必选参数 | 可选参数
    :-: | :-: | :-: | :-:
    -i, –inputFile <arg>|输入FsImage文件|√|
    -o, –outputFile <arg>|输出转换后的文件,如果已存在,则会覆盖原文件|√|
    -p, –processor <arg>|将FsImage文件转换成其他格式(LS\XML\FileDistribution),默认为LS||√
    -h, –help|显示帮助信息||√
  2. put
    hadoop fs -put <localsrc> ... <dst> 从本地文件系统中复制单个或多个源路径到目标文件系统,也支持从标准输入中读入输入写入目标文件系统
  3. rm
    hadoop fs -rm URI [URI ...] 删除指定的文件,只删除非空目录和文件
    -r 表示递归删除
  4. setrep
    hadoop fs -setrep [-R] [-w] <numReplicas> <path> 改变一个文件的副本系数
    -R选项用于递归改变目录下所有文件的副本系数
    -w选项指定该请求等待操作执行结束
  5. stat
    hadoop fs -tail [-f] URI 返回执行路径的统计信息

-f选项

说明

%F

文件类型

%b

文件大小

%g

所属组

%o

Block大小

%n

文件名

%r

复制因子数

%u

文件所有者

%Y, %y

修改日期

  1. tail
    hadoop fa -tail [-f] URI 将文件尾部1KB字节内容输出到stdout
    -f表示根据文件描述符进行追踪,当文件改名或被删除,追踪停止
  2. text
    hadoop fs -text <src> 类似于cat,将源文件输出为文本格式
    允许的格式是zip和TextRecordInputStream
  3. touchz
    hadoop fs -touchz URI [URI ...] 创建一个0字节的空文件
  4. truncate
    hadoop fs -truncate [-w] <length> <paths> 文件截断
    -w表示要求该命令等待回复完成
  5. usage
    hadoop fs -usage command 返回命令的帮助信息
  6. find
    hadoop fs - find <path > .. <expression> 查找满足表达式的文件和文件夹
    没有配置path,默认是全部目录/ 没有配置表达式,默认为-print

expression选项

说明

-name pattern

不区分大小写,对大小写不敏感

-iname pattern

对大小写敏感

-print

打印

-print0

打印在一行

  1. getfacl
    hadoop fs -getfacl [-R] <path> 获取文件的ACL权限
    -R指定递归查找
  2. HDFS快照
  • HDFS快照是一个只读的基于时间点文件系统拷贝,快照可以是整个文件系统的,也可以是其中的一部分,常用来作为数据备份和容灾,防止用户错误
  • 在DataNode上面的Blocks不会被复制,做Snapshot 的文件纪录了Block的列表和文件的大小,但是没有数据的复制
  • Snapshot 并不会影响HDFS 的正常操作,即修改会按照时间的反序记录,这样可以直接读取到最新的数据,快照数据是根据当前数据减去修改的部分计算出来
  • 快照会存储在snapshottable目录下,snapshottable存储的快照最多为65535个
  • snapshottable的目录数量没有限制,管理员可以将任何目录设置为snapshottable
  • 如果snapshottable里面已存放快照,那么该文件夹不能删除或者改名

命令

说明

hdfs dfsadmin -allowSnapshot <path>

建立快照目录

如果该操作成功,那么目录会变成snapshottable

hdfs dfsadmin -disallowSnapshot <path>

文件夹里面所有快照在快照失效前必须被删除,如果没有该目录,则会建立

hdfs dfsadmin -createSnapshot <path> [<snapshotName>]

snapshottable目录创建一个快照

该命令需要snapshottable目录的权限

hdfs dfsadmin -deleteSnapshot <path> <snapshotName>

从一个snapshottable目录删除快照

该命令需要snapshottable目录的权限

hdfs dfsadmin -renameSnapshot <path> <oldName> <newName>

重命名快照

该命令需要snapshottable目录的权限

hdfs lsSnapshottableDir

获取当前用户的所有snapshottable

hdfs snapshotDiff <path> <fromSnapshot> <toSnapshot>

得到两个快照之间的不同

该命令需要两个目录的权限

Java接口

连接Hadoop集群

Eclipse

Eclipse连接Hadoop集群

IntelliJ IDEA

IntelliJ IDEA连接Hadoop集群

Hadoop分布式文件系统Java接口详细版

Hadoop分布式文件系统(HDFS)Java接口(HDFS Java API)详细版

简介

  • Hadoop的FileSystem类是与Hadoop的某一文件系统进行交互的API
  • DistributedFileSystem是HDFS实例
  • 我们应该集成FileSystem抽象类,并编写代码,使其在不同文件系统中可移植,便于测试自己写的程序,例如可以使用本地文件系统中的存储函数快速进行测试

文件系统

Hadoop有一个抽象的文件系统概念,HDFS只是其中的一个实现
Java抽象类org.apache.hadoop.fs.FileSystem定义了Hadoop中一个文件系统的客户端接口,并且该抽象类有几个具体实现,其中和Hadoop紧密相关的见下表

文件系统

URI方案

Java实现(都在org.apache.hadoop包中)

描述

Local

file

fs.LocalFileSystem

使用客户端校验和的本地磁盘文件系统

使用RawLocalFileSystem表示无校验和的本地磁盘文件系统

HDFS

hdfs

hdfs.DistributedFileSystem

Hadoop的分布式文件系统

将HDFS设计成与MapReduce结合使用,可以实现高性能

WebHDFS

Webhdfs

Hdfs.web.WebHdfsFileSystem

基于HTTP的文件系统,提供对HDFS的认证读/写访问

Secure WebHDFS

swebhdfs

hdfs.web.SWebHdfsFileSystem

WebHDFS的HTTPS版本

HAR

har

fs.HarFileSystem

一个构件在其他文件系统之上用于文件存档的文件系统

Hadoop存档文件系统通常用于将HDFS中的多个文件打包成一个存档文件,以减少NameNode内存的使用

使用Hadoop的achive命令来创建HAR文件

View

viewfs

viewfs.ViewFileSystem

针对其他Hadoop文件系统的客户端挂载表

通常用于为联邦NameNode创建挂载点

FTP

ftp

fs.ftp.FTPFileSystem

由FTP服务器支持的文件系统

S3

S3a

fs.s3a.S3AFileSystem

由Amazon S3支持的文件系统,代替老版本的s3n(S3 原生)实现

Azure

wasb

fs.azure.NativeAzureFileSystem

由Microsoft Azure支持的文件系统

Swift

swift

fs.swift.snative.SwiftNativeFileSystem

由OpenStack Swift支持的文件系统

Hadoop对文件系统提供了许多接口,它一般使用URI方案来选取合适的文件系统实例进行交互
命令hadoop fs -ls file:可以列出本地文件系统根目录下的文件

接口

Hadoop是用Java写的,通过Java API可以调用大部分Hadoop文件系统的交互操作,比如文件系统的命令解释器就是一个Java命令,它是用Java的FileSystem类来提供文件系统操作
下面是一些文件系统接口介绍,这些接口通常与HDFS一同使用,因为Hadoop中的其它文件系统一般有访问基本文件系统的工具,但它们大多数都能用于任何Hadoop文件系统

  1. HTTP
  • 由WebHDFS协议提供的HTTPP REST API使得其他语言开发的应用能够很方便地与HDFS交互
  • HTTP接口比原生的Java客户端要慢,尽量不要使用它来传输特大数据
  • 通过HTTP访问HDFS有两种方法,两者都使用了WebHDFS协议
  • 直接访问
    HDFS守护进程直接服务于来自客户端的HTTP请求
  • 通过代理(一个或多个)访问
    客户端通常使用DistributedFileSystem API访问HDFS
  1. C语言
  • Hadoop提供一个名为libhdfs的C语言库,该语言库是Java FileSystem接口类的一个镜像(它被写成访问HDFS的C语言库,但其实它可以访问任何一个Hadoop文件系统)
  • 使用Java原生接口(JNI)调用Java文件系统客户端
  • 还有一个libwebhdfs库,该库使用了WebHDFS接口
  • 其开发滞后于Java API,一些新特性不支持
  1. NFS
  • 使用Hadoop的NFSv3网关将HDFS挂载为本地客户端的文件系统是可行的
  • 可以使用Unix实用程序(如ls和cat)与该文件系统交互,上传文件,通过任意一种编程语言调用POSIX库来访问文件系统
  • 关于如何配置和运行NFS网关,以及如何从客户端连接网关,可以参考Hadoop官网相关文档资料
  1. FUSE
  • 用户空间文件系统(Filesystem in Userspace)允许将用户空间实现的文件系统作为Unix文件系统进行集成
  • 通过使用Hadoop的Fuse-DFS功能模块,HDFS(或任何一个Hadoop)文件系统均可以作为一个标准的本地文件系统进行挂载
  • Fuse-DFSS是用C语言实现的,使用libhdfs作为访问HDFS的接口
  • 在写操作时,Hadoop NFS网关对于挂载HDFS来说是更健壮的解决方案,相比Fuse-DFS而言应优先选择