hadoop之hdfs

303 阅读5分钟

一、zookeeper

是一个开源的分布式协调服务框架,主要用来解决分布式集群中应用系统的一致性问题和数据管理问题。

本质上是一个分布式文件系统,适合存放小文件

f70afecbc220e6fb1ae92bdcf57405b.png

znode

1、可存储数据(文件特性),但数据大小有限制,至多1M;
2、可有子节点(文件夹特性);
3、由3部分组成(stat描述znode的版本、权限等状态信息;data、children子节点)

zk集群架构

是一个基于主从架构的高可用集群

4731fdf8367f58c2186c6045b52add7.png

leader: 是集群的核心,管理调度、投票选举、处理事务性(写)请求、参与投票
follower:接收客户端请求、处理非事务性(读)请求、转发事务性请求给leader、参与集群投票

zk的应用

1、数据发布/订阅(推拉模式);
2、命名服务(可以实现分布式全局唯一ID的分配机制);
3、分布式协调/通知(心跳检测、工作进度汇报、系统调度、分布式锁、分布式队列)

zk的watch机制

1、发布和订阅;
2、监控主机存活状态。

二、hadoop概述

是一个分布式集群框架,包括分布式文件系统(Hdfs)、分布式计算系统(MapReduce)、分布式集群资源管理(Yarn)。

google最早发表了两篇论文:
一篇是GFS,分布式文件系统,用于处理海量网页数据的存储;
另一篇是MapReduce,分布式计算框架,用于处理海量网页的索引计算。

hadoop 2.x的架构

三、hdfs概述

hdfs是一个分布式文件系统,用于存储文件。

四、hdfs的架构

b2507f037792fee4ece2bd058cc1898.png

由四部分组成:

1、Hdfs Client(就是一个客户端)

1、文件切分,将文件切为一个一个的Block,然后再上传到hdfs;
2、与NameNode交互,获取文件的位置信息;
3、与DateNode交互,读/写数据;
4、用命令管理/访问Hdfs。

2、NameNode(用于管理集群中的各种数据)

1、管理hdfs的名称空间;
2、管理Block的映射信息;
3、处理副本策略;
4、处理客户端的读写请求。

3、DataNode(用于存储各种数据)

1、存储实际的数据块;
2、执行数据的读/写。

4、SencondaryNode(用于hadoop中元数据信息的辅助管理 )

1、辅助NameNode,定期合并fsimage(元数据镜像文件)和edits(最近的元数据操作日志)并用新的fsimage替换

NameNode:
1、NameNode的元数据在内存中,重启会丢失,它的持久化由两个文件保证,镜像文件fsimage和日志文件edits;
2、数据流不经过NameNode,只决定客户端去哪个DataNode上读写;
3、心跳机制,DataNode定期向NameNode发送心跳,如果DataNode宕机,NameNode会向其它机器上复制副本数据。
DataNode:
1、以数据块的形式存储hdfs文件;
2、响应Hdfs客户端的请求; 1、周期性的向NameNode汇报心跳;
2、周期性的向NameNode汇报Block信息;
3、周期性的向NameNode汇报缓存数据块信息(访问频率高的数据块放到内存)。

五、hdfs的应用场景

适合的场景:

1、存储非常大的文件、高吞吐量、低延时;
2、采用流式的数据访问方式,即一次写入、多次读取;
3、不需要特别贵的机器,节约成本;
4、高容错性(副本机制);
5、提供扩展能力。

不适合的场景:

1、低延时的数据访问(比如毫秒级别,是做不到的);
2、大量小文件(因为文件的元数据在NameNode的内存中,大量文件会占用过多内存);
3、多方读写(hdfs采用追加方式写入数据,不支持文件offset的修改,不支持多个写入器)。

六、hdfs的文件副本机制和机架感知

所有文件都是以block块的方式存放在hdfs文件系统中,在haddp2中block的大小默认128M,可以在配置文件中指定。

hdfs分布式文件系统中由一个副本存放策略

七、hdfs的命令

$hdfs dfs -ls /   #显示文件列表
$hdfs dfs -ls -R /    #递归查看整个目录下的文件列表 
$hdfs dfs -mkdir [-p] <path>   #(递归)创建目录
$hdfs dfs -put <localsrc>... <dst>   #将单个或多个源文件从本地拷贝到hdfs中
$hdfs dfs -moveFromLoal <localsrc> <dst> #和put类似,但源文件localsrc拷贝之后被删除
$hdfs dfs -get <src> <localdst> #将hdfs上的文件拷贝到本地文件系统
$hdfs dfs -mv <src> <dst> #将hdfs上的文件从源路径移动到目标路径,不能夸文件系统
$hdfs dfs -rm -r dir #删除指定文件或非空目录
$hdfs dfs -cp [-f] [-p] <src> <dst> #将文件拷贝到目标路径
$hdfs dfs cat uri #查看文件内容
$hdfs dfs -chmod [-R] uri #修改文件权限
$hdfs dfs -chown [-R] hadoop:hadoop dir #修改文件的所属用户和用户组
$hdfs dfs -appendToFile <localsrc>... <dst> #合并本地文件到hdfs的dst

八、hdfs的高级命令

文件限额配置:

针对的是目录,不是某个用户
$hdfs dfs -count -q -h dir 查看配额限制
7dedc00fccb93b17fec144c6b7414ab.png

1、数量限额

$hdfs dfsadmin -setQuota 2 dir 给该目录下面设置最多上传两个文件,实际只能上传一个,目录本身也算一个
$hdfs dfsadmin -clrQuota dir 清除文件数量限制限制

2、空间大小限额

$hdfs dfsadmin -setQuota 384M dir (384M=3*128M 3是副本数,128M是block的大小)
$dd if=/dev/zero of=1.txt bs=129M count=1 生成129M的文件

安全模式:

是hadoop的一种保护机制,用于保护集群中数据块的安全性。在启动时集群处于安全模式,检查副本率(副本率=实际副本数/设置的副本数),应该大于等于默认副本率(0.999f)
$hdfs dfsadmin -safemode get
$hdfs dfsadmin -safemode enter
$hdfs dfsadmin -safemode leave

基准测试:

$hadoop jar xxx.jar TestDFSIO -write -nrFiles 10 -filesize 10MB 测试写入速度
$hadoop jar xxx.jar TestDFSIO -read -nrFiles 10 -filesize 10MB 测试读取速度
$hadoop jar xxx.jar TestDFSIO -clean 清除测试数据

九、hdfs文件写入过程

ce2b6ec25b2768bc4aebe44469bf7c2.png

十、hdfs文件读取过程

17504806af4b08f9895ca59152f1b40.png

十一、hdfs的元数据辅助管理(fsimage、edits、secondaryNameNode)

27e9bf0dcfbdf38b91fac5d984898ee.png

文件位置:
hadoop-2.x/hadoopDatas/namenodeDatas/current/fsimage_xxx
hadoop-2.x/hadoopDatas/nn/edits/current/edits_xxx
用命令查看fsimage文件的内容
$hdfs oiv -i fsimage_xxx -p -xml -o my_fsimage.xml 用命令查看edits文件的内容
$hdfs oiv -i edits_xxx -p -xml -o my_edit.xml

十二、hdfs高可用机制

ca73575575bacdca509c72c5cd3be5a.png

十三、hdfs的联邦机制

解决namenode内存不够用的问题(横向扩展)