• 六、Doris数据流与控制流


    目录:

    • 数据查询
    • 数据导入
    • 元数据修改 

    1、查询


    用户可使用MySQL客户端连接FE,执行SQL查询, 获得结果,查询流程如下:

    分步说明:

    • ① MySQL客户端执行DQL SQL命令。
    • FE解析, 分析, 改写, 优化和规划, 生成分布式执行计划。
    • ③ 分布式执行计划由 若干个可在单台be上执行的plan fragment构成, FE执行exec_plan_fragment, 将plan fragment分发给BE,并指定其中一台BE为coordinator。
    • ④ BE执行本地计算, 比如扫描数据。
    • ⑤ 其他BE调用transimit_data将中间结果发送给BE coordinator节点汇总为最终结果。
    • ⑥ FE调用fetch_data获取最终结果。
    • ⑦ FE将最终结果发送给MySQL client。

    执行计划在BE上的实际执行过程比较复杂, 采用向量化执行方式,比如一个算子产生4096个结果,输出到下一个算子参与计算,而非batch方式或者one-tuple-at-a-time。

    数据导入 


    用户创建表之后, 导入数据填充表

    • 支持导入数据源有: 本地文件, HDFS, Kafka和S3
    • 支持导入方式有: 批量导入, 流式导入
    • 支持的数据格式有: CSV, Parquet, ORC等.
    • 导入发起方式有: 用RESTful接口, 执行SQL命令.

    数据导入的流程图:

    分步解释:

    • 用户选择一台BE作为协调者, 发起数据导入请求, 传入数据格式, 数据源和标识此次数据导入的label, label用于避免数据重复导入. 用户也可以向FE发起请求, FE会把请求重定向给BE.
    • BE收到请求后, 向FE master节点上报, 执行loadTxnBegin, 创建全局事务。 因为导入过程中, 需要同时更新base表和物化索引的多个bucket, 为了保证数据导入的一致性, 用事务控制本次导入的原子性.
    • ③ BE创建事务成功后, 执行streamLoadPut调用, 从FE获得本次数据导入的计划. 数据导入, 可以看成是将数据分发到所涉及的全部的tablet副本上, BE从FE获取的导入计划包含数据的schema信息和tablet副本信息.
    • BE从数据源拉取数据, 根据base表和物化索引表的schema信息, 构造内部数据格式.
    • ⑤ BE根据分区分桶的规则和副本位置信息, 将发往同一个BE的数据, 批量打包, 发送给BE, BE收到数据后, 将数据写入到对应的tablet副本中.
    • 当BE coordinator节点完成此次数据导入, 向FE master节点执行loadTxnCommit, 提交全局事务, 发送本次数据导入的 执行情况, FE master确认所有涉及的tablet的多数副本都成功完成, 则发布本次数据导入使数据对外可见, 否则, 导入失败, 数据不可见, 后台负责清理掉不一致的数据.

    3、更改元数据


     更改元数据的操作有: 创建数据库, 创建表, 创建物化视图, 修改schema等等. 这样的操作需要:

    • 持久化到永久存储的设备上;
    • 保证高可用, 复制FE多实例上, 避免单点故障;
    • 有的操作需要在BE上生效, 比如创建表时, 需要在BE上创建tablet副本.

    元数据的更新操作流程如下:

    分步解释:

    • ① 用户使用MySQL client执行SQL的DDL命令, 向FE的master节点发起请求; 比如: 创建表.
    • FE检查请求合法性, 然后向BE发起同步命令, 使操作在BE上生效; 比如: FE确定表的列类型是否合法, 计算tablet的副本的放置位置, 向BE发起请求, 创建tablet副本.
    • ③ BE执行成功, 则修改内存的Catalog. 比如: 将table, partition, index, tablet的副本信息保存在Catalog中.
    • ④ FE追加本次操作到EditLog并且持久化.
    • ⑤ FE通过复制协议将EditLog的新增操作项同步到FE的follower节点.
    • ⑥ FE的follower节点收到新追加的操作项后, 在自己的Catalog上按顺序播放, 使得自己状态追上FE master节点.

    上述执行环节出现失败, 则本次元数据修改失败.

     

    参考:


  • 相关阅读:
    Windows消息机制
    inherited 为什么可以调用父类的private函数? [问题点数:100分,结帖人:h2plus0]
    C++Buidler6中需要注意的几个问题
    BGA封装芯片拆装全程纪实
    Delphi组件开发教程指南(四)组件生成过程(TWinControl)
    Delphi技巧集六 (等待执行完一个外部程序再执行另一个程序)
    C++ Builder高级应用开发指南
    干掉“Spirale”病毒
    完全看懂新世代x86指令集結構
    Delphi 组件撰写常问问题delphi 在整合环境中如何找出组件所产生的问题
  • 原文地址:https://www.cnblogs.com/tgzhu/p/15211248.html
Copyright © 2020-2023  润新知