【iceberg数据一致性】iceberg如何保证高并发数据一致性

在使用iceberg写数据时,一直弄不清楚为什么iceberg写入快,并且能够保证数据的一致性。今天决定搞清楚这个问题,经过查询和理解,写下来。

文件格式

iceberg元数据的文件目前有三个:metadata.json,snap.avro,m*.avro,它们分别对应了iceberg的元数据文件metadata,manifest-list,manifest-file文件,对于文件格式内容不明白的同学去查询资料看看,这里不做说明。

文件内容的格式如下

metadata.json

{
  "format-version" : 2,
  "table-uuid" : "da07b515-b2ed-458c-8fc1-fd2650d0f48a",
  "location" : "s3a://wux-hoo-dev-01/ice_warehouse/p059_avenger/attr_vals",
  "last-sequence-number" : 566,
  "last-updated-ms" : 1715896148763,
  "last-column-id" : 9,
  "current-schema-id" : 0,
  "schemas" : [ {
    "type" : "struct",
    "schema-id" : 0,
    "fields" : [ {
      "id" : 1,
      "name" : "serial_num",
      "required" : false,
      "type" : "string"
    }, {
      "id" : 2,
      "name" : "trans_seq",
      "required" : false,
      "type" : "string"
    }, {
      "id" : 3,
      "name" : "attr_name",
      "required" : false,
      "type" : "string"
    }, {
      "id" : 4,
      "name" : "pre_attr_value",
      "required" : false,
      "type" : "string"
    }, {
      "id" : 5,
      "name" : "post_attr_value",
      "required" : false,
      "type" : "string"
    }, {
      "id" : 6,
      "name" : "in_run_file",
      "required" : false,
      "type" : "string"
    }, {
      "id" : 7,
      "name" : "event_date",
      "required" : false,
      "type" : "string"
    }, {
      "id" : 8,
      "name" : "family",
      "required" : false,
      "type" : "string"
    }, {
      "id" : 9,
      "name" : "operation",
      "required" : false,
      "type" : "string"
    } ]
  } ],
  "default-spec-id" : 0,
  "partition-specs" : [ {
    "spec-id" : 0,
    "fields" : [ {
      "name" : "event_date",
      "transform" : "identity",
      "source-id" : 7,
      "field-id" : 1000
    }, {
      "name" : "family",
      "transform" : "identity",
      "source-id" : 8,
      "field-id" : 1001
    }, {
      "name" : "operation",
      "transform" : "identity",
      "source-id" : 9,
      "field-id" : 1002
    } ]
  } ],
  "last-partition-id" : 1002,
  "default-sort-order-id" : 0,
  "sort-orders" : [ {
    "order-id" : 0,
    "fields" : [ ]
  } ],
  "properties" : {
    "owner" : "root",
    "write.metadata.delete-after-commit.enabled" : "true",
    "schema.name-mapping.default" : "[{ \"field-id\":1, \"names\": [\"serial_num\"] },{ \"field-id\":2, \"names\": [\"trans_seq\"] },{ \"field-id\":3, \"names\": [\"attr_name\"] },{ \"field-id\":4, \"names\": [\"pre_attr_value\"] },{ \"field-id\":5, \"names\": [\"post_attr_value\"] },{ \"field-id\":6, \"names\": [\"in_run_file\"] },{ \"field-id\":7, \"names\": [\"event_date\"] },{ \"field-id\":8, \"names\": [\"family\"] },{ \"field-id\":9, \"names\": [\"operation\"] }]",
    "write.metadata.previous-versions-max" : "3",
    "write.parquet.compression-codec" : "zstd"
  },
  "current-snapshot-id" : 4890912288753727730,
  "refs" : {
    "main" : {
      "snapshot-id" : 4890912288753727730,
      "type" : "branch"
    }
  },
  "snapshots" : [ {
    "sequence-number" : 566,
    "snapshot-id" : 4890912288753727730,
    "parent-snapshot-id" : 3610607578140763977,
    "timestamp-ms" : 1715892795791,
    "summary" : {
      "operation" : "replace",
      "snapshot.producer" : "OPTIMIZE",
      "added-data-files" : "1",
      "deleted-data-files" : "3",
      "added-records" : "8728",
      "deleted-records" : "8728",
      "added-files-size" : "29130",
      "removed-files-size" : "42114",
      "changed-partition-count" : "1",
      "total-records" : "1329523",
      "total-files-size" : "2771968",
      "total-data-files" : "39",
      "total-delete-files" : "0",
      "total-position-deletes" : "0",
      "total-equality-deletes" : "0"
    },
    "manifest-list" : "s3a://wux-hoo-dev-01/ice_warehouse/p059_avenger/attr_vals/metadata/snap-4890912288753727730-1-2b4564d4-e38e-4b5e-bf85-2660fa400b35.avro",
    "schema-id" : 0
  } ],
  "statistics" : [ ],
  "partition-statistics" : [ ],
  "snapshot-log" : [ {
    "timestamp-ms" : 1715892795791,
    "snapshot-id" : 4890912288753727730
  } ],
  "metadata-log" : [ {
    "timestamp-ms" : 1715889404796,
    "metadata-file" : "s3a://wux-hoo-dev-01/ice_warehouse/p059_avenger/attr_vals/metadata/00578-0268ca68-4e34-4717-9cb1-1540070cb374.metadata.json"
  }, {
    "timestamp-ms" : 1715892548263,
    "metadata-file" : "s3a://wux-hoo-dev-01/ice_warehouse/p059_avenger/attr_vals/metadata/00579-8f364707-92b4-4c36-8b19-4080c5fd6e69.metadata.json"
  }, {
    "timestamp-ms" : 1715892795791,
    "metadata-file" : "s3a://wux-hoo-dev-01/ice_warehouse/p059_avenger/attr_vals/metadata/00580-c9b10830-04e3-4bc8-b414-57c86eca7c0d.metadata.json"
  } ]
}

snap.avro

{
 "manifest_path": 
"s3://datalake/db1/orders/metadata/62acb3d7-e992-4cbc-8e41-58809fcacb3e.avro",
 "manifest_length": 6152,
 "added_snapshot_id": 8333017788700497002,
 "added_data_files_count": 1,
 "added_rows_count": 1,
 "deleted_rows_count": 0,
 "partitions": {
        "array": [ {
            "contains_null": false,
            "lower_bound": {
                "bytes": "¹Ô\\\\u0006\\\\u0000"
            },
            "upper_bound": {
                "bytes": "¹Ô\\\\u0006\\\\u0000"
            }
        } ]
    }
}

m*.avro

{
      "data_file" : {
      "file_path" : 
“s3://datalake/db1/orders/data/order_ts_hour=2023-03-07-08/0_0_0.parquet”,

      "file_format" : "PARQUET",
      "block_size_in_bytes" : 67108864,
      "null_value_counts" : [],
      "lower_bounds" : {
     	    "array": [{
     	    "key": 1,
     	    "value": 123
                 }],
      }
     	"upper_bounds" : {
     	    "array": [{
     	    "key": 1,
     	    "value": 123
                 }],
      },
   }
}

写入过程

在写入数据时,iceberg会先写入数据文件data.parquet,然后写m*.avro,再写snap.avro,然后是metadata.json,最后更新iceberg数据库中iceberg_tables的metadata_location字段。如此则完成一次完整写入。

高并发一致性

那么在高并发的时候,同时操作某张表时是如何运作的呢?其实这里iceberg引用了乐观锁的方法。其实在写入数据的时候是有一个验证的操作的,即在准备写入时会检查原文件和带写入文件的差异,如果存在本次写入数据以外的数据,则代表有其他操作已经更新了原文件,那么本次写入会取消,并重试写入的步骤,知道验证完成,写入完成,如此就保证了数据的一致性,并且也解决了HMS锁的问题。

kimi的回答

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/639598.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis实用方案,如何使项目兼容多种数据库

系列文章目录 MyBatis缓存原理 Mybatis plugin 的使用及原理 MyBatisSpringboot 启动到SQL执行全流程 数据库操作不再困难,MyBatis动态Sql标签解析 Mybatis的CachingExecutor与二级缓存 使用MybatisPlus还是MyBaits ,开发者应该如何选择? 巧…

SVN创建项目分支

目录 背景调整目录结构常规目录结构当前现状目标 调整SVN目录调整目录结构创建项目分支 效果展示 背景 当前自己本地做项目的时候发现对SVN创建项目不规范,没有什么目录结构,趁着创建目录分支的契机,顺便调整下SVN服务器上的目录结构 调整目…

Day36 代码随想录打卡|二叉树篇---翻转二叉树

题目(leecode T226): 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 方法: 迭代法 翻转二叉树,即从根节点开始,一一交换每个节点的左右孩子节点,然后…

【Arthas】阿里的线上jvm监控诊断工具的基本使用

关于对运行中的项目做java监测的需求下,Arthas则是一个很好的解决方案。 我们可以用来 1.监控cpu 现成、内存、堆栈 2.排查cpu飚高 造成原因 3.接口没反应 是否死锁 4.接口慢优化 5.代码未按预期执行 是分支不对 还是没提交? 6.线上低级错误 能不能不重启…

伦敦金交易商压箱底的交易技法 居然是……

很多伦敦金交易商,也就是我们常说的伦敦金交易平台,或者伦敦金交易服务提供商,他们会和一些资深的市场分析师合作。另外,一般在这些伦敦金交易商内部,也会有一批高手,他们一边在交易,一边在平台…

【设计模式深度剖析】【3】【创建型】【抽象工厂模式】| 要和【工厂方法模式】对比加深理解

👈️上一篇:工厂方法模式 | 下一篇:建造者模式👉️ 目录 抽象工厂模式前言概览定义英文原话直译什么意思呢?(以运动型车族工厂,生产汽车、摩托产品为例) 类图4个角色抽象工厂(Abstract Fac…

起底震网病毒的来龙去脉

2010年,震网病毒被发现,引起世界哗然,在后续的10年间,陆陆续续有更多关于该病毒的背景和细节曝光。今年,《以色列时报》和《荷兰日报》又披露了关于此事件的更多信息,基于这些信息,我们重新梳理…

使用 Docker 部署 Jenkins 并设置初始管理员密码

使用 Docker 部署 Jenkins 并设置初始管理员密码 每一次开始,我都特别的认真与胆怯,是因为我期待结局,也能够不会那么粗糙,不会让我失望,所以,就多了些思考,多了些拘束,所以&#xf…

软件测试:功能测试-接口测试-自动化测试-性能测试-验收测试

软件测试的主要流程 一、测试主要的四个阶段 1.测试计划设计阶段:产品立项之后,进行需求分析,需求评审,业务需求评级,绘制业务流程图。确定测试负责人,开始制定测试计划; 2.测试准备阶段&…

不小心丢失mfc140u.dll文件怎么办?mfc140u.dll丢失的解决办法

当您发现mfc140u.dll文件不见了或者受损,别担心,我们可以一起解决这个问题!首先,您可能会注意到一个小提示,当您尝试打开某些程序时,屏幕上会跳出一个消息说“找不到mfc140u.dll”或者“mfc140u.dll文件缺失…

心识宇宙 x TapData:如何加速落地实时数仓,助力 AI 企业智慧决策

使用 TapData,化繁为简,摆脱手动搭建、维护数据管道的诸多烦扰,轻量代替 OGG、DSG 等同步工具,「CDC 流处理 数据集成」组合拳,加速仓内数据流转,帮助企业将真正具有业务价值的数据作用到实处&#xff0c…

Python的selenium爬取

1.selenium 1.1.前言 使用python的requests模块还是存在很大的局限性,例如:只发一次请求;针对ajax动态加载的网页则无法获取数据等等问题。特此,本章节将通过selenium模拟浏览器来完成更高级的爬虫抓取任务。 1.2.什么是seleniu…

学习单向链表带哨兵demo

一、定义 在计算机科学中,链表是数据元素的线性集合,其每个元素都指向下一个元素,元素存储上并不连续。 1.可以分三类为 单向链表,每个元素只知道其下一个元素是谁 双向链表,每个元素知道其上一个元素和下一个元素 …

抖音小店不能做无货源了吗?当然不是,而是玩法更先进了!

大家好,我是电商糖果 自从2023年抖音小店开始严查无货源,不少商家被平台处罚,被逼无奈退出抖音小店。 网上关于抖音小店不能做无货源的声音越来越多。 可是一年多过去,大家渐渐的发现,平台内还是有很多无货源商家&a…

Sping源码(八)—registerBeanPostProcessors

序言 之前我们用大量的篇幅介绍过invokeBeanFactoryPostProcessors()方法的执行流程。 而invokeBeanFactoryPostProcessors的主要逻辑就是遍历执行实现了BeanDefinitionRegistryPostProcesso类(主要是针对BeanDefinition的操作)和BeanFactoryPostProcessor(主要针对BeanFacrot…

spring-boot集成slf4j(二)logback配置详解

一、configuration 根节点:configuration,作为顶级标签, 可以用来配置一些lockback的全局属性,常见的属性如下: (1)scan“true” :scan是否开启自动扫描,监控配置文件更…

XShell-连接-Centos 7

XShell 连接Centos 7 一.准备 安装XShell XShell下载地址: 在虚拟机上安装Centos 7,具体操作自行学习 二.Centos 7的准备 1.网络适配器修改为NAT 2.获取IP 输入命令: ip addr我的Centos 7对外IP为192.168.174.129 三.XShell连接Cento…

Big Demo Day第十三期活动即将启幕,Web3创新项目精彩纷呈,PEPE大奖等你抽取

5月28号在香港数码港 Big Demo Day第十三期 活动即将拉开帷幕,活动将汇集众多Web3领域的创新项目,为参会者带来一场科技与智慧交融的盛宴。在这里,你不仅能深入了解区块链、AI等前沿技术的最新应用,还能有机会赢取丰厚的PEPE大奖。…

使用maven-helper插件解决jar包冲突

发现问题 maven-helper分析问题 如上所述,问题就是依赖版本冲突了,出现版本冲突的原因是因为由于Maven具有依赖传递性,所以当你引入一个依赖类的同时,其身后的依赖类也一起如过江之鲫纷至沓来了。 举个例子:   A依赖…

保护元件-详实的熔断器(保险丝)知识

目录: 一、汽车保险丝设计与选型 1、概述 2、构造及工作原理 1)构造 2)工作原理 3)保险丝熔断及分断时间 4)时间/电流特性曲线 5)环境温度修正系数 3、熔化热能值I2t★ 4、三种电流模型 1&a…