【DataHub】 现代数据栈的元数据平台的Serving Architecture【服务体系架构】讲解

Serving Architecture

架构图

DataHub服务层的架构图如下:

  • 主服务是gms,它提供一套REST API和一套GraphQL API,用于对元数据执行CRUD操作
  • 元数据服务还提供了搜索和图查询api,以支持二级索引查询、全文搜索以及数据血缘的关系查询

服务层组件

基本概念:

  • MCE: MetadataChangeEvent 元数据更新事件
  • MAE: Metadata Commit Log Stream 元数据审计事件

Metadata Storage

DataHub元数据服务(gms)以文档的方式存储元数据,同时兼有以下特点:

  • 如同RDBMS,比如MySQL, Postgres
  • 如同一个键值存储,如Couchbase等

Metadata Commit Log Stream (MAE)

当元数据更改被成功提交到持久存储时,DataHub Service Tier还会通过kafka发送提交事件元数据审计事件(MAE)。

MAE流是一个公共API,可以由外部系统订阅,提供了一种非常强大的方式来实时响应元数据中发生的变化。

  • 可以构建一个访问控制强制执行器,该强制执行器可以对元数据中的变化做出反应(例如某一个数据集新增了一个字段),从而立即锁定有问题的数据集
  • 注意并不是所有的MCE都将导致MAE,因为DataHub服务层将忽略对元数据的任何重复更改

Metadata Index Applier (mae-consumer-job)

MetadataAuditEvent (MAE) Consumer Job:MAE消费者是一个Kafka Streams job。它的主要功能是监听MetadataAuditEvent Kafka topic的消息并处理这些消息,将元数据模型中的更改转换为二次搜索和图索引的更新。

  • Job是与实体无关的,它将执行相应的图&搜索索引构建器,当特定的元数据方面发生变化时,作业将调用这些构建器。
  • 构建器指导作业如何基于元数据的更改来更新图和搜索的索引
  • 构建器可以选择的使用Remote DAO从其他源获取额外的元数据,以帮助计算最终如何更新图和搜索的索引。
  • 为了确保以正确的时间顺序处理元数据更改,MAE使用实体的URN 作为主键,这意味着一个特定实体的所有MAE都将被一个Kafka Stream线程顺序处理

Metadata Query Serving

  • 基于主键的对元数据的读取(例如,根据dataset-urn获取数据集的模式元数据【schema metadata】)被路由到文档存储。
  • 基于元数据读取的二级索引被路由到搜索索引(Datahub提供对二级索引强一致性支持)。
  • 全文和高级搜索查询被路由到搜索索引
  • 复杂的图查询(如数据血缘)被路由到图索引。

使用DAO存储和查询元数据

DataHub元数据服务使用优秀的dataHub -gma库,以标准的方式存储和查询元数据

Data Hub通过一组通用数据访问对象(DAO)进一步抽象底层数据系统。
DAO抽象的主要好处主要有2点:

  • 当修改DAO的实现时,无需再更改Data Hub中的任何业务逻辑。
  • DAO抽象的主要好处是标准化的变更数据捕获(CDC):
    • 无论底层数据存储系统的类型如何,通过键值DAO的任何更新操作都将自动发出元数据审计事件(MAE)。
    • 每个MAE包含相应实体的URN,以及特定元数据Aspect的前后数据。
    • 支持lambda架构,其中可以批量或流处理MAE。
    • 与MCE类似,MAE的模式也是由元数据模型自动生成的。

标准化元数据访问方式的Data Access Objects (DAO) 有如下4种类型

  • Key-value DAO (Local DAO)
  • Search DAO
  • Query DAO
  • Remote DAO

这些DAO严重依赖Java泛型,因此核心逻辑可以保持类型中立。然而,由于在Pegasus中没有继承,泛型通常会回退到扩展RecordTemplate而不是想要的类型(例如 entity, relationship, metadata aspect 等)。

  • Datahub已经向dao添加了额外的运行时类型检查,以避免绑定到意外的类型。
  • Datahub会缓存类型检查结果以最小化运行时开销。
    【DataHub】 现代数据栈的元数据平台的Serving Architecture【服务体系架构】讲解_第1张图片

Key-value DAO (Local DAO)

GMS使用Local DAO从本地文档存储中存储和检索元数据 Aspects。
由于DAO是一个泛型类,因此在实例化期间需要将其绑定到特定类型。每个实体类型都需要实例化它自己的DAO版本。

Local DAO的另一个重要功能是在更新元数据时自动发出MAE。
因为MAE有效地使用了相同的Pegasus模型,所以RecordTemplate可以很容易地转换成相应的GenericRecord。

接口定义如下:

public abstract class BaseLocalDAO<ASPECT extends UnionTemplate> {

 public abstract <URN extends Urn, METADATA extends RecordTemplate> void 
  add(Class<METADATA> type, URN urn, METADATA value);

 public abstract <URN extends Urn, METADATA extends RecordTemplate> 
  Optional<METADATA> get(Class<METADATA> type, URN urn, int version);

 public abstract <URN extends Urn, METADATA extends RecordTemplate> 
  ListResult<Integer> listVersions(Class<METADATA> type, URN urn, int start, 
    int pageSize);

 public abstract <METADATA extends RecordTemplate> ListResult<Urn> listUrns( 
  Class<METADATA> type, int start, int pageSize);

 public abstract <URN extends Urn, METADATA extends RecordTemplate> 
  ListResult<METADATA> list(Class<METADATA> type, URN urn, int start, int pageSize);
}

Search DAO

Search DAO也是一个泛型类,可以绑定到特定类型的搜索文档。DAO提供了如下3个API:

  • search API: 接受搜索输入、一个Filter、一个SortCriterion、一些分页参数,并返回一个SearchResult。
  • autoComplete API : 允许typeahead-style的自动完成【基于当前输入和filter,并返回AutocompleteResult】
  • filter API: 它只允许在没有搜索输入的情况下进行过滤。它接受一个Filter和一个SortCriterion作为输入,并返回SearchResult。

接口定义如下:

public abstract class BaseSearchDAO<DOCUMENT extends RecordTemplate> {

  public abstract SearchResult<DOCUMENT> search(String input, Filter filter, 
        SortCriterion sortCriterion, int from, int size);

  public abstract AutoCompleteResult autoComplete(String input, String field,
        Filter filter, int limit);

  public abstract SearchResult<DOCUMENT> filter(Filter filter, SortCriterion sortCriterion, 
        int from, int size);
}

Query DAO

允许客户端如GMS、MAE Consumer Job等,对元数据图各种查询操作。

接口定义如下:
请注意,泛型(ENTITY、RELATIONSHIP)故意没有类型,因为这些类型是底层图DB的本地类型,并且很可能因实现的不同而不同。

public abstract class BaseQueryDAO<ENTITY, RELATIONSHIP> {

 public abstract <ENTITY extends RecordTemplate> List<ENTITY> findEntities(
  Class<ENTITY> type, Filter filter, int offset, int count);

 public abstract <ENTITY extends RecordTemplate> List<ENTITY> findEntities(
  Class<ENTITY> type, Statement function);

 public abstract List<RecordTemplate> findMixedTypesEntities(Statement function);

 public abstract <ENTITY extends RecordTemplate, RELATIONSHIP extends RecordTemplate> List<RELATIONSHIP> 
  findRelationships(Class<ENTITY> entityType, Class<RELATIONSHIP> relationshipType, Filter filter, int offset, int count);

 public abstract <RELATIONSHIP extends RecordTemplate> List<RELATIONSHIP> 
  findRelationships(Class<RELATIONSHIP> type, Statement function);

 public abstract List<RecordTemplate> findMixedTypesRelationships(
  Statement function);
}

Remote DAO

Remote DAO只不过是Local DAO的一个专门的只读实现。

  • Remote DAO将从另一个GMS获取元数据,而不是从本地存储中获取元数据。实体类型和GMS之间的映射是作为硬编码映射实现的。
  • 为了防止循环依赖【rest.li 服务依赖于远程DAO,而远程DAO又依赖于 rest.li 客户端生成的 rest.li 服务】, Remote DAO需要构造raw rest.li 直接请求,而不是使用每个实体的rest.li 请求构建器。

参考

datahub metadata-serving architecture
mce-consumer-job
mae-consumer-job
datahub-mce-consumer
build-metadata-service

你可能感兴趣的:(【数据治理】,【BigData】,架构,kafka,java,数据库,大数据)