HADOOP
hadoop的概念
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
它主要有以下几个优点:
- 高可靠性:Hadoop按位存储和处理数据的能力值得人们信赖。
- 高扩展性:Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。
- 高效性:Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
- 高容错性:Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。
- 低成本:与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低。
hadoop的三大核心四大模块:
hdfs:分布式文件系统
yarn:分布式资源调度系统
mapreduce:分布式运算框架
common:支持其他Hadoop模块的通用实用程序。
HDFS:
HDFS具有主从架构。HDFS集群由单个NameNode组成,这是一个主服务器,用于管理文件系统命名空间并调节客户端对文件的访问。此外,还有许多DataNodes,通常是集群中的每个节点,它们管理连接到运行它们的节点的存储。HDFS公开文件系统命名空间,并允许将用户数据存储在文件中。在内部,一个文件被分割成一个或多个块,这些块存储在一组DataNodes中。NameNode执行文件系统命名空间操作,比如打开、关闭和重命名文件和目录。它还确定块到DataNodes的映射。DataNodes负责服务来自文件系统客户端的读写请求。DataNodes还对NameNode的指令执行块创建、删除和复制。
HDFS的设计思想:
1)大文件拆成块,分在多台机器上存储(解决处理数据时的IO瓶颈)
2)块均匀分布(解决负载均衡问题)
HDFS优点
(1)高容错性:数据自动保存多个副本,副本丢失后,会自动恢复。
(2)适合批处理:移动计算而非数据、数据位置暴露给计算框架。
(3)适合大数据处理:GB、TB、甚至PB级数据、百万规模以上的文件数量,1000以上节点规模。
(4)流式文件访问:一次性写入,多次读取;保证数据一致性。
(5)可构建在廉价机器上:通过多副本提高可靠性,提供了容错和恢复机制。
HDFS缺点
(1)低延迟数据访问:比如毫秒级、低延迟与高吞吐率。
(2)小文件存取:占用NameNode大量内存,寻道时间超过读取时间。
(3)并发写入、文件随机修改:一个文件只能有一个写者,仅支持append
HDFS的可靠性策略:
1)文件完整性
在文件建立时,每个数据块都产生校验和,校验和会保存在.meta文件内;
客户端获取数据时可以检查校验和是否相同,从而发现数据块是否损坏;如果正在读取的数据块损坏,则可以继续读取其它副本。NameNode标记该块已经损坏,然后复制block达到预期设置的文件备份数;DataNode 在其文件创建后三周验证其checksum.
2)网络或者机器失效
1)副本冗余
2)机架感知策略(副本放置策略)
3)心跳机制策略
3)namenode挂掉
(1)主备切换(高可用)
(2)镜像文件和操作日志磁盘存储
(3)镜像文件和操作日志可以存储多份,多磁盘存储
4)其他机制
(1)快照(和虚拟机快照意义相同,保存了系统某一时刻的影像,可以还原到该时刻)
(2)回收站机制
(3)安全模式
HDFS的优缺点
HDFS优点:
(1)高容错性:数据自动保存多个副本,副本丢失后,会自动恢复。
(2)适合批处理:移动计算而非数据、数据位置暴露给计算框架。
(3)适合大数据处理:GB、TB、甚至PB级数据、百万规模以上的文件数量,1000以上节点规模。
(4)流式文件访问:一次性写入,多次读取;保证数据一致性。
(5)可构建在廉价机器上:通过多副本提高可靠性,提供了容错和恢复机制。
HDFS缺点:
(1)低延迟数据访问:比如毫秒级、低延迟与高吞吐率。
(2)小文件存取:占用NameNode大量内存,寻道时间超过读取时间。
(3)并发写入、文件随机修改:一个文件只能有一个写者,仅支持append
**HDFS不适合存储小文件,如果生成场景中还必须将这些小文件进行存储(比如,每天产生的日志,数据量很小,但是必须存储)
HDFS天生就是为存储大文件而生的,一个块的元数据大小大概在150byte左右,存储一个小文件就要占用150byte的内存,如果存储大量的小文件,很快就将内存耗尽,而整个集群存储的数据量很小,失去了HDFS的意义****可以将数据合并上传,或者将文件append形式追加在HDFS文件末尾。
集群的搭建
hdfs shell
HDFS读写流程
(1)写数据流程
1).客户端发出请求 hdfs dfs -put /etc/profile /qf/data
2).namenode查看维护的目录结构,检查/qf/data是否存在,如不存在直接报错”no such file or directory“
如存在返回给客户端同意上传文件请求,将操作写入日志文件
3).客户端请求上传第一个块,询问namenode块的存储位置
4).namenode查看自己的datanode池,返回给客户端一个datanode列表
5).客户端发出请求建立pipeline
6).客户端先把文件写入缓存,达到一个块的大小时,会在客户端和第一个datanode建立连接开始流式的传输数据,这个datanode会一小部分一小部分(4K)的接收数据然后写入本地仓库,同时会把这些数据传输到第二个datanode,第二个datanode也同样一小部分一小部分的接收数据并写入本地仓库,同时传输给第三个datanode(在流式复制时,逐级传输和响应采用响应队列来等待传输结果。队列响应完成后返回给客户端)
7).第一个数据块传输完成后会使用同样的方式传输下面的数据块直到整个文件上传完成。
8).整个文件完成,namenode更新内存元数据
(2)读数据流程
1)客户端向namenode发起RPC调用,请求读取文件数据。
2)namenode检查文件是否存在,如果存在则获取文件的元信息(blockid以及对应的datanode列表)。
3)客户端收到元信息后选取一个网络距离最近的datanode,依次请求读取每个数据块。客户端首先要校检文件是否损坏,如果损坏,客户端会选取另外的datanode请求。
4)datanode与客户端建立socket连接,传输对应的数据块,客户端收到数据缓存到本地,之后写入文件。
5)依次传输剩下的数据块,直到整个文件合并完成。
拓展:hdfs的模拟实现 —
namenode的工作机制 – namenode的职责 --namenode的启动流程
namenode的工作机制:
- 第一次启动namenode格式化后,创建fsimage和edits文件,如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
- 客户端对元数据镜像增删改的请求
- namenode记录操作日志,更新滚动日志
- namenode在内存中对数据镜像增删改查