当前位置:首页 > 详细了解容错机制实现高可用和稳定性

详细了解容错机制实现高可用和稳定性

@杨兰燕14505646388:为保证服务器高可靠性,高可用性,应采取哪些技术-1,从服务器硬件系统的总线和处理器的处理能力入手。服务器的系统总线已经从过去的16位、32位发展到现在的64位;局部I/O总线技术(例如AGP、PCI-Express)在不断改进;SMP(对称多处理器)技术和DP(双处理器)技术的应用,硬件冗余和负载均衡技术的发展,大容量内存校验、纠错和专用内存技术的进步。2,服务器硬件设计改进。硬件设计高度模块化,便于故障诊断与维修。硬件冗余,例如双电源、双CPU(双CPU还能提高性能)。大功率的冷却系统。指示灯故障示警。3,高速、多个数、大容量磁盘的应用。支持SCSI高速硬盘及Raid技术,支持阵列卡以及光通讯设备。外接磁盘扩展阵列柜满足了大容量存储和提高了存储的I/O性能,高智能的阵列可以保证数据的安全和完整。本地Raid1双硬盘基本杜绝了由于磁盘损坏而破坏OS的可能性。4,支持集群、热备和均衡技术。集群和均衡技术的使用,使服务器系统具备了整体的容错功能和承载能力,我们不必担心由于服务器的意外故障和突发访问而引起的服务关闭甚至系统崩溃。5,系统备份和容灾。高性能的备份软件可以对系统进行备份,便于软件系统(OS、数据库系统、邮件系统、财务软件等)的及时恢复。异地容灾、应用级容灾降低了软件系统遭受数据丢失的灾难,和提高了灾难恢复的效率。本文来自“十万个为什么”电脑学习网http://www.why100000.com希望采纳

@吕晓云18536271212:gfs采用了哪些容错措施来确保整个系统的可靠性-GFS的精彩在于它采用了多种方法,从多个角度,使用不同的容错措施来确保整个系统的可靠性。2.1.1系统架构GFS的系统架构如图2-1[1]所示。GFS将整个系统的节点分为三类角色:Client(客户端)、Master(主服务器)和ChunkServer(数据块服务器)。Client是GFS提供给应用程序的访问接口,它是一组专用接口,不遵守POSIX规范,以库文件的形式提供。应用程序直接调用这些库函数,并与该库链接在一起。Master是GFS的管理节点,在逻辑上只有一个,它保存系统的元数据,负责整个文件系统的管理,是GFS文件系统中的“大脑”。ChunkServer负责具体的存储工作。数据以文件的形式存储在ChunkServer上,ChunkServer的个数可以有多个,它的数目直接决定了GFS的规模。GFS将文件按照固定大小进行分块,默认是64MB,每一块称为一个Chunk(数据块),每个Chunk都有一个对应的索引号(Index)。客户端在访问GFS时,首先访问Master节点,获取将要与之进行交互的ChunkServer信息,然后直接访问这些ChunkServer完成数据存取。GFS的这种设计方法实现了控制流和数据流的分离。Client与Master之间只有控制流,而无数据流,这样就极大地降低了Master的负载,使之不成为系统性能的一个瓶颈。Client与ChunkServer之间直接传输数据流,同时由于文件被分成多个Chunk进行分布式存储,Client可以同时访问多个ChunkServer,从而使得整个系统的I/O高度并行,系统整体性能得到提高。相对于传统的分布式文件系统,GFS针对Google应用的特点从多个方面进行了简化,从而在一定规模下达到成本、可靠性和性能的最佳平衡。具体来说,它具有以下几个特点。1.采用中心服务器模式GFS采用中心服务器模式来管理整个文件系统,可以大大简化设计,从而降低实现难度。Master管理了分布式文件系统中的所有元数据。文件划分为Chunk进行存储,对于Master来说,每个ChunkServer只是一个存储空间。Client发起的所有操作都需要先通过Master才能执行。这样做有许多好处,增加新的ChunkServer是一件十分容易的事情,ChunkServer只需要注册到Master上即可,ChunkServer之间无任何关系。如果采用完全对等的、无中心的模式,那么如何将ChunkServer的更新信息通知到每一个ChunkServer,会是设计的一个难点,而这也将在一定程度上影响系统的扩展性。Master维护了一个统一的命名空间,同时掌握整个系统内ChunkServer的情况,据此可以实现整个系统范围内数据存储的负载均衡。由于只有一个中心服务器,元数据的一致性问题自然解决。当然,中心服务器模式也带来一些固有的缺点,比如极易成为整个系统的瓶颈等。GFS采用多种机制来避免Master成为系统性能和可靠性上的瓶颈,如尽量控制元数据的规模、对Master进行远程备份、控制信息和数据分流等。2.不缓存数据缓存(Cache)机制是提升文件系统性能的一个重要手段,通用文件系统为了提高性能,一般需要实现复杂的缓存机制。GFS文件系统根据应用的特点,没有实现缓存,这是从必要性和可行性两方面考虑的。从必要性上讲,客户端大部分是流式顺序读写,并不存在大量的重复读写,缓存这部分数据对系统整体性能的提高作用不大;而对于ChunkServer,由于GFS的数据在ChunkServer上以文件的形式存储,如果对某块数据读取频繁,本地的文件系统自然会将其缓存。从可行性上讲,如何维护缓存与实际数据之间的一致性是一个极其复杂的问题,在GFS中各个ChunkServer的稳定性都无法确保,加之网络等多种不确定因素,一致性问题尤为复杂。此外由于读取的数据量巨大,以当前的内存容量无法完全缓存。对于存储在Master中的元数据,GFS采取了缓存策略,GFS中Client发起的所有操作都需要先经过Master。Master需要对其元数据进行频繁操作,为了提高操作的效率,Master的元数据都是直接保存在内存中进行操作。同时采用相应的压缩机制降低元数据占用空间的大小,提高内存的利用率。3.在用户态下实现文件系统作为操作系统的重要组成部分,其实现通常位于操作系统底层。以Linux为例,无论是本地文件系统如Ext3文件系统,还是分布式文件系统如Lustre等,都是在内核态实现的。在内核态实现文件系统,可以更好地和操作系统本身结合,向上提供兼容的POSIX接口。然而,GFS却选择在用户态下实现,主要基于以下考虑。在用户态下实现,直接利用操作系统提供的POSIX编程接口就可以存取数据,无需了解操作系统的内部实现机制和接口,从而降低了实现的难度,并提高了通用性。POSIX接口提供的功能更为丰富,在实现过程中可以利用更多的特性,而不像内核编程那样受限。用户态下有多种调试工具,而在内核态中调试相对比较困难。用户态下,Master和ChunkServer都以进程的方式运行,单个进程不会影响到整个操作系统,从而可以对其进行充分优化。在内核态下,如果不能很好地掌握其特性,效率不但不会高,甚至还会影响到整个系统运行的稳定性。用户态下,GFS和操作系统运行在不同的空间,两者耦合性降低,从而方便GFS自身和内核的单独升级。4.只提供专用接口通常的分布式文件系统一般都会提供一组与POSIX规范兼容的接口。其优点是应用程序可以通过操作系统的统一接口来透明地访问文件系统,而不需要重新编译程序。GFS在设计之初,是完全面向Google的应用的,采用了专用的文件系统访问接口。接口以库文件的形式提供,应用程序与库文件一起编译,Google应用程序在代码中通过调用这些库文件的API,完成对GFS文件系统的访问。采用专用接口有以下好处。降低了实现的难度。通常与POSIX兼容的接口需要在操作系统内核一级实现,而GFS是在应用层实现的。采用专用接口可以根据应用的特点对应用提供一些特殊支持,如支持多个文件并发追加的接口等。专用接口直接和Client、Master、ChunkServer交互,减少了操作系统之间上下文的切换,降低了复杂度,提高了效率。

@郑萍15587354045:实现容错技术的主要手段-容错FT(FaultTolerant)技术一般利用冗余硬件交叉检测操作结果。随着处理器速度的加快和价格的下跌而越来越多地转移到软件中。未来容错技术将完全在软件环境下完成,那时它和高可用性技术之间的差别也就随之消失了。局域网的核心设备是服务器。用户不断从文件服务器中大量存取数据,文件服务器集中管理系统共享资源。但是如果文件服务器或文件服务器的硬盘出现故障,数据就会丢失,所以,我们在这里讲解的容错技术是针对服务器、服务器硬盘和供电系统的。就是容许错误,是指设备的一个或多个关键部分发生故障时,能够自动地进行检测与诊断,并采取相应措施,保证设备维持其规定功能,或牺牲性能来保证设备在可接受范围内继续工作。错误一般分为两类:第一类是先天性的固有错误,如元器件生产过程中造成的错误、线路与程序在设计过程中产生的错误。这一类的错误需对其拆除、更换或修正,是不能容忍的。第二类是后天性的错误,它是由于设备在运行中产生了缺陷所导致的故障。这种故障有瞬时性、间歇性和永久性的区别。容错技术是提高系统可靠性的重要途径。常采用的容错方法有从形式上看可分为硬件容错和软件容错。硬件容错就是以冗余的硬件来应对灾难。为使硬件容错得以实施,在系统设计时,就必须像“乐高”玩具那样,采用硬件模块化思路以增强系统的可扩充性和可维护性。当故障发生后,冗余的硬件便可立即挺身而出保障系统继续工作,而无需中断服务。硬件容错的缺点是成本较高。软件容错就是以冗余的软件来应对灾难。其优点是不依赖硬件,且灵活性和可移植性都较好,缺点是速度较慢

@元灵竹18603917716:分布式系统一致性高可用的解决方案总结-本文基于对redis、zookpeer、rocketmq、elasticsearch学习总结,对于分布式系统学习,一定绕不开一个点,那就是CAP定理。什么是CAP定理,我这里简单的复制摘抄一下百度上的文案。CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partitiontolerance)。CAP原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。说明一下上面的三个要素各代表的含义:CAP定理说明上述的三个要素不能兼顾,最多只能满足其中的两个要素,在分布式系统中,一般都是保证分区容错性,而在一致性和可用性之间做取舍。因此存在CP、AP两种分布式集群的实现。CP集群,即满足一致性和分区容错性,如zookpeerAP集群,即满足可用性和分区容错性,如redis-cluster下面,针对与上述的CP和AP问题,我们展开话题。对于分布式系统,学习了解多了之后,发现其内在的解决方案基本上都是一样的,所谓万变不离其中。总结一下大体在于以下几步:数据分片,很多分布式系统尤其是中间件服务,一般都会涉及高并发,数据量大的问题,如redis-cluster、recketmq,以及被大家熟知的Elasticsearch。针对于大数据量高并发的问题,若不做处理,服务器的性能将会成为服务的瓶颈,解决的方案之一便是数据分片,将大数据量在集群中按照一定的规则分片,使数据按照一定的规则分布集群的不同服务器上,以减轻单个服务器的压力,保证服务集群的可用性。redis-cluster的数据分片是通过redis-cluster的哈希槽来实现的,redis-cluster有16384个哈希槽,这个数量是固定的,根据集群中服务器的数量可以手动的调配每个服务上存放的hash槽的数量,哈希槽之间是相互独立的,因此对集群的扩展提供了便利。rocketmq的分片和topic紧密相关,在使用rocketmq中,无论是消息的生产者还是消费者都需要注册订阅一个topic。在rocketmq集群中,集群中的broker保存这个topic下数据的一部分,也就是topic的其中一个数据分片。当然,rocketmq不仅将一个topic下的数据分片到多个broker上,而且,一个broker上的topic数据还可以被分为多个queue,这是因为rocketmq中,一个queue只能被一个consumer消费,若是consumer的数量多于queue的数量,没有绑定queue的consumer将不能消费数据。elasticsearch的数据分片在我看来和mysql的分库分表原理是一样的,elasticsearch中,每一个索引都相当于mysql的一个表,将一个索引分成多个shard放在不同的节点上,每个shard存储一部分数据。elasticsearch将数据进行分片,这样可以支持集群的横向扩展,同时,多个节点提供服务可以提高系统的效率和吞吐量。综上所述,数据分片的一般都有两个好处,一个是支持集群的横向扩展,而是提升服务的吞吐量和性能。数据分片解决了以上两个问题,但是若是集群中一个节点发生宕机,或者因为网络原因和集群断开链接,那么这部分的数据分片甚至整个集群都会不可用,如何解决这个问题,就需要用到数据备份和主备切换。数据分片的策略了解了数据分片之后,需要了解以下数据分片的策略,根据集群提供服务的性质不同,可以采用的数据分片策略也各有不同,下面是我学习后的总结:说到这里,会发现其实这种分片策略和负载均衡的策略还是挺相似的。数据备份,举个例子来说,我有两台电脑A、电脑B,A用于工作,B用于游戏,我写了一篇文章,保存在电脑上电脑上,若是某一天我的电脑A磁盘坏了,那我这篇文章就找不到了,即便我现在还有电脑B,我也没有办法在对文章进行编辑。但是若是我在之前,就将文章拷贝了一份放在电脑B上,那么现在,我用电脑B就可以对文件进行编辑修改。举这个例子,我的目的就是为了说明数据备份对于集群可用性的意义,例子中,我的两台电脑可以认为是集群中两台服务器,两台服务器一开始提供的服务可能不相同,A电脑提供的就是编辑文章的服务,数据备份的意义就在于,当原本提供服务的服务器宕机损坏,集群中另外的服务器仍然可以根据已经备份的数据提供相同的服务,而不会影响到用户的工作。数据备份的目的就是不发生单点问题的措施之一,但是若是数据备份的策略不合适,备份的时机不对,那么备份的数据时效性也是问题。还是从例子出发,这里的文章每次都是我手动从A电脑拷贝到B电脑,这是我的备份策略,若是我选择每天晚上才拷贝一次,那么若是A电脑在我拷贝之前坏了,当天的文章编辑数据就丢失了,采用手动的方式备份,这种备份方式耗时耗力且不可控,而在分布式集群中,不同的系统采用了不同的备份策略,下面一一来说明。首先明确一点,在分布式集群中,不可能采用人工手动备份,一定是系统程序按照一定的规则自动备份,就好像我将AB连在一起,写个程序,让A电脑自动把文章同步到B电脑。数据备份的方式分为两种:这里以redis-cluster和zookeeper举例。在redis-cluster中,当一台新的slave节点加入时,会出发数据同步,需要将主节点的数据同步到从节点。这时根据从节点的状态有两种同步方案:完整重同步和部分重同步完整重同步既是将主节点的全部数据都复制给新的slave节点。大致流程为,当一个新的节点加入进来时,发送PSYNC命令给主节点并携带slave节点自身的信息(重点是复制偏移量),主节点会根据slave传过来的信息判断是完整重同步还是部分重同步,如何判断与数据同步时的复制缓冲区有关,更细节不展开介绍。相对于redis-cluster,zookeeper中的数据同步有四种方式,和redis-cluster完整重同步和部分重同步相似的SNAP(全量同步)和DIFF(增量同步),以及zk事务处理相关的TRUNC(仅回滚同步)、TRUNC+DIFF(回滚+增量同步)当节点已经加入集群,成为集群中的从节点,只要不断开连接,一般都只需要进行增量同步,不过系统同步的范围和方式有所差异,大致分为下面六种:下面还是以具体服务来举例:redis-cluster中,主从复制采用的是异步复制的方式,master节点在做数据变更之后,会由一个异步线程将数据变更同步给slave节点,这是通过push的方式。当redis2.8之后,slave会周期的获取最新的数据,加入了pull方式。无论是master还是slave,在进行数据同步时,不会阻塞正常的应用请求。所以redis-cluster的主从复制,是异步备份+最终一致性的备份。elasticsearch的主从复制可以手动设置同步备份或者异步备份,数据备份时不要求强一致性,而是主分片(primaryshard)会维护一份需要同步的(replicashard)分片列表,这个分片列表同步完成,则认为数据备份完成,需要注意的是,这里的主从复制不是节点的更新数据,而是分片的更新数据。rocketmq的主从复制和elasticsearch类似,也可以分为同步备份和异步备份,不同的是rocketetmq的数据备份采用的是pull的方式,从节点会通过HAConnection链接主动向主节点发送待拉取数据偏移量,待主节点返回节点更新数据信息,更新从节点数据偏移量,如此重复。zookeeper的数据备份则是通过ZAB协议,通过消息广播的方式同步数据到从节点。当数据备份后,主从节点上就有了相同的数据,为了提升服务的性能,那么可以采用读写分离的方式。主节点提供数据写服务,从节点提供读服务,可以有效的分担主节点的服务器压力。可以进行数据分片的系统,如:redis、rocketmq、elasticsearch,一般都可以配置一主多从、多主多从的集群架构。读写分离之后,主节点提供写服务,从节点只提供读服务,因此若是主节点发生宕机,从节点依然可以提供读服务,但是服务无法更新数据,这时候就要进行主从切换。早起,主从切换可以由人工手动完成,不过随着技术发展,主从切换已经成为集群的必备功能。想要实现主从切换,必须要解决两个问题:解决这个问题,需要额外再引入一个角色,相当于是一个监视者的角色,能够长期的对主节点进行监视,若是只有一个监视者,可能会发生误判,所以还需要一套机制去保证当监视者说主节点宕机,那么主节点是真的宕机,否则集群会出现脑裂问题。以redis为例,在redis的哨兵模式中,这个监视者的角色是一个个哨兵实例,而在redis-cluster架构中,这个监视者的角色是redis实例自己。在redis哨兵模式中,哨兵集群中的哨兵实例会定期和redis实例进行通信(ping),监视redis实例的在线情况,若是其中一台哨兵发现redis实例master故障,那么该哨兵会将该master状态改为主观下线,并通知其他哨兵,当哨兵集群中达到配置数量的哨兵实例认为该master都为主观下线状态,这时会将master修改为客观下线状态,并开始触发后续的故障转移。在redis-cluster模式中,集群中的每一个节点都可以和其他节点通讯(ping),当某一个节点A发现主节点B下线了,A会将该主节点B设为疑似下线状态。集群中的节点会通过互发消息维护信息,当另一个节点C收到A的消息时,会将A对B节点的判断记录在C节点的维护信息下,这个信息可以理解为A说C疑似下线了。若是有其他节点发送C的状态信息,A同样也会记录。当某一个节点如C发现记录的B节点信息中,超过半数的主节点都认为B下线了,那么C就会将B节点状态修改为已下线状态,并广播消息给集群的其他节点,开始后续的故障转移。上面就是redis的两种分布式模式故障检测的方案。大致可以归结为,监视节点会和被监视节点进行通讯,感知被监视节点的状态;监视节点之间也会进行通讯,同步信息。为了防止集群出现脑裂,对于某个主节点的故障判断会十分的谨慎,需要达到一定数量的监视节点都认为主节点故障时,才会认为主节点真的故障,从而触发故障转移。在rocketmq集群模式中,nameserver扮演着监视者的角色(不同于其他系统,nameserver并不负责集群的主从切换,rocketmq4.5之前不支持自动主从切换,4.5之后,通过dledger实现自动的故障转移)。在elasticsearch集群中,elasticsearch实例本身在扮演监视者角色。zookeeper也是实例本身扮演监视者的角色。故障转移就是当集群发现集群中的主节点/从节点发生故障之后的处理,从节点比较简单,直接将从节点下线即可,主节点的故障转移流程比较复杂,各个系统根据系统的功能和架构有不同的实现方式,共同点是选举出的主节点一定是集群中数据最新的最完善的节点。选举过程大致如下:首先选举成功的条件时集群中具有投票权限的超过半数的节点投票一致,通过某一个节点成为主节点。开始一轮选举时,定义为一个纪元,用一个自增的id表示。候选节点将带着纪元id,以及自身信息作为投票申请广播给集群给可投票的节点。具有投票权限的节点投票只要满足两个条件:1.自身在最新纪元没有给投过票2.节点发送过来的投票申请时最新纪元的(如何判断时最新纪元,则是判断一下节点之前通过申请的纪元id是否小于当前申请的纪元id)。半数以上的投票节点通过某一个候选节点成为leader节点,则leader产生。若是一个纪元没有产生主节点,则候选节点进入随机的休眠,并且开启下一个纪元,知道产生leader节点。在zk集群经过崩溃恢复模式之后,需要保证:1.已经提交的事务不能丢失2.未被提交的事务不能出现。如何保证以上两点,zk服务集群中维护了zxid,zxid也可以看作是一个自增的id,集群中每产生一个新事物,zxid就会增加。zxid有64位,前32位维护了集群主节点变更情况,每重新选举出一个新的主节点则增加,后32位维护在新的主节点集群下事务的id,产生一个新事物则增加。ZAB的选举模式有很多种,我主要了解了默认,也是推荐的FastLeaderElection模式,在这个模式下,我会以集群中一台参与选举的服务器的视角来模拟选主的过程;我是一台zk服务器,我现在很慌,因为我的leader服务器不见了,作为一个有梦想的follower,我也要参加leader的选举,为了这次选举我要准备:myid(在集群中标识是这台服务器的id),zxid(本台服务器保存的最新事务id),logicClock(本台服务器发起的第几轮投票)首先我会自己选自己,这得自信。于是我将自身的选举信息[myid,zxid]放到自己的收票箱,然后将我的选举信息还有我的选举轮次logicClock广播给其他服务器进行PK作为一个有原则的服务器,我们的选举也是有原则的,当我收到别人的选举信息时,我也会将他和我自己的选举信息进行PK,PK的原则如下:经过这一系列的PK,终于选出了我心中的leader服务器,要广播给其他服务器。超过半数的服务器都同意某一台服务器成为leader,选举结束了。

@戚代云18509462055:加快构建科技创新容错机制-核心阅读加快构建科技创新容错及信用评价机制,对于破除科技创新实践中的体制机制障碍,最大限度解放和激发科技创新的巨大潜能,营造勇于创新、宽容失败的创新氛围,防范和控制科技创新风险等有着重要现实意义。科技创新容错的内涵与存在的问题由于科技创新主体的认识与控制能力的有限性以及科技创新活动的复杂性、不确定性和风险性,这意味着科技创新实际上也就是一个不断试错、反复探索的过程,因而具有很高的失败风险。在科技创新实践中,就非常需要对创新失败与过错失误进行宽容,鼓励先行先试,最大限度地支持和保护科技创新主体的积极性和合法权益,以消除对创新风险的顾虑和担心。科技创新容错,就是在科技创新活动中,对于因技术路线选择失误、不可抗力或不可预见等因素,而造成创新失败的责任主体,予以从轻、减轻或免予问责。相应地,构建科技创新容错机制,就是通过制度设计和机制调节,宽容并纠正科技创新活动中可能出现的失败和偏差,对相关创新责任主体实施豁免,并提供必要的制度保障。2018年1月,《国务院关于全面加强基础科学研究的若干意见》中明确提出要“建立鼓励创新、宽容失败的容错机制,鼓励科研人员大胆探索、挑战未知”。当前,在国家及地方层面上,都已把构建科技创新容错机制作为实施创新驱动发展战略的重要内容,纷纷出台科技创新容错领域的政策文件,在全社会范围内凝聚形成鼓励创新、宽容失败的科技创新制度环境和社会氛围。当然,由于科技创新容错机制仍处于探索构建之中,在实际工作中还存在着一些难点和问题。目前,由于科技创新容错工作推进机制还不健全,时常会面临科技创新容错免责认定与推进难题。首先,在对科技创新主体容错或问责进行具体认定时,关于哪些错能够容、哪些错不能容,还缺乏明确的界定标准和相应的制度安排,对所容之“错”的科学界定还存在着一定难度。其次,由于科技活动具有长期性、探索性、专业性和前沿性等规律特征,使得在协调推进科技创新容错与加强科技创新管理的工作中,非专业人士很难实现对科技创新主体的全部活动进行全方位跟踪评判。此外,由于科技创新容错机制的运行涉及多个部门,需要科技管理、司法、审计、金融等部门以及科技项目实施单位之间相互配合、协同推进。在实践中,由于各相关部门之间对科技项目的监督、检查、审计等信息还缺乏互通共享渠道,在科技创新容错实践中容易出现跨部门协调推进不畅问题。另外,由于科技创新容错风险贯穿于容错机制实施全过程,存在着诸多的不确定性和风险规避难问题。目前,由于科技创新容错免责的法律法规还不完善,部门的权力清单尚不清晰,使得相关决策部门及决策者在进行科技创新容错决策与执行时需要承担较高的担当风险。与此同时,由于科技创新容错与科技信用评价是相辅相成的,科技创新容错机制的构建依赖于良好的科研诚信与科技信用评价基础,只有各类科技创新主体能够严格遵循科研规律,恪守科研诚信,才能有效降低科技创新容错中的道德风险。目前,科技信用评价、科研诚信监督及惩戒机制还不健全,部分科技创新主体的科研诚信意识不强,时常发生与科学精神要求不一致的行为,科研失信现象屡有发生,增加了科研活动中的道德风险,相应地也加大了科技创新容错的难度。构建科技创新容错机制的路径选择大力实施创新驱动发展战略,着力破解制约科技创新体制机制障碍,加快构建科技创新容错机制,为科技创新过程中的先行先试探索、颠覆式创新“保驾护航”,积极培育形成鼓励创新、宽容失败和防范风险的创新制度环境。一是科学界定科技创新容错内涵,明确容错合理边界。科学界定所容之“错”的科学边界与合理范围,是构建科技创新容错机制的首要条件。当前,部分科技创新主体对科技创新容错内涵与范畴的理解还存在歧义,容易将“容错”等同“避责”或把所容之“错”视同为违法违纪行为。因此,为了确保科技创新容错的针对性和有效性,要明确容错科学边界与合理范围,并相应地制定完备的科技创新容错正面清单和负面清单以及容错机制运行规程,以便于判定哪些错该“容”,哪些“错”不该容。二是完善科技创新评价体系,激发勇于探索的科研精神。科学研究是面向未知世界的认识和探索活动,构建科技创新容错机制,就是实现对科研特点和规律的尊重与回归。在科技创新领域建立容错机制,需要遵循科技创新规律,重视科研试错探索的价值。根据2018年7月中办、国办印发的《关于深化项目评审、人才评价、机构评估改革的意见》的相关要求,进一步推进科技评价制度改革,发挥好评价指挥棒和风向标作用,营造良好的科研制度环境,遵循科技人才发展规律,注重业绩和潜力评价、过程和结果评价相结合,健全和完善科技创新评价体系,为科研人员和机构松绑减负,培育形成激发勇于探索的科研精神的长效机制。三是推进科研诚信体系建设,保障容错机制有效运行。科研诚信与科技创新容错是相辅相成的,健全和完善科研诚信体系,减少科研活动信息不对称和科研失信行为,降低科技创新风险,保障科技创新容错机制有效运行。首先,要建立包括科研机构、科技社团及科研人员在内的科研诚信体系,完善科研单位及个人信用信息数据库,提高科技信用信息的共享水平。其次,要健全科研诚信奖惩机制,健全科学规范、激励有效、惩处有力的科研诚信惩戒机制,努力做到“褒扬诚信、惩戒失信”。再次,要构建科技项目信用评价机制,加强科技项目申报与受理、评审与立项、实施与管理以及结项与验收等环节的信用评价。四是完善科技创新容错法治基础,健全容错司法环境。完备、规范的法律文件有助于增强科技创新容错的法律效力与司法保障。从科技创新容错的法治运行轨迹看,立法是起点,执法是中端,司法是末端。首先,在科技创新容错实践中,立法、执法及司法机关应加强与知识产权行政管理部门、科研机构、创新型企业沟通,认真研究科技创新融资、科研成果资本化和产业化中的新情况,充分尊重科技创新的特点和规律,保护科研人员凭借聪明才智和创新成果获取合法收益。其次,妥善处理涉及科创主体的案件,对科技企业生产经营与创新发展中的经济行为,除法律法规明令禁止的之外,都应不予以违法犯罪对待,积极营造鼓励大胆创新、勇于探索的司法环境。五是重视创新容错与科研诚信教育,加强舆论引导监督。近年来,关于科技创新容错及科研诚信的宣传教育日益受到各级政府与学界的重视,但仍存在着制度化的教育缺位和不到位的问题,相当比例的科技工作者对容错纠错、科研诚信、科研道德和学术规范等概念的认识不深。鉴于此,应从科研人员的学习、工作、生活等方面入手,加强容错纠错、科研诚信、科学精神、学术规范等方面的宣传教育。充分发挥媒体的舆论导向与监督作用,重视创新容错、科研诚信等领域法律法规的普及,弘扬科学精神,全面提高科技人员的科研诚信水平。

@戚明红14578427872:什么是系统容错?-双机容错系统方案一,双机容错系统方案综述1.1久强世纪StorageSolution双机容错系统近年来,随着计算机技术的飞速发展,服务器的性能有了大幅度的提升,服务器作为处理关键性事物的业务主机已随处可见.对于要求有高可用性和高安全性的系统,比如金融,邮电,交通,石油,电力,保险证券等行业,用户提出了系统容错的要求.久强世纪公司推出基于Cluster集群技术的双机互备援解决方案,包括用于对双服务器实行监控的HA容错软件和作为数据存储设备的系列磁盘阵列系统.通过软硬件两部分的紧密配合,提供给客户一套具有单点故障容错能力,且性价比优越的用户应用系统运行平台.1.2Cluster集群技术Cluster集群技术:一组相互独立的服务器在网络中表现为单一系统,并以单一系统的模式加以管理.此单一系统为客户工作站提供高可靠性的服务.Cluster大多数模式下,集群中所有的计算机拥有一个共同的名称,集群内任一系统上运行的服务可被所有的网络客户所使用.Cluster必须可以协调管理各分离的组件的错误和失败,并可透明的向Cluster中加入组件.一个Cluster包含多台(至少二台)拥有共享数据储存空间的服务器.任何一台服务器运行一个应用时,应用数据被存储在共享的数据空间内.每台服务器的操作系统和应用程序文件存储在其各自的本地储存空间上.Cluster内各节点服务器通过一内部局域网相互通讯.当一台节点服务器发生故障时,这台服务器上所运行的应用程序将在另一节点服务器上被自动接管.当一个应用服务发生故障时,应用服务将被重新启动或被另一台服务器接管.当以上任一故障发生时,客户将能很快连接到新的应用服务上.1.3久强世纪StorageSolution双机容错系统方案Cluster集群可由N台服务器组成,当Cluster最小值N=2时,即为双机容错集群系统.久强世纪Cluster双机容错系统结合了磁盘阵列产品的安全可靠性与HA监控软件技术的优点,将二者的优势相互配合.使用软件与磁盘阵列结合的方案,可以有效提高主机工作效率,减轻服务器和网络设备压力,保证系统稳定性.二,系统概述2.1功能概述·如果硬盘发生故障时,磁盘阵列柜会有蜂鸣声告警,同时硬盘架面板上的状态指示灯变成红色(正常时为绿色),以便提醒用户进行及时有效的维护·独特的硬盘保护环路设计,可以确保故障硬盘插拔时,即刻隔断与SCSI总线的连接,而不会影响SCSI总线上的信号·即时响应:控制器在硬盘发生故障时即刻识别错误信息·支持环境监控(当机箱内温度过高时会有蜂鸣告警声)·冗余电源备份(支持热插拔)·热插拔风扇·系统安全密码锁定·当柜门关闭时,仍可观察到控制器及硬盘工作状态·支持不同品牌,容量,型号的SCSI硬盘2.2阵列柜结构AccuSTORS940阵列柜的组成包括RAID控制器,双电源保护装置,支持热插拔的硬盘盒(MobileRack)等,大部分部件具有冗余能力,可以全面保护硬盘和数据的安全.AccuSTORS940的RAID控制器使用64-bitRISC处理器,基本缓存(CACHE)为64MB,控制器提供4个通道(Channel),其中两个为主机通道(HostChannel),2个为设备通道(DiskChannel),可同时接驳8块硬盘,最大RAID5容量为7X146GB=1.02TB.在控制器中,可以方便的给设置0,1,3,5,0+1级的RAID组.控制器带有Monitor接口,用户可以通过该接口使用终端或终端仿真程序进行设置,可以对控制器的BIOS程序进行升级.在阵列柜的顶部预留一个插槽,用户可以选装一个备份RAID控制器,以提高系统的可靠性.AccuSTORS940或内部与SCSI硬盘的接口是采用SCA-2规格的整体式后背板,可以直接使用80Pin热插拔硬盘,配备转换口后,也可使用80PinUltra2/Ultra160硬盘.每一硬盘插槽配有隔绝保护IC,以消除硬盘在热插时的电流负效应,避免瞬间电流造成对硬盘或控制器的损害.AccuSTORS940阵列柜安装双份热插拔电源,每个电源的功率300W,通过调整电压开关该电源可以在110/220V电压下工作.正常情况下,双电源在Share状态工作,各输出150W功率,保证电源的使用寿命.如果其中一只电源发生故障,另一电源将自动转换到300W输出功率状态,使阵列继续正常运转.同时系统将通过液晶屏幕和蜂鸣方式发出警报,用户可以将损坏的电源直接拔除,而不必关闭阵列.机箱后背板上装有四个热插拔冷却风扇,风扇的启动温度和转速受ENC控制,用户可以通过ENC上的DIP开关进行设定.所有风扇均采用德国标准的三钢珠结构,使其使用寿命大大延长.阵列柜中安置有8个硬盘盒,可以接驳80针Ultra2/Ultra160SCSI硬盘和SCA硬盘,普通硬盘接入阵列后,即支持热插拔功能.MobileRack可自动为硬盘设置ID,前面板上有指示灯,可以显示硬盘的工作状态.阵列柜后面板上装有HOST-A,HOST-B接口各两个,用来接驳主机.Monitor口可接至终端或PC机,用来进行阵列的设置.Modem口可以接驳调制解调器,用于传真和Pager方式的远程报警.UPS口可连接UPS电源,当断电时UPS系统会送出一PowerFail信号到此UPS接口上,此时磁盘阵列控制器会即刻将缓存(Cache)的资料完整地写入磁盘中,并关闭缓存,如服务器再有资料传来则会直接写入硬盘内,直到电源恢复正常.两个设备通道接口配备终结器,用户可以串联机柜或其他SCSI设备.2.3双机容错系统软件HA久强世纪StorageSolution双机容错系统解决方案提供专用双机软件:HA.HAForNT作为目前市场上最为成熟的双机容错软件,以其友好图形操作界面,方便的配置与管理被广泛应用于政府,学校,电信,电力,石油,交通等行业.通过装在两个服务器中的双机热备份应用软件HA,系统具有在线容错能力,即当处于工作状态的服务器无法正常工作时,通过双机系统容错软件,使处于守候监护状态的另一台服务器迅速接管不正常服务器上的业务程序及数据资料,使得网络用户的业务交易正常运行,保证交易数据的完整一致性及交易业务的高可靠性.通过架设与两台服务器间的侦测网络,HAforNT软件能够对两台服务器的软硬件运行状态实行监控.HAForNT具有两种工作模式:HotStandby:即双机热备份,两台服务器为生产机--备份机关系.当生产机发生故障时,备份机自动接管生产机的任务和数据,使拥护业务交易正常运行.使用者可在最短时间内回复作业,使客户的应用不必中断,减少主机停机所造成的损失.DaulActive:即双机互备援.两台服务器各运行不同的应用任务,并互相作为备份机.当两部主机中任一主机当机时,另一部主机可迅速接替故障主机任务.三,系统整合久强世纪Storagesolution双机容错系统是由HA容错软件与磁盘阵列有机组合的成熟方案.整个系统的组合架构工作包括三个方面:1)硬件系统的连接2)容错软件的安装和配置3)与用户应用的整合3.1硬件系统的连接硬件部分的连接主要包括磁盘阵列与主机的连接和侦测网络的连接.用户可以将支持多主机的磁盘阵列系统分别连接至两台服务器的SCSI接口.磁盘阵列系统提供两条标准68Pin外接SCSI电缆,可与任何服务器的Ultra3SCSI接口接驳.用户不需要在服务器上增加任何硬件设备或驱动程序.磁盘阵列连接至主机后,用户可以象增加普通硬盘那样对其进行分区,格式化,安装文件系统等操作.HAforNT可使用三种侦测网络.RS232线路:只需使用软件附带的专用电缆将两台服务器的串口连接即可;TCP/IP:使用直连网线或通过交换设备(Switch或Hub)连接两台服务器的网卡;ShareDisk:在磁盘阵列柜上设置双主机共享的8MB分区;以上三种侦测网络可同时使用,互为备份,有利于提高双机系统的可靠性.3.2容错软件的安装和配置HA容错软件的安装简单快捷.整个安装过程中,用户不需要进行繁琐的安装选择,或更改服务器硬件配备或操作系统设定与容错软件配合.HAforNT具有友好图形用户界面(GUI),使容错软件的配置管理成为轻松的工作.3.3与用户应用的整合久强世纪Storagesolution双机容错控制系统能够提供具有相当容错能力的应用系统平台.它既可以同所有大型数据库配合使用,也可监管用户自主开发的应用软件.在与容错系统整合时,只需将数据库系统分别在两台服务器安装,并将数据文件放置于共享的磁盘阵列即可,而不需要对应用程序进行任何更改.

@魏金玫15955161720:什么叫容错纠错机制?-容错、纠错机制就是给予改革者、创新者鼓励和保障,比方说给予企业家一定的市场机制或者政策补偿,让他们有一个兜底的保障,从而敢于改革及创新。容错纠错机制的建立,给想干事的干部吃了一颗“定心丸”,消除了他们想干事却担心工作失误或犯错误被揪住不放的顾虑,促使他们在改革创新中放开手脚,激发他们改革创新的热情。不过这里的错”不是一般性的违法乱纪,明知故犯,而是依法秉公用权。

@殷瑞18010706664:自适应控制和容错控制-标准定义就不说了,相信你自己看过了自适应控制是指能够在运行过程中,自动改变控制参数的系统(通常是对PID控制参数进行调节,PID后述),最常用的手段是人工神经网络。最典型的情况是,我没有去精确调节PID的参数,而让系统在实际使用中,根据情况(比如在某一个P值下,室内温度上升的很慢),自动去调整这些参数,以便让系统更加适合具体的环境(而不是对所有环境通用)。具体的机制,说简单了就是如果反馈结果显示P项小了,就增加一点,否则就减小一点(其实真的就是这样简单)容错控制是出于安全和稳定性考虑的,与自控相关的不是很大。容错就是指在部分传感器坏了(比如温度)的情况下,机器人仍能利用可以获得的信息进行工作的控制方式。通常的方法就是利用其他传感器的信息来推算坏掉的传感器的信息,或者干脆采用默认值的方式。下面说下比例积分微分控制(也就是PID控制)比例控制(P)是最好理解的一部分,简单来说就是,温度高的越多,我制冷量就越大。这个是PID中,通常肯定会存在的一项,当加入I和D时,控制器将获得额外好处,如下:I是积分控制,积分用来解决的问题就是消除静差(就是说,你设定的是24度,实际到了25度的时候,制冷量就和室内热量持平了,温度不再降低),通过对误差(差的那1度)进行积分(随时间会越来越大),系统将相应的调整输出以消除静差。D是微分控制,最大的用途是消除震荡(就是一下温度过低了,到23度了,然后加温,加到了25,再降温……),是误差的变化值,这个就和阻尼的作用一样(在摆钟上加阻尼,摆动会越来越小)。实际使用的时候,首先通过当前温度和期望温度计算出误差e,如果需要积分,则是对每个周期的e进行累加(就是都加起来),这里暂时记为ei,如果需要微分,就用本周期的e减去上周期的e,这里记做ed最终输出(制冷量)=kp*e+ki*ei+kd*ed这里kpkikd就是之前提到的PID的参数,可以通过理论计算,但实际引用中都是通过经验给定(简单说就是试)

@岑章洪14526644958:揭秘Spark_checkpoint-checkpoint是什么(1)、Spark在生产环境下经常会面临transformation的RDD非常多(例如一个Job中包含1万个RDD)或者具体transformation的RDD本身计算特别复杂或者耗时(例如计算时长超过1个小时),这个时候就要考虑对计算结果数据持久化保存;(2)、Spark是擅长多步骤迭代的,同时擅长基于Job的复用,这个时候如果能够对曾经计算的过程产生的数据进行复用,就可以极大的提升效率;(3)、如果采用persist把数据放在内存中,虽然是快速的,但是也是最不可靠的;如果把数据放在磁盘上,也不是完全可靠的!例如磁盘会损坏,系统管理员可能清空磁盘。(4)、Checkpoint的产生就是为了相对而言更加可靠的持久化数据,在Checkpoint的时候可以指定把数据放在本地,并且是多副本的方式,但是在生产环境下是放在HDFS上,这就天然的借助了HDFS高容错、高可靠的特征来完成了最大化的可靠的持久化数据的方式;假如进行一个1万个算子操作,在9000个算子的时候persist,数据还是有可能丢失的,但是如果checkpoint,数据丢失的概率几乎为0。checkpoint原理机制1.当RDD使用cache机制从内存中读取数据,如果数据没有读到,会使用checkpoint机制读取数据。此时如果没有checkpoint机制,那么就需要找到父RDD重新计算数据了,因此checkpoint是个很重要的容错机制。checkpoint就是对于一个RDDchain(链)如果后面需要反复使用某些中间结果RDD,可能因为一些故障导致该中间数据丢失,那么就可以针对该RDD启动checkpoint机制,使用checkpoint首先需要调用sparkContext的setCheckpoint方法,设置一个容错文件系统目录,比如hdfs,然后对RDD调用checkpoint方法。之后在RDD所处的job运行结束后,会启动一个单独的job来将checkpoint过的数据写入之前设置的文件系统持久化,进行高可用。所以后面的计算在使用该RDD时,如果数据丢失了,但是还是可以从它的checkpoint中读取数据,不需要重新计算。2.persist或者cache与checkpoint的区别在于,前者持久化只是将数据保存在BlockManager中但是其lineage是不变的,但是后者checkpoint执行完后,rdd已经没有依赖RDD,只有一个checkpointRDD,checkpoint之后,RDD的lineage就改变了。persist或者cache持久化的数据丢失的可能性更大,因为可能磁盘或内存被清理,但是checkpoint的数据通常保存到hdfs上,放在了高容错文件系统。问题:哪些RDD需要cache?会被重复使用的(但不能太大)。问题:用户怎么设定哪些RDD要cache?因为用户只与driverprogram打交道,因此只能用rdd.cache()去cache用户能看到的RDD。所谓能看到指的是调用transformation()后生成的RDD,而某些在transformation()中Spark自己生成的RDD是不能被用户直接cache的,比如reduceByKey()中会生成的ShuffledRDD、MapPartitionsRDD是不能被用户直接cache的。运算时间很长或运算量太大才能得到的RDD,computingchain过长或依赖其他RDD很多的RDD。实际上,将ShuffleMapTask的输出结果存放到本地磁盘也算是checkpoint,只不过这个checkpoint的主要目的是去partition输出数据。问题:什么时候checkpoint?cache机制是每计算出一个要cache的partition就直接将其cache到内存了。但checkpoint没有使用这种第一次计算得到就存储的方法,而是等到job结束后另外启动专门的job去完成checkpoint。也就是说需要checkpoint的RDD会被计算两次。因此,在使用rdd.checkpoint()的时候,建议加上rdd.cache(),这样第二次运行的job就不用再去计算该rdd了,直接读取cache写磁盘。其实Spark提供了rdd.persist(StorageLevel.DISK_ONLY)这样的方法,相当于cache到磁盘上,这样可以做到rdd第一次被计算得到时就存储到磁盘上,但这个persist和checkpoint有很多不同,之后会讨论。RDD需要经过[Initialized-->markedforcheckpointing-->checkpointinginprogress-->checkpointed]这几个阶段才能被checkpoint。Initialized:首先driverprogram需要使用rdd.checkpoint()去设定哪些rdd需要checkpoint,设定后,该rdd就接受RDDCheckpointData管理。用户还要设定checkpoint的存储路径,一般在HDFS上。markedforcheckpointing:初始化后,RDDCheckpointData会将rdd标记为MarkedForCheckpoint。checkpointinginprogress:每个job运行结束后会调用finalRdd.doCheckpoint(),finalRdd会顺着computingchain回溯扫描,碰到要checkpoint的RDD就将其标记为CheckpointingInProgress,然后将写磁盘(比如写HDFS)需要的配置文件(如core-site.xml等)broadcast到其他worker节点上的blockManager。完成以后,启动一个job来完成checkpoint(使用rdd.context.runJob(rdd,CheckpointRDD.writeToFile(path.toString,broadcastedConf)))。checkpointed:job完成checkpoint后,将该rdd的dependency全部清掉,并设定该rdd状态为checkpointed。然后,为该rdd强加一个依赖,设置该rdd的parentrdd为CheckpointRDD,该CheckpointRDD负责以后读取在文件系统上的checkpoint文件,生成该rdd的partition。有意思的是我在driverprogram里checkpoint了两个rdd,结果只有一个(下面的result)被checkpoint成功,pairs2没有被checkpoint,也不知道是bug还是故意只checkpoint下游的RDD:checkPoint是一种容错机制,当我们的程序需要很多transformation操作的时候,如果我们担心中间某些关键的后面会反复几次使用的RDD,可能会因为节点的故障,导致持久化数据的丢失,那么就可以针对该RDD额外启动checkpoint机制,实现容错和高可用。首先要调用SparkContext的setCheckPointDir()方法,设置一个容错的文件系统的目录,比如HDFS;然后对RDD调用checkpoint()方法。之后,在RDD所处的job运行结束之后,会启动一个单独的job,来将checkPoint的RDD的数据写入之前设置的文件系统,进行高可用、容错的类持久化操作。此时就算在后面使用RDD时,它的持久化的数据,不小心丢失了,但是还是可以从它的checkpoint文件中直接读取其数据,从而不需要重新计算。(CacheManager)答:首先使用SparkContext.setCheckpointDir(),设置checkpoint的目录,然后使用RDD.checkpoin进行checkpoint。剖析,当我们使用了checkpoint之后,发生的一系列操作:1、对RDD调用了checkpoint()方法之后,它就接受RDDCheckpointData对象的管理。2、RDDCheckpointData对象,会负责将调用了checkpoint()方法的RDD的状态,设置为MarkedForCheckpoint。3、在RDD所在的那个job运行结束之后,会调用job中,最后一个RDD的doCheckPoint()方法,该方法沿着finalRDD的lineage向上查找,标记为MarkedForCheckpoint的RDD,并将其标记为CheckpointingInProgress。4、然后启动一个单独的job,来将lineage中,标记为CheckpointingInProgress的RDD,进行checkpoint的操作,也就是将这个RDD写入到Sparkcontext.setCheckpointDir()方法设置的文件系统中。答:最主要的区别:在于持久化,只是将数据保存在BlockManager中,但是rdd的lineage没有发生改变。但是checkpoint执行完以后,rdd已经没有之前所谓的依赖rdd了,而只有一个强行为其设置的checkpointRDD,也就是说,checkpoint之后,rdd的lineage就改变了。其次,持久化的数据丢失的可能性更大,无论是磁盘、或者是内存,都有可能丢失;但是checkpoint的数据,通常是保存在容错、高可用的文件系统中的,比如HDFS,依赖于这种高容错的文件西永,所以checkpoint的数据丢失可能性非常低。答:如果一个RDD没有缓存,而且还设置了checkpoint,这样的操作是很悲剧的,细想,本来当前RDD的这个job都执行结束了,但是由于中间的rdd没有持久化,那么checkpointjob想要将rdd的数据写入到外部文件系统中的话,还得从rdd之前所有的rdd,全部重新计算一次,然后才能计算出rdd的数据,再将其checkpoint到外部的文件系统中,所以我们通常建议,对要checkpoint的rdd使用persisit(StorageLevel_DISK_OMLY),该rdd计算之后,就直接将其持久化到磁盘上去,然后后面进行checkpoint操作是,直接从磁盘上读取rdd的数据,并checkpoint到外部文件系统即可,不需要重新计算一次rdd。

@孔瑗15700170373:揭秘Spark_checkpoint-checkpoint是什么(1)、Spark在生产环境下经常会面临transformation的RDD非常多(例如一个Job中包含1万个RDD)或者具体transformation的RDD本身计算特别复杂或者耗时(例如计算时长超过1个小时),这个时候就要考虑对计算结果数据持久化保存;(2)、Spark是擅长多步骤迭代的,同时擅长基于Job的复用,这个时候如果能够对曾经计算的过程产生的数据进行复用,就可以极大的提升效率;(3)、如果采用persist把数据放在内存中,虽然是快速的,但是也是最不可靠的;如果把数据放在磁盘上,也不是完全可靠的!例如磁盘会损坏,系统管理员可能清空磁盘。(4)、Checkpoint的产生就是为了相对而言更加可靠的持久化数据,在Checkpoint的时候可以指定把数据放在本地,并且是多副本的方式,但是在生产环境下是放在HDFS上,这就天然的借助了HDFS高容错、高可靠的特征来完成了最大化的可靠的持久化数据的方式;假如进行一个1万个算子操作,在9000个算子的时候persist,数据还是有可能丢失的,但是如果checkpoint,数据丢失的概率几乎为0。checkpoint原理机制1.当RDD使用cache机制从内存中读取数据,如果数据没有读到,会使用checkpoint机制读取数据。此时如果没有checkpoint机制,那么就需要找到父RDD重新计算数据了,因此checkpoint是个很重要的容错机制。checkpoint就是对于一个RDDchain(链)如果后面需要反复使用某些中间结果RDD,可能因为一些故障导致该中间数据丢失,那么就可以针对该RDD启动checkpoint机制,使用checkpoint首先需要调用sparkContext的setCheckpoint方法,设置一个容错文件系统目录,比如hdfs,然后对RDD调用checkpoint方法。之后在RDD所处的job运行结束后,会启动一个单独的job来将checkpoint过的数据写入之前设置的文件系统持久化,进行高可用。所以后面的计算在使用该RDD时,如果数据丢失了,但是还是可以从它的checkpoint中读取数据,不需要重新计算。2.persist或者cache与checkpoint的区别在于,前者持久化只是将数据保存在BlockManager中但是其lineage是不变的,但是后者checkpoint执行完后,rdd已经没有依赖RDD,只有一个checkpointRDD,checkpoint之后,RDD的lineage就改变了。persist或者cache持久化的数据丢失的可能性更大,因为可能磁盘或内存被清理,但是checkpoint的数据通常保存到hdfs上,放在了高容错文件系统。问题:哪些RDD需要cache?会被重复使用的(但不能太大)。问题:用户怎么设定哪些RDD要cache?因为用户只与driverprogram打交道,因此只能用rdd.cache()去cache用户能看到的RDD。所谓能看到指的是调用transformation()后生成的RDD,而某些在transformation()中Spark自己生成的RDD是不能被用户直接cache的,比如reduceByKey()中会生成的ShuffledRDD、MapPartitionsRDD是不能被用户直接cache的。运算时间很长或运算量太大才能得到的RDD,computingchain过长或依赖其他RDD很多的RDD。实际上,将ShuffleMapTask的输出结果存放到本地磁盘也算是checkpoint,只不过这个checkpoint的主要目的是去partition输出数据。问题:什么时候checkpoint?cache机制是每计算出一个要cache的partition就直接将其cache到内存了。但checkpoint没有使用这种第一次计算得到就存储的方法,而是等到job结束后另外启动专门的job去完成checkpoint。也就是说需要checkpoint的RDD会被计算两次。因此,在使用rdd.checkpoint()的时候,建议加上rdd.cache(),这样第二次运行的job就不用再去计算该rdd了,直接读取cache写磁盘。其实Spark提供了rdd.persist(StorageLevel.DISK_ONLY)这样的方法,相当于cache到磁盘上,这样可以做到rdd第一次被计算得到时就存储到磁盘上,但这个persist和checkpoint有很多不同,之后会讨论。RDD需要经过[Initialized-->markedforcheckpointing-->checkpointinginprogress-->checkpointed]这几个阶段才能被checkpoint。Initialized:首先driverprogram需要使用rdd.checkpoint()去设定哪些rdd需要checkpoint,设定后,该rdd就接受RDDCheckpointData管理。用户还要设定checkpoint的存储路径,一般在HDFS上。markedforcheckpointing:初始化后,RDDCheckpointData会将rdd标记为MarkedForCheckpoint。checkpointinginprogress:每个job运行结束后会调用finalRdd.doCheckpoint(),finalRdd会顺着computingchain回溯扫描,碰到要checkpoint的RDD就将其标记为CheckpointingInProgress,然后将写磁盘(比如写HDFS)需要的配置文件(如core-site.xml等)broadcast到其他worker节点上的blockManager。完成以后,启动一个job来完成checkpoint(使用rdd.context.runJob(rdd,CheckpointRDD.writeToFile(path.toString,broadcastedConf)))。checkpointed:job完成checkpoint后,将该rdd的dependency全部清掉,并设定该rdd状态为checkpointed。然后,为该rdd强加一个依赖,设置该rdd的parentrdd为CheckpointRDD,该CheckpointRDD负责以后读取在文件系统上的checkpoint文件,生成该rdd的partition。有意思的是我在driverprogram里checkpoint了两个rdd,结果只有一个(下面的result)被checkpoint成功,pairs2没有被checkpoint,也不知道是bug还是故意只checkpoint下游的RDD:checkPoint是一种容错机制,当我们的程序需要很多transformation操作的时候,如果我们担心中间某些关键的后面会反复几次使用的RDD,可能会因为节点的故障,导致持久化数据的丢失,那么就可以针对该RDD额外启动checkpoint机制,实现容错和高可用。首先要调用SparkContext的setCheckPointDir()方法,设置一个容错的文件系统的目录,比如HDFS;然后对RDD调用checkpoint()方法。之后,在RDD所处的job运行结束之后,会启动一个单独的job,来将checkPoint的RDD的数据写入之前设置的文件系统,进行高可用、容错的类持久化操作。此时就算在后面使用RDD时,它的持久化的数据,不小心丢失了,但是还是可以从它的checkpoint文件中直接读取其数据,从而不需要重新计算。(CacheManager)答:首先使用SparkContext.setCheckpointDir(),设置checkpoint的目录,然后使用RDD.checkpoin进行checkpoint。剖析,当我们使用了checkpoint之后,发生的一系列操作:1、对RDD调用了checkpoint()方法之后,它就接受RDDCheckpointData对象的管理。2、RDDCheckpointData对象,会负责将调用了checkpoint()方法的RDD的状态,设置为MarkedForCheckpoint。3、在RDD所在的那个job运行结束之后,会调用job中,最后一个RDD的doCheckPoint()方法,该方法沿着finalRDD的lineage向上查找,标记为MarkedForCheckpoint的RDD,并将其标记为CheckpointingInProgress。4、然后启动一个单独的job,来将lineage中,标记为CheckpointingInProgress的RDD,进行checkpoint的操作,也就是将这个RDD写入到Sparkcontext.setCheckpointDir()方法设置的文件系统中。答:最主要的区别:在于持久化,只是将数据保存在BlockManager中,但是rdd的lineage没有发生改变。但是checkpoint执行完以后,rdd已经没有之前所谓的依赖rdd了,而只有一个强行为其设置的checkpointRDD,也就是说,checkpoint之后,rdd的lineage就改变了。其次,持久化的数据丢失的可能性更大,无论是磁盘、或者是内存,都有可能丢失;但是checkpoint的数据,通常是保存在容错、高可用的文件系统中的,比如HDFS,依赖于这种高容错的文件西永,所以checkpoint的数据丢失可能性非常低。答:如果一个RDD没有缓存,而且还设置了checkpoint,这样的操作是很悲剧的,细想,本来当前RDD的这个job都执行结束了,但是由于中间的rdd没有持久化,那么checkpointjob想要将rdd的数据写入到外部文件系统中的话,还得从rdd之前所有的rdd,全部重新计算一次,然后才能计算出rdd的数据,再将其checkpoint到外部的文件系统中,所以我们通常建议,对要checkpoint的rdd使用persisit(StorageLevel_DISK_OMLY),该rdd计算之后,就直接将其持久化到磁盘上去,然后后面进行checkpoint操作是,直接从磁盘上读取rdd的数据,并checkpoint到外部文件系统即可,不需要重新计算一次rdd。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至举报,一经查实,本站将立刻删除。

最新文章