HDFS NameNode重启优化

本文已发表于InfoQ,下面的版本又经过少量修订。

一、背景

在Hadoop集群整个生命周期里,由于调整参数、Patch、升级等多种场景需要频繁操作NameNode重启,不论采用何种架构,重启期间集群整体存在可用性和可靠性的风险,所以优化NameNode重启非常关键。

本文基于Hadoop-2.x和HA with QJM社区架构和系统设计(如图1所示),通过梳理NameNode重启流程,并在此基础上,阐述对NameNode重启优化实践。


图1 HDFS HA with QJM架构图示

二、NameNode重启流程

在HDFS的整个运行期里,所有元数据均在NameNode的内存集中管理,但是由于内存易失特性,一旦出现进程退出、宕机等异常情况,所有元数据都会丢失,给整个系统的数据安全会造成不可恢复的灾难。为了更好的容错能力,NameNode会周期进行CheckPoint,将其中的一部分元数据(文件系统的目录树Namespace)刷到持久化设备上,即二进制文件FSImage,这样的话即使NameNode出现异常也能从持久化设备上恢复元数据,保证了数据的安全可靠。

但是仅周期进行CheckPoint仍然无法保证所有数据的可靠,如前次CheckPoint之后写入的数据依然存在丢失的问题,所以将两次CheckPoint之间对Namespace写操作实时写入EditLog文件,通过这种方式可以保证HDFS元数据的绝对安全可靠。

事实上,除Namespace外,NameNode还管理非常重要的元数据BlocksMap,描述数据块Block与DataNode节点之间的对应关系。NameNode并没有对这部分元数据同样操作持久化,原因是每个DataNode已经持有属于自己管理的Block集合,将所有DataNode的Block集合汇总后即可构造出完整BlocksMap。

HA with QJM架构下,NameNode的整个重启过程中始终以SBN(StandbyNameNode)角色完成。与前述流程对应,启动过程分以下几个阶段:
1. 加载FSImage; 2. 回放EditLog;
3. 执行CheckPoint(非必须步骤,结合实际情况和参数确定,后续详述); 4. 收集所有DataNode的注册和数据块汇报。

默认情况下,NameNode会保存两个FSImage文件,与此对应,也会保存对应两次CheckPoint之后的所有EditLog文件。一般来说,NameNode重启后,通过对FSImage文件名称判断,选择加载最新的FSImage文件及回放该CheckPoint之后生成的所有EditLog,完成后根据加载的EditLog中操作条目数及距上次CheckPoint时间间隔(后续详述)确定是否需要执行CheckPoint,之后进入等待所有DataNode注册和元数据汇报阶段,当这部分数据收集完成后,NameNode的重启流程结束。

从线上NameNode历次重启时间数据看,各阶段耗时占比基本接近如图2所示。


图2 NameNode重启各阶段耗时占比

经过优化,在元数据总量540M(目录树240M,数据块300M),超过4K规模的集群上重启NameNode总时间~35min,其中加载FSImage耗时~15min,秒级回放EditLog,数据块汇报耗时~20min,基本能够满足生产环境的需求。

2.1 加载FSImage

如前述,FSImage文件记录了HDFS整个目录树Namespace相关的元数据。从Hadoop-2.4.0起,FSImage开始采用Google Protobuf编码格式描述(HDFS-5698),详细描述文件见fsimage.proto。根据描述文件和实现逻辑,FSImage文件格式如图3所示。


图3 FSImage文件格式

从fsimage.proto和FSImage文件存储格式容易看到,除了必要的文件头部校验(MAGIC)和尾部文件索引(FILESUMMARY)外,主要包含以下核心数据:

  1. NS_INFO(NameSystemSection):记录HDFS文件系统的全局信息,包括NameSystem的ID,当前已经分配出去的最大Block ID以及Transaction ID等信息;
  2. INODE(INodeSection):整个目录树所有节点数据,包括INodeFile/INodeDirectory/INodeSymlink等所有类型节点的属性数据,其中记录了如节点ID,节点名称,访问权限,创建和访问时间等等信息;
  3. INODE_DIR(INodeDirectorySection):整个目录树中所有节点之间的父子关系,配合INODE可构建完整的目录树;
  4. FILES_UNDERCONSTRUCTION(FilesUnderConstructionSection):尚未完成写入的文件集合,主要为重启时重建Lease集合;
  5. SNAPSHOT(SnapshotSection):记录Snapshot数据,快照是Hadoop 2.1.0引入的新特性,用于数据备份、回滚,以防止因用户误操作导致集群出现数据问题;
  6. SNAPSHOT_DIFF(SnapshotDiffSection):执行快照操作的目录/文件的Diff集合数据,与SNAPSHOT一起构建较完整的快照管理能力;
  7. SECRET_MANAGER(SecretManagerSection):记录DelegationKey和DelegationToken数据,根据DelegationKey及由DelegationToken构造出的DelegationTokenIdentifier方便进一步计算密码,以上数据可以完善所有合法Token集合;
  8. CACHE_MANAGER(CacheManagerSection):集中式缓存特性全局信息,集中式缓存特性是Hadoop-2.3.0为提升数据读性能引入的新特性;
  9. STRING_TABLE(StringTableSection):字符串到ID的映射表,维护目录/文件的Permission字符到ID的映射,节省存储空间。

NameNode执行CheckPoint时,遵循Protobuf定义及上述文件格式描述,重启加载FSImage时,同样按照Protobuf定义的格式从文件流中读出相应数据构建整个目录树Namespace及其他元数据。将FSImage文件从持久化设备加载到内存并构建出目录树结构后,实际上并没有完全恢复元数据到最新状态,因为每次CheckPoint之后还可能存在大量HDFS写操作。

2.2 回放EditLog

NameNode在响应客户端的写请求前,会首先更新内存相关元数据,然后再把这些操作记录在EditLog文件中,可以看到内存状态实际上要比EditLog数据更及时。

记录在EditLog之中的每个操作又称为一个事务,对应一个整数形式的事务编号。在当前实现中多个事务组成一个Segment,生成独立的EditLog文件,其中文件名称标记了起止的事务编号,正在写入的EditLog文件仅标记起始事务编号。EditLog文件的格式非常简单,没再通过Google Protobuf描述,文件格式如图4所示。


图4 EditLog文件格式

一个完整的EditLog文件包括四个部分内容,分别是:
* LAYOUTVERSION:版本信息;
* OP_START_LOG_SEGMENT:标识文件开始;
* RECORD:顺序逐个记录HDFS写操作的事务内容;
* OP_END_LOG_SEGMENT:标记文件结束。

NameNode加载FSImage完成后,即开始对该FSImage文件之后(通过比较FSImage文件名称中包含的事务编号与EditLog文件名称的起始事务编号大小确定)生成的所有EditLog严格按照事务编号从小到大逐个遵循上述的格式进行每一个HDFS写操作事务回放。

NameNode加载完所有必需的EditLog文件数据后,内存中的目录树即恢复到了最新状态。

2.3 DataNode注册汇报

经过前面两个步骤,主要的元数据被构建,HDFS的整个目录树被完整建立,但是并没有掌握数据块Block与DataNode之间的对应关系BlocksMap,甚至对DataNode的情况都不掌握,所以需要等待DataNode注册,并完成对从DataNode汇报上来的数据块汇总。待汇总的数据量达到预设比例(dfs.namenode.safemode.threshold-pct)后退出Safemode。

NameNode重启经过加载FSImage和回放EditLog后,所有DataNode不管进程是否发生过重启,都必须经过以下两个步骤: 1. DataNode重新注册RegisterDataNode;
2. DataNode汇报所有数据块BlockReport。

对于节点规模较大和元数据量较大的集群,这个阶段的耗时会非常可观。主要有三点原因:
1. 处理BlockReport的逻辑比较复杂,相对其他RPC操作耗时较长。图5对比了BlockReport和AddBlock两种不同RPC的处理时间,尽管AddBlock操作也相对复杂,但是对比来看,BlockReport的处理时间显著高于AddBlock处理时间;
2. NameNode对每一个BlockReport的RPC请求处理都需要持有全局锁,也就是说对于BlockReport类型RPC请求实际上是串行处理;
3. NameNode重启时所有DataNode集中在同一时间段进行BlockReport请求。


图5 BlockReport和AddBlock两个RPC处理时间对比

之前我们在NameNode内存全景一文中详细描述过Block在NameNode元数据中的关键作用及与Namespace/DataNode/BlocksMap的复杂关系,从中也可以看出,每个新增Block需要维护多个关系,更何况重启过程中所有Block都需要建立同样复杂关系,所以耗时相对较高。

三、重启优化

根据前面对NameNode重启过程的简单梳理,在各个阶段可以适当的实施优化以加快NameNode重启过程。

HDFS-7097 解决重启过程中SBN执行CheckPoint时不能处理BlockReport请求的问题

Fix:2.7.0

Hadoop-2.7.0版本前,SBN(StandbyNameNode)在执行CheckPoint操作前会先获得全局读写锁fsLock,在此期间,BlockReport请求由于不能获得全局写锁会持续处于等待状态,直到CheckPoint完成后释放了fsLock锁后才能继续。NameNode重启的第三个阶段,同样存在这种情况。而且对于规模较大的集群,每次CheckPoint时间在分钟级别,对整个重启过程影响非常大。实际上,CheckPoint是对目录树的持久化操作,并不涉及BlocksMap数据结构,所以CheckPoint期间是可以让BlockReport请求直接通过,这样可以节省期间BlockReport排队等待带来的时间开销,HDFS-7097正是将锁粒度放小解决了CheckPoint过程不能处理BlockReport类型RPC请求的问题。

与HDFS-7097相对,另一种思路也值得借鉴,就是重启过程尽可能避免出现CheckPoint。触发CheckPoint有两种情况:时间周期或HDFS写操作事务数,分别通过参数dfs.namenode.checkpoint.period和dfs.namenode.checkpoint.txns控制,默认值分别是3600s和1,000,000,即默认情况下一个小时或者写操作的事务数超过1,000,000触发一次CheckPoint。为了避免在重启过程中频繁执行CheckPoint,可以适当调大dfs.namenode.checkpoint.txns,建议值10,000,000 ~ 20,000,000,带来的影响是EditLog文件累计的个数会稍有增加。从实践经验上看,对一个有亿级别元数据量的NameNode,回放一个EditLog文件(默认1,000,000写操作事务)时间在秒级,但是执行一次CheckPoint时间通常在分钟级别,综合权衡减少CheckPoint次数和增加EditLog文件数收益比较明显。

HDFS-6763 解决SBN每间隔1min全局计算和验证Quota值导致进程Hang住数秒的问题

Fix:2.8.0

ANN(ActiveNameNode)将HDFS写操作实时写入JN的EditLog文件,为同步数据,SBN默认间隔1min从JN拉取一次EditLog文件并进行回放,完成后执行全局Quota检查和计算,当Namespace规模变大后,全局计算和检查Quota会非常耗时,在此期间,整个SBN的Namenode进程会被Hang住,以至于包括DN心跳和BlockReport在内的所有RPC请求都不能及时处理。NameNode重启过程中这个问题影响突出。

实际上,SBN在EditLog Tailer阶段计算和检查Quota完全没有必要,HDFS-6763将这段处理逻辑后移到主从切换时进行,解决SBN进程间隔1min被Hang住的问题。

从优化效果上看,对一个拥有接近五亿元数据量,其中两亿数据块的NameNode,优化前数据块汇报阶段耗时~30min,其中触发超过20次由于计算和检查Quota导致进程Hang住~20s的情况,整个BlockReport阶段存在超过5min无效时间开销,优化后可到~25min。

HDFS-7980 简化首次BlockReport处理逻辑优化重启时间

Fix:2.7.1

NameNode加载完元数据后,所有DataNode尝试开始进行数据块汇报,如果汇报的数据块相关元数据还没有加载,先暂存消息队列,当NameNode完成加载相关元数据后,再处理该消息队列。对第一次块汇报的处理比较特别(NameNode重启后,所有DataNode的BlockReport都会被标记成首次数据块汇报),为提高处理速度,仅验证块是否损坏,之后判断块状态是否为FINALIZED,若是建立数据块与DataNode的映射关系,建立与目录树中文件的关联关系,其他信息一概暂不处理。对于非初次数据块汇报,处理逻辑要复杂很多,对报告的每个数据块,不仅检查是否损坏,是否为FINALIZED状态,还会检查是否无效,是否需要删除,是否为UC状态等等;验证通过后建立数据块与DataNode的映射关系,建立与目录树中文件的关联关系。

初次数据块汇报的处理逻辑独立出来,主要原因有两方面:
* 加快NameNode的启动时间;测试数据显示含~500M元数据的NameNode在处理800K个数据块的初次块汇报的处理时间比正常块汇报的处理时间可降低一个数量级; * 启动过程中,不提供正常读写服务,所以只要确保正常数据(整个Namespace和所有FINALIZED状态Blocks)无误,无效和冗余数据处理完全可以延后到IBR(IncrementalBlockReport)或下次BR(BlockReport)。

这本来是非常合理和正常的设计逻辑,但是实现时NameNode在判断是否为首次数据块块汇报的逻辑一直存在问题,导致这段非常好的改进点逻辑实际上长期并未真正执行到,直到HDFS-7980在Hadoop-2.7.1修复该问题。HDFS-7980的优化效果非常明显,测试显示,对含80K Blocks的BlockReport RPC请求的处理时间从~500ms可优化到~100ms,从重启期整个BlockReport阶段看,在超过600M元数据,其中300M数据块的NameNode显示该阶段从~50min优化到~25min。

HDFS-7503 解决重启前大删除操作会造成重启后锁内写日志降低处理能力

Fix:2.7.0

若NameNode重启前产生过大删除操作,当NameNode加载完FSImage并回放了所有EditLog构建起最新目录树结构后,在处理DataNode的BlockReport时,会发现有大量Block不属于任何文件,Hadoop-2.7.0版本前,对于这类情况的输出日志逻辑在全局锁内,由于存在大量IO操作的耗时,会严重拉长处理BlockReport的处理时间,影响NameNode重启时间。HDFS-7503的解决办法非常简单,把日志输出逻辑移出全局锁外。线上效果上看对同类场景优化比较明显,不过如果重启前不触发大的删除操作影响不大。

防止热备节点SBN(StandbyNameNode)/冷备节点SNN(SecondaryNameNode)长时间未正常运行堆积大量Editlog拖慢NameNode重启时间

选择HA热备方案SBN(StandbyNameNode)还是冷备方案SNN(SecondaryNameNode)架构,执行CheckPoint的逻辑几乎一致,如图6所示。如果SBN/SNN服务长时间未正常运行,CheckPoint不能按照预期执行,这样会积压大量EditLog。积压的EditLog文件越多,重启NameNode需要加载EditLog时间越长。所以尽可能避免出现SNN/SBN长时间未正常服务的状态。


图6 CheckPoint流程

在一个有500M元数据的NameNode上测试加载一个200K次HDFS事务操作的EditLog文件耗时~5s,按照默认2min的EditLog滚动周期,如果一周时间SBN/SNN未能正常工作,则会累积~5K个EditLog文件,此后一旦发生NameNode重启,仅加载EditLog文件的时间就需要~7h,也就是整个集群存在超过7h不可用风险,所以切记要保证SBN/SNN不能长时间故障。

HDFS-6425 HDFS-6772 NameNode重启后DataNode快速退出blockContentsStale状态防止PostponedMisreplicatedBlocks过大影响对其他RPC请求的处理能力

Fix: 2.6.0, 2.7.0

当集群中大量数据块的实际存储副本个数超过副本数时(跨机房架构下这种情况比较常见),NameNode重启后会迅速填充到PostponedMisreplicatedBlocks,直到相关数据块所在的所有DataNode汇报完成且退出Stale状态后才能被清理。如果PostponedMisreplicatedBlocks数据量较大,每次全遍历需要消耗大量时间,且整个过程也要持有全局锁,严重影响处理BlockReport的性能,HDFS-6425和HDFS-6772分别将可能在BlockReport逻辑内部遍历非常大的数据结构PostponedMisreplicatedBlocks优化到异步执行,并在NameNode重启后让DataNode快速退出blockContentsStale状态避免PostponedMisreplicatedBlocks过大入手优化重启效率。

降低BlockReport时数据规模

NameNode处理BlockReport的效率低主要原因还是每次BlockReport所带的Block规模过大造成,所以可以通过调整Block数量阈值,将一次BlockReport分成多盘分别汇报,以提高NameNode对BlockReport的处理效率。可参考的参数为:dfs.blockreport.split.threshold,默认值1,000,000,即当DataNode本地的Block个数超过1,000,000时才会分盘进行汇报,建议将该参数适当调小,具体数值可结合NameNode的处理BlockReport时间及集群中所有DataNode管理的Block量分布确定。

重启完成后对比检查数据块上报情况

前面提到NameNode汇总DataNode上报的数据块量达到预设比例(dfs.namenode.safemode.threshold-pct)后就会退出Safemode,一般情况下,当NameNode退出Safemode后,我们认为已经具备提供正常服务的条件。但是对规模较大的集群,按照这种默认策略及时执行主从切换后,容易出现短时间丢块的问题。考虑在200M数据块的集群,默认配置项dfs.namenode.safemode.threshold-pct=0.999,也就是当NameNode收集到200M*0.999=199.8M数据块后即可退出Safemode,此时实际上还有200K数据块没有上报,如果强行执行主从切换,会出现大量的丢块问题,直到数据块汇报完成。应对的办法比较简单,尝试调大dfs.namenode.safemode.threshold-pct到1,这样只有所有数据块上报后才会退出Safemode。但是这种办法一样不能保证万无一失,如果启动过程中有DataNode汇报完数据块后进程挂掉,同样存在短时间丢失数据的问题,因为NameNode汇总上报数据块时并不检查副本数,所以更稳妥的解决办法是利用主从NameNode的JMX数据对比所有DataNode当前汇报数据块量的差异,当差异都较小后再执行主从切换可以保证不发生上述问题。

其他

除了优化NameNode重启时间,实际运维中还会遇到需要滚动重启集群所有节点或者一次性重启整集群的情况,不恰当的重启方式也会严重影响服务的恢复时间,所以合理控制重启的节奏或选择合适的重启方式尤为关键,HDFS集群启动方式分析一文对集群重启方式进行了详细的阐述,这里就不再展开。

经过多次优化调整,从线上NameNode历次的重启时间监控指标上看,收益非常明显,图7截取了其中几次NameNode重启时元数据量及重启时间开销对比,图中直观显示在500M元数据量级下,重启时间从~4000s优化到~2000s。


图7 NameNode重启时间对比

这里罗列了一小部分实践过程中可以有效优化重启NameNode时间或者重启全集群的点,其中包括了社区成熟Patch和相关参数优化,虽然实现逻辑都很小,但是实践收益非常明显。当然除了上述提到,NameNode重启还有很多可以优化的地方,比如优化FSImage格式,并行加载等等,社区也在持续关注和优化,部分讨论的思路也值得关注、借鉴和参考。

四、总结

NameNode重启甚至全集群重启在整个Hadoop集群的生命周期内是比较频繁的运维操作,优化重启时间可以极大提升运维效率,避免可能存在的风险。本文通过分析NameNode启动流程,并结合实践过程简单罗列了几个供参考的有效优化点,借此希望能给实践过程提供可优化的方向和思路。

五、参考文献

  • NameNode内存全景
  • NameNode内存详解
  • Apache Hadoop
  • Hadoop Source
  • HDFS Issues
  • Cloudera Blog

作者简介

小桥,美团点评技术工程部数据平台研发工程师。2012年北京航空航天大学毕业,2015年初加入美团点评,关注Hadoop生态存储方向,致力于为美团点评提供稳定、高效、易用的离线数据存储服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/478336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 4. 寻找两个有序数组的中位数(二分查找,难)

文章目录1. 题目2. 解题2.1 合并数组2.2 优化2.1解法,双指针2.3 二分法(找第k个数)2.4 切分法1. 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为O(log(mn…

论文浅尝 | 当Hearst还不够时:用分布模型来提升语料库中的上下义关系检测

笔记整理 | 潘晓梅,东南大学硕士,研究方向为知识图谱构建、自然语言处理。来源:EMNLP 2020.论文下载地址: https://www.aclweb.org/anthology/2020.emnlp-main.502.pdf项目源码地址: https://github.com/ccclyu/ComHyp…

python 连接 rabbitMQ以及rabbitMQssl注意事项,password

pip3 install pika1.1.0官方对于pika有如下介绍# Since threads aren’t appropriate to every situation, it doesn’t require threads. Pika core takes care not to forbid them, either. The same goes for greenlets, callbacks, continuations, and generators. An inst…

LeetCode 887. 鸡蛋掉落(DP,难、不懂)

1. 题目 你将获得 K 个鸡蛋&#xff0c;并可以使用一栋从 1 到 N 共有 N 层楼的建筑。 每个蛋的功能都是一样的&#xff0c;如果一个蛋碎了&#xff0c;你就不能再把它掉下去。 你知道存在楼层 F &#xff0c;满足 0 < F < N 任何从高于 F 的楼层落下的鸡蛋都会碎&…

正确的LeetCode刷题姿势!

名师 带你刷爆LeetCode算法知识 讲解训练免费0元报名参加在讲到 AI 算法工程师时&#xff0c;大部分同学关注点都在高大上的模型&#xff0c;一线优秀的项目。但大家往往忽略了一点&#xff0c;人工智能的模型、项目最终还是要靠程序和算法实现。算法能力是每一个程序员的基本功…

论文浅尝 | DI刊发的那些有关Knowledge Graph的论文

本文转载自公众号&#xff1a;数据智能英文刊知识图谱被称为人工智能的基石&#xff0c;它的前身是语义网&#xff0c;由谷歌在2012年率先提出&#xff0c;用于改善自身的搜索业务。Data Intelligence执行主编、东南大学计算机科学与技术学院漆桂林教授这样定义知识图谱&#x…

缓存那些事

本文已发表于《程序员》杂志2017年第3期&#xff0c;下面的版本又经过进一步的修订。 一般而言&#xff0c;现在互联网应用&#xff08;网站或App&#xff09;的整体流程&#xff0c;可以概括如图1所示&#xff0c;用户请求从界面&#xff08;浏览器或App界面&#xff09;到网络…

浅析消息队列 RabbitMQ

浅析消息队列 RabbitMQhttps://www.pianshen.com/article/4275953257/

LeetCode 42. 接雨水(双指针、单调栈)

文章目录1. 题目2. 解题2.1 正反扫描法2.2 双指针2.3 单调栈1. 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#xff0c;在这种情况下&am…

论文浅尝 - IJCAI | Knowledge is NOT always you need: 外部知识注入预训练模型的利与弊...

转载公众号 | 浙大KG论文题目&#xff1a;Drop Redundant, Shrink Irrelevant: Selective Knowledge Injection for Language Model Pretraining本文作者&#xff1a;张宁豫&#xff08;浙江大学&#xff09;、邓淑敏&#xff08;浙江大学&#xff09;、张亦弛&#xff08;阿里…

圆形的CNN卷积核?华中大清华康奈尔提出圆形卷积,进一步提升卷积结构性能!...

文 | 小马编 | 极市平台写在前面目前正常卷积的感受野大多都是一个矩形的&#xff0c;因为矩形更有利于储存和计算数据的方便。但是&#xff0c;人类视觉系统的感受野更像是一个圆形的。因此&#xff0c;作者就提出&#xff0c;能不能将CNN卷积核的感受野也变成圆形呢&#xff…

Android自定义Lint实践

Android Lint是Google提供给Android开发者的静态代码检查工具。使用Lint对Android工程代码进行扫描和检查&#xff0c;可以发现代码潜在的问题&#xff0c;提醒程序员及早修正。 为保证代码质量&#xff0c;美团在开发流程中加入了代码检查&#xff0c;如果代码检测到问题&…

关于PaddleNLP如何加载训练好的模型进行NER

关于PaddleNLP如何加载训练好的模型进行NER 关于PaddleNLP如何加载训练好的模型进行NER 当时在如何加载已经训练好的模型的问题上花了很长时间&#xff0c;后来也是受另一篇文章启发&#xff0c;问题才得以解决&#xff0c;此文章写的很详细&#xff0c;所以不再详细介绍&#…

论文浅尝 | 利用机器翻译和多任务学习进行复杂的知识图谱问答

笔记整理 | 谭亦鸣&#xff0c;东南大学博士生。来源&#xff1a;EACL‘21链接&#xff1a;https://www.aclweb.org/anthology/2021.eacl-main.300.pdf概述知识图谱问答过程一般包括实体链接&#xff0c;多跳推理等步骤&#xff0c;传统方法将各个步骤作为模块单独处理&#xf…

LeetCode 134. 加油站(贪心)

文章目录1. 题目2. 解题1. 题目 在一条环路上有 N 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 …

诺奖级成果开源!为什么说AlphaFold2足以改变全人类?

文 | 炼丹学徒编 | 小轶前天&#xff0c;AlphaFold2开源&#xff0c;相信大家被大大小小的公众号刷屏了。谷歌Deepmind团队此前使用基于Transformer的模型&#xff0c;在CASP14比赛上&#xff0c;刷新蛋白质三维结构预测的新高度&#xff0c;而详细论文&#xff0c;代码&#x…

美团外卖前端可视化界面组装平台 —— 乐高

乐高&#xff0c;是美团点评一个快速搭建后台系统页面的平台。名称来源于大家熟悉的丹麦知名玩具品牌&#xff0c;他们的玩具都是通过组合易拆卸、装配的零件&#xff0c;形成最终的作品。经过长期的发展&#xff0c;乐高品牌渐渐有了“快乐、想象、创意的未来”的寓意。 随着外…

[Paddle2.0学习之第四步](下)词向量之CBOW

[Paddle2.0学习之第四步]&#xff08;下&#xff09;词向量之CBOW&#xff1a;https://blog.csdn.net/qq_41976613/article/details/118977184

论文浅尝 | 主题驱动的分子图表示对比学习

笔记整理 | 方尹&#xff0c;浙江大学在读博士&#xff0c;研究方向&#xff1a;图表示学习。论文地址&#xff1a;https://arxiv.org/abs/2012.12533动机与贡献现有的对比学习框架中可能存在以下几个弊端&#xff1a;1.把节点看成一种视图&#xff0c;在节点和图之间进行对比学…