基于iceberg的master分支的9b6b5e0d2(2022-2-9)。

参数说明

1、PARTIAL_PROGRESS_ENABLED(partial-progress.enabled)

默认为 false。该参数能够让合并任务以group为单位做提交,当其中一个group任务失败,可以单独对该group任务重试。

2、USE_STARTING_SEQUENCE_NUMBER(use-starting-sequence-number)

默认为 true。

该参数使用做合并时的sequenceNumber作为新的数据文件的sequenceNumber。

测试

一、append方式生成 a,b,c三个snapshot,基于b做文件合并。

模拟的场景是:已存在a,b快照,现在基于b快照做小文件合并,但任务还未完成时,另一条数据流基于b快照做了append类型的数据:

右:USE_STARTING_SEQUENCE_NUMBER,下:PARTIAL_PROGRESS_ENABLED true false
true 成功 成功
false 成功 成功
  • 成功:生成新的快照,最终snapshot是 a,b,c,d。

  • 新生成的大文件是基于a,b的数据文件的总和,

  • 快照d中包含了c的数据,以及基于a,b合并的数据。

  • a,b,c,d对应的squenceNumber分别是1,2,3,4:

    USE_STARTING_SEQUENCE_NUMBER 为 true时,d里面生成的新的大文件对应的manifest的squeceid是用的以前的2,删除的manifest用的是新的id4

    USE_STARTING_SEQUENCE_NUMBER 为 false 时,d里面合并任务使用的全都是最新的id

结论:

1、纯append流的数据,做小文件合并都能成功。

2、可以通过设置 USE_STARTING_SEQUENCE_NUMBER 字段来控制合并任务中的manifest的squencyNumber。

二、append方式生成 a,b,c 三个 snapshot,先基于c做一次合并,合并成功后,基于c再做一次合并。

模拟的场景是,基于c快照做小文件合并,该任务还未完成,又启动了一个基于c快照做小文件合并的任务:

右:USE_STARTING_SEQUENCE_NUMBER,下:PARTIAL_PROGRESS_ENABLED true false
true 成功,但没生成新快照 成功,但没生成新快照
false 失败 失败
  • 成功,但没生成新快照:只是表示该任务是完整执行了,没有出现异常退出的情况,但最终并未生成新的快照。PARTIAL_PROGRESS_ENABLED 设置 true,会打印出异常信息,但由于是部分提交,这些异常被忽略,最终程序执行成功,但也没有生成新的 snapshot。Failure during rewrite commit process, partial progress enabled. Ignoring。
  • 失败:提示 Cannot commit rewrite because of a ValidationException or CommitFailedException. This usually means that this rewrite has conflicted with another concurrent Iceberg operation. To reduce the likelihood of conflicts, set partial-progress.enabled which will break up the rewrite into multiple smaller commits controlled by partial-progress.max-commits. Separate smaller rewrite commits can succeed independently while any commits that conflict with another Iceberg operation will be ignored. This mode will create additional snapshots in the table history, one for each commit.

结论:目前功能上不能基于同一个快照做多次合并,只会成功一次。

三、append方式生成 a,b 两个snapshot,对a的数据做更新生成c,再基于b做文件合并。

模拟的场景是:基于b快照做合并,此时还未完成,另一条数据流对a快照中的数据做了更新,且提交成功生成了c快照:

右:USE_STARTING_SEQUENCE_NUMBER,下:PARTIAL_PROGRESS_ENABLED true false
true 成功 成功,但没生成新快照
false 成功 失败
  • 失败:提示 Cannot commit, found new delete for replaced data file。
  • 成功,生成最新快照d,生成快照a,b中数据合并的大文件
  • 成功,但没生成新的快照:参考上面说明

结论:在合并的过程中,有另一条数据流对需要合并的数据做修改,可以通过设置 USE_STARTING_SEQUENCE_NUMBER 来使任务成功。

四、append方式生成 a,b,c 三个snapshot,对c的数据做更新生成d,再基于b做文件合并。

模拟的场景:基于b快照做合并,此时还未完成,另一条数据流先做append,生成了c快照,然后又对c快照里的数据做修改生成了快照d:

右:USE_STARTING_SEQUENCE_NUMBER,下:PARTIAL_PROGRESS_ENABLED true false
true 成功 成功,但没生成新快照
false 成功 失败
  • 失败,提示:

    Cannot commit, found new delete for replaced data file

    Cannot commit rewrite because of a ValidationException or CommitFailedException. This usually means that this rewrite has conflicted with another concurrent Iceberg operation. To reduce the likelihood of conflicts, set partial-progress.enabled which will break up the rewrite into multiple smaller commits controlled by partial-progress.max-commits. Separate smaller rewrite commits can succeed independently while any commits that conflict with another Iceberg operation will be ignored. This mode will create additional snapshots in the table history, one for each commit.

因为在获取文件的时候,此时只能读取到a和b下的数据文件,a和b下没有delete文件,所以没有读取a和b下数据文件的min和max。 在做merge的时候,最新的snapshot是d,此时有delete文件,所以需要判断该delete文件是否能够匹配上前面读取的数据文件。匹配条件有两个,一个是sequenceNumber,一个是最大最小值是否有交集。delete的文件是后生成的,它的sequenceNumber肯定是大于前面a,b下的数据文件,所以该条件满足。因为在读取a,b下的数据文件的时候,没有读取min,max,导致不能够跟delete文件做值的交叉范围判断,所以data文件中被关联了delete文件,所以这种情况下,虽然只对 a和b做合并,且后续修改的数据文件没有被修改,但依然会合并失败。

如果在读取a,b下数据文件的时候,把对应的min,max也读取上来,那么就可以合并成功,对应流程在 ManifestGroup.planFiles中,读取内容由 columns 决定。

  • 成功:生成最新快照e,最终的快照为:a,b,c,d,e
  • 成功,但没生成新的快照:参考上面说明

结论:虽然后续修改的数据并不在合并的数据中,但USE_STARTING_SEQUENCE_NUMBER为false依然会失败,具体原因已在上面说明。

结论

1、PARTIAL_PROGRESS_ENABLED

当该参数为true时,虽然它最终能让任务执行完成,但实际上它忽略子提交失败的情况,所以实际有没有做合并与该参数无关。

2、USE_STARTING_SEQUENCE_NUMBER

设置该参数为true,可以修改新生成的dataFile和manifest的sequenceNumber为原来的number,这样在读取数据的时候,就可以把delteFile应用到新生成的dataFile中了,可以解决大多数数据冲突的情况。

iceberg合并小文件冲突测试的更多相关文章

  1. HDFS 07 - HDFS 性能调优之 合并小文件

    目录 1 - 为什么要合并小文件 2 - 合并本地的小文件,上传到 HDFS 3 - 合并 HDFS 的小文件,下载到本地 4 - 通过 Java API 实现文件合并和上传 版权声明 1 - 为什么 ...

  2. Hadoop HDFS编程 API入门系列之合并小文件到HDFS(三)

    不多说,直接上代码.  代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs7; import java.io.IOException;import ja ...

  3. [转载]mapreduce合并小文件成sequencefile

    mapreduce合并小文件成sequencefile http://blog.csdn.net/xiao_jun_0820/article/details/42747537

  4. Hive 利用 on tez 引擎 合并小文件

    Hive 利用 on tez 引擎 合并小文件 标签(空格分隔): Hive \[f(N) + \sum_{i=2}^N f(N-i+1)*X_i\] SET hive.exec.dynamic.pa ...

  5. hadoop 使用map合并小文件到SequenceFile

    上一例是直接用SequenceFile的createWriter来实现,本例采用mapreduce的方式. 1.把小文件整体读入需要自定义InputFormat格式,自定义InputFormat格式需 ...

  6. Hadoop合并小文件的几种方法

    1.Hadoop HAR 将众多小文件打包成一个大文件进行存储,并且打包后原来的文件仍然可以通过Map-Reduce进行操作,打包后的文件由索引和存储两大部分组成: 缺点: 一旦创建就不能修改,也不支 ...

  7. hadoop spark合并小文件

      一.输入文件类型设置为 CombineTextInputFormat hadoop job.setInputFormatClass(CombineTextInputFormat.class) sp ...

  8. Facebook-Haystack合并小文件

    1.原文 https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Beaver.pdf 2.翻译版 http://www.importn ...

  9. Hadoop实战项目:小文件合并

    项目背景 在实际项目中,输入数据往往是由许多小文件组成,这里的小文件是指小于HDFS系统Block大小的文件(默认128M),早期的版本所定义的小文件是64M,这里的hadoop-2.2.0所定义的小 ...

随机推荐

  1. 【Java】eclipse中的JUnit单元测试

    eclipse中的JUnit单元测试 步骤: 选中当前工程 - 右键选择:build path - add libraries - JUnit 4 - 下一步 创建Java类,进行单元测试. 此时的J ...

  2. 【Java】流程控制

    文章目录 流程控制 一.用户交互scanner 1.1 Scanner对象 1.2 Scanner进阶使用 二.顺序结构 三.选择结构 3.1 if单选择结构 3.2 if双选择结构 3.3 if多选 ...

  3. winform全局异常处理

    static void Main() { //设置应用程序处理异常方式:ThreadException处理 Application.SetUnhandledExceptionMode(Unhandle ...

  4. Ajax_Post用法

    Ajax_Post用法 post方法的用法其实跟get是大同小异的 唯一不同的地方就是我们需要修改server.js的文件 只需要将get修改为post即可 那么我为了方便操作我这里选择的是直接在下面 ...

  5. 关于cmake和开源项目发布的那些事(PF)

    本来是打算写一篇年终总结,随便和以往一样提一提自己的开源项目(长不大的plain framework)的一些进度,不过最近这一年对于这个项目实在是维护不多,实在难以用它作为醒目的标题.而最近由于使用了 ...

  6. node.js和vue cli脚手架下载安装配置方法

    一.node.js安装以及环境配置 1.下载vue.js 下载地址: https://nodejs.org/en/ 2.安装node.js 下载完成后,双击安装包开始安装.安装地址最好换成自己指定的地 ...

  7. 学习JAVAWEB第一天

    第一天:单元测试(junit)黑盒测试:不需要写代码,给输入值,看程序能否给出期望值白盒测试:需要写代码,关注程序的具体执行流程junit使用步骤:步骤1:定义一个测试类建议类名,被测试类名后面加一个 ...

  8. C++智能指针使用说明

    导读 STL提供四种智能指针:auto_ptr.unique_ptr.shared_ptr和weak_ptr.其中auto_ptr是C++98提供的解决方案,C++11以后均已摒弃.所有代码在gcc ...

  9. 体验 正式发布 的OSM v1.0.0 版本

    2021年10月份发布了OSM 1.0 RC[1],在过去的几个月里,OSM 的贡献者一直在努力为 v1.0.0 版本的发布做准备.2022年2月1日,OSM 团队正式发布 1.0.0 版本[2]. ...

  10. 使用Hot Chocolate和.NET 6构建GraphQL应用(7) —— 实现Query分页功能

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 GraphQL中的查询分页相对来说是查询中比较难理解的,接口的Schema也和其他不一样.在这篇文章中,我们 ...