Yelp的实时数据流引擎Schematizer

实时数据流引擎Schematizer 【Yelp的实时数据流引擎Schematizer】原文链接
这是关于Yelp的实时流数据基础设施系列文章的第三篇。这个系列会深度讲解我们如何用“确保只有一次”的方式把MySQL数据库中的改动实时地以流的方式传输出去,我们如何自动跟踪表模式变化,如何处理和转换流,以及最终如何把这些数据存储到Redshift或Salesforce之类的数据仓库中去。这一篇主要介绍Schematizer,Yelp的模式存储服务。 1. 为什么不用Kafka

  • 当接入上百个服务时,会有上千种不同模式的非阻塞消息传来传去
  • Confluent Schema Registry和Kafka Connect都不错,但太晚发布
  • 所以才有了Yelp Schematizer
2. Yelp Schematizer 是什么
  • Yelp 认为数据必须模式化(Schema),而不是任意格式
  • Schematizer 用于跟踪和管理所有“模式”(而不是数据)
  • 并提供自动化文档支持等功能的模式存储服务
  • Yelp 使用Apache Avro来表达模式,包括表示模式演进
  • 消息在传递时,不带模式,只带模式的ID
这么看Avro在做模式序列化的过程中,自动实现了灾备存储

3. Yelp Schematizer 管理模式的方法
  1. 用数据产生信息分组模式,例如按库名表名分组
  2. 用数据的目的地信息分组,例如发到MySQL或Redshift集群分成不同组
  3. 以上两种方法都是必要的
4. Yelp Schematizer 和Apache Avro 的关系
  1. 任何数据生产者希望发送消息时,都要先去Schematizer 注册一个模式
  2. 注册Schematizer 模式最简单的方式,是注册一个Avro 模式
  3. 对无法注册Avro 模式的数据生产者,也可以向Schematizer 中加入模式转换器来生成Avro 模式,MySQL Streamer就是这个模式
  4. 使用类似流程时,如果数据生产者改变了模式定义,则需要重新注册模式
  5. Schematizer 中也可以定义自己的模式规则
  6. 注册模式的过程是幂等的,即相同的模式注册多次,则只有第一次是新注册,之后会返回已经注册的模式。这样在程序实现时,就统一全部写成新注册就好了,不要考虑“先查询-有就使用-没有再注册”这种小流程
5. 上游模式改变是否会影响下游服务?
  • Schematizer 使用Avro Resolution Rules 解释规则来确认Topic 和新模式之间是否兼容:如果兼容就沿用旧模式,否则就注册新的模式
  • Avro 来保证各种版本模式的打包和解包
  • 不兼容的模式会自动生成和分配到不同的Topic
  • 模式确实发生改变时,数据管道应该可以自动生成流水线化的模式迁移计划。但Schematizer 目前只支持Redshift的计划生成。
  • Schematizer 知道所有数据生产者和消费者的信息,包括负责人和联系方式等。这在最初只是一种附带的通讯录实现,但后期发现有用后,则定义了单独的模式,并写到Kafka Topic中。
  • Redshift 和Splunk 可以单独处理Kafka Topic,就可以简单的实现一键发布最新通讯录功能了
  • Kafka 生产者通常需要知道自己要使用哪个Topic,但Schematizer 定义了模式和Topic之间的关系,所以数据生产者只需要定义模式,就可以自动找到Topic 了
  • 模式定义了数据,也同时定义了文档。这对数据消费者理解数据是必要的。
Yelp的实时数据流引擎Schematizer
文章图片
image
* 兼容性问题引起的崩溃是很多编程方法的硬伤,但PHP解决了这个问题* 人工可读(PII,Personally Identifiable Information)数据和人工不可读(non-PII)数据必然分开存储。这样做一方面是考虑PII - non-PII之间转换是模式不兼容的会引起Schematizer 的大量开销,另一个方面考虑PII 的安全性问题(不应被不授权的下游消费者看到)

6. 知识挖掘器Watson
  • Yelp Watson 是自行开发的Webapp,用来在大量文档中找到有用信息。其中使用Whoosh Python包 实现了简单的搜索引擎功能。
  • Yelp Watson 实际上是Schematizer 的一个可视化前端,通过Schematizer 的几个RESTful API 来获取数据
  • Yelp Watson 也有一些附加功能,包括允许使用者为任何数据源打标签(称为Category),以便自行组织自己想要的数据和关联关系;包括允许使用者添加注释(称为Notes)
Whoosh Python包的优点是快速开发。`Elasticsearch`的优点是功能丰富。

7. SQLAlchemy模型 来为数据的数据源和模式整理文档
  • SQLAlchemy 也有单独字段来记录模型的维护者和专家
  • SQLAlchemy 被Yelp 设定为强制要求提供属性描述和文档
8. 特定应用转换器(Application Specific Transformer,AST)
  • 实际是定制流程,按顺序执行,包括
    1. Model Doc Extractor component
    2. Column Doc Extractor component
    3. ID Transform component
    4. Bit Flag Field Transform component
    5. Enum Field Transform component
9. 流处理器Paastorm -> 待续

    推荐阅读