大数据经典论文解读
徐文浩
bothub创始人
1984 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
推荐试读
换一换
02 | 学习方法:建立你的大数据知识网络
05 | The Google File System (三): 多写几次也没关系
09 | Bigtable(二):不认识“主人”的分布式架构
课程目录
已更新 12 讲/共 36 讲
课前导读 (3讲)
开篇词 | 读论文是成为优秀工程师的成年礼
01 | 什么是大数据:从GFS到Dataflow,12年大数据生态演化图
02 | 学习方法:建立你的大数据知识网络
基础知识篇:Google的三驾马车 (9讲)
03 | The Google File System (一): Master的三个身份
04 | The Google File System (二): 如何应对网络瓶颈?
05 | The Google File System (三): 多写几次也没关系
06 | MapReduce(一):源起Unix的设计思想
07 | MapReduce(二):不怕失败的计算框架
08 | Bigtable(一):错失百亿的Friendster
09 | Bigtable(二):不认识“主人”的分布式架构
10 | Bigtable(三):SSTable存储引擎详解
11 | 通过Thrift序列化:我们要预知未来才能向后兼容吗?
大数据经典论文解读
15
15
1.0x
00:00/00:00
登录|注册

11 | 通过Thrift序列化:我们要预知未来才能向后兼容吗?

你好,我是徐文浩。
现在,我们已经解读完了 GFS、MapReduce 以及 Bigtable 这三篇论文,这三篇论文之所以被称为 Google 的三驾马车,一方面是因为它们发表得早,分别在 2003、2004 和 2006 年就发表了。另一方面,是这三篇论文正好覆盖了大数据的存储、大数据的批处理也就是计算,以及大数据的在线服务领域。
相信你到这里,也看到了一个反复出现的关键字,那就是“数据”。在过去的三篇论文里,我们花了很多精力去分析谷歌是如何设计了分布式的系统架构,数据在硬件层面应该怎么存储。其中的很多设计面临的主要瓶颈和挑战,就是硬盘读写和网络传输性能。比如 GFS 里的数据复制,需要走流水线式的传输就是为了减少网络传输的数据量;Bigtable 里,我们会对一个个 data block 进行压缩,目的是让数据存储的空间可以小一些。
那么,我们能不能在“数据”本身上直接做点文章呢?答案当然是可以的,今天这节课,我们就来一起读一篇 Facebook 在 2007 年发表的《Thrift: Scalable Cross-Language Services Implementation》技术论文,它的背后也就是这 Apache Thrift 这个开源项目。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
02 | 学习方法:建立你的大数据知识网络
05 | The Google File System (三): 多写几次也没关系
09 | Bigtable(二):不认识“主人”的分布式架构
10 | Bigtable(三):SSTable存储引擎详解
11 | 通过Thrift序列化:我们要预知未来才能向后兼容吗?
该试读文章来自付费专栏《大数据经典论文解读》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥59
立即订阅
登录 后留言

精选留言(3)

  • 吴小智
    对于思考题,能想到两个问题:1. 每次需要传输到数据多了,对于 RPC 不是长链接交互的场景,每次都需要带上 Header,就跟 HTTP 一样每次都传输了重复的数据;2. 那就是需要每次都要解析 Header ,然后在对数据进行序列化,多做了运算,Thrift 生成代码的方式,就是把解析 Header 的这个计算,直接变成代码了,直接就可以对数据进行序列化,会快一点。
    2021-10-13
    2
  • 在路上
    徐老师好,TCompactProtocol处理Delta Encoding的方式非常巧妙,通过判断Field第一个字节的高4位是否为0,得知到底是用了一个还是多个字节存储fieldId和fieldType。
    readFieldBegin()的部分源码:
    ```
    // mask off the 4 MSB of the type header. it could contain a field id delta.
    short modifier = (short)((type & 0xf0) >> 4);
    if (modifier == 0) {
      // not a delta. look ahead for the zigzag varint field id.
      fieldId = readI16();
    } else {
      // has a delta. add the delta to the last read field id.
      fieldId = (short)(lastFieldId_ + modifier);
    }
    ```
    writeFieldBeginInternal()的部分源码:
    ```
    // check if we can use delta encoding for the field id
    if (field.id > lastFieldId_ && field.id - lastFieldId_ <= 15) {
      // write them together
      writeByteDirect((field.id - lastFieldId_) << 4 | typeToWrite);
    } else {
      // write them separate
      writeByteDirect(typeToWrite);
      writeI16(field.id);
    }
    ```


    直接把IDL写入协议的Header,协议的接收者可以根据Header的信息得知如何解析协议,但是如果每次传输的数据量不大,额外传输的IDL就会成为严重的网络负担。Apache Avro很好的解决了这个问题,在Apache Avro Specification的Protocol Declaration/Protocol Wire Format/Schema Resolution/Parsing Canonical Form for Schemas四个章节中详细地描述了整个过程。

    谁负责写数据,就以谁的IDL为准。当客户端第一次发起一种请求时,会先发送一条消息(HandshakeRequest),告知服务端接下来的请求的IDL,服务端会响应消息(HandshakeResponse),告知服务端针对这个请求响应的IDL。之后再发起相同类型的请求时,只需要发送IDL的指纹,指纹对的上,接收方就使用缓存的IDL,如果对不上,接收方会要求发送方重发Handshake。哪些内容构成了一个IDL的指纹呢?并非整个文本,因为在文本中增加一个空格,调整字段的书写顺序,并不影响数据的序列化和反序列化,只有真正影响序列化和反序列化的内容,才会被当作计算指纹的一部分。
    2021-10-13
  • 哈达syn$
    老师会讲 lsm 相关的论文吗
    2021-10-13
    1
收起评论
3
返回
顶部