一文搞定Journal Node原理

【概述】


hdfs的HA机制,具体来说可以分为两部分,一部分是基于zkfc、zookeeper完成nn之间的选主;而另一部分则是nn之间的元数据共享与同步。

从hdfs2.0版本开始,引入了HA using Quroum Journal Manager(QJM)方案。

QJM的思想最初来源于paxos协议。在具体实现中,Journal Node(JN)集群作为NN之间editlog的一致性存储系统,也是HDFS高可用方案中的核心组件。

通过JN,ANN可以尽可能及时的将元数据同步到SNN,ANN通过push的方式将editlog写入JN集群,而SNN通过pull的方式从JN中读取editlog,JN之间彼此不主动进行数据的交互。

由于paxos协议的关系,读写JN都要求至少大多数节点成功返回才认为本次请求是成功的。另外,2N+1台JN组成的集群,最多可以容忍N个JN节点异常。因此整体具有很强的HA能力。

本文就其中的一些细节展开进行说明。

【JN中的概念与持久化文件】


一些概念:

  • epoch

    epoch是paxos协议中的一个概念,可以用于标识leader。

    而具体实现中,epoch是一个单调递增的整数,用来标识每一次ANN的生命周期,每发生一次NN的主备切换,epoch就会加1。

    ANN后续的每个请求中,都会携带epoch,同时JN会对请求进行校验,如果携带的epoch比本地存储的小,则抛出异常;而如果携带的epoch比本地存储的大,则更新本地的epoch。

    这就意味着,不管怎样进行NN的切换,任意时刻都只能有1个NN成功写JN。

  • txid

    每条写入的editlog都有一个对应的递增的事务ID。

  • segment

    多个连续的事务(txid)组成一个segment,持久化到一个对应的editlog文件中。

    这样,对应到具体实现中, 任何时间,JN上只会有一个segment处于正在写的状态(Inprogress),而其他的segment文件则都处于写完关闭的状态(Finalized)

JN中的持久化文件:

|-- current
|   |-- committed-txid
|   |-- edits_0000000000000000001-0000000000000000002
|   |-- edits_inprogress_0000000000000000003
|   |-- last-promised-epoch
|   |-- last-writer-epoch
|   |-- paxos
|   |-- VERSION
|-- in_use.lock
  • last-promised-epoch

    有两个地方会写入,一个是ANN发送新的epoch的rpc请求时,会进行更新;另一个是每次editlog的写请求时,会判断请求中的epoch是否比本地的epoch大,如果是则进行更新,否则会抛出异常。

  • last-writer-epoch

    每写一个新的segment时,检查请求中的epoch是比上次写入的epoch大,如果大,则将当前请求中的epoch写入文件中。

  • committed-txid

    处理每个写editlog的事务请求中,同步更新本地记录的事务ID。

  • edits_$starttxid-$end

### NLP基础知识与学习路径 自然语言处理(Natural Language Processing, NLP)作为计算机科学和人工智能的重要分支,其目标在于使计算机能够理解和生成人类语言。这是一门融合了语言学、计算机科学以及数学等多个学科的综合性科学[^2]。 #### 数学基础的重要性 对于初学者而言,扎实的数学基础是不可或缺的一部分。线性代数、概率论与统计学构成了NLP的核心工具集。这些知识不仅帮助理解算法原理,还支持构建更高效的模型架构。 #### 词向量技术简介 在现代NLP实践中,`词向量(Word Embedding)`扮演着极为重要的角色。这是一种将词汇映射到连续空间上的高维数值表示方法。通过这种方式,可以有效地捕获词语间的语义相似性和句法结构特性。常见的预训练模型如`Word2Vec`, `GloVe` 和基于Transformer架构的`BERT`均依赖于此类嵌入机制来增强表达能力[^3]。 以下是实现简单版本word embedding的一个Python代码片段: ```python import numpy as np from sklearn.decomposition import PCA from matplotlib import pyplot def create_word_embedding(sentences, vocab_size=100, embed_dim=5): from gensim.models import Word2Vec model = Word2Vec(sentences=sentences.split(), vector_size=embed_dim, window=5, min_count=1, workers=4) words = list(model.wv.index_to_key) X = model.wv[words] pca = PCA(n_components=2) result = pca.fit_transform(X) pyplot.scatter(result[:, 0], result[:, 1]) for i, word in enumerate(words): pyplot.annotate(word, xy=(result[i, 0], result[i, 1])) pyplot.show() create_word_embedding("The cat sat on the mat.") ``` 此脚本展示了如何利用gensim库创建基本单词嵌入并可视化它们的关系图谱。 #### 推荐的学习平台 为了更好地掌握上述理论和技术细节,“ai-learning”是一个值得探索的学习站点。该平台上提供了丰富的课程资料覆盖从基础概念到高级应用各个层面的内容[^1]。 ### 结束语 综上所述,进入NLP领域需具备良好的编程技巧、坚实的数学功底以及对最新研究成果的关注度。随着深度学习框架的发展,越来越多强大的开源项目可供实践检验所学到的知识点。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值