用Carbondata做CDC

举报
养猪技术专家 发表于 2020/07/07 09:51:55 2020/07/07
【摘要】 所谓CDC,即Change Data Capture,变化数据的摄取,本质是根据数据变化对原始表做数据更新/插入/删除。Apache CarbonData是一种通过索引对大数据快速分析的列式数据格式,由华为开源贡献给Apache社区,并且在华为云的MRS等服务上集成,可以通过MRS服务使用Carbondata或者使用开源版本的Carbondata。本文旨在叙述Carbon CDC使用和原理。

Carbon CDC的使用方式

Carbon CDC是通过其Merge api来实现的,语法如下所示,target表示需要被更新的目标表,source表示一个批次的更新数据

  targetDS.merge(sourceDS, <condition>)
          .whenMatched(<condition>)
          .updateExpr(updateMap)
          .insertExpr(insertMap_u)
          .whenNotMatched(<condition>)
          .insertExpr(insertMap)
          .whenNotMatchedAndExistsOnlyOnTarget(<condition>)
          .delete()
          .execute()

MERGE API操作语义

以下是mergeAPI操作的详细说明

  • merge 将根据条件合并数据集。

  • whenMatched当源行根据匹配条件与目标表行匹配时,将执行子句。这些子句具有以下语义。

  • whenMatched子句最多可以具有一个updateExpr和一个delete操作。updateExpr合并中操作仅更新匹配的目标行的指定列。delete操作将删除匹配的行。

  • 如果有两个whenMatched子句,则按指定的顺序对其进行求值。第一个子句必须具有子句条件(否则第二个子句将永远不会执行)。

  • 如果两个whenMatched子句都具有条件,并且对于匹配的源-目标行对都不满足,那么匹配的目标行将保持不变。

  • whenNotMatched 当源行根据匹配条件与任何目标行都不匹配时,将执行子句。

  • whenNotMatched子句只能有insertExpr动作。根据指定的列和相应的表达式生成新行。用户不需要指定目标表中的所有列。对于未指定的目标列,将插入NULL。

  • whenNotMatchedAndExistsOnlyOnTarget当row与源不匹配并且仅存在于target中时,执行子句。该子句只能具有删除操作。

  • 注意:尚不支持用于合并的SQL语法。

举一个最简单的例子

Carbon CDC的原理

  1. CDC是通过Merge实现的,而Merge操作是通过CarbonMergeDataSetCommand来实现的,其内部通过Join的方式获取delta数据,source表全体参与Join,而Target表只有tupleId和参与匹配的列参与Join,这样可以避免大量数据IO, 除此外还增加了用于标记判断IUD状态的动态生成列;

  2. join所生成的datafram迭代做两个操作,一是根据条件生成的状态来判断一条数据是删除还是更新或者是插入,如果是更新,则本质是先删除旧的数据再增加一条新的数据;

  3. 删除的数据称为deltaRDD,是将update的旧数据和delete的旧数据的tupleId提取出来,走carbon的delete流程来标记block/pageid/id等信息写入delta文件的方式表征删除;

  4. insert的数据或update所新增的数据取自source join出来的结果,该RDD会通过carbon的insert流程写入到新的carbondata文件中,insert流程会产生新的segment;

  5. 在进行merge操作的时候,结束时会调用horizontal compaction,进行delta文件合并;

  6. CDC过程中由于产生新的segment,所以可以通过carbon的minor compaction或major compaction进行segment数据合并,以更好的进行数据查询。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。