Apache Hudi初探(四)(与spark的结合)

简介: Apache Hudi初探(四)(与spark的结合)

背景


目前hudi的与spark的集合还是基于spark datasource V1来的,这一点可以查看hudi的source实现就可以知道:

class DefaultSource extends RelationProvider
  with SchemaRelationProvider
  with CreatableRelationProvider
  with DataSourceRegister
  with StreamSinkProvider
  with StreamSourceProvider
  with SparkAdapterSupport
  with Serializable {

后续在进一步的写入的时候也是基于DataSource V2的


闲说杂谈


继续上次的Apache Hudi初探(三)涉及的代码:

 // HoodieDataSourceInternalBatchWrite 类中的方法:其所涉及的的方法调用链如下:
 createBatchWriterFactory => dataWriter.write => dataWriter.commit/abort => dataWriter.close
     ||
     \/
 onDataWriterCommit
     ||
     \/
 commit/abort

HoodieDataSourceInternalBatchWrite 这些方法的调用最终都会委托到DataSourceInternalWriterHelper这个类来执行


  • createBatchWriterFactory
  public DataWriterFactory createBatchWriterFactory(PhysicalWriteInfo info) {
    dataSourceInternalWriterHelper.createInflightCommit();
    if (WriteOperationType.BULK_INSERT == dataSourceInternalWriterHelper.getWriteOperationType()) {
      return new HoodieBulkInsertDataInternalWriterFactory(dataSourceInternalWriterHelper.getHoodieTable(),
          writeConfig, instantTime, structType, populateMetaFields, arePartitionRecordsSorted);
    } else {
      throw new IllegalArgumentException("Write Operation Type + " + dataSourceInternalWriterHelper.getWriteOperationType() + " not supported ");
    }
  }

主要是创建*.hoodie/20230422183520311.deltacommit.inflight这种类型的文件(对于MOR表) ,表明该操作正在进行


返回
HoodieBulkInsertDataInternalWriterFactory*对象用于Task write


dataWriter.write这是真正的写数据的地方

hudi写数据的最终类是HoodieBulkInsertDataInternalWriter,它会委托BulkInsertDataInternalWriterHelper具体去执行

所以write最终会调用到BulkInsertDataInternalWriterHelper.write方法,该方法首先会从record中获取对应的分区信息

然后根据根据分区信息获取对应的writer,其中写的文件名称如下:

bcbfc2b3-6a8a-480a-b2de-ed7d0e736cde-0_1-788-738368_20230422183520311.parquet

其中: bcbfc2b3-6a8a-480a-b2de-ed7d0e736cde-0 是 fileId ,由uuid + 写文件的次数(从0开始)

1-788-738368是 writeToken ,由 taskPartitionId(spark)+ taskId(spark) + taskEpochId 组成

20230422183520311 是instantTime 格式为yyyyMMddHHmmssSSS

写成功以后会返回一个HoodieInternalWriteStatus数据结构,其中包含了分区路径,fileId,以及写入的统计信息如文件记录数等


dataWriter.commit

这个会调用writer的close方法获取到HoodieInternalWriteStatus数据结构,并返回一个HoodieWriterCommitMessage(List)数据结构,

最终组装成一个DataWritingSparkTaskResult的数据结构


dataWriter.close
清除writer便于GC,以及收集写入的文件信息


onDataWriterCommit
目前的实现是打印出log信息,Received commit of a data writer =,注意这是在driver执行的


commit/abort

commit最终调用的是DataSourceInternalWriterHelper.commit方法,

最终会调用SparkRDDWriteClient.commitStats方法做一些额外的信息提交

rollback最终也是调用的是SparkRDDWriteClient.rollback方法做一些提交


因为commit/abort涉及到的细节比较多,所以下一次详解(当前还涉及到SparkRDDWriteClient.preWrite)

相关文章
|
负载均衡 应用服务中间件 nginx
5分钟搞懂Ingress / IngressController / IngressClass的区别
先来个一句话总结:Ingress由Ingress规则、IngressController、IngressClass这3部分组成。Ingress资源只是一系列路由转发配置,必须使用IngressController才能让路由规则生效,而IngressClass是IngressController的具体实现。使用原则:先部署IngressController → 再部署Ingress资源。
21863 0
5分钟搞懂Ingress / IngressController / IngressClass的区别
|
28天前
|
Ubuntu Linux 测试技术
Linux系统离线安装Docker完整指南
本文详细介绍在Ubuntu 24等Linux系统中离线安装Docker的完整流程,适用于内网隔离环境。涵盖安装包下载、`docker.service`配置、安装与卸载脚本编写、权限设置、镜像测试及用户组配置,并包含docker-compose的离线部署方法,助力高效完成生产环境搭建。
558 4
Linux系统离线安装Docker完整指南
|
前端开发 Java 数据库连接
Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换
Spring Boot 3 整合 Mybatis-Plus 动态数据源实现多数据源切换
|
9月前
|
弹性计算 关系型数据库 数据库
快速体验Cloudberry和APCC
通过Docker快速体验Cloudberry和APCC
443 6
|
API Nacos 数据库
Nacos配置问题之启动项目报错如何解决
Nacos是一个开源的、易于部署的动态服务发现、配置管理和服务管理平台,旨在帮助微服务架构下的应用进行快速配置更新和服务治理;在实际运用中,用户可能会遇到各种报错,本合集将常见的Nacos报错问题进行归纳和解答,以便使用者能够快速定位和解决这些问题。
6181 100
|
存储 算法 索引
(六)漫谈分布式之一致性算法上篇:用二十六张图一探Raft共识算法奥妙之处!
现如今,大多数分布式存储系统都投向了Raft算法的怀抱,而本文就来聊聊大名鼎鼎的Raft算法/协议!
448 8
|
存储 算法 Java
(五)漫谈分布式之一致性算法篇:谁说Paxos晦涩难懂?你瞧这不一学就会!
没在时代发展的洪流中泯然于众的道理很简单,是因为它们并不仅是空中楼阁般的高大上理论,而是有着完整落地的思想,它们已然成为构建分布式系统不可或缺的底层基石,而本文则来好好聊聊分布式与一致性思想的落地者:Paxos与Raft协议(算法)。
463 6
|
缓存 算法
本地缓存Caffeine系列(五)
本地缓存Caffeine系列(五)
|
Ubuntu Linux 网络安全
Docker&Docker Compose安装(离线+在线)
Docker&Docker Compose安装(离线+在线)
18861 1
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的校园防疫的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的校园防疫的详细设计和实现(源码+lw+部署文档+讲解等)