天天看点

[DB] HDFS

体系架构

NameNode

HDFS主节点、管理员

接收客户端(命令行、Java程序)的请求:创建目录、上传、下载、删除数据

管理和维护HDFS的日志和元信息

日志文件(edits文件)

二进制文件,记录客户端所有操作,同时体现HDFS的最新状态

$HADOOP_HOME/tmp/dfs/name/current

日志查看器(edits viewer):把edits转成文本(XML)格式

hdfs oev -i edits_inprogress_0000000000000000107 -o ~/a.xml

元信息(fsimage文件)

记录数据块的位置信息、数据块的冗余信息,不体现HDFS的最新状态

image viewer,把fsimage文件转为文本或者xml

DataNode

数据节点

按数据块保存数据库(1.x:64M,2.x:128M)

/root/training/hadoop-2.7.3/tmp/dfs/data/current/BP-419062579-192.168.157.111-1535553141546/current/finalized/subdir0/subdir0

数据块冗余度设置原则:一般跟数据节点的个数一样,但是最大不要超过3

Hadoop 3.x以后,HDFS纠删码技术,大大的节约存储的空间(节约一半 )

SecondaryNameNode

第二名称节点

进行日志信息的合并

由于edits文件记录了最新的状态信息,并且随着操作越来越多,edits就会越大

把edits中的最新信息写到fsimage中

edits文件就可以清空

通常和NameNode部署在一台机器上,提高下载速度

什么时候合并?HDFS发出检查点时(checkpoint)

HDFS每隔60分钟产生一个检查点(fs.check.period)

edits文件达到64M(fs.check.size)

[DB] HDFS

数据传输

数据上传

请求上传数据 Distributed FileSystem.java

创建 DFSClient.java

建立RPC通信

拿到NameNode代理对象NameNodeProxies(HA)

请求创建文件元信息

创建文件元信息

将元信息返回给 Distributed FileSystem

创建输出流 FSDataOutputStream

上传数据到DataNode

根据元信息,水平复制

数据下载

请求

创建

请求得到元信息

查找元信息(先查缓存,再查fsimage)

返回元信息

创建输入流

下载数据块

把下载的数据块合成一个文件

[DB] HDFS
[DB] HDFS

高级特性

安全模式

只读,正常运行时off

HDFS的自我保护机制,检查数据块副本率

如果冗余度小于设定的副本率(DataNode坏掉),就水平复制

在hdfs-default.xml中设定副本率

快照

全部文件系统或某目录在某时刻的镜像,默认关闭

启用目录的快照功能

创建快照 -createSnapshot 目录 快照名称

用于以下场景

防止用户误操作/备份/测试/灾难恢复

一般不建议使用,因为本来就有冗余,再生成新的冗余,太浪费空间

配额

HDFS为每个目录分配的大小空间

名称配额

设置该目录中最多存放的文件(目录)个数

空间配额

设置该目录中最大能够存放的文件大小

回收站

默认禁用

放入/trash

回收站中文件可快速恢复

可设置一个时间,超过后文件自动删除

用户权限管理

功能较弱

建议使用 Hadoop Kerberos

启动过程

网页->Startup Progress

Loading fsimage

Loading edits

Saving checkpoint

Safe mode

底层原理

RPC(remote procedure call)

远程过程调用(协议)

在客户端调用服务器端的程序

一个框架,调用者和被调用者运行在其中完成通信

调用远程代码,需要实现调用者和被调用者间的连接与通信

基于Client/Server进程间相互通信的一种同步通信形式

Client是请求服务的调用者,Server是执行Client的请求而被调用的程序

Hadoop用Java实现RPC

客户端

服务器端

MyRPCClient.java

[DB] HDFS
[DB] HDFS

View Code

MyInterface.java

[DB] HDFS
[DB] HDFS

MyInterfaceImpl.java

[DB] HDFS
[DB] HDFS

MyRPCServer.java

[DB] HDFS
[DB] HDFS
[DB] HDFS
[DB] HDFS
[DB] HDFS
[DB] HDFS

 Java动态代理对象

如果一个类的名字有$,表示这是一个代理对象

是一种包装设计模式

可以增强类的功能

应用:数据库连接池

newProxyInstance 参数

ClassLoader 类加载器

Class<?>[ ] 真正对象实现的接口

InvocationHandler 实现接口来处理客户端调用

MyBusiness.java

[DB] HDFS
[DB] HDFS

MyBusinessImpl.java

[DB] HDFS
[DB] HDFS

TestMain.java

[DB] HDFS
[DB] HDFS
[DB] HDFS

命令

hdfs dfs

-ls /:查看所有目录下的文件

-ls /data:查看/data下的所有文件

-mkdir /data:在hdfs上创建目录/data

-cp:拷贝文件

-rm:删除文件

-get:复制文件到本地