diff --git a/site-image-source/hudi-stack-1-x.excalidraw b/site-image-source/hudi-stack-1-x.excalidraw new file mode 100644 index 000000000000..18efd517cec0 --- /dev/null +++ b/site-image-source/hudi-stack-1-x.excalidraw @@ -0,0 +1,1761 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 918, + "versionNonce": 2515017, + "index": "a0", + "isDeleted": false, + "id": "wM7l8HjOj-TacKEYGzl9e", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 315.6685181580783, + "y": 355.7164993131703, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 1292.7425636336952, + "height": 422.25167468251266, + "seed": 2097147078, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830728632, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 929, + "versionNonce": 1860854407, + "index": "a1", + "isDeleted": false, + "id": "pmmvZ1lxh5XAy5nngCz1h", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 310.24615712641753, + "y": 964.4052012920706, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 1292.0421662441488, + "height": 114.47517788469396, + "seed": 422732806, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830031087, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 915, + "versionNonce": 969576519, + "index": "a2", + "isDeleted": false, + "id": "4Tyd-mdUuiI-Mcg-B6_vD", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 311.81804627047313, + "y": 1096.2334612735244, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 1288.6675242763258, + "height": 107.04141468200305, + "seed": 1318318918, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732829923169, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 812, + "versionNonce": 1186918247, + "index": "a3", + "isDeleted": false, + "id": "1AwGoeqIDl2cZOD7L2tXL", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 779.2085884929838, + "y": 1104.411396702611, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 283.15960693359375, + "height": 53.05115090332227, + "seed": 1468111494, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732829923169, + "link": null, + "locked": false, + "fontSize": 42.440920722657815, + "fontFamily": 1, + "text": "Lake Storage", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Lake Storage", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 960, + "versionNonce": 161199497, + "index": "a7", + "isDeleted": false, + "id": "lnEPxXivcnWy9SuJ7MGUr", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 358.1518647373209, + "y": 384.87249103894237, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 442.0575875629402, + "height": 165.74745042402446, + "seed": 1662330758, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [], + "updated": 1732830375798, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1241, + "versionNonce": 2038307945, + "index": "a8", + "isDeleted": false, + "id": "7JcSAUmakCtcm1xNTXhxv", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 492.57703509423436, + "y": 388.94397023014653, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 147.23094177246094, + "height": 48.68880849067817, + "seed": 1716668102, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830375799, + "link": null, + "locked": false, + "fontSize": 38.951046792542535, + "fontFamily": 1, + "text": "Indexes", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Indexes", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 1622, + "versionNonce": 1378920265, + "index": "a9", + "isDeleted": false, + "id": "1rlGgfNSFQJn4K5v7xaP-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 367.68876816142574, + "y": 450.4172212674116, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 412.4152221679687, + "height": 66.30303430407945, + "seed": 455704070, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830375799, + "link": null, + "locked": false, + "fontSize": 26.521213721631778, + "fontFamily": 1, + "text": "(Bloom filter, Bucketing, Hash,\nExpressions,Secondary index)", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Bloom filter, Bucketing, Hash, Expressions,Secondary index)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1025, + "versionNonce": 1458550121, + "index": "aA", + "isDeleted": false, + "id": "IkK_yRLiwqrngNi7-UZyP", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 854.2990942177289, + "y": 380.4573450957573, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 459.2760120421066, + "height": 165.74745042402446, + "seed": 1989659974, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [], + "updated": 1732831040785, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1283, + "versionNonce": 1342449929, + "index": "aB", + "isDeleted": false, + "id": "9OpAF3bY_weceGSUVTJw1", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 951.871672106377, + "y": 397.30069436729036, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 220.22323608398438, + "height": 48.68880849067817, + "seed": 1174025350, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830375799, + "link": null, + "locked": false, + "fontSize": 38.951046792542535, + "fontFamily": 1, + "text": "Lake Cache", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Lake Cache", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 1522, + "versionNonce": 1368137705, + "index": "aC", + "isDeleted": false, + "id": "jtt18YMuxaMvVpbv5_-ic", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 897.5065757444186, + "y": 454.0810257132903, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 334.15069580078125, + "height": 68.3171327586285, + "seed": 588100550, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830375799, + "link": null, + "locked": false, + "fontSize": 27.3268531034514, + "fontFamily": 1, + "text": "(Columnar, transactional,\nmutable, WIP)", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Columnar, transactional,\nmutable, WIP)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1210, + "versionNonce": 280115913, + "index": "aD", + "isDeleted": false, + "id": "8zaUoZjUT1YtWoAdUD7Sm", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 847.9278068856488, + "y": 581.6857742688885, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 473.46383756294006, + "height": 165.74745042402446, + "seed": 1743735558, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [], + "updated": 1732830375799, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1449, + "versionNonce": 2115107241, + "index": "aE", + "isDeleted": false, + "id": "CCxLUqBJi_QooixACQnA4", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 935.6561617518396, + "y": 585.0443628350936, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 280.75152587890625, + "height": 48.68880849067817, + "seed": 589036102, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830375799, + "link": null, + "locked": false, + "fontSize": 38.951046792542535, + "fontFamily": 1, + "text": "Table Services", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Table Services", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 2042, + "versionNonce": 1792466057, + "index": "aF", + "isDeleted": false, + "id": "MlnEWrKRsebPFkqTTJ-By", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 832.0784599085541, + "y": 638.5596245086222, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 505.92388916015625, + "height": 99.00900329760728, + "seed": 191938950, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830375799, + "link": null, + "locked": false, + "fontSize": 26.402400879361945, + "fontFamily": 1, + "text": "(cleaning, compaction, indexing, \nclustering, storage layout, storage\ncleanup, timeline history)", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(cleaning, compaction, indexing, \nclustering, storage layout, storage cleanup, timeline history)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1232, + "versionNonce": 1992057705, + "index": "aG", + "isDeleted": false, + "id": "s8CAmpZGP5nRrH_xM28-J", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 361.0122024177813, + "y": 585.1332973919593, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 444.13766568793994, + "height": 165.74745042402446, + "seed": 1948950726, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [], + "updated": 1732830375799, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1529, + "versionNonce": 1041108553, + "index": "aH", + "isDeleted": false, + "id": "PXasGUhUxHDzLs-odywYB", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 387.989249271473, + "y": 592.8644131832157, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 360.77667236328125, + "height": 47.19389326276189, + "seed": 1088854022, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830375799, + "link": null, + "locked": false, + "fontSize": 37.75511461020951, + "fontFamily": 1, + "text": "Concurrency Control", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Concurrency Control", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 1814, + "versionNonce": 1202150697, + "index": "aI", + "isDeleted": false, + "id": "avtNnc37zN8mgGuJAME12", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 364.22387795159875, + "y": 651.3867513062173, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 458.4510498046875, + "height": 66.30303430407945, + "seed": 1503766342, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830375799, + "link": null, + "locked": false, + "fontSize": 26.521213721631778, + "fontFamily": 1, + "text": "(TrueTime generation, OCC, MVCC, \nNon-blocking, Lock providers)", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(TrueTime generation, OCC, MVCC, \nNon-blocking, Lock providers)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1366, + "versionNonce": 552605449, + "index": "aJ", + "isDeleted": false, + "id": "HYYsTpoXxoL4Rogr8AxI1", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1728.6991454398521, + "y": 195.24692867382555, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 478.6542672504402, + "height": 193.0000545906912, + "seed": 515427974, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [], + "updated": 1732831356803, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1736, + "versionNonce": 986336745, + "index": "aK", + "isDeleted": false, + "id": "3vVH4xO42ytZzilTtimql", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1777.8715822482873, + "y": 212.18467898702625, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 383.5795078277588, + "height": 48.68880849067817, + "seed": 1558777286, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732831356803, + "link": null, + "locked": false, + "fontSize": 38.951046792542535, + "fontFamily": 1, + "text": "Timeline Metaserver", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Timeline Metaserver", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 2014, + "versionNonce": 1308272841, + "index": "aL", + "isDeleted": false, + "id": "ZS7VWz92a9eyOldR28EJL", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1757.9876732448236, + "y": 276.5756874163586, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 408.9254522025585, + "height": 68.3171327586285, + "seed": 1095722246, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732831356803, + "link": null, + "locked": false, + "fontSize": 27.3268531034514, + "fontFamily": 1, + "text": "(Timeline, Stats, table service\ncoordination)", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Timeline, Stats, table service\ncoordination)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 1437, + "versionNonce": 854839305, + "index": "aM", + "isDeleted": false, + "id": "Hw2XmBKJZajeJTWh275Le", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1179.3666707769712, + "y": 382.7595854596352, + "strokeColor": "#e03131", + "backgroundColor": "#99e9f2", + "width": 20.098190307617188, + "height": 48.68880849067817, + "seed": 1298715718, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830375799, + "link": null, + "locked": false, + "fontSize": 38.951046792542535, + "fontFamily": 1, + "text": "*", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "*", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 989, + "versionNonce": 636413673, + "index": "aO", + "isDeleted": false, + "id": "2JUm8NLBXPeNxd3y1rdIT", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1431.3430587651396, + "y": 579.845909160555, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 165.60083204507828, + "height": 106.10230180664453, + "seed": 1082718918, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830375799, + "link": null, + "locked": false, + "fontSize": 42.440920722657815, + "fontFamily": 1, + "text": "Storage\nEngine", + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "Storage\nEngine", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 1864, + "versionNonce": 1880779399, + "index": "aP", + "isDeleted": false, + "id": "Xzf7cozP5jJsKmb_CmRQc", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 725.8253295006798, + "y": 1154.961119152245, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 381.906005859375, + "height": 34.15856637931425, + "seed": 1684648454, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732829923169, + "link": null, + "locked": false, + "fontSize": 27.3268531034514, + "fontFamily": 1, + "text": "(Cloud Object stores, HDFS)", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Cloud Object stores, HDFS)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 797, + "versionNonce": 1385791911, + "index": "aQ", + "isDeleted": false, + "id": "bH33i8hjAndQknf_WXSqN", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 739.5896431507499, + "y": 971.3975589346142, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 373.5567626953125, + "height": 53.05115090332227, + "seed": 296845638, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732829923169, + "link": null, + "locked": false, + "fontSize": 42.440920722657815, + "fontFamily": 1, + "text": "Open File Formats", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Open File Formats", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 1824, + "versionNonce": 1063826631, + "index": "aR", + "isDeleted": false, + "id": "UZHPZWl-xHsW5pBtEoSq0", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 690.2757357267437, + "y": 1028.6027883695729, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 488.61786553263664, + "height": 34.15856637931425, + "seed": 1002268806, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732829923169, + "link": null, + "locked": false, + "fontSize": 27.3268531034514, + "fontFamily": 1, + "text": "(Parquet, ORC, Avro, SSTable/HFile)", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Parquet, ORC, Avro, SSTable/HFile)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1077, + "versionNonce": 2110380807, + "index": "aS", + "isDeleted": false, + "id": "KjuCDXpySYZk_m88G3vsI", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 318.7959270812328, + "y": 107.51009518786077, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 1292.392364938919, + "height": 211.3847076020009, + "seed": 1649043398, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830420616, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 860, + "versionNonce": 1297470983, + "index": "aT", + "isDeleted": false, + "id": "gVg9p9TmhswPL4JQIfEN0", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 365.0778682200337, + "y": 141.16100613109165, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 436.18356412544017, + "height": 165.74745042402446, + "seed": 91586310, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [], + "updated": 1732830647199, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1138, + "versionNonce": 324404551, + "index": "aU", + "isDeleted": false, + "id": "Ks8Ctqdeqs2JPWK4x4bZp", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 488.86604516874036, + "y": 158.51373532229582, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 135.5459442138672, + "height": 48.68880849067817, + "seed": 431730246, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830420616, + "link": null, + "locked": false, + "fontSize": 38.951046792542535, + "fontFamily": 1, + "text": "Writers", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Writers", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 1426, + "versionNonce": 689161319, + "index": "aV", + "isDeleted": false, + "id": "xs_UphPfF7HtnC5DB1z-b", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 373.90060986598223, + "y": 217.1803641833253, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 362.1021728515625, + "height": 66.00600219840486, + "seed": 2079978886, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830420616, + "link": null, + "locked": false, + "fontSize": 26.402400879361945, + "fontFamily": 1, + "text": "(Inserts, Updates, Deletes,\nMerge, Insert overwrites)", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Inserts, Updates, Deletes,\nMerge, Insert overwrites)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 914, + "versionNonce": 1272896743, + "index": "aW", + "isDeleted": false, + "id": "idkUtZMKj9uj32BGmlUys", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 846.6574009933781, + "y": 140.07857380179257, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 461.0891630837735, + "height": 165.74745042402446, + "seed": 1701663942, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [], + "updated": 1732831043900, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1115, + "versionNonce": 1266488999, + "index": "aX", + "isDeleted": false, + "id": "6RQSXKEoNdua0ANYfJ_jY", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 959.9333887127589, + "y": 157.43130299299673, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 155.05990600585938, + "height": 48.68880849067817, + "seed": 1605553158, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830420616, + "link": null, + "locked": false, + "fontSize": 38.951046792542535, + "fontFamily": 1, + "text": "Readers", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Readers", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 1406, + "versionNonce": 1628547527, + "index": "aY", + "isDeleted": false, + "id": "EizbiOpOWsDHkvfzWVgxE", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 872.1014884453518, + "y": 217.55444006183416, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 344.93063086271286, + "height": 67.83227854649073, + "seed": 952589126, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830420616, + "link": null, + "locked": false, + "fontSize": 27.132911418596294, + "fontFamily": 1, + "text": "(Snapshot, Time Travel,\nIncremental, CDC queries)", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Snapshot, Time Travel,\nIncremental, CDC queries)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 912, + "versionNonce": 2028394727, + "index": "aZ", + "isDeleted": false, + "id": "KaH5V2b3JTWQupg1baOBQ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1351.0603482734125, + "y": 163.38793830213444, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 242.50210177898407, + "height": 106.10230180664453, + "seed": 1997013638, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830420616, + "link": null, + "locked": false, + "fontSize": 42.440920722657815, + "fontFamily": 1, + "text": "Programming\nAPI", + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "Programming\nAPI", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1131, + "versionNonce": 948511751, + "index": "aa", + "isDeleted": false, + "id": "1h1SBZlAAxdUf3R1Yi186", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 318.9352106530034, + "y": -121.05026658052748, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 1292.392364938919, + "height": 211.3847076020009, + "seed": 1295106502, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830420616, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1178, + "versionNonce": 183076841, + "index": "ab", + "isDeleted": false, + "id": "xyoYyuJ8foYIRUwaG_Aa1", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1735.6142872084672, + "y": 451.0902276960369, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 471.8020537087735, + "height": 212.27088792402452, + "seed": 241277190, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [], + "updated": 1732831352223, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1504, + "versionNonce": 170042057, + "index": "ac", + "isDeleted": false, + "id": "bAPQ_zEcYjwcoUbuEXnYv", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1837.656419426143, + "y": 463.85178326775565, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 257.3738708496094, + "height": 47.506794315331426, + "seed": 571770950, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732831352223, + "link": null, + "locked": false, + "fontSize": 38.00543545226514, + "fontFamily": 1, + "text": "Administration", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Administration", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 1913, + "versionNonce": 1026908585, + "index": "ad", + "isDeleted": false, + "id": "u5Jl-cnuSSLB8uz-RAxe5", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1740.429853647277, + "y": 525.8270336649374, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 478.3522003491721, + "height": 99.00900329760728, + "seed": 2015858566, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732831352223, + "link": null, + "locked": false, + "fontSize": 26.402400879361945, + "fontFamily": 1, + "text": "(CLI, Metrics integrations, config\nmanagement, deployment tooling,\npackaging)", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(CLI, Metrics integrations, config\nmanagement, deployment tooling, packaging)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1153, + "versionNonce": 2066981417, + "index": "ae", + "isDeleted": false, + "id": "sJGt0T04I-C-G3PO9jLRX", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 371.06100748181507, + "y": -99.9336108832623, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 426.6848662087735, + "height": 165.74745042402446, + "seed": 2094509766, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [], + "updated": 1732830906183, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 977, + "versionNonce": 1732032007, + "index": "ah", + "isDeleted": false, + "id": "H12LgOjHqXXt-P3yBEXm-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1456.9873794071075, + "y": -62.19477798434173, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 139.79732477664948, + "height": 106.10230180664453, + "seed": 714644614, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830449158, + "link": null, + "locked": false, + "fontSize": 42.440920722657815, + "fontFamily": 1, + "text": "User\nAccess", + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "User\nAccess", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1013, + "versionNonce": 1650527593, + "index": "ai", + "isDeleted": false, + "id": "GrJvfoRNR_EKSXaU1EIaM", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 312.8012023827663, + "y": 822.1225037502879, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 1292.0421662441488, + "height": 114.47517788469396, + "seed": 951682441, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830094404, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 925, + "versionNonce": 1293300489, + "index": "aj", + "isDeleted": false, + "id": "45yatnuwyUhLzXIy-9BrX", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 590.1928604560126, + "y": 827.8149859909738, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 632.6104125976562, + "height": 53.05115090332227, + "seed": 47678183, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830025213, + "link": null, + "locked": false, + "fontSize": 42.440920722657815, + "fontFamily": 1, + "text": "High performance table format", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "High performance table format", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 1437, + "versionNonce": 1219929289, + "index": "ak", + "isDeleted": false, + "id": "yL5nrhra27xJCC8Mx6210", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 328.6711929755436, + "y": 890.3341066688313, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 1253.6273803710942, + "height": 33.00300109920243, + "seed": 156977833, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830063164, + "link": null, + "locked": false, + "fontSize": 26.402400879361945, + "fontFamily": 1, + "text": "(Schema, File listing, Column Stats, partition stats, Evolution)", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Schema, File listing, Column Stats, partition stats, Evolution)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1112, + "versionNonce": 446096489, + "index": "al", + "isDeleted": false, + "id": "8RUssWTNXRT8mlpU_u0s9", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1673.99560004216, + "y": -112.60233319028703, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 606.0498553003619, + "height": 1305.5524559325127, + "seed": 1151312393, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830746199, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1063, + "versionNonce": 787423081, + "index": "am", + "isDeleted": false, + "id": "n6iuykb9lJ4x6W0fR6Ugw", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1734.6197168744634, + "y": -69.71644883568689, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 434.7976950407028, + "height": 106.10230180664453, + "seed": 1483930855, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732831748387, + "link": null, + "locked": false, + "fontSize": 42.440920722657815, + "fontFamily": 1, + "text": "Shared \nPlatform Components", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Shared \nPlatform Components", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1395, + "versionNonce": 1450889577, + "index": "an", + "isDeleted": false, + "id": "xL0HirI1gC8rMMfK-PHFx", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 845.9567404212868, + "y": -98.78381481104384, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 459.07418912544017, + "height": 165.74745042402446, + "seed": 1728619559, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [], + "updated": 1732831047517, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1319, + "versionNonce": 206439593, + "index": "ao", + "isDeleted": false, + "id": "OFNVzwfkq7L6Z93RE2al1", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 553.182937325739, + "y": -95.15032717770396, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 74.58924323320389, + "height": 48.68880849067817, + "seed": 1221186183, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830923933, + "link": null, + "locked": false, + "fontSize": 38.951046792542535, + "fontFamily": 1, + "text": "SQL", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "SQL", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 1347, + "versionNonce": 1923028775, + "index": "ap", + "isDeleted": false, + "id": "B8AYtZec5wSobwxOPsne0", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1011.2080374948214, + "y": -95.84694176103744, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 91.06508456170559, + "height": 48.68880849067817, + "seed": 1739697769, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732830932438, + "link": null, + "locked": false, + "fontSize": 38.951046792542535, + "fontFamily": 1, + "text": "Code", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Code", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 1825, + "versionNonce": 1864186023, + "index": "aq", + "isDeleted": false, + "id": "BzmQye9J-mWMUKKPNH13X", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 391.6578211900621, + "y": -35.67739486238679, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 382.80874633789057, + "height": 92.22992302671022, + "seed": 1026880647, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732831019735, + "link": null, + "locked": false, + "fontSize": 24.59464614045606, + "fontFamily": 1, + "text": "(Spark, Flink, Trino, Presto,\nBigQuery, Redshift, Doris, \nHive, StarRocks)", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Spark, Flink, Trino, Presto,\nBigQuery, Redshift, Doris, \nHive, StarRocks)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 2016, + "versionNonce": 1846701321, + "index": "ar", + "isDeleted": false, + "id": "UTpzPmi9Ons9XaEJaI8VC", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 863.9002393153339, + "y": -34.27114486238672, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 387.796566337347, + "height": 61.48661535114015, + "seed": 365562855, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732831029270, + "link": null, + "locked": false, + "fontSize": 24.59464614045606, + "fontFamily": 1, + "text": "(Java, Rust, Python, \nSpark, Flink, Ray, Daft)", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Java, Rust, Python, \nSpark, Flink, Ray, Daft)", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1560, + "versionNonce": 599921415, + "index": "as", + "isDeleted": false, + "id": "j7cOeH7glQqNmsqrLuJtv", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1729.0531258688322, + "y": 742.863320605622, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "width": 484.7061987035875, + "height": 205.98182542402466, + "seed": 1849122311, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [], + "updated": 1732831343570, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1926, + "versionNonce": 1949833767, + "index": "at", + "isDeleted": false, + "id": "Ui1OomkXzBOH78Eyds0SW", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1765.41707221617, + "y": 752.5130046416951, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 414.51717876304855, + "height": 49.434399008581764, + "seed": 2009859367, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732831343570, + "link": null, + "locked": false, + "fontSize": 39.54751920686541, + "fontFamily": 1, + "text": "Replication & Loading", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Replication & Loading", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 2236, + "versionNonce": 1386233159, + "index": "au", + "isDeleted": false, + "id": "Z036wG7lY-pd362dg3kWL", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1767.1340548883534, + "y": 819.1725795340413, + "strokeColor": "#1e1e1e", + "backgroundColor": "#99e9f2", + "width": 412.66962997731326, + "height": 68.68421868204743, + "seed": 847169607, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732831343570, + "link": null, + "locked": false, + "fontSize": 27.47368747281897, + "fontFamily": 1, + "text": "(Streaming/batch ingest,\ncatalog sync, interop )", + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(Streaming/batch ingest,\ncatalog sync, interop )", + "autoResize": false, + "lineHeight": 1.25 + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/site-image-source/hudi-stack-indexes.excalidraw b/site-image-source/hudi-stack-indexes.excalidraw new file mode 100644 index 000000000000..2d3bd940c607 --- /dev/null +++ b/site-image-source/hudi-stack-indexes.excalidraw @@ -0,0 +1,1255 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "TiTWD0IzT-ybUwmFF96Du", + "type": "rectangle", + "x": 347.75, + "y": 400.4296875, + "width": 425.32812500000006, + "height": 597.2617187500001, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "av", + "roundness": null, + "seed": 960014345, + "version": 278, + "versionNonce": 255234921, + "isDeleted": false, + "boundElements": null, + "updated": 1732839940832, + "link": null, + "locked": false + }, + { + "id": "NwYF36KZEAIs8zQi57GNk", + "type": "rectangle", + "x": 404.953125, + "y": 450.91015625, + "width": 290.40234375, + "height": 60.32421875, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "ax", + "roundness": null, + "seed": 2025728647, + "version": 99, + "versionNonce": 134269289, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "KIdJbfVJf1eFapj0Mu79G" + } + ], + "updated": 1732840007648, + "link": null, + "locked": false + }, + { + "id": "KIdJbfVJf1eFapj0Mu79G", + "type": "text", + "x": 475.4503479003906, + "y": 463.572265625, + "width": 149.40789794921875, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "axV", + "roundness": null, + "seed": 1506828393, + "version": 32, + "versionNonce": 903197769, + "isDeleted": false, + "boundElements": null, + "updated": 1732840007648, + "link": null, + "locked": false, + "text": "file listings", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "NwYF36KZEAIs8zQi57GNk", + "originalText": "file listings", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "EQ8VVM80Zaf4lwcyzdAE9", + "type": "rectangle", + "x": 407.666015625, + "y": 530.744140625, + "width": 290.40234375, + "height": 60.32421875, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b02", + "roundness": null, + "seed": 1168028617, + "version": 183, + "versionNonce": 709709897, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "lLZ2ZYETOrpI8E_gXL__l" + } + ], + "updated": 1732840009931, + "link": null, + "locked": false + }, + { + "id": "lLZ2ZYETOrpI8E_gXL__l", + "type": "text", + "x": 436.12124437093735, + "y": 543.40625, + "width": 233.4918862581253, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b03", + "roundness": null, + "seed": 822563497, + "version": 137, + "versionNonce": 783179561, + "isDeleted": false, + "boundElements": [], + "updated": 1732840009931, + "link": null, + "locked": false, + "text": "column statistics", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "EQ8VVM80Zaf4lwcyzdAE9", + "originalText": "column statistics", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "50drocMbxsoA7LjdEbf7O", + "type": "rectangle", + "x": 409.873046875, + "y": 608.630859375, + "width": 290.40234375, + "height": 60.32421875, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b04", + "roundness": null, + "seed": 1939737289, + "version": 207, + "versionNonce": 2139354921, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "L9uiUBGkmtho-2VuC2bth" + } + ], + "updated": 1732839855297, + "link": null, + "locked": false + }, + { + "id": "L9uiUBGkmtho-2VuC2bth", + "type": "text", + "x": 421.0802960395813, + "y": 621.29296875, + "width": 267.9878454208374, + "height": 35, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b05", + "roundness": null, + "seed": 855886249, + "version": 183, + "versionNonce": 942483977, + "isDeleted": false, + "boundElements": [], + "updated": 1732839855297, + "link": null, + "locked": false, + "text": "partition statistics", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "50drocMbxsoA7LjdEbf7O", + "originalText": "partition statistics", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "oagBYAIMqS5qDQNkuavGO", + "type": "rectangle", + "x": 413.076171875, + "y": 691.115234375, + "width": 290.40234375, + "height": 80, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b06", + "roundness": null, + "seed": 1031750855, + "version": 310, + "versionNonce": 1703773385, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "q66d-0oyGSFond7qEjUD7" + } + ], + "updated": 1732839889462, + "link": null, + "locked": false + }, + { + "id": "q66d-0oyGSFond7qEjUD7", + "type": "text", + "x": 438.3533935546875, + "y": 696.115234375, + "width": 239.847900390625, + "height": 70, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b07", + "roundness": null, + "seed": 1256788967, + "version": 349, + "versionNonce": 579381737, + "isDeleted": false, + "boundElements": [], + "updated": 1732839889461, + "link": null, + "locked": false, + "text": "stats index on \nextract_date(ts)", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "oagBYAIMqS5qDQNkuavGO", + "originalText": "stats index on \nextract_date(ts)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "AUGVimiIqeBQwQAUB8B9q", + "type": "rectangle", + "x": 416.435546875, + "y": 797.77734375, + "width": 290.40234375, + "height": 80, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b08", + "roundness": null, + "seed": 684230345, + "version": 398, + "versionNonce": 818244295, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "6qijsAk3QrMu1fJRhLS6_" + } + ], + "updated": 1732839894015, + "link": null, + "locked": false + }, + { + "id": "6qijsAk3QrMu1fJRhLS6_", + "type": "text", + "x": 422.3367964029312, + "y": 802.77734375, + "width": 278.5998446941376, + "height": 70, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b09", + "roundness": null, + "seed": 1434371497, + "version": 428, + "versionNonce": 2121955815, + "isDeleted": false, + "boundElements": [], + "updated": 1732839894015, + "link": null, + "locked": false, + "text": "bloom filter index on\nlower(emp_name)", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "AUGVimiIqeBQwQAUB8B9q", + "originalText": "bloom filter index on\nlower(emp_name)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "oI2fr4NHM2mDrjI_800zc", + "type": "rectangle", + "x": 418.810546875, + "y": 911.9140625, + "width": 290.40234375, + "height": 80, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0A", + "roundness": null, + "seed": 1279008361, + "version": 447, + "versionNonce": 527257031, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "N1TUZWGbTABpRKLrG7r1O" + } + ], + "updated": 1732839897936, + "link": null, + "locked": false + }, + { + "id": "N1TUZWGbTABpRKLrG7r1O", + "type": "text", + "x": 434.3437805175781, + "y": 916.9140625, + "width": 259.33587646484375, + "height": 70, + "angle": 0, + "strokeColor": "#ffffff", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0B", + "roundness": null, + "seed": 1641965897, + "version": 495, + "versionNonce": 2066363721, + "isDeleted": false, + "boundElements": [], + "updated": 1732839920651, + "link": null, + "locked": false, + "text": "secondary index on\n(dept_id)", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "oI2fr4NHM2mDrjI_800zc", + "originalText": "secondary index on\n(dept_id)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "vMeeDh59dtWyU3IJ89w78", + "type": "text", + "x": 450.31287933886045, + "y": 378.4453125, + "width": 186.36262938380253, + "height": 59.79296875000003, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0C", + "roundness": null, + "seed": 1752430055, + "version": 291, + "versionNonce": 214847687, + "isDeleted": false, + "boundElements": null, + "updated": 1732840393016, + "link": null, + "locked": false, + "text": "\nMetadata Table", + "fontSize": 23.917187499999997, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "\nMetadata Table", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "jiP2jvGSxicKHS5puhUhF", + "type": "arrow", + "x": 732.13671875, + "y": 481.9609375, + "width": 109.46875, + "height": 74.09375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0F", + "roundness": { + "type": 2 + }, + "seed": 1790005479, + "version": 135, + "versionNonce": 444856775, + "isDeleted": false, + "boundElements": null, + "updated": 1732840084385, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 109.46875, + 74.09375 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "UeCvlJV21rbz70Cn5pIss", + "type": "arrow", + "x": 727.0618701893835, + "y": 563.58630236201, + "width": 116.4375, + "height": 1.39453125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0G", + "roundness": { + "type": 2 + }, + "seed": 1038076263, + "version": 154, + "versionNonce": 437187817, + "isDeleted": false, + "boundElements": [], + "updated": 1732840079417, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 116.4375, + -1.39453125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "g7hVSt34wQuHRIJwackOg", + "type": "arrow", + "x": 726.8215329606085, + "y": 636.634089642357, + "width": 118.38671875, + "height": 71.2109375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0H", + "roundness": { + "type": 2 + }, + "seed": 1371468777, + "version": 311, + "versionNonce": 1890530857, + "isDeleted": false, + "boundElements": [], + "updated": 1732840096949, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 118.38671875, + -71.2109375 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "-Hi_yTA2gCy8VuZ_3Njom", + "type": "text", + "x": 864.0175247192383, + "y": 505.33984375, + "width": 192.7799072265625, + "height": 105, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0I", + "roundness": null, + "seed": 31624999, + "version": 294, + "versionNonce": 390759817, + "isDeleted": false, + "boundElements": [], + "updated": 1732840125302, + "link": null, + "locked": false, + "text": "\nTable Format \nMetadata", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "\nTable Format \nMetadata", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "gYM7UoalJH1ybROeVvg44", + "type": "arrow", + "x": 731.91015625, + "y": 724.2421875, + "width": 105.8671875, + "height": 0.67578125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0J", + "roundness": { + "type": 2 + }, + "seed": 1047230281, + "version": 40, + "versionNonce": 1622268105, + "isDeleted": false, + "boundElements": null, + "updated": 1732840139099, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 105.8671875, + -0.67578125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "VfbOge0Y55q9Hzc2t8UuL", + "type": "text", + "x": 851.9420776367188, + "y": 656.73046875, + "width": 281.37188720703125, + "height": 105, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0K", + "roundness": null, + "seed": 1776455303, + "version": 394, + "versionNonce": 1765078409, + "isDeleted": false, + "boundElements": [], + "updated": 1732840176063, + "link": null, + "locked": false, + "text": "Expression index on \ndate to implement\nlogical partitioning", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Expression index on \ndate to implement\nlogical partitioning", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "SN2AafI_SgaCoC4ai35lI", + "type": "text", + "x": 851.2359313964844, + "y": 793.56640625, + "width": 317.4918212890625, + "height": 105, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0L", + "roundness": null, + "seed": 1831867945, + "version": 566, + "versionNonce": 2126379785, + "isDeleted": false, + "boundElements": [], + "updated": 1732840224900, + "link": null, + "locked": false, + "text": "Expression index using \nbloom filters\n", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Expression index using \nbloom filters\n", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "PBhNke_L2eZBXfqXwbiPg", + "type": "arrow", + "x": 726.7369640145266, + "y": 833.6356175880769, + "width": 105.8671875, + "height": 0.67578125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0M", + "roundness": { + "type": 2 + }, + "seed": 267274249, + "version": 106, + "versionNonce": 1699684615, + "isDeleted": false, + "boundElements": [], + "updated": 1732840188816, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 105.8671875, + -0.67578125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "WqLZJmHKJFcPiG3xePjxa", + "type": "arrow", + "x": 725.6602183204143, + "y": 945.8154357190864, + "width": 105.8671875, + "height": 0.67578125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0N", + "roundness": { + "type": 2 + }, + "seed": 1552223145, + "version": 161, + "versionNonce": 1807406343, + "isDeleted": false, + "boundElements": [], + "updated": 1732840231332, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 105.8671875, + -0.67578125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "-qRzzAy51gTxiTrzdjq7a", + "type": "text", + "x": 845.9806518554688, + "y": 898.734375, + "width": 298.81585693359375, + "height": 70, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0O", + "roundness": null, + "seed": 837762217, + "version": 674, + "versionNonce": 803825639, + "isDeleted": false, + "boundElements": [], + "updated": 1732840251569, + "link": null, + "locked": false, + "text": "Secondary index with \nreverse mapping", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Secondary index with \nreverse mapping", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "C4p0s_i6opKGKKtPOLQ5G", + "type": "line", + "x": 307.734375, + "y": 431.53515625, + "width": 0.6796875, + "height": 232.37890625, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0P", + "roundness": null, + "seed": 1655611049, + "version": 135, + "versionNonce": 278200041, + "isDeleted": false, + "boundElements": null, + "updated": 1732840344554, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.6796875, + 232.37890625 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "Ep1v7YTiWa-IPaVbsrv-p", + "type": "line", + "x": 308.3879892359599, + "y": 703.5354200086558, + "width": 1.4765625, + "height": 265.41796875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0Q", + "roundness": null, + "seed": 945775623, + "version": 257, + "versionNonce": 388187817, + "isDeleted": false, + "boundElements": [], + "updated": 1732840295169, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.4765625, + 265.41796875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "pfU-EnjMowq2BHVywmPNs", + "type": "text", + "x": 73.87957763671875, + "y": 483.80859375, + "width": 215.17990112304688, + "height": 105, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0R", + "roundness": null, + "seed": 1477306023, + "version": 437, + "versionNonce": 1224240745, + "isDeleted": false, + "boundElements": [], + "updated": 1732840332269, + "link": null, + "locked": false, + "text": "Used by query\nengines to plan \nqueries", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Used by query\nengines to plan \nqueries", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "nbhoQIHGI14k_cJt7i3Mf", + "type": "text", + "x": 64.54676818847656, + "y": 766.55078125, + "width": 198.21191895008087, + "height": 140, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0S", + "roundness": null, + "seed": 1359461129, + "version": 605, + "versionNonce": 1051071209, + "isDeleted": false, + "boundElements": [], + "updated": 1732840416776, + "link": null, + "locked": false, + "text": "Used by hudi\nstorage engine\nto speed up\nqueries/writes", + "fontSize": 28, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Used by hudi\nstorage engine\nto speed up\nqueries/writes", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "NT6dcyzTHt6ggl2-miEMj", + "type": "line", + "x": 333.2522388827055, + "y": 431.8184364139876, + "width": 24.5546875, + "height": 0.3828125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0U", + "roundness": null, + "seed": 1901052905, + "version": 366, + "versionNonce": 661317703, + "isDeleted": false, + "boundElements": [], + "updated": 1732840357584, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -24.5546875, + 0.3828125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "vd55kkGGZeOqBFhmhBP3p", + "type": "line", + "x": 331.2834888827055, + "y": 666.8496864139876, + "width": 24.5546875, + "height": 0.3828125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0V", + "roundness": null, + "seed": 1979960681, + "version": 368, + "versionNonce": 942907655, + "isDeleted": false, + "boundElements": [], + "updated": 1732840363332, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -24.5546875, + 0.3828125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "atlLwwa9PCi6Q7wbhwsyE", + "type": "line", + "x": 334.3030201327055, + "y": 704.7754676639877, + "width": 24.5546875, + "height": 0.3828125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0W", + "roundness": null, + "seed": 646335303, + "version": 294, + "versionNonce": 2131712649, + "isDeleted": false, + "boundElements": [], + "updated": 1732840366917, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -24.5546875, + 0.3828125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "FmpDd7Mv-wbBMuJRoBqF6", + "type": "line", + "x": 338.9709888827055, + "y": 966.4746864139877, + "width": 24.5546875, + "height": 0.3828125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#1971c2", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0X", + "roundness": null, + "seed": 549391433, + "version": 350, + "versionNonce": 434638823, + "isDeleted": false, + "boundElements": [], + "updated": 1732840371800, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -24.5546875, + 0.3828125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/site-image-source/hudi-timeline-actions.excalidraw b/site-image-source/hudi-timeline-actions.excalidraw new file mode 100644 index 000000000000..2e26372cbe7d --- /dev/null +++ b/site-image-source/hudi-timeline-actions.excalidraw @@ -0,0 +1,959 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "rw7tJgZ33bb0eh7XDmBID", + "type": "line", + "x": 324.32421875, + "y": 470.9375, + "width": 489.14453125, + "height": 4.0234375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0Y", + "roundness": { + "type": 2 + }, + "seed": 419426121, + "version": 351, + "versionNonce": 7761449, + "isDeleted": false, + "boundElements": null, + "updated": 1732870401808, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 489.14453125, + 4.0234375 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "wXTzjgZYSPyop6Grxb01G", + "type": "arrow", + "x": 324.63671875, + "y": 535.25390625, + "width": 0.8671875, + "height": 53.3203125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0Z", + "roundness": null, + "seed": 2067904681, + "version": 133, + "versionNonce": 979958855, + "isDeleted": false, + "boundElements": [], + "updated": 1732870461072, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.8671875, + -53.3203125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "riLcsTPDU4VWrGCxhiN-7", + "type": "arrow", + "x": 813.73046875, + "y": 537.01171875, + "width": 0.8671875, + "height": 53.3203125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0a", + "roundness": null, + "seed": 430749863, + "version": 165, + "versionNonce": 235394537, + "isDeleted": false, + "boundElements": [], + "updated": 1732870393088, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.8671875, + -53.3203125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "-32K8M3YgrzZwxXlvaqJp", + "type": "text", + "x": 281.0664367675781, + "y": 548.8046875, + "width": 94.03190612792969, + "height": 60, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0b", + "roundness": null, + "seed": 1816525161, + "version": 70, + "versionNonce": 1956198889, + "isDeleted": false, + "boundElements": null, + "updated": 1732870753407, + "link": null, + "locked": false, + "text": "Action A\nrequested \nat instant 1", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Action A\nrequested \nat instant 1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Rjmi8Kvxz8HkYpYyjmVa9", + "type": "text", + "x": 768.3611649572849, + "y": 547.42578125, + "width": 97.18392008543015, + "height": 60, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0c", + "roundness": null, + "seed": 1072962633, + "version": 164, + "versionNonce": 1875345737, + "isDeleted": false, + "boundElements": [], + "updated": 1732870745190, + "link": null, + "locked": false, + "text": "Action A\ncompleted \nat instant 5", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Action A\ncompleted \nat instant 5", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "PXs_nygAy46WpaXZnHoOs", + "type": "arrow", + "x": 493.73792266845703, + "y": 536.158203125, + "width": 0.8671875, + "height": 53.3203125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "groupIds": [], + "frameId": null, + "index": "b0d", + "roundness": null, + "seed": 2087671625, + "version": 206, + "versionNonce": 841551751, + "isDeleted": false, + "boundElements": [], + "updated": 1732871653837, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.8671875, + -53.3203125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "EJ2q2wSCKLQF98AwdzK6T", + "type": "text", + "x": 463.7516174316406, + "y": 549.470703125, + "width": 66.86395263671875, + "height": 40, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "groupIds": [], + "frameId": null, + "index": "b0e", + "roundness": null, + "seed": 485983785, + "version": 153, + "versionNonce": 201174343, + "isDeleted": false, + "boundElements": [], + "updated": 1732871580502, + "link": null, + "locked": false, + "text": "Action A\ninflight", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Action A\ninflight", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "B_WNyatLoIUeUeSg-Pbtr", + "type": "arrow", + "x": 644.870735168457, + "y": 535.255859375, + "width": 0.8671875, + "height": 53.3203125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "groupIds": [], + "frameId": null, + "index": "b0f", + "roundness": null, + "seed": 1854446823, + "version": 247, + "versionNonce": 784735591, + "isDeleted": false, + "boundElements": [], + "updated": 1732871661787, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.8671875, + -53.3203125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "2oYRowBlrXPsC-lIhXFpW", + "type": "text", + "x": 589.7484588623047, + "y": 548.806640625, + "width": 117.13589477539062, + "height": 60, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "groupIds": [], + "frameId": null, + "index": "b0g", + "roundness": null, + "seed": 491939847, + "version": 232, + "versionNonce": 337032775, + "isDeleted": false, + "boundElements": [], + "updated": 1732871589470, + "link": null, + "locked": false, + "text": "Action A fails, \ninflight again\nwith retry", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Action A fails, \ninflight again\nwith retry", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "pEOTunE0jGaDMix1mp8I7", + "type": "line", + "x": 415.55481115784505, + "y": 347.5938925215974, + "width": 273.6171875, + "height": 1.66015625, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0h", + "roundness": { + "type": 2 + }, + "seed": 436186889, + "version": 791, + "versionNonce": 1029679111, + "isDeleted": false, + "boundElements": [], + "updated": 1732871552936, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 273.6171875, + 1.66015625 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "oRBSQHPSwma4pp7b2op0q", + "type": "arrow", + "x": 418.09387365784505, + "y": 276.3282675215974, + "width": 0.2109375, + "height": 57.9765625, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0i", + "roundness": null, + "seed": 505865705, + "version": 628, + "versionNonce": 257625895, + "isDeleted": false, + "boundElements": [], + "updated": 1732871552936, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.2109375, + 57.9765625 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "1_zMbzNqoQlOK3tLnYCaJ", + "type": "arrow", + "x": 599.2813736578448, + "y": 282.4532675215974, + "width": 0.43359375, + "height": 58.1328125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "groupIds": [], + "frameId": null, + "index": "b0j", + "roundness": null, + "seed": 1241792713, + "version": 839, + "versionNonce": 1185144071, + "isDeleted": false, + "boundElements": [], + "updated": 1732871666019, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.43359375, + 58.1328125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "FaQfwZqetxEUiHieo_ZN1", + "type": "arrow", + "x": 688.9567963263019, + "y": 283.4083456465974, + "width": 0.2578125, + "height": 54.359375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0k", + "roundness": null, + "seed": 187908009, + "version": 762, + "versionNonce": 520139111, + "isDeleted": false, + "boundElements": [], + "updated": 1732871552936, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.2578125, + 54.359375 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "nUUPE9s2-slbSmiINXvGY", + "type": "text", + "x": 368.9525086065753, + "y": 204.7950643965974, + "width": 98.39991760253906, + "height": 60, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0l", + "roundness": null, + "seed": 266297993, + "version": 613, + "versionNonce": 517205127, + "isDeleted": false, + "boundElements": [], + "updated": 1732871552936, + "link": null, + "locked": false, + "text": "Action B\nrequested \nat instant 2", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Action B\nrequested \nat instant 2", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "rh3Q6hk1s2Y135H8mg8JP", + "type": "text", + "x": 639.8446350097656, + "y": 204.55078125, + "width": 96.92791748046875, + "height": 60, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b0o", + "roundness": null, + "seed": 553929607, + "version": 725, + "versionNonce": 852673447, + "isDeleted": false, + "boundElements": [], + "updated": 1732871552936, + "link": null, + "locked": false, + "text": "Action B\ncompleted \nat instant 3", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Action B\ncompleted \nat instant 3", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "9roBC31Z5ETjvgT8K1DDv", + "type": "text", + "x": 559.2161483764648, + "y": 231.41015625, + "width": 68.22395324707031, + "height": 40, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "groupIds": [], + "frameId": null, + "index": "b0p", + "roundness": null, + "seed": 1673059207, + "version": 400, + "versionNonce": 1451944137, + "isDeleted": false, + "boundElements": [], + "updated": 1732871570936, + "link": null, + "locked": false, + "text": "Action B\ninflight", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Action B\ninflight", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "cnRkUmLJwXpiYgyT0ltz8", + "type": "line", + "x": 756.7899368594401, + "y": 433.5370121669676, + "width": 273.6171875, + "height": 1.66015625, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b14", + "roundness": { + "type": 2 + }, + "seed": 1672864199, + "version": 925, + "versionNonce": 1898322441, + "isDeleted": false, + "boundElements": [], + "updated": 1732871618236, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 273.6171875, + 1.66015625 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "isUXOFaaQGNNk83Va1XRE", + "type": "arrow", + "x": 759.3289993594401, + "y": 362.2713871669676, + "width": 0.2109375, + "height": 57.9765625, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b15", + "roundness": null, + "seed": 172232935, + "version": 762, + "versionNonce": 994570473, + "isDeleted": false, + "boundElements": [], + "updated": 1732871618236, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.2109375, + 57.9765625 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "zMsxS7nqRkoiSIwB4b7fZ", + "type": "arrow", + "x": 940.5164993594401, + "y": 368.3963871669676, + "width": 0.43359375, + "height": 58.1328125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "groupIds": [], + "frameId": null, + "index": "b16", + "roundness": null, + "seed": 427777031, + "version": 975, + "versionNonce": 1568086759, + "isDeleted": false, + "boundElements": [], + "updated": 1732871672803, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.43359375, + 58.1328125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "RK19l_b_rzmIyLNRxeWTL", + "type": "arrow", + "x": 1030.1919220278971, + "y": 369.3514652919676, + "width": 0.2578125, + "height": 54.359375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b17", + "roundness": null, + "seed": 895763239, + "version": 896, + "versionNonce": 1439533737, + "isDeleted": false, + "boundElements": [], + "updated": 1732871618236, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.2578125, + 54.359375 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "udNE5xQf0CHYduE6ZOrUO", + "type": "text", + "x": 711.1076401065103, + "y": 303.2342777919676, + "width": 96.55990600585938, + "height": 60, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b18", + "roundness": null, + "seed": 1314866759, + "version": 771, + "versionNonce": 1268579463, + "isDeleted": false, + "boundElements": [], + "updated": 1732871680438, + "link": null, + "locked": false, + "text": "Action C\nrequested \nat instant 4", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Action C\nrequested \nat instant 4", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "AK7tbWpleH1FTBBT4ZnUm", + "type": "text", + "x": 981.0620452572591, + "y": 290.4939008953702, + "width": 97.43991088867188, + "height": 60, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b19", + "roundness": null, + "seed": 323806567, + "version": 864, + "versionNonce": 423495623, + "isDeleted": false, + "boundElements": [], + "updated": 1732871644151, + "link": null, + "locked": false, + "text": "Action C\ncompleted \nat instant 6", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Action C\ncompleted \nat instant 6", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "2-mr984rBFAXok5r2MeyM", + "type": "text", + "x": 901.5072738339193, + "y": 317.3532758953702, + "width": 66.11195373535156, + "height": 40, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "groupIds": [], + "frameId": null, + "index": "b1A", + "roundness": null, + "seed": 595173511, + "version": 536, + "versionNonce": 1671720007, + "isDeleted": false, + "boundElements": [], + "updated": 1732871647480, + "link": null, + "locked": false, + "text": "Action C\ninflight", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Action C\ninflight", + "autoResize": true, + "lineHeight": 1.25 + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/site-image-source/hudi-timeline-truetime.excalidraw b/site-image-source/hudi-timeline-truetime.excalidraw new file mode 100644 index 000000000000..3f4f63bcc9a9 --- /dev/null +++ b/site-image-source/hudi-timeline-truetime.excalidraw @@ -0,0 +1,2083 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "text", + "version": 487, + "versionNonce": 1589746247, + "isDeleted": false, + "id": "kDR8fPJ9JfnlLD6LfwsiP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 655.6817087295009, + "y": 1446.8307686350395, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 93.27994203567505, + "height": 25, + "seed": 1019624457, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "Real time", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "index": "b1B", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876776341, + "link": null, + "locked": false, + "containerId": null, + "originalText": "Real time", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "8GpUVrSrdEVpwG-Ivfhzu", + "type": "rectangle", + "x": 236.39453125, + "y": 1360.49609375, + "width": 64.33984375000004, + "height": 53.28125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1F", + "roundness": { + "type": 3 + }, + "seed": 1428676999, + "version": 807, + "versionNonce": 354798313, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "bGmBqaCJOy6gJpJgowuKN" + }, + { + "id": "L0Gda99DrPHp9HdQTKGj7", + "type": "arrow" + } + ], + "updated": 1732876803395, + "link": null, + "locked": false + }, + { + "id": "bGmBqaCJOy6gJpJgowuKN", + "type": "text", + "x": 260.95446014404297, + "y": 1374.63671875, + "width": 15.219985961914062, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1FV", + "roundness": null, + "seed": 1042692711, + "version": 460, + "versionNonce": 87495047, + "isDeleted": false, + "boundElements": null, + "updated": 1732876135514, + "link": null, + "locked": false, + "text": "B", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "8GpUVrSrdEVpwG-Ivfhzu", + "originalText": "B", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ouCODsuEmRiy2aHhUs9C0", + "type": "arrow", + "x": 203.41015625, + "y": 1425.1484375, + "width": 554.109375, + "height": 7.6328125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1H", + "roundness": { + "type": 2 + }, + "seed": 20654889, + "version": 187, + "versionNonce": 221626441, + "isDeleted": false, + "boundElements": null, + "updated": 1732874712889, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 554.109375, + -7.6328125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "w2wF4x2bQ60ffrAaaxRNe", + "type": "arrow", + "x": 202.60690600468774, + "y": 1427.1551064450296, + "width": 4.83203125, + "height": 439.41796875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1I", + "roundness": { + "type": 2 + }, + "seed": 35696009, + "version": 388, + "versionNonce": 1164921737, + "isDeleted": false, + "boundElements": [], + "updated": 1732874709871, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -4.83203125, + -439.41796875 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "type": "text", + "version": 570, + "versionNonce": 2080613543, + "isDeleted": false, + "id": "fqbNaQKRGyvsnLvm5hxhC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 74.78581023216236, + "y": 1004.61328125, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 102.49991512298584, + "height": 25, + "seed": 1458587881, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "True Time", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "index": "b1J", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732874745419, + "link": null, + "locked": false, + "containerId": null, + "originalText": "True Time", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "0OVpbXMt75HaE-AKVDjGS", + "type": "rectangle", + "x": 317.640625, + "y": 1359.1328125, + "width": 60.29296875000003, + "height": 54.437499999999986, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "#b2f2bb", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1N", + "roundness": { + "type": 3 + }, + "seed": 1634528233, + "version": 1127, + "versionNonce": 897354151, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "Ci37cF-WsW_K7wAdJc9Q2" + }, + { + "id": "XJ6EheD-WNdet90cyaa8i", + "type": "arrow" + } + ], + "updated": 1732876270513, + "link": null, + "locked": false + }, + { + "id": "Ci37cF-WsW_K7wAdJc9Q2", + "type": "text", + "x": 341.02711486816406, + "y": 1373.8515625, + "width": 13.519989013671875, + "height": 25, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1O", + "roundness": null, + "seed": 43615945, + "version": 779, + "versionNonce": 1640918119, + "isDeleted": false, + "boundElements": [], + "updated": 1732876224690, + "link": null, + "locked": false, + "text": "A", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "0OVpbXMt75HaE-AKVDjGS", + "originalText": "A", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "t7j3Y7pLNHtQ-lK-fKP16", + "type": "rectangle", + "x": 462.509765625, + "y": 1236.5703125, + "width": 58.38671874999998, + "height": 52.671875, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#b2f2bb", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1P", + "roundness": { + "type": 3 + }, + "seed": 1815048201, + "version": 1557, + "versionNonce": 2107462919, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "k1b9SVMmifd-8Krwf2G8Z" + } + ], + "updated": 1732876600431, + "link": null, + "locked": false + }, + { + "id": "k1b9SVMmifd-8Krwf2G8Z", + "type": "text", + "x": 484.94313049316406, + "y": 1250.40625, + "width": 13.519989013671875, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1Q", + "roundness": null, + "seed": 1991673577, + "version": 1208, + "versionNonce": 895163431, + "isDeleted": false, + "boundElements": [], + "updated": 1732876600431, + "link": null, + "locked": false, + "text": "A", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "t7j3Y7pLNHtQ-lK-fKP16", + "originalText": "A", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "MN7FcSni1RTmma80KyDbx", + "type": "rectangle", + "x": 638.646484375, + "y": 1018.7890625, + "width": 64.33984375000004, + "height": 53.28125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1R", + "roundness": { + "type": 3 + }, + "seed": 979787623, + "version": 1277, + "versionNonce": 1988449255, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "QKE5raazmwWBv4lUY4M4J" + }, + { + "id": "6g5OAI8W2961G4SFyC1ma", + "type": "arrow" + } + ], + "updated": 1732876940881, + "link": null, + "locked": false + }, + { + "id": "QKE5raazmwWBv4lUY4M4J", + "type": "text", + "x": 663.206413269043, + "y": 1032.9296875, + "width": 15.219985961914062, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1S", + "roundness": null, + "seed": 1565776519, + "version": 994, + "versionNonce": 698362215, + "isDeleted": false, + "boundElements": [], + "updated": 1732876927233, + "link": null, + "locked": false, + "text": "B", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "MN7FcSni1RTmma80KyDbx", + "originalText": "B", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "QJCb7uRb5ZTgAc35U_mW_", + "type": "ellipse", + "x": 479.890625, + "y": 1376.8828125, + "width": 11.05859375, + "height": 12.94140625, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1T", + "roundness": { + "type": 2 + }, + "seed": 1310805545, + "version": 1234, + "versionNonce": 826001321, + "isDeleted": false, + "boundElements": [ + { + "id": "Pjb4zz5-I4Ev2IhS7EbAX", + "type": "arrow" + } + ], + "updated": 1732876588798, + "link": null, + "locked": false + }, + { + "id": "DgTPCQUg0Xk0wrzEhw9dA", + "type": "ellipse", + "x": 552.146484375, + "y": 1162.095703125, + "width": 11.05859375, + "height": 12.94140625, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1U", + "roundness": { + "type": 2 + }, + "seed": 587526281, + "version": 892, + "versionNonce": 1760225033, + "isDeleted": false, + "boundElements": [ + { + "id": "9XS3oZ4tVJzGijveQnhRv", + "type": "arrow" + } + ], + "updated": 1732876813833, + "link": null, + "locked": false + }, + { + "id": "XJ6EheD-WNdet90cyaa8i", + "type": "arrow", + "x": 378.8507657467232, + "y": 1387.4228057239727, + "width": 100.00849419859429, + "height": 2.8643168506448546, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1V", + "roundness": { + "type": 2 + }, + "seed": 1150965705, + "version": 2767, + "versionNonce": 2132232969, + "isDeleted": false, + "boundElements": null, + "updated": 1732876570736, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 100.00849419859429, + -2.8643168506448546 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "9hBS40_AdaY_2N--AcRSJ", + "focus": -0.09415799495635191, + "gap": 1, + "fixedPoint": null + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "Pjb4zz5-I4Ev2IhS7EbAX", + "type": "arrow", + "x": 488.4144322985412, + "y": 1367.6629963936443, + "width": 1.7824925611946583, + "height": 72.99112139364433, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1W", + "roundness": { + "type": 2 + }, + "seed": 1279439847, + "version": 1402, + "versionNonce": 2004781447, + "isDeleted": false, + "boundElements": null, + "updated": 1732876598089, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.7824925611946583, + -72.99112139364433 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "QJCb7uRb5ZTgAc35U_mW_", + "focus": 0.47208020524851624, + "gap": 9.537399194530503, + "fixedPoint": null + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "L0Gda99DrPHp9HdQTKGj7", + "type": "arrow", + "x": 272.21570828424024, + "y": 1357.358809426448, + "width": 279.74522921575976, + "height": 189.94474692644803, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1X", + "roundness": { + "type": 2 + }, + "seed": 1296649705, + "version": 663, + "versionNonce": 2077198631, + "isDeleted": false, + "boundElements": null, + "updated": 1732876809166, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 279.74522921575976, + -189.94474692644803 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "8GpUVrSrdEVpwG-Ivfhzu", + "focus": -0.5630492964709586, + "gap": 3.1372843235519667, + "fixedPoint": null + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "9XS3oZ4tVJzGijveQnhRv", + "type": "arrow", + "x": 568.1938532871128, + "y": 1168.08984375, + "width": 83.6459904628872, + "height": 0.09375, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1Y", + "roundness": { + "type": 2 + }, + "seed": 1294870313, + "version": 795, + "versionNonce": 1857975495, + "isDeleted": false, + "boundElements": null, + "updated": 1732876874005, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 83.6459904628872, + -0.09375 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "DgTPCQUg0Xk0wrzEhw9dA", + "focus": -0.0718273851088867, + "gap": 4.997812870448373, + "fixedPoint": null + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "L-TGf2cakm8o_yKvhUqdm", + "type": "ellipse", + "x": 659.947265625, + "y": 1161.099609375, + "width": 11.05859375, + "height": 12.94140625, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1Z", + "roundness": { + "type": 2 + }, + "seed": 1135300935, + "version": 680, + "versionNonce": 1918032521, + "isDeleted": false, + "boundElements": [ + { + "id": "6g5OAI8W2961G4SFyC1ma", + "type": "arrow" + } + ], + "updated": 1732876919418, + "link": null, + "locked": false + }, + { + "id": "6g5OAI8W2961G4SFyC1ma", + "type": "arrow", + "x": 666.9369338150574, + "y": 1153.6332963750376, + "width": 1.1499533118147838, + "height": 74.47604441038152, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1a", + "roundness": { + "type": 2 + }, + "seed": 1283622281, + "version": 778, + "versionNonce": 1867819111, + "isDeleted": false, + "boundElements": [], + "updated": 1732876941649, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.1499533118147838, + -74.47604441038152 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "L-TGf2cakm8o_yKvhUqdm", + "focus": 0.22515927506021796, + "gap": 7.553437748249349, + "fixedPoint": null + }, + "endBinding": { + "elementId": "MN7FcSni1RTmma80KyDbx", + "focus": 0.06779189599020363, + "gap": 7.086939464656098, + "fixedPoint": null + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "-bBMu-WmOhJ8rP5rSweC3", + "type": "image", + "x": 354.14453125, + "y": 1332.15234375, + "width": 40.500000000000014, + "height": 40.500000000000014, + "angle": 0, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1d", + "roundness": null, + "seed": 1916100905, + "version": 602, + "versionNonce": 188485927, + "isDeleted": false, + "boundElements": [ + { + "id": "XJ6EheD-WNdet90cyaa8i", + "type": "arrow" + } + ], + "updated": 1732876249872, + "link": null, + "locked": false, + "status": "saved", + "fileId": "390d5a2a922e2244e96b5cf5ea08c1c0abbaa1ab", + "scale": [ + 1, + 1 + ], + "crop": null + }, + { + "id": "uZRmhqoSPBsQbSbKJQBZP", + "type": "image", + "x": 506.064453125, + "y": 1208.802734375, + "width": 37.80078125000001, + "height": 37.80078125000001, + "angle": 0, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1e", + "roundness": null, + "seed": 272076393, + "version": 471, + "versionNonce": 1751488679, + "isDeleted": false, + "boundElements": [], + "updated": 1732876603449, + "link": null, + "locked": false, + "status": "saved", + "fileId": "c50369743b49b2e67084c9dbef6602bfa475591f", + "scale": [ + 1, + 1 + ], + "crop": null + }, + { + "id": "HpxnnrTRix7WOOhVd_Jlv", + "type": "image", + "x": 520.0078125, + "y": 1122.98828125, + "width": 40.500000000000014, + "height": 40.500000000000014, + "angle": 0, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1f", + "roundness": null, + "seed": 276082631, + "version": 600, + "versionNonce": 1297301351, + "isDeleted": false, + "boundElements": [], + "updated": 1732876882185, + "link": null, + "locked": false, + "status": "saved", + "fileId": "390d5a2a922e2244e96b5cf5ea08c1c0abbaa1ab", + "scale": [ + 1, + 1 + ], + "crop": null + }, + { + "id": "5UKq04tAb8qPEwsIaw5Ff", + "type": "image", + "x": 688.107421875, + "y": 993.322265625, + "width": 37.80078125000001, + "height": 37.80078125000001, + "angle": 0, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b1g", + "roundness": null, + "seed": 1317928457, + "version": 734, + "versionNonce": 1968988647, + "isDeleted": false, + "boundElements": [], + "updated": 1732876929366, + "link": null, + "locked": false, + "status": "saved", + "fileId": "c50369743b49b2e67084c9dbef6602bfa475591f", + "scale": [ + 1, + 1 + ], + "crop": null + }, + { + "type": "text", + "version": 496, + "versionNonce": 276227049, + "isDeleted": false, + "id": "Ij5i0WQwucCpM0WlXP6Im", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 318.7211681547619, + "y": 1193.4045758928573, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 65.35995861887932, + "height": 40, + "seed": 1974997863, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 16, + "fontFamily": 1, + "text": "wait for\nlock", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "index": "b1h", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876828101, + "link": null, + "locked": false, + "containerId": null, + "originalText": "wait for\nlock", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "ellipse", + "version": 501, + "versionNonce": 1089001383, + "isDeleted": false, + "id": "gPh_thqrDBIZ3RwmuSFS2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 352.7661830357142, + "y": 1230.876674107143, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 34.96372767857151, + "height": 34.96372767857151, + "seed": 743378567, + "groupIds": [ + "6SLb7loJU83j6Pi254St0", + "4r12YmF-ZAfNZVzrMIdxC" + ], + "strokeSharpness": "round", + "boundElementIds": [], + "index": "b1i", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876823152, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 481, + "versionNonce": 358435527, + "isDeleted": false, + "id": "TBNsRQe99PuDsuAhtTzyl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 357.09316740063355, + "y": 1235.1907495703258, + "strokeColor": "#000000", + "backgroundColor": "white", + "width": 26.50538999044442, + "height": 26.50538999044442, + "seed": 1754899879, + "groupIds": [ + "4r12YmF-ZAfNZVzrMIdxC" + ], + "strokeSharpness": "sharp", + "boundElementIds": [], + "index": "b1j", + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1732876823152, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 441, + "versionNonce": 1159092711, + "isDeleted": false, + "id": "5gTax5tsXm2gL0ubu9qBX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 369.9938343845952, + "y": 1249.5227555265478, + "strokeColor": "#000000", + "backgroundColor": "white", + "width": 8.350543656039012, + "height": 8.283618434368043, + "seed": 1774475463, + "groupIds": [ + "4r12YmF-ZAfNZVzrMIdxC" + ], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 8.350543656039012, + -8.283618434368043 + ] + ], + "index": "b1k", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876823152, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 486, + "versionNonce": 891323655, + "isDeleted": false, + "id": "ZbW3TfATh3eyrFQyx4xlE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 370.28523436280557, + "y": 1258.3168830972477, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 0.47106702281207424, + "height": 9.670937847777504, + "seed": 1433118695, + "groupIds": [ + "4r12YmF-ZAfNZVzrMIdxC" + ], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.47106702281207424, + -9.670937847777504 + ] + ], + "index": "b1l", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876823152, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 422, + "versionNonce": 1962429479, + "isDeleted": false, + "id": "Az1v8PrgdsGJjMwLt2M5A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 370.41177548981864, + "y": 1235.744482078214, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 0.11493664588617457, + "height": 4.367592543674275, + "seed": 1771836167, + "groupIds": [ + "4r12YmF-ZAfNZVzrMIdxC" + ], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.11493664588617457, + 4.367592543674275 + ] + ], + "index": "b1m", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876823152, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 428, + "versionNonce": 1888104263, + "isDeleted": false, + "id": "PQKaBjAfe7FXh2kZ59T_Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 377.876468735569, + "y": 1237.7957959549958, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 1.609113042406316, + "height": 2.8734161471541655, + "seed": 1859263015, + "groupIds": [ + "4r12YmF-ZAfNZVzrMIdxC" + ], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -1.609113042406316, + 2.8734161471541655 + ] + ], + "index": "b1n", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876823152, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 426, + "versionNonce": 1647488615, + "isDeleted": false, + "id": "uWvaLWJ1l50KhMgaCCNVC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 385.5476494422617, + "y": 1248.8592116114964, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 4.827339127218955, + "height": 0.45974658354467285, + "seed": 1778007367, + "groupIds": [ + "4r12YmF-ZAfNZVzrMIdxC" + ], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -4.827339127218955, + 0.45974658354467285 + ] + ], + "index": "b1o", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876823152, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 535, + "versionNonce": 79579527, + "isDeleted": false, + "id": "fQA9iNmXeLI8h-qVtaoaj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.6853239387963983, + "x": 372.70058929618335, + "y": 1261.5003152163342, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 4.827339127218955, + "height": 0.45974658354467285, + "seed": 242285671, + "groupIds": [ + "4r12YmF-ZAfNZVzrMIdxC" + ], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -4.827339127218955, + 0.45974658354467285 + ] + ], + "index": "b1p", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876823152, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 576, + "versionNonce": 90800295, + "isDeleted": false, + "id": "6qaFLAtC6DTSYmuJV9uBV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0.9008490547315002, + "x": 379.00201455977617, + "y": 1260.2357296217494, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 4.827339127218955, + "height": 0.45974658354467285, + "seed": 1879234439, + "groupIds": [ + "4r12YmF-ZAfNZVzrMIdxC" + ], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -4.827339127218955, + 0.45974658354467285 + ] + ], + "index": "b1q", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876823152, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 602, + "versionNonce": 903926727, + "isDeleted": false, + "id": "VL6b5CGqsZ2L-R_av569r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0.7914765779746311, + "x": 384.4193821697645, + "y": 1255.5305861152328, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 4.827339127218955, + "height": 0.45974658354467285, + "seed": 1961643687, + "groupIds": [ + "4r12YmF-ZAfNZVzrMIdxC" + ], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -4.827339127218955, + 0.45974658354467285 + ] + ], + "index": "b1r", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876823152, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 671, + "versionNonce": 2118173415, + "isDeleted": false, + "id": "i2UwTnqJ5KzGYJiuWNbu2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0.15105493350121968, + "x": 360.2862090601443, + "y": 1249.4296221238008, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 4.827339127218955, + "height": 0.45974658354467285, + "seed": 131719623, + "groupIds": [ + "4r12YmF-ZAfNZVzrMIdxC" + ], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -4.827339127218955, + 0.45974658354467285 + ] + ], + "index": "b1s", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876823152, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 732, + "versionNonce": 253087239, + "isDeleted": false, + "id": "jl7TSukVNsi6A8yW659wD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0.4579214719581044, + "x": 361.2214986186475, + "y": 1244.0351390574765, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 4.827339127218955, + "height": 0.45974658354467285, + "seed": 166203623, + "groupIds": [ + "4r12YmF-ZAfNZVzrMIdxC" + ], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -4.827339127218955, + 0.45974658354467285 + ] + ], + "index": "b1t", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876823152, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 768, + "versionNonce": 1398568231, + "isDeleted": false, + "id": "K0KQ4KSs-W-WRiR3zcYnQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0.6163986815425382, + "x": 363.49971015477456, + "y": 1238.7380053546644, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 4.827339127218955, + "height": 0.45974658354467285, + "seed": 77814791, + "groupIds": [ + "4r12YmF-ZAfNZVzrMIdxC" + ], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -4.827339127218955, + 0.45974658354467285 + ] + ], + "index": "b1u", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876823152, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 813, + "versionNonce": 578893895, + "isDeleted": false, + "id": "p00LeySc7_-OJy5QB3Xec", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 5.744062102714786, + "x": 361.8651108394132, + "y": 1255.1970412490466, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 4.827339127218955, + "height": 0.45974658354467285, + "seed": 470303527, + "groupIds": [ + "4r12YmF-ZAfNZVzrMIdxC" + ], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -4.827339127218955, + 0.45974658354467285 + ] + ], + "index": "b1v", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876823152, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 869, + "versionNonce": 845191015, + "isDeleted": false, + "id": "pWwodPt5MgG6QCHr1oDnV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 5.744062102714786, + "x": 364.9107368976038, + "y": 1261.014310983105, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 1.715238547213973, + "height": 0.3746103718941782, + "seed": 1082345031, + "groupIds": [ + "4r12YmF-ZAfNZVzrMIdxC" + ], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -1.715238547213973, + 0.3746103718941782 + ] + ], + "index": "b1w", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876823152, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1109, + "versionNonce": 904593897, + "isDeleted": false, + "id": "9hBS40_AdaY_2N--AcRSJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 378.6684494018554, + "y": 1368.29296875, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 78.49362280964851, + "height": 40, + "seed": 1991575849, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 16, + "fontFamily": 1, + "text": "generate\ntime", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "index": "b1x", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "id": "XJ6EheD-WNdet90cyaa8i", + "type": "arrow" + } + ], + "updated": 1732876570736, + "link": null, + "locked": false, + "containerId": null, + "originalText": "generate\ntime", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 865, + "versionNonce": 1497944265, + "isDeleted": false, + "id": "H8E5woBUeKsDQOU48oBoV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 511.9350581020117, + "y": 1327.06640625, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 70.54394629597664, + "height": 40, + "seed": 1687083815, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 16, + "fontFamily": 1, + "text": "sleep for\nX ms", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "index": "b1y", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "id": "Pjb4zz5-I4Ev2IhS7EbAX", + "type": "arrow" + } + ], + "updated": 1732876561161, + "link": null, + "locked": false, + "containerId": null, + "originalText": "sleep for\nX ms", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 929, + "versionNonce": 562514025, + "isDeleted": false, + "id": "qFrI78e1tq127qkWzxXHG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 563.4582667201757, + "y": 1144.24609375, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 71.98190405964847, + "height": 40, + "seed": 517805257, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 16, + "fontFamily": 1, + "text": "generate\ntime", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "index": "b1z", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "id": "9XS3oZ4tVJzGijveQnhRv", + "type": "arrow" + } + ], + "updated": 1732876876117, + "link": null, + "locked": false, + "containerId": null, + "originalText": "generate\ntime", + "autoResize": false, + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 908, + "versionNonce": 1617282887, + "isDeleted": false, + "id": "o8FpuLyAaWrUaT7TroQ2D", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 689.2084956020117, + "y": 1088.7890625, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 70.54394629597664, + "height": 40, + "seed": 2002808457, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 16, + "fontFamily": 1, + "text": "sleep for\nX ms", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "index": "b20", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [ + { + "id": "6g5OAI8W2961G4SFyC1ma", + "type": "arrow" + } + ], + "updated": 1732876934533, + "link": null, + "locked": false, + "containerId": null, + "originalText": "sleep for\nX ms", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "8FKpcP0L-2tRrGfa9Zfvq", + "type": "arrow", + "x": 295.50131070771334, + "y": 1440.6651933427768, + "width": 47.711729042172806, + "height": 0.09636295738225643, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b24", + "roundness": { + "type": 2 + }, + "seed": 19165033, + "version": 169, + "versionNonce": 269112359, + "isDeleted": false, + "boundElements": null, + "updated": 1732876763823, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 47.711729042172806, + -0.09636295738225643 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "A2JukBULO3fBofwfh2Dv1", + "type": "arrow", + "x": 328.29219726003936, + "y": 1440.0486917176731, + "width": 45.458244729531714, + "height": 0.8739123376390125, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "#a5d8ff", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "b25", + "roundness": { + "type": 2 + }, + "seed": 2112643785, + "version": 487, + "versionNonce": 1453621513, + "isDeleted": false, + "boundElements": [], + "updated": 1732876770233, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -45.458244729531714, + 0.8739123376390125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "type": "text", + "version": 578, + "versionNonce": 439667689, + "isDeleted": false, + "id": "vW8__q5JA3YipqniF_AgN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 282.77018523216236, + "y": 1450.328125, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 60.09995090961456, + "height": 27, + "seed": 1448539271, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 6, + "text": "< x ms", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "index": "b26", + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1732876791819, + "link": null, + "locked": false, + "containerId": null, + "originalText": "< x ms", + "autoResize": true, + "lineHeight": 1.35 + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "390d5a2a922e2244e96b5cf5ea08c1c0abbaa1ab": { + "mimeType": "image/png", + "id": "390d5a2a922e2244e96b5cf5ea08c1c0abbaa1ab", + "dataURL": "data:image/png;base64,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", + "created": 1732875423059, + "lastRetrieved": 1732875423059 + }, + "c50369743b49b2e67084c9dbef6602bfa475591f": { + "mimeType": "image/png", + "id": "c50369743b49b2e67084c9dbef6602bfa475591f", + "dataURL": "data:image/png;base64,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", + "created": 1732875338930, + "lastRetrieved": 1732875338930 + } + } +} \ No newline at end of file diff --git a/website/docs/hudi_stack.md b/website/docs/hudi_stack.md index 203e8ce5947d..9e9d940aef93 100644 --- a/website/docs/hudi_stack.md +++ b/website/docs/hudi_stack.md @@ -7,65 +7,116 @@ toc_max_heading_level: 3 last_modified_at: --- -Apache Hudi is a Transactional [Data Lakehouse](https://hudi.apache.org/blog/2024/07/11/what-is-a-data-lakehouse/) Platform built around a database kernel. It brings core warehouse and database functionality directly to a data lake thereby providing a table-level abstraction over open file formats like Apache Parquet/ORC (more recently known as the lakehouse architecture) and enabling transactional capabilities such as updates/deletes. Hudi also incorporates essential table services that are tightly integrated with the database kernel. These services can be executed automatically across both ingested and derived data to manage various aspects such as table bookkeeping, metadata, and storage layout. This integration along with various platform-specific services extends Hudi's role from being just a 'table format' to a comprehensive and robust [data lakehouse](https://hudi.apache.org/blog/2024/07/11/what-is-a-data-lakehouse/) platform. +Apache Hudi adds core warehouse and database functionality directly to a data lake (more recently known as the data lakehouse architecture) elevating it from a collection of +objects/files to well-managed tables. Hudi adds table abstraction over open file formats like Apache Parquet/ORC using a table format layer, that is optimized for frequent writes, +large-scale queries on a table snapshot as well efficient incremental scans. To understand the Hudi stack, we can simply translate the components to the seminal paper +on "[Architecture of a Database System](https://dsf.berkeley.edu/papers/fntdb07-architecture.pdf)", with modernized names. -In this section, we will explore the Hudi stack and deconstruct the layers of software components that constitute Hudi. The features marked with an asterisk (*) represent work in progress, and the dotted boxes indicate planned future work. These components collectively aim to fulfill the [vision](https://github.com/apache/hudi/blob/master/rfc/rfc-69/rfc-69.md) for the project. +On top of this foundation, Hudi adds [storage engine](https://en.wikipedia.org/wiki/Database_engine) functionality found in many databases ("transactional storage manager" in the paper), +enabling transactional capabilities such as concurrency control, indexing, change capture and updates/deletes. The storage engine also consists of essential table services +to manage/maintain the tables, that are tightly integrated with the underlying storage layer and executed automatically by upper-layer writers or platform components +like an independent table management service. -![Hudi Stack](/assets/images/blog/hudistack/hstck_new.png) -

Figure: Apache Hudi Architectural stack

+Hudi then defined clear read/write APIs that help interact with the tables, from a variety of SQL engines and code written in many programming languages using their popular data +processing frameworks. Hudi also comes with several platform services that help tune performance, operate tables, monitor tables, ingest data, import/export data, and more. + +Thus, when all things considered, the Hudi stack expands out of being just a 'table format' to a comprehensive and robust [data lakehouse](https://hudi.apache.org/blog/2024/07/11/what-is-a-data-lakehouse/) platform. In this section, +we will explore the Hudi stack and deconstruct the layers of software components that constitute Hudi. The features marked with an asterisk (*) represent work in progress, and +the dotted boxes indicate planned future work. These components collectively aim to fulfill the [vision](https://github.com/apache/hudi/blob/master/rfc/rfc-69/rfc-69.md) for the project. + +![Hudi Stack](/assets/images/hudi-stack-1-x.png) +

Figure: Apache Hudi Database Architecture

## Lake Storage -The storage layer is where the data files (such as Parquet) are stored. Hudi interacts with the storage layer through the [Hadoop FileSystem API](https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/fs/FileSystem.html), enabling compatibility with various systems including HDFS for fast appends, and various cloud stores such as Amazon S3, Google Cloud Storage (GCS), and Azure Blob Storage. Additionally, Hudi offers its own storage APIs that can rely on Hadoop-independent file system implementation to simplify the integration of various file systems. Hudi adds a custom wrapper filesystem that lays out the foundation for improved storage optimizations. +The storage layer is where the data files/objects (such as Parquet) as well as all table format metadata are stored. Hudi interacts with the storage layer through Cloud native and [Hadoop FileSystem API](https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/fs/FileSystem.html), enabling compatibility +with various systems including HDFS for fast appends, and various cloud stores such as Amazon S3, Google Cloud Storage (GCS), and Azure Blob Storage. Additionally, Hudi offers its own storage APIs that can rely on Hadoop-independent file system +implementation to simplify the integration of various file systems. Hudi adds a custom wrapper filesystem that lays out the foundation for improved storage optimizations. ## File Formats ![File Format](/assets/images/blog/hudistack/file_format_2.png)

Figure: File format structure in Hudi

-File formats hold the raw data and are physically stored on the lake storage. Hudi operates on logical structures of File Groups and File Slices, which consist of Base File and Log Files. Base Files are compacted and optimized for reads and are augmented with Log Files for efficient append. Future updates aim to integrate diverse formats like unstructured data (e.g., JSON, images), and compatibility with different storage layers in event-streaming, OLAP engines, and warehouses. Hudi's layout scheme encodes all changes to a Log File as a sequence of blocks (data, delete, rollback). By making data available in open file formats (such as Parquet), Hudi enables users to bring any compute engine for specific workloads. - -## Transactional Database Layer -The transactional database layer of Hudi comprises the core components that are responsible for the fundamental operations and services that enable Hudi to store, retrieve, and manage data efficiently on [data lakehouse](https://hudi.apache.org/blog/2024/07/11/what-is-a-data-lakehouse/) storages. +File formats hold the actual data and are physically stored on the lake storage. Hudi operates on logical structures of File Groups and File Slices, which consist of Base File and Log Files. +Log files store updates/deletes/inserts on top of records stored in base files, and periodically log files are compacted into small set of log files (log compaction) or base files (compaction). +Future updates aim to integrate diverse formats like unstructured data (e.g., JSON, images), and compatibility with different storage layers in event-streaming, OLAP engines, and warehouses. +Hudi's layout scheme encodes all changes to a Log File as a sequence of blocks (data, delete, rollback). By making data available in open file formats (such as Parquet/Avro), Hudi enables users to +bring any compute engine for specific workloads. -### Table Format +## Table Format ![Table Format](/assets/images/blog/hudistack/table_format_1.png)

Figure: Apache Hudi's Table format

-Drawing an analogy to file formats, a table format simply comprises the file layout of the table, the schema, and metadata tracking changes. Hudi organizes files within a table or partition into File Groups. Updates are captured in Log Files tied to these File Groups, ensuring efficient merges. There are three major components related to Hudi’s table format. +Drawing an analogy to file formats, a table format simply concerns with how files are distributed with the table, partitioning schemes, schema and metadata tracking changes. Hudi organizes files within a table or partition into +File Groups. Updates are captured in log files tied to these File Groups, ensuring efficient merges. There are three major components related to Hudi’s table format. + +- **Timeline** : Hudi's [timeline](./timeline), stored in the `/.hoodie/timeline` folder, is a crucial event log recording all table actions in an ordered manner, + with events kept for a specified period. Hudi uniquely designs each File Group as a self-contained log, enabling record state reconstruction through delta logs, even after archival of historical actions. This approach effectively limits metadata size based on table activity frequency, essential for managing tables with frequent updates. + +- **File Group and File Slice** : Within each partition the data is physically stored as base and Log Files and organized into logical concepts as [File groups](https://hudi.apache.org/tech-specs-1point0/#storage-layout) and +File Slices. File groups contain multiple versions of File Slices and are split into multiple File Slices. A File Slice comprises the Base and Log File. Each File Slice within +the file-group is uniquely identified by the write that created its base file or the first log file, which helps order the File Slices. -- **Timeline** : Hudi's [timeline](./timeline), stored in the /.hoodie folder, is a crucial event log recording all table actions in an ordered manner, with events kept for a specified period. Hudi uniquely designs each File Group as a self-contained log, enabling record state reconstruction through delta logs, even after archival of related actions. This approach effectively limits metadata size based on table activity frequency, essential for managing tables with frequent updates. +- **Metadata Table** : Implemented as an another merge-on-read Hudi table, the [metadata table](./metadata) efficiently handles quick updates with low write amplification. +It leverages a [SSTable](https://cassandra.apache.org/doc/stable/cassandra/architecture/storage_engine.html#sstables) based file format for quick, indexed key lookups, +storing vital information like file paths, column statistics and schema. This approach streamlines operations by reducing the necessity for expensive cloud file listings. -- **File Group and File Slice** : Within each partition the data is physically stored as base and Log Files and organized into logical concepts as [File groups](https://hudi.apache.org/tech-specs-1point0/#storage-layout) and File Slices. File groups contain multiple versions of File Slices and are split into multiple File Slices. A File Slice comprises the Base and Log File. Each File Slice within the file-group is uniquely identified by the commit's timestamp that created it. +Hudi’s approach of recording updates into Log Files is more efficient and involves low merge overhead than systems like Hive ACID, where merging all delta records against +all Base Files is required. Read more about the various table types in Hudi [here](./table_types). -- **Metadata Table** : Implemented as a merge-on-read table, Hudi's [metadata table](./metadata) efficiently handles quick updates with low write amplification. It leverages the HFile format for quick, indexed key lookups, storing vital information like file paths, column statistics, bloom filters, and record indexes. This approach streamlines operations by reducing the necessity for expensive cloud file listings. The metadata table in Hudi acts as an additional [indexing system](./metadata#supporting-multi-modal-index-in-hudi) to uplevel the read and write performance. -Hudi’s approach of recording updates into Log Files is more efficient and involves low merge overhead than systems like Hive ACID, where merging all delta records against all Base Files is required. Read more about the various table types in Hudi [here](./table_types). +## Storage Engine +The storage layer of Hudi comprises the core components that are responsible for the fundamental operations and services that enable Hudi to store, retrieve, and manage data +efficiently on [data lakehouse](https://hudi.apache.org/blog/2024/07/11/what-is-a-data-lakehouse/) storages. This functionality is comparable to that of roles play by storage engines in popular databases like PostgreSQL, MySQL, MongoDB, +Cassandra and Clickhouse. + ### Indexes -![Indexes](/assets/images/blog/hudistack/index_3.png) +![Indexes](/assets/images/hudi-stack-indexes.png)

Figure: Indexes in Hudi

-[Indexes](./indexing) in Hudi enhance query planning, minimizing I/O, speeding up response times and providing faster writes with low merge costs. Hudi’s [metadata table](./metadata/#metadata-table-indices) brings the benefits of indexes generally to both the readers and writers. Compute engines can leverage various indexes in the metadata table, like file listings, column statistics, bloom filters, record-level indexes, and [functional indexes](https://github.com/apache/hudi/blob/master/rfc/rfc-63/rfc-63.md) to quickly generate optimized query plans and improve read performance. In addition to the metadata table indexes, Hudi supports Simple, Bloom, HBase, and Bucket indexes, to efficiently locate File Groups containing specific record keys. Hudi also provides reader indexes such as [functional](https://github.com/apache/hudi/blob/master/rfc/rfc-63/rfc-63.md) and secondary indexes to boost reads. The table partitioning scheme in Hudi is consciously exploited for implementing global and non-global indexing strategies. +[Indexes](./indexing) in Hudi enhance query planning, minimizing I/O, speeding up response times and providing faster writes with low merge costs. The [metadata table](./metadata/#metadata-table-indices) acts +as an additional [indexing system](./metadata#supporting-multi-modal-index-in-hudi) and brings the benefits of indexes generally to both the readers and writers. Compute engines can leverage various indexes in the metadata +table, like file listings, column statistics, bloom filters, record-level indexes, and [expression indexes](https://github.com/apache/hudi/blob/master/rfc/rfc-63/rfc-63.md) to quickly generate optimized query plans and improve read +performance. In addition to the metadata table indexes, Hudi supports simple join based indexing, bloom filters stored in base file footers, external key-value stores like HBase, +and optimized storage techniques like bucketing , to efficiently locate File Groups containing specific record keys. Hudi also provides reader indexes such as [expression](https://github.com/apache/hudi/blob/master/rfc/rfc-63/rfc-63.md) and +secondary indexes to boost reads. The table partitioning scheme in Hudi is consciously exploited for implementing global and non-global indexing strategies, that limit scope of a record's +uniqueness to a given partition or globally across all partitions. ### Table Services ![Table Services](/assets/images/blog/hudistack/table_services_2.png)

Figure: Table services in Hudi

-Apache Hudi offers various table services to help keep the table storage layout and metadata management performant. Hudi was designed with built-in table services that enables running them in inline, semi-asynchronous or full-asynchronous modes. Furthermore, Spark and Flink streaming writers can run in continuous mode, and invoke table services asynchronously sharing the underlying executors intelligently with writers. Let’s take a look at these services. +Apache Hudi offers various table services to help keep the table storage layout and metadata management performant. Hudi was designed with built-in table services that enables +running them in inline, semi-asynchronous or full-asynchronous modes. Furthermore, Spark and Flink streaming writers can run in continuous mode, and invoke table services +asynchronously sharing the underlying executors intelligently with writers. Let’s take a look at these services. #### Clustering -The [clustering](./clustering) service, akin to features in cloud data warehouses, allows users to group frequently queried records using sort keys or merge smaller Base Files into larger ones for optimal file size management. It's fully integrated with other timeline actions like cleaning and compaction, enabling smart optimizations such as avoiding compaction for File Groups undergoing clustering, thereby saving on I/O. +The [clustering](./clustering) service, akin to features in cloud data warehouses, allows users to group frequently queried records using sort keys or merge smaller Base Files into +larger ones for optimal file size management. It's fully integrated with other timeline actions like cleaning and compaction, enabling smart optimizations such as avoiding +compaction for File Groups undergoing clustering, thereby saving on I/O. #### Compaction -Hudi's [compaction](./compaction) service, featuring strategies like date partitioning and I/O bounding, merges Base Files with delta logs to create updated Base Files. It allows concurrent writes to the same File Froup, enabled by Hudi's file grouping and flexible log merging. This facilitates non-blocking execution of deletes even during concurrent record updates. +Hudi's [compaction](./compaction) service, featuring strategies like date partitioning and I/O bounding, merges Base Files with delta logs to create updated Base Files. It allows +concurrent writes to the same File Froup, enabled by Hudi's file grouping and flexible log merging. This facilitates non-blocking execution of deletes even during concurrent +record updates. #### Cleaning -[Cleaner](http://hudi.apache.org/blog/2021/06/10/employing-right-configurations-for-hudi-cleaner) service works off the timeline incrementally, removing File Slices that are past the configured retention period for incremental queries, while also allowing sufficient time for long running batch jobs (e.g Hive ETLs) to finish running. This allows users to reclaim storage space, thereby saving on costs. +[Cleaner](http://hudi.apache.org/blog/2021/06/10/employing-right-configurations-for-hudi-cleaner) service works off the timeline incrementally, removing File Slices that are past the configured retention period for incremental queries, +while also allowing sufficient time for long running batch jobs (e.g Hive ETLs) to finish running. This allows users to reclaim storage space, thereby saving on costs. #### Indexing -Hudi's scalable metadata table contains auxiliary data about the table. This subsystem encompasses various indices, including files, column_stats, and bloom_filters, facilitating efficient record location and data skipping. Balancing write throughput with index updates presents a fundamental challenge, as traditional indexing methods, like locking out writes during indexing, are impractical for large tables due to lengthy processing times. Hudi addresses this with its innovative asynchronous [metadata indexing](./metadata_indexing), enabling the creation of various indices without impeding writes. This approach not only improves write latency but also minimizes resource waste by reducing contention between writing and indexing activities. +Hudi's scalable metadata table contains auxiliary data about the table. This subsystem encompasses various indices, including files, column_stats, and bloom_filters, +facilitating efficient record location and data skipping. Balancing write throughput with index updates presents a fundamental challenge, as traditional indexing methods, +like locking out writes during indexing, are impractical for large tables due to lengthy processing times. Hudi addresses this with its innovative asynchronous [metadata indexing](./metadata_indexing), +enabling the creation of various indices without impeding writes. This approach not only improves write latency but also minimizes resource waste by reducing contention between writing and indexing activities. ### Concurrency Control -[Concurrency control](./concurrency_control) defines how different writers/readers coordinate access to the table. Hudi’s way of publishing monotonically increasing timestamped commits to the timeline lays out the foundation for atomicity guarantees, clearly differentiating between writers (responsible for upserts/deletes), table services (focusing on storage optimization and bookkeeping), and readers (for query execution). Hudi provides snapshot isolation, offering a consistent view of the table across these different operations. It employs lock-free, non-blocking MVCC for concurrency between writers and table-services, as well as between different table services, and optimistic concurrency control (OCC) for multi-writers with early conflict detection. With [Hudi 1.0](https://github.com/apache/hudi/blob/master/rfc/rfc-69/rfc-69.md), non-blocking concurrency control ([NBCC](https://github.com/apache/hudi/blob/master/rfc/rfc-66/rfc-66.md)) is introduced, allowing multiple writers to concurrently operate on the table with non-blocking conflict resolution. +[Concurrency control](./concurrency_control) defines how different writers/readers/table services coordinate access to the table. Hudi uses monotonically increasing time to sequence and order various +changes to table state. Much like databases, Hudi take an approach of clearly differentiating between writers (responsible for upserts/deletes), table services +(focusing on storage optimization and bookkeeping), and readers (for query execution). Hudi provides snapshot isolation, offering a consistent view of the table across +these different operations. It employs lock-free, non-blocking MVCC for concurrency between writers and table-services, as well as between different table services, and +optimistic concurrency control (OCC) for multi-writers with early conflict detection. With [Hudi 1.0](https://github.com/apache/hudi/blob/master/rfc/rfc-69/rfc-69.md), non-blocking concurrency control ([NBCC](https://github.com/apache/hudi/blob/master/rfc/rfc-66/rfc-66.md)) +is introduced, allowing multiple writers to concurrently operate on the table with non-blocking conflict resolution. ### Lake Cache* ![Lake Cache](/assets/images/blog/hudistack/lake_cache_3.png) @@ -73,11 +124,6 @@ Hudi's scalable metadata table contains auxiliary data about the table. This sub Data lakes today face a tradeoff between fast data writing and optimal query performance. Writing smaller files or logging deltas enhances writing speed, but superior query performance typically requires opening fewer files and pre-materializing merges. Most databases use a buffer pool to reduce storage access costs. Hudi’s design supports creating a multi-tenant caching tier that can store pre-merged File Slices. Hudi’s timeline can then be used to simply communicate caching policies. Traditionally, caching is near query engines or in-memory file systems. Integrating a [caching layer](https://issues.apache.org/jira/browse/HUDI-6489) with Hudi's transactional storage enables shared caching across query engines, supporting updates and deletions, and reducing costs. The goal is to build a buffer pool for lakes, compatible with all major engines, with the contributions from the rest of the community. -### Metaserver* -![Metaserver](/assets/images/blog/hudistack/metaserver_2.png) -

Figure: Proposed Metaserver in Hudi

- -Storing table metadata on lake storage, while scalable, is less efficient than RPCs to a scalable meta server. Hudi addresses this with its metadata server, called "metaserver," an efficient alternative for managing table metadata for a large number of tables. Currently, the timeline server, embedded in Hudi's writer processes, uses a local rocksDB store and [Javalin](https://javalin.io/) REST API to serve file listings, reducing cloud storage listings. Since version 0.6.0, there's a trend towards standalone timeline servers, aimed at horizontal scaling and improved security. These developments are set to create a more efficient lake [metastore](https://issues.apache.org/jira/browse/HUDI-3345) for future needs. ## Programming APIs @@ -87,13 +133,42 @@ Hudi tables can be used as sinks for Spark/Flink pipelines and the Hudi writing ### Readers Hudi provides snapshot isolation for writers and readers, enabling consistent table snapshot queries across major query engines (Spark, Hive, Flink, Presto, Trino, Impala) and cloud warehouses. It optimizes query performance by utilizing lightweight processes, especially for base columnar file reads, and integrates engine-specific vectorized readers like in Presto and Trino. This scalable model surpasses the need for separate readers and taps into each engine's unique optimizations, such as Presto and Trino's data/metadata caches. For queries merging Base and Log Files, Hudi employs mechanisms such as spillable maps and lazy reading to boost merge performance. Additionally, Hudi offers a read-optimized query option, trading off data freshness for improved query speed. There are also recently added features such as positional merge, encoding partial Log File to only changed columns and support for Parquet as the Log File format to improve MoR snapshot query performance. -## User Interface +## User Access -### Platform Services +### SQL Engines +Apache Hudi is compatible with a wide array of SQL query engines, catering to various analytical needs. For distributed ETL batch processing, Apache Spark is frequently utilized, +leveraging its efficient handling of large-scale data. In the realm of streaming use cases, compute engines such as Apache Flink and Apache Spark's Structured Streaming provide +robust support when paired with Hudi. Moreover, Hudi supports modern data lake query engines such as Trino and Presto, as well as modern analytical databases such as ClickHouse +and StarRocks. This diverse support of compute engines positions Apache Hudi as a flexible and adaptable platform for a broad spectrum of use cases. + +### Code Frameworks +While SQL still rules the roost when it comes to data engineering, an equally important and widespread data engineering/data science practice is to write code in different +languages like Java, Scala, Python and R, to analyze data using sophisticated algorithms with full expressiveness of the language. To this end, Hudi supports several +popular data processing frameworks like Apache Spark and Apache Flink, as well as python based distributed frameworks like Daft, Ray and native bindings in Rust for easy +integration with engines written in C/C++. + +... + +## Platform Services ![Platform Services](/assets/images/blog/hudistack/platform_2.png)

Figure: Various platform services in Hudi

-Platform services offer functionality that is specific to data and workloads, and they sit directly on top of the table services, interfacing with writers and readers. Services, like [Hudi Streamer](./hoodie_streaming_ingestion#hudi-streamer), are specialized in handling data and workloads, seamlessly integrating with Kafka streams and various formats to build data lakes. They support functionalities like automatic checkpoint management, integration with major schema registries (including Confluent), and deduplication of data. Hudi Streamer also offers features for backfills, one-off runs, and continuous mode operation with Spark/Flink streaming writers. Additionally, Hudi provides tools for [snapshotting](./snapshot_exporter) and incrementally [exporting](./snapshot_exporter#examples) Hudi tables, importing new tables, and [post-commit callback](/docs/next/platform_services_post_commit_callback) for analytics or workflow management, enhancing the deployment of production-grade incremental pipelines. Apart from these services, Hudi also provides broad support for different catalogs such as [Hive Metastore](./syncing_metastore), [AWS Glue](./syncing_aws_glue_data_catalog/), [Google BigQuery](./gcp_bigquery), [DataHub](./syncing_datahub), etc. that allows syncing of Hudi tables to be queried by interactive engines such as Trino and Presto. +Platform services offer functionality that is specific to data and workloads, and they sit directly on top of the table services, interfacing with writers and readers. +Services, like [Hudi Streamer](./hoodie_streaming_ingestion#hudi-streamer) (or its Flink counterpart), are specialized in handling data and workloads, seamlessly integrating with Kafka streams and various +formats to build data lakes. They support functionalities like automatic checkpoint management, integration with major schema registries (including Confluent), and +deduplication of data. Hudi Streamer also offers features for backfills, one-off runs, and continuous mode operation with Spark/Flink streaming writers. Additionally, +Hudi provides tools for [snapshotting](./snapshot_exporter) and incrementally [exporting](./snapshot_exporter#examples) Hudi tables, importing new tables, and [post-commit callback](/docs/next/platform_services_post_commit_callback) for analytics or +workflow management, enhancing the deployment of production-grade incremental pipelines. Apart from these services, Hudi also provides broad support for different +catalogs such as [Hive Metastore](./syncing_metastore), [AWS Glue](./syncing_aws_glue_data_catalog/), [Google BigQuery](./gcp_bigquery), [DataHub](./syncing_datahub), etc. that allows syncing of Hudi tables to be queried by +interactive engines such as Trino and Presto. + +### Metaserver* +![Metaserver](/assets/images/blog/hudistack/metaserver_2.png) +

Figure: Proposed Metaserver in Hudi

+ +Storing table metadata on lake storage, while scalable, is less efficient than RPCs to a scalable meta server. Hudi addresses this with its metadata server, called "metaserver," +an efficient alternative for managing table metadata for a large number of tables. Currently, the timeline server, embedded in Hudi's writer processes, uses a local rocksDB store and [Javalin](https://javalin.io/) REST API to serve file listings, reducing cloud storage listings. +Since version 0.6.0, there's a trend towards standalone timeline servers, aimed at horizontal scaling and improved security. These developments are set to create a more efficient lake [metastore](https://issues.apache.org/jira/browse/HUDI-3345) +for future needs. + -### Query Engines -Apache Hudi is compatible with a wide array of query engines, catering to various analytical needs. For distributed ETL batch processing, Apache Spark is frequently utilized, leveraging its efficient handling of large-scale data. In the realm of streaming use cases, compute engines such as Apache Flink and Apache Spark's Structured Streaming provide robust support when paired with Hudi. Moreover, Hudi supports modern data lake query engines such as Trino and Presto, as well as modern analytical databases such as ClickHouse and StarRocks. This diverse support of compute engines positions Apache Hudi as a flexible and adaptable platform for a broad spectrum of use cases. \ No newline at end of file diff --git a/website/docs/overview.mdx b/website/docs/overview.mdx index 009de571fb13..f0036738fc39 100644 --- a/website/docs/overview.mdx +++ b/website/docs/overview.mdx @@ -8,27 +8,28 @@ last_modified_at: 2019-12-30T15:59:57-04:00 import SlackCommunity from '@site/src/components/SlackCommunity'; -Welcome to Apache Hudi! This overview will provide a high level summary of what Apache Hudi is and will orient you on +Hello there! This overview will provide a high level summary of what Apache Hudi is and will orient you on how to learn more to get started. ## What is Apache Hudi -Apache Hudi (pronounced “hoodie”) is the next generation [streaming data lake platform](/blog/2021/07/21/streaming-data-lake-platform). - Hudi brings core warehouse and database functionality directly to a data lake. Hudi provides [tables](/docs/next/sql_ddl), + +Apache Hudi (pronounced "hoodie") pioneered the concept of "[transactional data lakes](https://www.uber.com/blog/hoodie/)", which is more popularly known today as +the data lakehouse architecture. Today, Hudi has grown into an [open data lakehouse platform](/blog/2021/07/21/streaming-data-lake-platform), with a open table format purpose-built for high performance writes on +incremental data pipelines and fast query performance due to comprehensive table optimizations. + +Hudi brings core database functionality directly to a data lake - [tables](/docs/next/sql_ddl), [transactions](/docs/next/timeline), [efficient upserts/deletes](/docs/next/write_operations), [advanced indexes](/docs/next/indexing), [ingestion services](/docs/hoodie_streaming_ingestion), data [clustering](/docs/next/clustering)/[compaction](/docs/next/compaction) optimizations, -and [concurrency](/docs/next/concurrency_control) all while keeping your data in open source file formats. +and [concurrency control](/docs/next/concurrency_control) all while keeping your data in open file formats. Not only is Apache Hudi great for streaming workloads, +but it also allows you to create efficient incremental batch pipelines. Apache Hudi can easily be used on any [cloud storage platform](/docs/cloud). +Hudi’s advanced performance optimizations, make analytical queries/pipelines faster with any of the popular query engines including, Apache Spark, Flink, Presto, Trino, Hive, etc. -Not only is Apache Hudi great for streaming workloads, but it also allows you to create efficient incremental batch pipelines. Read the docs for more [use case descriptions](/docs/use_cases) and check out [who's using Hudi](/powered-by), to see how some of the largest data lakes in the world including [Uber](https://eng.uber.com/uber-big-data-platform/), [Amazon](https://aws.amazon.com/blogs/big-data/how-amazon-transportation-service-enabled-near-real-time-event-analytics-at-petabyte-scale-using-aws-glue-with-apache-hudi/), [ByteDance](http://hudi.apache.org/blog/2021/09/01/building-eb-level-data-lake-using-hudi-at-bytedance), [Robinhood](https://s.apache.org/hudi-robinhood-talk) and more are transforming their production data lakes with Hudi. -Apache Hudi can easily be used on any [cloud storage platform](/docs/cloud). -Hudi’s advanced performance optimizations, make analytical workloads faster with any of -the popular query engines including, Apache Spark, Flink, Presto, Trino, Hive, etc. - -[Hudi-rs](https://github.com/apache/hudi-rs) is the native Rust implementation for Apache Hudi, which also provides bindings to Python. It +[Hudi-rs](https://github.com/apache/hudi-rs) is the native Rust implementation for Apache Hudi, which also provides bindings to Python. It expands the use of Apache Hudi for a diverse range of use cases in the non-JVM ecosystems. ## Core Concepts to Learn @@ -39,7 +40,7 @@ If you are relatively new to Apache Hudi, it is important to be familiar with a - [Hudi Table Types](/docs/next/table_types) – `COPY_ON_WRITE` and `MERGE_ON_READ` - [Hudi Query Types](/docs/next/table_types#query-types) – Snapshot Queries, Incremental Queries, Read-Optimized Queries -See more in the "Concepts" section of the docs. +See more in the "Design & Concepts" section of the docs. Take a look at recent [blog posts](/blog) that go in depth on certain topics or use cases. @@ -51,12 +52,10 @@ Sometimes the fastest way to learn is by doing. Try out these Quick Start resour - [Flink Quick Start Guide](/docs/flink-quick-start-guide) – if you primarily use Apache Flink - [Python/Rust Quick Start Guide (Hudi-rs)](/docs/python-rust-quick-start-guide) - if you primarily use Python or Rust -If you want to experience Apache Hudi integrated into an end to end demo with Kafka, Spark, Hive, Presto, etc, try out the Docker Demo: - -- [Docker Demo](/docs/docker_demo) +If you want to experience Apache Hudi integrated into an end to end demo with Kafka, Spark, Hive, Presto, etc, try out the [Docker Demo](/docs/docker_demo) ## Connect With The Community -Apache Hudi is community focused and community led and welcomes new-comers with open arms. Leverage the following +Apache Hudi is community-focused and community-led and welcomes new-comers with open arms. Leverage the following resources to learn more, engage, and get help as you get started. ### Join in on discussions diff --git a/website/docs/python-rust-quick-start-guide.md b/website/docs/python-rust-quick-start-guide.md index 73f22a1c6735..b4aecb8d958f 100644 --- a/website/docs/python-rust-quick-start-guide.md +++ b/website/docs/python-rust-quick-start-guide.md @@ -1,5 +1,5 @@ --- -title: "Python/Rust Quick Start (Hudi-rs)" +title: "Python/Rust Quick Start" toc: true last_modified_at: 2024-11-28T12:53:57+08:00 --- diff --git a/website/docs/timeline.md b/website/docs/timeline.md index 3d44f8d7426c..7f027d6ee139 100644 --- a/website/docs/timeline.md +++ b/website/docs/timeline.md @@ -5,71 +5,107 @@ toc_min_heading_level: 2 toc_max_heading_level: 4 --- -At its core, Hudi maintains a `timeline` which is a log of all actions performed on the table at different `instants` of time that helps provide instantaneous views of the table, -while also efficiently supporting retrieval of data in the order of arrival. A Hudi instant consists of the following components - -* `Instant action` : Type of action performed on the table -* `Instant time` : Instant time is typically a timestamp (e.g: 20190117010349), which monotonically increases in the order of action's begin time. -* `state` : current state of the instant - -Hudi guarantees that the actions performed on the timeline are atomic & timeline consistent based on the instant time. -Atomicity is achieved by relying on the atomic puts to the underlying storage to move the write operations through various states in the timeline. -This is achieved on the underlying DFS (in the case of S3/Cloud Storage, by an atomic PUT operation) and can be observed by files of the pattern `..` in Hudi’s timeline. - -### Actions -Key actions performed include - -* `COMMITS` - A commit denotes an **atomic write** of a batch of records into a table. -* `CLEANS` - Background activity that gets rid of older versions of files in the table, that are no longer needed. -* `DELTA_COMMIT` - A delta commit refers to an **atomic write** of a batch of records into a MergeOnRead type table, where some/all of the data could be just written to delta logs. -* `COMPACTION` - Background activity to reconcile differential data structures within Hudi e.g: moving updates from row based log files to columnar formats. Internally, compaction manifests as a special commit on the timeline -* `ROLLBACK` - Indicates that a commit/delta commit was unsuccessful & rolled back, removing any partial files produced during such a write -* `SAVEPOINT` - Marks certain file groups as "saved", such that cleaner will not delete them. It helps restore the table to a point on the timeline, in case of disaster/data recovery scenarios. - -### States -Any given instant can be -in one of the following states - -* `REQUESTED` - Denotes an action has been scheduled, but has not initiated -* `INFLIGHT` - Denotes that the action is currently being performed -* `COMPLETED` - Denotes completion of an action on the timeline - -All the actions in requested/inflight states are stored in the active timeline as files named * -*_\.\.\_**. Completed actions are stored along with a time that -denotes when the action was completed, in a file named * -*_\\_\.\.** -
- hudi_timeline.png -
+Changes to table state (writes, table services, schema changes, etc) are recorded as **_actions_** in the Hudi **_timeline_**. The Hudi timeline is a log of all actions performed +on the table at different **_instants_** (points in time). It is a key component of Hudi's architecture, acting as a source of truth for the state of the table. All instant times +used on the timeline follow [TrueTime](https://research.google/pubs/spanner-truetime-and-the-cap-theorem/) semantics, and are monotonically increasing globally across various +processes involved. See TrueTime section below for more details. + +Each action has the following attributes associated with it. + +* **requested instant** : Instant time representing when the action was requested on the timeline. An immutable plan for the action should be generated before the action is requested. +* **completed instant** : Instant time representing when the action was completed on the timeline. All relevant changes to table data/metadata should be made before the action is completed. +* **state** : state of the action. valid states are `REQUESTED`, `INFLIGHT` and `COMPLETED` during an action's lifecycle. +* **type** : the kind of action performed. See below for full list of actions. + +![Timeline actions](/assets/images/hudi-timeline-actions.png) +

Figure: Actions in the timeline

+ +### Action Types + +Following are the valid action types. + +* **COMMIT** - Write operation denoting an atomic write of a batch of records into a base files in the table. +* **DELTA_COMMIT** - Write operation denoting an atomic write of a batch of records into merge-on-read type table, where some/all of the data could be just written to delta logs. +* **REPLACE_COMMIT** - Write operation that atomically replaces a set of file groups in the table with another. Used for implementing batch write operations like _insert_overwrite_, _delete_partition_ etc, as well as table services + like clustering. +* **CLEANS** - Table service that removes older file slices that are no longer needed from the table, by deleting those files. +* **COMPACTION** - Table service to reconcile differential data between base and delta files, by merging delta files into base files. +* **LOGCOMPACTION** - Table service to merge multiple small log files into a bigger log file in the same file slice. +* **CLUSTERING** - Table service to rewrite existing file groups with optimized sort order or storage layouts, as new file groups in the table. +* **INDEXING** - Table service to build an index of a requested type on a column of the table, consistent with the state of the table at the completed instant in face of ongoing writes. +* **ROLLBACK** - Indicates that an unsuccessful write operation was rolled back, removing any partial/uncommitted files produced during such a write from storage. +* **SAVEPOINT** - Marks certain file slices as "saved", such that cleaner will not delete them. It helps restore the table to a point on the timeline, in case of disaster/data recovery scenarios or perform time-travel queries as of those instants. +* **RESTORE** - Restores a table to a given savepoint on the timeline, in case of disaster/data recovery scenarios. + +In some cases, action types in the completed state may be different from requested/inflight states, but still tracked by the same requested instant. For e.g. _CLUSTERING_ as in requested/inflight state, +becomes _REPLACE_COMMIT_ in completed state. Compactions complete as _COMMIT_ action on the timeline producing new base files. In general, multiple write operations from the storage engine +may map to the same action on the timeline. + +### State Transitions +Actions go through state transitions on the timeline, with each transition recorded by a file of the pattern `..`(for other states) or +`_.` (for COMPLETED state). Hudi guarantees that the state transitions are atomic and timeline consistent based on the instant time. +Atomicity is achieved by relying on the atomic operations on the underlying storage (e.g. PUT calls to S3/Cloud Storage). + +Valid state transitions are as follows: + +* `[ ] -> REQUESTED` - Denotes an action has been scheduled, but has not initiated by any process yet. + Note that the process requesting the action can be different from the process that will perform/complete the action. +* `REQUESTED -> INFLIGHT` - Denotes that the action is currently being performed by some process. +* `INFLIGHT -> REQUESTED` or `INFLIGHT -> INFLIGHT` - A process can safely fail many times while performing the action. +* `INFLIGHT -> COMPLETED` - Denotes that the action has been completed successfully. + +The current state of an action on the timeline is the highest state recorded for that action on the timeline, with states ordered as `REQUESTED < INFLIGHT < COMPLETED`. + +### TrueTime Generation + +Time in distributed systems has been studied literally for [decades](https://lamport.azurewebsites.net/pubs/chandy.pdf). Google Spanner’s +[TrueTime](https://research.google/pubs/spanner-truetime-and-the-cap-theorem/) API addresses the challenges of managing time in distributed systems by providing a globally +synchronized clock with bounded uncertainty. Traditional systems struggle with clock drift and lack of a consistent timeline, but TrueTime ensures that all nodes operate with +a common notion of time, defined by a strict interval of uncertainty. This enables Spanner to achieve external consistency in distributed transactions, allowing it to assign +timestamps with confidence that no other operation in the past or future will conflict, solving age-old issues of clock synchronization and causality. Several OLTP databases +like Spanner, [CockroachDB](https://www.cockroachlabs.com/blog/living-without-atomic-clocks/) rely on TrueTime. + +Hudi uses these semantics for instant times on the timeline, to provide unique monotonically increasing instant values. TrueTime can be generated by a single shared time generator +process or by having each process generate its own time and waiting for time >= maximum expected clock drift across all processes within a distributed lock. Locking ensures only one +process is generating time at a time and waiting ensures enough time passes such that any new time generated is guaranteed to be greater than the previous time. + +![Timeline actions](/assets/images/hudi-timeline-truetime.png) +

Figure: TrueTime generation for processes A & B

+ +The figure above shows how time generated by process A and B are monotonically increasing, even though process B has a lower local clock than A at the start, by waiting for uncertainty window of x ms to pass. +In fact, given Hudi targets transaction durations > 1 second, we can afford to operate with a much higher uncertainty bound (> 100ms) guaranteeing extremely high fidelity time generation. + +### Ordering of Actions + +Thus, actions appear on the timeline as an interval starting at the requested instant and ending at the completed instant. Such actions can be ordered by completion time to + +- **Commit time ordering** : To obtain serializable execution order of writes performed consistent with typical relational databases, the actions can be ordered by completed instant. +- **Event time ordering**: Data lakehouses ultimately deal with streams of data (CDC, events, slowly changing data etc), where ordering is dependent on business fields in + the data. In such cases, actions can be ordered by commit time, while the records themselves are further merged in order of a specified event time field. + +Hudi relies on ordering of requested instants of certain actions against completed instants of other actions, to implement non-blocking table service operations or concurrent streaming model +writes with event time ordering. -Example above shows upserts happenings between 10:00 and 10:20 on a Hudi table, roughly every 5 mins, leaving commit metadata on the Hudi timeline, along -with other background cleaning/compactions. One key observation to make is that the commit time indicates the `arrival time` of the data (10:20AM), while the actual data -organization reflects the actual time or `event time`, the data was intended for (hourly buckets from 07:00). These are two key concepts when reasoning about tradeoffs between latency and completeness of data. -When there is late arriving data (data intended for 9:00 arriving >1 hr late at 10:20), we can see the upsert producing new data into even older time buckets/folders. -With the help of the timeline, an incremental query attempting to get all new data that was committed successfully since 10:00 hours, is able to very efficiently consume -only the changed files without say scanning all the time buckets > 07:00. +### Active Timeline and History -### Active and Archived timeline -Hudi divides the entire timeline into active and archived timeline. As the name suggests active timeline is consulted all -the time to serve metadata on valid data files and to ensure reads on the timeline does not incur unnecessary latencies -as timeline grows, the active timeline needs to be bounded on the metadata (timeline instants) it can serve. To ensure this, -after certain thresholds the archival kicks in to move older timeline events to the archived timeline. In general, archival -timeline is never contacted for regular operations of the table and is merely used for book-keeping and debugging purposes. -Any instants seen under “.hoodie” directory refers to active timeline and those archived goes into “.hoodie/archived” folder. +Hudi implements the timeline as a Log Structured Merge ([LSM](https://en.wikipedia.org/wiki/Log-structured_merge-tree)) tree under the `.hoodie/timeline` directory. Unlike typical LSM implementations, +the memory component and the write-ahead-log are at once replaced by [avro](https://avro.apache.org/) serialized files containing individual actions (**_active timeline_**) for high durability and inter-process co-ordination. +All actions on the Hudi table are created in the active timeline a new entry and periodically actions are archived from the active timeline to the LSM structure (timeline history). +As the name suggests active timeline is consulted all the time to build a consistent view of data and archiving completed actions ensures reads on the timeline does not incur unnecessary latencies +as timeline grows. The key invariant around such archiving is that any side effects from completed/pending actions (e.g. uncommitted files) are removed from storage, before archiving them. -#### LSM Timeline +#### LSM Timeline History As mentioned above, active timeline has limited log history to be fast, while archived timeline is expensive to access during reads or writes, especially with high write throughput. To overcome this limitation, Hudi introduced the LSM ( log-structured merge) tree based timeline. Completed actions, their plans and completion metadata are stored in a more -scalable LSM tree based archived timeline organized in an **_archived_** storage location under the `.hoodie` metadata -path. The new timeline format is enabled by default and going forward, we will refer to the archived timeline as LSM -timeline. It consists of Apache Parquet files with action instant data and bookkeeping metadata files, in the following +scalable LSM tree based archived timeline organized in an **_history_** storage folder under the `.hoodie/timeline` metadata +path. It consists of Apache Parquet files with action instant data and bookkeeping metadata files, in the following manner. ```bash -/.hoodie/archived/ +/.hoodie/timeline/history/ ├── _version_ <-- stores the manifest version that is current ├── manifest_1 <-- manifests store list of files in timeline ├── manifest_2 <-- compactions, cleaning, writes produce new manifest files @@ -87,11 +123,11 @@ One can read more about the details of LSM timeline in Hudi 1.0 specs. To unders In the above figure, each level is a tree sorted by instant times. We can see that for a bunch of commits the metadata is stored in a parquet file. As and when more commits are accumulated, they get compacted and pushed down to lower level of the tree. Each new operation to the timeline yields a new snapshot version. The advantage of such a structure is that -we can keep the top level in memory, and still load the remaining levels efficiently from the disk if we need to walk +we can keep the top level in memory if needed, and still load the remaining levels efficiently from the disk if we need to walk back longer history. The LSM timeline compaction frequency is controlled by`hoodie.timeline.compaction.batch.size` i.e. for every _N_ parquet files in the current level, they are merged and flush as a compacted file in the next level. -### Archival Configs +### Timeline Archival Configs Basic configurations that control archival. #### Spark write client configs diff --git a/website/src/pages/roadmap.md b/website/src/pages/roadmap.md index 7fd850cf2867..e6f7f9aec931 100644 --- a/website/src/pages/roadmap.md +++ b/website/src/pages/roadmap.md @@ -24,7 +24,7 @@ down by areas on our [stack](/docs/hudi_stack). | 2.0.0 | Dec 2025 | -## Transactions Database Layer +## Storage Engine | Feature | Target Release | Tracking | |------------------------------------------------------|----------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -68,7 +68,7 @@ down by areas on our [stack](/docs/hudi_stack). | Replace Dataframe write path for Spark | 1.1.0 | [HUDI-4857](https://issues.apache.org/jira/browse/HUDI-4857) | -## Platform Services +## Platform Components | Feature | Target Release | Tracking | |---------------------------------------------------------------------------------------------------|----------------|----------------------------------------------------------------------------------------------------------------------------------------| diff --git a/website/static/assets/images/hudi-stack-1-x.png b/website/static/assets/images/hudi-stack-1-x.png new file mode 100644 index 000000000000..ba61758c4b8e Binary files /dev/null and b/website/static/assets/images/hudi-stack-1-x.png differ diff --git a/website/static/assets/images/hudi-stack-indexes.png b/website/static/assets/images/hudi-stack-indexes.png new file mode 100644 index 000000000000..aef8e5e2bf81 Binary files /dev/null and b/website/static/assets/images/hudi-stack-indexes.png differ diff --git a/website/static/assets/images/hudi-timeline-actions.png b/website/static/assets/images/hudi-timeline-actions.png new file mode 100644 index 000000000000..def0d3a32255 Binary files /dev/null and b/website/static/assets/images/hudi-timeline-actions.png differ diff --git a/website/static/assets/images/hudi-timeline-truetime.png b/website/static/assets/images/hudi-timeline-truetime.png new file mode 100644 index 000000000000..e96a74399ec7 Binary files /dev/null and b/website/static/assets/images/hudi-timeline-truetime.png differ