hadoop浅谈
什么是hadoop
百度百科:
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。
思想之源(Google三篇论文):
Hadoop的思想之源:Google
Google是最早面临海量数据处理的问题,从而有了Google低成本之道: 大量使用普通的pc服务器,提供有冗余的集群服务,因此Google面对的数据存储和计算难题有了三大论文,也是大数据的三驾马车
- 《分布式文件系统》:GFS (google file system)
- 《分布式计算模型》:MapReduce
- 《BigTable》:BigTable
hadoop的优点
Hadoop是一个能够对大量数据进行分布式处理的软件框架。 Hadoop 以一种可靠、高效、可伸缩的方式进行数据处理。此外,Hadoop 依赖于社区服务,因此它的成本比较低,任何人都可以使用。
- 高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖。
- 高扩展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。
- 高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
- 高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。
- 低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低 。
Hadoop带有用Java语言编写的框架,因此运行在 Linux 生产平台上是非常理想的。Hadoop 上的应用程序也可以使用其他语言编写,比如 C++。
Hadoop的体系架构
Hadoop的体系架构主要分为
- HDFS
- Mapreduce
- YARN
HDFS
-
NameNode: 用于保存元数据信息(Namenode将元数据保存在内存中)
- 处理客户端的请求
- 元数据(Filename、副本数,各个副本所在的节点的位置)
-
DataNode:
- 用于具体保存数据的(副本数默认为3,可设置)
-
SecondaryNameNode:
- 用于同步元数据信息
-
Client:
- 发起请求
HDFS读写流程简述
HDFS写入请求:
- client(客户端)向NameNode发出写数据请求。
- 请求成功后,写入一条记录,返回DataNode列表。
- client按128MB(默认)切分文件,将block写入对应的DataNode。(注意这里,还有一些具体的细节。比如将一个block写入一个最近的Datanode,该DataNode,再将block写给下一个存储该block副本的Datanode,同时在写入的时候是以packet的形式,建立管线写入到DataNode中)
- 写入完成后,client向NameNode发送完成信号。
HDFS读取流程:
- client向NameNode发起读取请求,
- NameNode查询元数据信息,
- 获得这个文件的数据块位置列表,并返回。
- client就近选取datanode服务器,读取数据。
namenode从datanode接受心跳和块报告
namenode启动后,datanode向namenode进行注册
- 心跳机制
- 心跳是每3秒一次心跳返回结果带有NameNode给该DataNode的命令如删除块,复制块等。如果超过10分钟没有收到某个DataNode 的心跳,则认为该节点不可用
- 块报告
- DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息
- 块损坏
- 当DataNode读取block的时候,重新计算checksum,和创建时的对比。DataNode 在其文件创建后三周验证其checksum
HDFS常见问题:
问题1:怎么保证HDFS数据的安全性(数据的0丢失)。
- hdfs以冗余保证数据的安全,每个块有多个副本。
- datanode周期性向namenode进行块报告,并且在读取元数据时,进行校验和。
- 心跳机制。
- hdfs的高可用。
问题2:namenode启动流程
- namenode启动后会加载元数据(加载fsimage和edits文件,合并生成新的fsimage,并生成edits文件,DataNode注册与发送心跳和Block Report,NameNode 启动过程中会进入SafeMode(安全模式)),并等待datanode注册,同时进入安全模式,安全模式下hdfs只读不写(安全模式是一个只读不写的操作)
- datanode注册后,向namenode发送心跳和块报告
YARN
- ResourceManager:
- 负责全局任务的调度和资源管理
- (Container:硬件资源(CPU,内存,硬盘))
- 处理客户端请求,
- 启动/监控applicationMaster
- 监控NodeManager
- 负责全局任务的调度和资源管理
- Nodemanager:
- 单个节点上的资源管理
- 处理来自ResourceManager的命令
- 处理来自ApplicationMater的命令
- 单个节点上的资源管理
- ApplicationMaster
- 为应用程序申请资源,并分配制内部任务
- 任务监控与容错
- 为应用程序申请资源,并分配制内部任务
- Container
- 对环境的抽象,其封装了CPU,内存等多维资源
向Yarn提交任务流程简述
- Client向ResourceManager发出请求,提交程序。
- ResourceManager 发送命令给一个NodeManager节点,以启动App master。
- App master启动后,向ResourceManager申请资源。
- App master向资源所在的Nodemanager发送命令,启动task任务,App master监控这些任务的情况。
- 当这些task执行结束,向app master进行反馈。
- 所有任务结束之后,app master向Resource Manager反馈; 回收本次任务的资源。
Mapreduce
分两个阶段:Map和Reduce 计算框架,编程模型 “分而治之”的思想, 分布式并行计算
map阶段:
- 读取HDFS中的文件。每一行解析成一个<k,v>。每一个键值对调用一次map函数。
- 覆盖map(),接收1.1产生的<k,v>,进行处理,转换为新的<k,v>输出。
- 对1.2输出的<k,v>进行分区。默认分为一个区。
- 对不同分区中的数据进行排序(按照k)、分组。分组指的是相同key的value放到一个集合中。
Reduce阶段:
- 多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点上。
- 对多个map的输出进行合并、排序。覆盖reduce函数,接收的是分组后的数据,实现自己的业务逻辑,处理后,产生新的<k,v>输出。
- 对reduce输出的<k,v>写到HDFS中。
Hadoop的安装运行模式:
- 单机(本地)运行模式
- 无需运行任何守护进程,所有程序都在单个JVM上执行,测试用
- 伪分布式
- 将所有的守护进程运行在一个节点 ,学习、联系用
- 分布式
共同学习,共同进步!