大家好,又见面了,我是你们的朋友全栈君。
分布式是指通过网络连接的多个组件,通过交换信息协作而形成的系统。
集群是指同一组件的多个实例,形成的逻辑上的整体。
集群强调的是任务的同一性,分布式强调的是差异性
分布式:不同的业务模块部署在不同的服务器上或者同一个业务模块分拆多个子业务,部署在不同的服务器上,解决高并发的问题
集群:同一个业务部署在多台机器上,提高系统可用性
主要由HDFS和MapReduce组成,MR由JobTracker和多个TaskTracker组成。
JobTracker的主要作用:JobTracker是框架的中心,接收任务,计算资源,分配资源,分配任务,与DataNode进行交流等功能。决策程序失败时 重启等操作。
TaskTracker监视当前机器上的task运行状况
存在问题:JobTracker是MR的集中处理点,存在单点故障。JobTracker完成了太多任务,造成了过多资源的消耗,当mapreduce job非常多的时候,会造成很大的内存消耗,同时也增加了JobTracker失效的风险
为了解决单NameNode制约HDFS扩展性的问题,提出了联邦HDFS。让多个NameNode分管不同的目录进而实现访问隔离和横向扩展,同时解决了NameNode单点故障的问题
有两个NameNode: active、standby。实现高可用。
基于yarn进行计算资源的分配、管理
yarn负责资源的管理和调度。
Application Master负责一个作业的管理。每个Job都有独立的Application Master
Resource Manager负责资源的分配。
Node Manager负责节点上资源管理。
Hadoop是开源的、可靠的、可扩展的系统架构,可以利用分布式架构来存储海量数据,以及实现分布式的计算。使用MapReduce计算模型实现对大数据集进行分布式的处理。
Shuffle是MapReduce的核心。
Map端Shuffle :map端会将map处理数据的中间结果写入磁盘供reduce端拉取;首先会写入内存缓冲区,当内存缓存区达到阈值,溢写到磁盘; 在溢写之前会进行分区、排序,保证所属分区及有序性;写磁盘之前,如果有combiner阶段,就先进行combiner预聚合;写入磁盘,将溢写到磁盘的文件合并为一个大文件,等待reduce拉取
Reduce端Shuffle: reduce会默认起5个线程来拉取属于自己的数据,会对拉取到的数据济宁合并、排序,最终生成一个大的文件作为reduce端的输入
MR在reduce阶段需要分组将key相同的放在一起进行规约,为实现目的,有两种算法:hashmap和sort,前者太耗内存,而排序通过外排可以对任意数据量分组,只要磁盘够大进行。
map端排序是为了减轻reduce端排序的压力。
支持大文件存储、部署在廉价机器上、高容错、简单的一致性模型
不适合低延迟数据访问、不适合大量小文件存储、不支持强事务
存储文件的基本单位,把文件存储到不同的磁盘上,默认大小是128M
存储元数据,将元数据保存到内存及磁盘上,保存文件、block、datanode的关系
NameNode中的元数据信息存储在内存及文件中。内存中为实时信息;文件中为数据镜像,作为持久化存储使用
存储块内容,存储在磁盘中,维护了block id到文件的映射
NameNode的操作日志
NameNode的元数据镜像文件。fsimage保存了最新的元数据检查点,包含了整个HDFS文件系统的所有目录和文件的信息
Secondary NameNode会定期合并fsimage和edits,合成新的fsimage,新的操作会写入新的edit log中。
保留合并后的镜像文件,以防数据节点失败时恢复数据
这种策略减少了机架间的数据传输,提高了写操作的效率。机架的错误远远比节点的错误少,所以这种策略不会影响到数据的可靠性和可用性。这种策略在不损害数据可靠性和读取性能的情况下改进了写的性能。
全局资源管理器,负责对系统中的所有资源进行管理,处理客户端请求,启动或监控Application Master,监控NodeManager,资源的调度和分配
由两个组件组成:Scheduler调度器、应用程序管理器Application Manager
负责资源的调度,根据容量队列的限制,将资源分配给正在运行的应用
负责管理所有的应用程序,包括应用程序的提交,与调度器协商启动Application Master,监控Application Master的运行状态。
每个应用均包含一个Application Master,用于和Resource Manager协调获取资源,将得到的资源进一步分配给任务,与Node Manager通信启动/停止任务,监控所有任务的状态,在任务失败时重新为任务申请资源执行任务
每个节点上的任务和资源管理器,是真正执行应用程序的容器的提供者,监控应用程序的使用情况。并通过心跳向集群资源调度器 ResourceManager 进行汇报以更新自己的健康状态。同时其也会监督 Container 的生命周期管理,监控每个 Container 的资源使用(内存、CPU 等)情况,追踪节点健康状况,管理日志和不同应用程序用到的附属服务
抽象的逻辑资源单位。Container是由Resource Manager动态分配的资源构成。它包括了该节点上的一定量的CPU、内存、磁盘、网络等资源,MapReduce程序的所有Task都是在一个容器中执行的,容器的大小是可以动态调整的
有三种:先进先出、容量调度、公平调度
FIFO:将所有的应用放到一个队列中,按照提交的顺序执行,不适合大型集群
容量调度器:保留一个小队列保证小作业一提交就可以启动,以整个集群的利用率为代价,大作业的执行时间更长(默认的资源调度)
公平调度器:调度器在所有任务之间动态平衡
map side join:将小表
textfile为默认格式,存储方式为行式存储,在检索时磁盘开销大,数据解析开销大
二进制文件,以<key,value>的形式序列化到文件中,存储方式为行式存储,可以对文件进行分割和压缩,一般使用block压缩,使用Hadoop 的标准的Writable 接口实现序列化和反序列化
存储方式为数据按行分块,每块按照列存储的行列混合模式,具有压缩、列存取的特点。在使用时,读记录尽量涉及到最少的block,这样读取需要的列只需要读取每个row group的头部定义,具有明显速度优势。
Orc是从hive的原生格式RCFILE优化改进而来
Parquet是Cloudera公司研发并开源的格式
两者都属于行列存储模式,但Orc严格上应该算是行列混合存储,首先按照行组分割整个表,在一个行组内按列进行存储
Parquet和ORC都是自解析的,文件中包含该文件的数据和元数据,Orc的元数据使用Protocol Buffers序列化
两者都支持嵌套数据格式(struct/map/list),但是策略不同:
压缩:两者都相比txt格式进行了数据压缩,相比而言,Orc的压缩比例更大,效果更好
计算引擎支持:都支持MR、spark计算引擎
查询引擎支持:parquet被spark sql、hive、impala等支持;而Orc被spark sql、hive支持,不被impala支持。
https://zhuanlan.zhihu.com/p/156064664?from_voters_page=true
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147674.html原文链接:https://javaforall.cn