配色: 字号:
大数据技术原理与应用
2021-04-27 | 阅:  转:  |  分享 
  
HadoopYARN运行流程HBASE需求 Google的结构化数据存储需求?–?低成本可扩展地处理以亿为单位的数据表
(海量)?–?众多的列,但并非每列都有数据,且经常只访问很少的列(稀疏)?–?高吞吐量和高并发(快速)?
HBase的原型?-Google?Bigtable?传统RDBMS并行Cache高访问量复杂,难以解
决MapReduce?Map/ReduceMapReduce程序能满足高并发要求吗?全文件扫描效率行吗?答案因为R
DBMS和MapReduce不能满足要求海量结构化数据存储需求众多的列,但并非每列都有数据,且经常只访问很少的列(稀疏)?
低成本可扩展地处理以十亿为单位的数据表(海量)?高吞吐量和高并发(快速)?方案:?Bigtable?H
Base?HBase是什么Hbase是一种面向列的(稀疏),基于HDFS的(海量),高性能(快速)分布式数据库系统利用
HadoopHDFS作为其文件存储系统,提供高可靠性、高性能、列存储、可伸缩、实时读写的数据库系统。利用HadoopMapR
educe来处理HBase中的海量数据利用Zookeeper作为协同服务。Hbase特点水平扩展面向列范围查询可靠
性高性能随机读/写和Hadoop无缝集成HbasevsRDBMSHBaseRDBMS数据类型只有字符串丰富的
数据类型数据操作简单的增删改查各种各样的函数,表连接存储模式基于列存储基于表格结构和行存储数据保护更新后旧版本仍然
会保留替换可伸缩性轻易的进行增加节点,兼容性高需要中间层,牺牲功能水平扩展数据量太大了,读写性能下降?传统方案:分库
分表(迁移数据,中间层)HBase:啥都不用做,加机器即可,且性能平稳。HDFSHbase存储结构水平扩展如何做到的?
当storeFile多了后,HBase会自动compact;当rows多了后,HBase会自动将regionsplit;H
Base会定时对RegionServer的Region数进行balance;RegionServer下线,Master会重新
分配其负责的Region到其他的RegionServer;RegionServer上线后,当Master进行balance时
会迁移一些Region到新的RegionServer。面向列动态增删schema?传统方案:停机维护;HBase:
No,ColumnQualifier可动态增删。面向列如何做到的?以ColumnFamily为存储单元;K/V方式存
储。高性能随机读/写如何做到的?随机读K/V存储;Cache;Split;Balance。随机写(相对而言)C
ache+WAL;Compact;Split;Balance;数据可靠性借助HDFS保证数据的可靠;HLog
File;恢复机制。Hadoop其他组件ZookeeperZooKeeper是Apache软件基金会下的一个为大型分布式
计算提供开源的分布式配置服务、同步服务和命名注册的项目。曾是Hadoop项目的一部分,后来独立。项目地址:http://z
ookeeper.apache.org/PigPig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言
叫PigLatin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。Pig为复杂的海量
数据并行计算提供了一个简单的操作和编程接口。Pig极大的简化了Hadoop的使用项目地址:http://pig.apach
e.org/PigPig可以加载数据、表达转换数据以及存储最终结果Pig语句通常按照如下的格式来编写:通过LOAD语句
从文件系统读取数据通过一系列“转换”语句对数据进行处理通过一条STORE语句把处理结果输出到文件系统中,或者使用DUMP语句把
处理结果输出到屏幕上Pig在企业数据分析系统中的作用HiveHive是基于Hadoop的一个数据仓库工具,可以将结构化的数据
文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可
以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。Hi
ve项目地址:http://hive.apache.orgSqoopSqoop是一个用来将Hadoop和关系型数据库中的数据相
互转移的工具,可以将一个关系型数据库(例如:MySQL,Oracle,Postgres等)中的数据导进到Hadoop的HD
FS中,也可以将HDFS的数据导进到关系型数据库中。对于某些NoSQL数据库它也提供了连接器。Sqoop,类似于其他ETL工具
,使用元数据模型来判断数据类型并在数据从数据源转移到Hadoop时确保类型安全的数据处理。Sqoop专为大数据批量传输设计,能够分
割数据集并创建Hadoop任务来处理每个区块。项目地址:http://sqoop.apache.org/ArvoApach
eArvo是一个独立于编程语言的数据序列化系统,该项目是由hadoop之父创建的,旨在解决hadoop中Writable类型的不
足:缺乏语言的可移植性。Arvo可以被多种语言(c,c++,java)处理的数据格式,具有丰富的数据类型和模式,主要包括avr
o模式(定义数据结构)和avro对象容器文件(存储数据)。项目地址:http://avro.apache.org/Googl
e分布式理论的开源实现HDFS采用了集中式meta管理的的架构,对外提供文件接口。每个文件在系统中会按照等长度分为多个块
,被称为chunk,每个chunk可以有多个副本,被称为Replica;文件操作采用Append-only的方式,数据一旦被写入
到系统中,除非被删除,否则不允许再进行修改。在整个集群中可以有一到多个/组Meta管理服务器,在HDFS中称为Namenode,
主要用来管理meta信息,例如文件Meta、ChunkMeta、数据位置、用户、集群中机器状态等信息。集群中的每台机器上会部署
一个用来存储ChunkReplica数据的节点,被称为Datanode;Datanode用来接收数据读写请求,并将数据存储到本地
文件系统当中,每个Chunkreplica被存储到本地文件系统独立的文件。在集群中的每个机器上可以启动若干个用户程序来操作HD
FS上的文件,被称为HDFS系统的client端。读取数据时,client端会先从Namenode上获取文件的meta、Chun
kmeta和数据位置信息,并携带chunkmeta信息到Datanode上读取数据。写入数据时,client端会先在namen
ode上打开文件的同时获取文件meta和写入版本,获取数据位置,然后向datanode写入数据。Datanode会定期向Name
node汇报自己拥有的replica信息,Namenode会根据自己管理的信息对数据进行复制和存储空间回收等操作。在这张架构图中
,还表现了Namenode在选取数据位置的时候,考虑到了机架的分布,将一个chunk的多份replica放置在多个rack下来应对
机架网络或者供电异常。从文件的操作接口来看,Append-only的操作形式极大的简化了设计和实现难度,给数据一致性奠定基础;但
是append-only给很多业务实现提出了挑战,必须进行二次开发才能实现随机读写的能力。在最新的HDFS系统中,增加了Trun
cate的功能,可以将文件?长度缩短后用新数据进行覆盖写入,是对当前写入方式的一点改进。meta集中管理的架构从工程实现上来看,
设计简单高效,但Namenode可能会成为整个分布式文件存储系统的单点和瓶颈,带来了可用性和扩展性问题。为了应对单点问题,HDFS
采用了HA方式来防止单点失效带来的存储服务不可用,利用Namenode的Federation功能来实现扩展性。HDFS采用了
集中式meta管理的的架构,对外提供文件接口。每个文件在系统中会按照等长度分为多个块,被称为chunk,每个chunk可以有多个
副本,被称为Replica;文件操作采用Append-only的方式,数据一旦被写入到系统中,除非被删除,否则不允许再进行修改。
在整个集群中可以有一到多个/组Meta管理服务器,在HDFS中称为Namenode,主要用来管理meta信息,例如文件Meta、
ChunkMeta、数据位置、用户、集群中机器状态等信息。集群中的每台机器上会部署一个用来存储ChunkReplica数据的
节点,被称为Datanode;Datanode用来接收数据读写请求,并将数据存储到本地文件系统当中,每个Chunkreplica
被存储到本地文件系统独立的文件。在集群中的每个机器上可以启动若干个用户程序来操作HDFS上的文件,被称为HDFS系统的clien
t端。读取数据时,client端会先从Namenode上获取文件的meta、Chunkmeta和数据位置信息,并携带chunk
meta信息到Datanode上读取数据。写入数据时,client端会先在namenode上打开文件的同时获取文件meta和写入
版本,获取数据位置,然后向datanode写入数据。Datanode会定期向Namenode汇报自己拥有的replica信息,N
amenode会根据自己管理的信息对数据进行复制和存储空间回收等操作。在这张架构图中,还表现了Namenode在选取数据位置的时
候,考虑到了机架的分布,将一个chunk的多份replica放置在多个rack下来应对机架网络或者供电异常。从文件的操作接口来看
,Append-only的操作形式极大的简化了设计和实现难度,给数据一致性奠定基础;但是append-only给很多业务实现提出了
挑战,必须进行二次开发才能实现随机读写的能力。在最新的HDFS系统中,增加了Truncate的功能,可以将文件?长度缩短后用新数
据进行覆盖写入,是对当前写入方式的一点改进。meta集中管理的架构从工程实现上来看,设计简单高效,但Namenode可能会成为整
个分布式文件存储系统的单点和瓶颈,带来了可用性和扩展性问题。为了应对单点问题,HDFS采用了HA方式来防止单点失效带来的存储服务不
可用,利用Namenode的Federation功能来实现扩展性。HDFSClient向远程的Namenode发起RP
C请求;Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出
异常;当客户端开始写入文件的时候,开发库会将文件切分成多个packets,并在内部以"dataqueue"的形式管理这些pac
kets,并向Namenode申请新的blocks,获取用来存储replicas的合适的datanodes列表,列表的大小根据在N
amenode中对replication的设置而定。开始以pipeline(管道)的形式将packet写入所有的replicas
中。开发库把packet以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给在此pipe
line中的下一个datanode,直到最后一个datanode,这种写数据的方式呈流水线的形式。最后一个datanode成功存
储之后会返回一个ackpacket,在pipeline里传递至客户端,在客户端的开发库内部维护着"ackqueue",成功收到
datanode返回的ackpacket后会从"ackqueue"移除相应的packet。如果传输过程中,有某个datano
de出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除,剩余的block会
继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持replic
as设定的数量。YarnResourceManager调度、启动每一个Job所属的ApplicationMast
er、另外监控ApplicationMasterApplicationMaster负责一个Job生命周期内的所有工作,类
似老的框架中JobTrackerResourceManager处理客户端请求启动/监控ApplicationMaster
监控NodeManager资源分配与调度NodeManager单个节点上的资源管理处理来自ResourceManager的
命令处理来自ApplicationMaster的命令ApplicationMaster数据切分为应用程序申请资源,并分配给
内部任务任务监控与容错3.1、任务提交JobClient.runJob()创建一个新的JobClient实例,调用
其submitJob()函数。向JobTracker请求一个新的jobID检测此job的output配置计算此job的inpu
tsplits将Job运行所需的资源拷贝到JobTracker的文件系统中的文件夹中,包括jobjar文件,job.xml配置文
件,inputsplits通知JobTracker此Job已经可以运行了提交任务后,runJob每隔一秒钟轮询一次job的进度,
将进度返回到命令行,直到任务运行完毕。3.2、任务初始化当JobTracker收到submitJob调用的时候,将此任务放到一
个队列中,job调度器将从队列中获取任务并初始化任务。初始化首先创建一个对象来封装job运行的tasks,status以及pr
ogress。在创建task之前,job调度器首先从共享文件系统中获得JobClient计算出的inputsplits。其为
每个inputsplit创建一个maptask。每个task被分配一个ID。3.3、任务分配TaskTracker周期性
的向JobTracker发送heartbeat。在heartbeat中,TaskTracker告知JobTracker其已经准备
运行一个新的task,JobTracker将分配给其一个task。在JobTracker为TaskTracker选择一个task
之前,JobTracker必须首先按照优先级选择一个Job,在最高优先级的Job中选择一个task。TaskTracker有固定
数量的位置来运行maptask或者reducetask。默认的调度器对待maptask优先于reducetask当选择
reducetask的时候,JobTracker并不在多个task之间进行选择,而是直接取下一个,因为reducetask没有数
据本地化的概念。3.4、任务执行TaskTracker被分配了一个task,下面便要运行此task。首先,TaskTrack
er将此job的jar从共享文件系统中拷贝到TaskTracker的文件系统中。TaskTracker从distributed
cache中将job运行所需要的文件拷贝到本地磁盘。其次,其为每个task创建一个本地的工作目录,将jar解压缩到文件目录中。
其三,其创建一个TaskRunner来运行task。TaskRunner创建一个新的JVM来运行task。被创建的child
JVM和TaskTracker通信来报告运行进度。分布式计算:MapReduce计算框架分布式存储:BigTabl
eSpanner分布式文件系统:GFS分布式一致性:Chubby(基于Paxos)Chap02分布式处理软件
架构Hadoophttp://dblab.xmu.edu.cn/post/bigdata提纲2.1概述2.2Hado
op项目结构2.3Hadoop的安装与使用2.4Hadoop集群的部署与使用2.2Hadoop项目结构H
adoop的项目结构不断丰富发展,已经形成一个丰富的Hadoop生态系统2.2Hadoop项目结构组件功能HDFS分布
式文件系统MapReduce分布式并行编程模型YARN资源管理和调度器Tez运行在YARN之上的下一代Hadoop查询
处理框架HiveHadoop上的数据仓库HBaseHadoop上的非关系型的分布式数据库Pig一个基于Hadoop的大
规模数据分析平台,提供类似SQL的查询语言PigLatinSqoop用于在Hadoop与传统数据库之间进行数据传递Oozi
eHadoop上的工作流管理系统Zookeeper提供分布式协调一致性服务Storm流计算框架Flume一个高可用的
,高可靠的,分布式的海量日志采集、聚合和传输的系统AmbariHadoop快速部署工具,支持ApacheHadoop集群的供
应、管理和监控Kafka一种高吞吐量的分布式发布订阅消息系统,可以处理消费者规模的网站中的所有动作流数据Spark类似于
HadoopMapReduce的通用并行框架HDFS是什么分布式文件系统冗余存储面向大文件存储设计面向批量插入设计基
于商用机器提供可靠的数据存储容忍部分节点故障HDFSRefercece:http://hadoop.apache.org
/docs/r1.0.4/hdfs_design.htmlHDFS系统架构图Metadata(Name,replicas.
.)(/home/foo/data,6...NameNode元数据操作同步元数据和日志SecondaryNameNo
deDFSClient块操作读操作DatanodesDatanodes写操作机架另一个机架DFSClientH
DFS相关术语HDFSGFSMooseFS说明NameNodeMasterMaster整个文件系统的大脑,它提供
整个文件系统的目录信息,各个文件的分块信息,数据块的位置信息,并且管理各个数据服务器。DataNodeChunkServer
ChunkServer分布式文件系统中的每一个文件,都被切分成若务器上,此服务器称之为数据服务器。BlockChunk
Chunk每个文件都会被切分成若干个块(默认64MB)每一块都有连续的一段文件内容是存储的基本单位。Packet无无
客户端写文件的时候,不是一个字节一个字节写入文件系统的,而是累计到一定数量后,往文件个数据包。Chunk无Block(6
4KB)在每一个数据包中,都会将数据切成更小的块(512字节),每一个块配上一个奇偶校验码(CRC),这样的块,
就是传输块。SecondaryNameNode无Metalogger备用的主控服务器,在身后默默的拉取着主控服务器的日志
,等待主控服务器牺牲后被扶正。HDFS核心功能功能说明NamespaceHDFS支持传统的层次型文件组织,与大多数其
他文件系统类似,用户可以创建目录,并在其间创建、删除、移动和重命名文件。Shell命令Hadoop包括一系列的类shell的命
令,可直接和HDFS以及其他Hadoop支持的文件系统进行交互。数据复制每个文件的block大小和replication因子都
是可配置的。Replication因子可以在文件创建的时候配置,以后也可以改变。HDFS中的文件是write-one,并且严格要
求在任何时候只有一个writer。机架感知在大多数情况下,replication因子是3,HDFS的存放策略是将一个副本存放
在本地机架上的节点,一个副本放在同一机架上的另一个节点,最后一个副本影响到数据的可靠性和有效性。放在不同机架上的一个节点。机架的错
误远远比节点的错误少。EditlogFSEditLog类是整个日志体系的核心,提供了一大堆方便的日志写入API,以及日志的恢复
存储等功能。集群均衡如果某个DataNode节点上的空闲空间低于特定的临界点,那么就会启动一个计划自动地将数据从一个DataN
ode搬移到空闲的DataNode。空间的回收删除文件并没有立刻从HDFS中删除,HDFS将这个文件重命名,并转移
到/trash目录,用于恢复,/trash可设置保存时间。读取文件流程1、使用HDFSClient,向远程的Namenode
发起RPC请求;2、Namenode会视情况返回文件的部分或者全部block列表,对于每个block,Namenode都会返回有
该block拷贝的datanode地址;3-4、HDFSClient选取离客户端最接近的datanode来读取block;
5、当读完列表的block后,如果文件读取还没有结束,客户端开发库会继续向Namenode获取下一批的block列表。6、读取完
当前block的数据后,关闭与当前的datanode连接,并为读取下一个block寻找最佳的datanode;注:读取完一个b
lock都会进行checksum验证,如果读取datanode时出现错误,客户端会通知Namenode,然后再从下一个拥有该blo
ck拷贝的datanode继续读。写入文件流程HDFSClient向远程的Namenode发起RPC请求;Namenod
e会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;当客户端开始写入
文件的时候,开发库会将文件切分成多个packets,并在内部以"dataqueue"的形式管理这些packets,并向Namen
ode申请新的blocks,获取用来存储replicas的合适的datanodes列表,列表的大小根据在Namenode中对rep
lication的设置而定。开始以pipeline(管道)的形式将packet写入所有的replicas中。开发库把packet
以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给在此pipeline中的下一个dat
anode,直到最后一个datanode,这种写数据的方式呈流水线的形式。最后一个datanode成功存储之后会返回一个ack
packet,在pipeline里传递至客户端,在客户端的开发库内部维护着"ackqueue",成功收到datanode返回的a
ckpacket后会从"ackqueue"移除相应的packet。如果传输过程中,有某个datanode出现了故障,那么当前
的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除,剩余的block会继续剩下的datanod
e中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持replicas设定的数量。HDF
S不擅长的多数据中心情况低延迟数据访问需求(10ms)大量的小文件多个数据写入者HadoopMapReduceHad
oopMapReduce是什么?一个在大型计算机集群上快速分发计算的编程模型一个组织执行计算的操作框架其中一个开源实
现即HadoopMapReduceMapReduce并行处理的基本过程CitefromDeanandGhemawa
t(OSDI2004)1.有一个待处理的大数据,被划分为大小相同的数据块(如64MB),及与此相应的用户作业程序2.系统中
有一个负责调度的主节点(Master),以及数据Map和Reduce工作节点(Worker)MapReduce并行处理的基本过程
CitefromDeanandGhemawat(OSDI2004)3.用户作业程序提交给主节点4.主节点为作业程
序寻找和配备可用的Map节点,并将程序传送给map节点5.主节点也为作业程序寻找和配备可用的Reduce节点,并将程序传送给R
educe节点MapReduce并行处理的基本过程CitefromDeanandGhemawat(OSDI200
4)6.主节点启动每个Map节点执行程序,每个map节点尽可能读取本地或本机架的数据进行计算7.每个Map节点处理读取的数据
块,并做一些数据整理工作(combining,sorting等)并将中间结果存放在本地;同时通知主节点计算任务完成并告知中间结果
数据存储位置MapReduce并行处理的基本过程CitefromDeanandGhemawat(OSDI2004
)8.主节点等所有Map节点计算完成后,开始启动Reduce节点运行;Reduce节点从主节点所掌握的中间结果数据位置信息,远程
读取这些数据9.Reduce节点计算结果汇总输出到一个结果文件即获得整个处理结果MapReduce并行处理的基本过程Cit
efromDeanandGhemawat(OSDI2004)完整计算过程MR简例(WordCount)Hado
opYARNHadoop1.0VSHadoop2.0产生背景直接源于MRv1在几个方面的缺陷 ?扩展性受限
?单点故障 ?难以支持MR之外的计算多计算框架各自为战,数据共享困难 ?MR:离线计算框架 ?Stor
m:实时计算框架 ?Spark:内存计算框架Hadoop1.0MR调度MapReduce1.0缺点JobTrack
er是Map-reduce的集中处理点,存在单点故障。JobTracker完成了太多的任务,造成了过多的资源消耗,当m
ap-reducejob非常多的时候,会造成很大的内存开销。在TaskTracker端,以map/reducetas
k的数目作为资源的表示过于简单,没有考虑到cpu/内存的占用情况。MapReduce框架在有任何重要的或者不重要的变化
(例如bug修复,性能提升和特性化)时,都会强制进行系统级别的升级更新。强制让分布式集群系统的每一个用户端同时更新。H
adoopYARNMR调度YarnvsMR1.0MR1.0JobTracker资源管理任务调度、监控Ya
rnResourceManager调度、启动每一个Job所属的ApplicationMaster、另外监控Applic
ationMasterApplicationMaster负责一个Job生命周期内的所有工作,类似老的框架中JobTrac
kerHadoopYARN模块组成ResourceManager处理客户端请求启动/监控ApplicationMast
er监控NodeManager资源分配与调度NodeManager单个节点上的资源管理处理来自ResourceManag
er的命令处理来自ApplicationMaster的命令ApplicationMaster数据切分为应用程序申请资源,并
分配给内部任务任务监控与容错HDFS采用了集中式meta管理的的架构,对外提供文件接口。每个文件在系统中会按照等长度分为
多个块,被称为chunk,每个chunk可以有多个副本,被称为Replica;文件操作采用Append-only的方式,数据一旦
被写入到系统中,除非被删除,否则不允许再进行修改。在整个集群中可以有一到多个/组Meta管理服务器,在HDFS中称为Nameno
de,主要用来管理meta信息,例如文件Meta、ChunkMeta、数据位置、用户、集群中机器状态等信息。集群中的每台机器上
会部署一个用来存储ChunkReplica数据的节点,被称为Datanode;Datanode用来接收数据读写请求,并将数据存储
到本地文件系统当中,每个Chunkreplica被存储到本地文件系统独立的文件。在集群中的每个机器上可以启动若干个用户程序来操
作HDFS上的文件,被称为HDFS系统的client端。读取数据时,client端会先从Namenode上获取文件的meta、C
hunkmeta和数据位置信息,并携带chunkmeta信息到Datanode上读取数据。写入数据时,client端会先在na
menode上打开文件的同时获取文件meta和写入版本,获取数据位置,然后向datanode写入数据。Datanode会定期向N
amenode汇报自己拥有的replica信息,Namenode会根据自己管理的信息对数据进行复制和存储空间回收等操作。在这张架
构图中,还表现了Namenode在选取数据位置的时候,考虑到了机架的分布,将一个chunk的多份replica放置在多个rack下
来应对机架网络或者供电异常。从文件的操作接口来看,Append-only的操作形式极大的简化了设计和实现难度,给数据一致性奠定基
础;但是append-only给很多业务实现提出了挑战,必须进行二次开发才能实现随机读写的能力。在最新的HDFS系统中,增加了T
runcate的功能,可以将文件?长度缩短后用新数据进行覆盖写入,是对当前写入方式的一点改进。meta集中管理的架构从工程实现上
来看,设计简单高效,但Namenode可能会成为整个分布式文件存储系统的单点和瓶颈,带来了可用性和扩展性问题。为了应对单点问题,H
DFS采用了HA方式来防止单点失效带来的存储服务不可用,利用Namenode的Federation功能来实现扩展性。HDFS
采用了集中式meta管理的的架构,对外提供文件接口。每个文件在系统中会按照等长度分为多个块,被称为chunk,每个chunk可以
有多个副本,被称为Replica;文件操作采用Append-only的方式,数据一旦被写入到系统中,除非被删除,否则不允许再进行
修改。在整个集群中可以有一到多个/组Meta管理服务器,在HDFS中称为Namenode,主要用来管理meta信息,例如文件Me
ta、ChunkMeta、数据位置、用户、集群中机器状态等信息。集群中的每台机器上会部署一个用来存储ChunkReplica
数据的节点,被称为Datanode;Datanode用来接收数据读写请求,并将数据存储到本地文件系统当中,每个Chunkrepl
ica被存储到本地文件系统独立的文件。在集群中的每个机器上可以启动若干个用户程序来操作HDFS上的文件,被称为HDFS系统的cl
ient端。读取数据时,client端会先从Namenode上获取文件的meta、Chunkmeta和数据位置信息,并携带ch
unkmeta信息到Datanode上读取数据。写入数据时,client端会先在namenode上打开文件的同时获取文件meta
和写入版本,获取数据位置,然后向datanode写入数据。Datanode会定期向Namenode汇报自己拥有的replica信
息,Namenode会根据自己管理的信息对数据进行复制和存储空间回收等操作。在这张架构图中,还表现了Namenode在选取数据位
置的时候,考虑到了机架的分布,将一个chunk的多份replica放置在多个rack下来应对机架网络或者供电异常。从文件的操作接
口来看,Append-only的操作形式极大的简化了设计和实现难度,给数据一致性奠定基础;但是append-only给很多业务实现
提出了挑战,必须进行二次开发才能实现随机读写的能力。在最新的HDFS系统中,增加了Truncate的功能,可以将文件?长度缩短后
用新数据进行覆盖写入,是对当前写入方式的一点改进。meta集中管理的架构从工程实现上来看,设计简单高效,但Namenode可能会
成为整个分布式文件存储系统的单点和瓶颈,带来了可用性和扩展性问题。为了应对单点问题,HDFS采用了HA方式来防止单点失效带来的存储
服务不可用,利用Namenode的Federation功能来实现扩展性。HDFSClient向远程的Namenode发
起RPC请求;Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户
端抛出异常;当客户端开始写入文件的时候,开发库会将文件切分成多个packets,并在内部以"dataqueue"的形式管理这些
packets,并向Namenode申请新的blocks,获取用来存储replicas的合适的datanodes列表,列表的大小根
据在Namenode中对replication的设置而定。开始以pipeline(管道)的形式将packet写入所有的repli
cas中。开发库把packet以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给在此p
ipeline中的下一个datanode,直到最后一个datanode,这种写数据的方式呈流水线的形式。最后一个datanode
成功存储之后会返回一个ackpacket,在pipeline里传递至客户端,在客户端的开发库内部维护着"ackqueue",成
功收到datanode返回的ackpacket后会从"ackqueue"移除相应的packet。如果传输过程中,有某个dat
anode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除,剩余的blo
ck会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持rep
licas设定的数量。YarnResourceManager调度、启动每一个Job所属的ApplicationM
aster、另外监控ApplicationMasterApplicationMaster负责一个Job生命周期内的所有工
作,类似老的框架中JobTrackerResourceManager处理客户端请求启动/监控ApplicationMast
er监控NodeManager资源分配与调度NodeManager单个节点上的资源管理处理来自ResourceManag
er的命令处理来自ApplicationMaster的命令ApplicationMaster数据切分为应用程序申请资源,并
分配给内部任务任务监控与容错3.1、任务提交JobClient.runJob()创建一个新的JobClient实例
,调用其submitJob()函数。向JobTracker请求一个新的jobID检测此job的output配置计算此job的i
nputsplits将Job运行所需的资源拷贝到JobTracker的文件系统中的文件夹中,包括jobjar文件,job.xml配置文件,inputsplits通知JobTracker此Job已经可以运行了提交任务后,runJob每隔一秒钟轮询一次job的进度,将进度返回到命令行,直到任务运行完毕。3.2、任务初始化当JobTracker收到submitJob调用的时候,将此任务放到一个队列中,job调度器将从队列中获取任务并初始化任务。初始化首先创建一个对象来封装job运行的tasks,status以及progress。在创建task之前,job调度器首先从共享文件系统中获得JobClient计算出的inputsplits。其为每个inputsplit创建一个maptask。每个task被分配一个ID。3.3、任务分配TaskTracker周期性的向JobTracker发送heartbeat。在heartbeat中,TaskTracker告知JobTracker其已经准备运行一个新的task,JobTracker将分配给其一个task。在JobTracker为TaskTracker选择一个task之前,JobTracker必须首先按照优先级选择一个Job,在最高优先级的Job中选择一个task。TaskTracker有固定数量的位置来运行maptask或者reducetask。默认的调度器对待maptask优先于reducetask当选择reducetask的时候,JobTracker并不在多个task之间进行选择,而是直接取下一个,因为reducetask没有数据本地化的概念。3.4、任务执行TaskTracker被分配了一个task,下面便要运行此task。首先,TaskTracker将此job的jar从共享文件系统中拷贝到TaskTracker的文件系统中。TaskTracker从distributedcache中将job运行所需要的文件拷贝到本地磁盘。其次,其为每个task创建一个本地的工作目录,将jar解压缩到文件目录中。其三,其创建一个TaskRunner来运行task。TaskRunner创建一个新的JVM来运行task。被创建的childJVM和TaskTracker通信来报告运行进度。分布式计算:MapReduce计算框架分布式存储:BigTableSpanner分布式文件系统:GFS分布式一致性:Chubby(基于Paxos)
献花(0)
+1
(本文系紫气东来2ze...首藏)