HDFS基础理论以及Java API访问示例
近年来机器学习开始在各行各业的发展中扮演重要角色,而机器学习效果的提升离不开大规模的训练数据,从而对计算能力和存储容量都提出了新的要求。大数据时代必须解决海量数据的高效存储问题,hadoop分布式文件系统(Hadoop Distributed File System,HDFS)是谷歌文件系统(Google File System,GFS)的开源实现,也是hadoop的两大核心组成部分之一,提供了在廉价服务器集群中进行大规模分布式文件存储的能力。
一.基本概念
1.分布式文件系统
分布式文件系统是一种通过网络实现文件在多台主机上进行分布式存储的文件系统。
- 分布式文件系统的设计一般采用C/S(Client/Server)客户/服务器模式。
- 计算机集群中的计算机节点一般放置在机架(rack)上,每个机架可以存放8-64个节点,同一机架上的不同节点之间通过网络互连;不同机架之间采用交换机(switch)或另一级网络。
2.HDFS中的数据块
- 普通文件系统中的磁盘块:磁盘进行数据读写的最小单位,通常512B
- HDFS中的块(Block),默认为64MB,为了最小化寻址开销
- HDFS中块的大小会远大于普通文件系统中磁盘块的大小,原因是:
(1) 处理的数据规模大,块越大,存储的块数越少
(2) HDFS的寻址开销:- 磁盘寻道开销
- 数据块的定位开销
3.客户端对HDFS的操作
- [读] 客户端要访问一个文件时,客户端从名称节点获得数据节点和文件块的映射关系,然后到相应位置去访问文件块。
- [写] 当存储文件时,由名称节点来分配存储位置,然后由客户端将数据直接写入对应的数据节点。
- [其他操作] 数据节点也需要根据名称节点的命令来创建、删除数据块,并实现数据的冗余复制。
4.名称节点和数据节点
分布式文件系统在物理结构上由计算机集群中的多个节点构成,分为两类:
-
主节点(Master)/名称节点(NameNode)
作用:
(1)管理文件系统的命名空间(文件块和数据节点的映射关系,包括目录、文件和块),维护着文件系统的目录树和目录树内所有的文件和目录(负责文件和目录的创建、删除、重命名);
(2)响应客户端对文件的访问;
这些信息以两个文件形式永久地保存在本地磁盘上:
① 命名空间镜像文件(也称文件系统映像,File System Image,FSImage)即HDFS元数据的完整快照,每次NameNode启动的时候,就会默认加载最新的命名空间映像
② 编辑日志文件(Edit Log)
ps:HDFS集群中只有一个命名空间,并且只有唯一一个名称节点,该节点负责对这个命名空间进行管理。 -
从节点(Slave)/数据节点(DataNode)
根据需要存储并检索数据块(受客户端或namenode调度,处理客户端的读写请求),并定期向namenode发送它们所存储的块的列表,以及其’心跳’信息(heartbeat)。
ps:所有的HDFS通信协议都是构建在TCP/IP协议基础之上的- 客户端通过一个可配置的端口向名称节点主动发起TCP连接,并使用客户端协议与名称节点进行交互;
- 名称节点和数据节点之间通过数据节点协议进行交互;
- 客户端和数据节点之间通过RPC(Remote Procedure Call远程过程调用)进行交互。
-
HDFS集群在不同机架间的数据交换
一个HDFS集群通常包含多个机架,不同机架之间的数据交换需要经过交换机或路由器,同一个机架上的不同机器之间的通信则不需要经过路由器或交换机,这意味着更大的通信贷带宽。
二.如何访问HDFS
1.命令行接口
(1)访问
- 访问本地文件系统
在命令行输入
该条语句可以访问本地文件系统目录,如下:hadoop dfs -ls file:///
- 访问HDFS文件系统
在命令行中输入:
或者输入hadoop dfs -ls hdfs:///
即可查看HDFS的根目录hdfs dfs -ls /
(2)目录操作
- 创建用户目录
第一次使用HDFS时,首先创建用户目录
[命令解析]$cd /usr/local/hadoop $hdfs dfs -mkdir -p /user/hadoop
-p表示若是多级目录,父目录和子目录一起创建
hadoop dfs -mkdir//在HDFS上创建路径为 的目录 - 显示与当前用户对应的HDFS上的用户目录
. 表示HDFS中的当前用户目录,即/user/hadoop目录$hdfs dfs -ls .
(3)文件操作
-
从本地文件系统向HDFS中上传文件 -put
如图所示,本地文件系统/home/Documents路径下存在一个文本文件mytext.txt,其内容如下:
在HDFS中已创建/user/hadoop/input路径,用于接收从本地上传的文件,在终端中输入:$hdfs dfs -put /home/hadoop/Documents/mytext.txt input
输入
hdfs dfs -ls input
可以列出HDFS上input文件夹中上传的文件
我们再输入hdfs dfs -cat input input/mytext.txt
即可查看文件具体内容
-
从HDFS下载文件到本地文件系统
$hdfs dfs -get input/mytext.txt /home/hadoop/Downloads
hdfs dfs -get [hdfs中文件路径] [本地系统路径]
-
在HDFS中移动文件
$hdfs dfs -mv
如在HDFS的根目录下创建目录/input$hdfs dfs -mv input/mytext.txt /input
要把HDFS的“/user/hadoop/input/mytext.txt”文件,剪切到HDFS的另外一个目录“/input”中(注意,这个input目录位于HDFS根目录下),-mv后文件在源路径中不存在
2.Java API
本系统的Eclipse中的工作空间为:/home/hadoop/workspace
创建好项目之后,注意,需要为项目添加需要用到的JAR包,方法如下:
选择该项目,右键–>Build Path–>Configure Build Path, 横向菜单中选择 Libraries–>Add External JARs…
为了编写一个能够与HDFS交互的Java应用程序,一般需要向Java工程中添加以下JAR包:
- ”/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-2.7.1.jar和haoop-nfs-2.7.1.jar;
- /usr/local/hadoop/share/hadoop/common/lib”目录下的所有JAR包;
- “/usr/local/hadoop/share/hadoop/hdfs”目录下的haoop-hdfs-2.7.1.jar和haoop-hdfs-nfs-2.7.1.jar;
- “/usr/local/hadoop/share/hadoop/hdfs/lib”目录下的所有JAR包。
运行该程序之前记得启动hadoop
start-all.sh
3.Web_UI
- hadoop 2.x.x 版本 Master节点在浏览器中输入localhost:50070即可看到整个集群的状态
- 【注意!】hadoop 3.x.x 版本端口号改为9870
即在浏览器中输入localhost:9870或Master:9870(若主机名已修改)