Oops. In the first paragraph, I meant “when we added the endpoint to load a VIEW, metadata-location was correctly marked as required."
On Thu, Feb 29, 2024 at 4:18 PM Ryan Blue <b...@tabular.io> wrote: > Once again, I’m catching up late and might have a helpful perspective. > > I think there was a mistake in the OpenAPI spec for loading tables and the > metadata-location is not listed as required. I don’t recall that being > intentional, but maybe it was? Maybe for a different reason? Either way, > when we added the endpoint to load a catalog, metadata-location was > correctly marked as required. > > Whatever the reason for the field being optional, *the intent was never > to change requirements from Iceberg* that metadata is written to files > and atomic operations guarantee a linear history. > > I’m glad to clear up the confusion on that. Right now, *catalogs must > write metadata files for Iceberg tables and should guarantee a linear > history*. > > You may be able to get away with bending those rules (what Dan refers to > as not compliant), but that’s unintentional. We may also choose to relax > the requirement for metadata files in the future — I see support for the > idea and have considered proposing it also. But for now, it’s a > requirement, even if you don’t have to send the location to the client > (though note that the client has a hard dependency on it!). > > Ryan > > On Thu, Feb 29, 2024 at 4:06 PM Daniel Weeks <daniel.c.we...@gmail.com> > wrote: > >> 1. I agree, this is what the spec currently requires >> >> 2. I agree, it's up for consideration >> >> 3. I agree, I think if an implementation didn't adhere to the current >> spec requirements, I would say it's out of spec (not sure I'd go as far as >> to say it's a different kind of table entirely). >> >> Just to expand on #3, we will find lots of cases where implementations >> deviate (likely unintentionally) from the rest/table spec and I feel like >> the goal is to identify those cases and steer them back into compliance >> with the spec as opposed to immediately claiming they're something entirely >> different. The overarching goal is to improve openness and >> interoperability. >> >> My main point is that there isn't an inherent incompatibility between the >> REST spec and the Iceberg spec. The preservation of the storage >> representation was discussed and intentional during the design/development >> of the REST spec. >> >> -Dan >> >> >> On Thu, Feb 29, 2024 at 3:40 PM Jack Ye <yezhao...@gmail.com> wrote: >> >>> > For example, I cannot validate the atomic behaviors Glue claims, but I >>> wouldn't assert that it is non-compliant because of that. >>> >>> I think these are not comparable claims because the API scope is >>> completely different, but I don't think it's worth arguing in depth. Let's >>> try to see if we can have some consensus. >>> >>> Based on what you said above, do you agree with the following 3 points? >>> >>> 1. Today, a table/view in any catalog including a REST spec-compatible >>> catalog is an Iceberg table/view if and only if it points to a JSON >>> metadata file in storage. This concept is a part of the Iceberg table/view >>> spec. There is a debate to be had for if we want to remove this requirement >>> or not. The argument for it (as Yufei said) is to use other storage for >>> better performance. The argument against it (as Amogh said) is to keep >>> Iceberg open source friendly through the JSON format. >>> >>> 2. Today, a table/view in any catalog including a REST spec-compatible >>> catalog is an Iceberg table/view if and only if it behind the scene >>> performs the atomic metadata file swap for every commit. This concept is a >>> part of the Iceberg table/view spec. We should consider removing this >>> requirement in the Iceberg table/view spec. >>> >>> 3. A table/view in an Iceberg REST spec-compatible catalog may or may >>> not be an Iceberg table/view. The REST spec does not enforce this, and this >>> stance will remain true going forward. For example, it could use the >>> Iceberg table/view metadata structure but does not store the metadata in >>> JSON file, or not use the metadata file swap commit procedure, or both, and >>> in those cases it is not an Iceberg table/view. More extremely, it might be >>> a totally different kind of table that is only surfaced through the REST >>> models. >>> >>> -Jack >>> >>> On Thu, Feb 29, 2024 at 2:13 PM Daniel Weeks <daniel.c.we...@gmail.com> >>> wrote: >>> >>>> > In that case are tables in a REST-compliant catalog still an Iceberg >>>> table? I don't think so, because it is a table that only partially follows >>>> the Iceberg table spec. >>>> >>>> If the catalog is REST compliant and complies with the Iceberg spec, >>>> they are still Iceberg tables. I can see there is an argument that if the >>>> catalog is REST compliant but does not follow the commit requirements (or >>>> aspects of the Iceberg spec), that you cannot call those Iceberg tables. >>>> But the assertion that Iceberg tables in a REST catalog are de facto >>>> non-compliant is incorrect. >>>> >>>> > I like the idea about validation for format compliance. But don't >>>> think you can technically validate this. You can validate the static table >>>> to see if it has all the Iceberg metadata components, but you can not >>>> validate the internal behavior of the service during a commit to see if it >>>> really atomically swapped a metadata file. >>>> >>>> Just because you cannot see/validate the implementation doesn't mean >>>> that it is non-compliant. For example, I cannot validate the atomic >>>> behaviors Glue claims, but I wouldn't assert that it is non-compliant >>>> because of that. >>>> >>>> I do think there is a discussion to be had about if/when we might >>>> adjust the storage/swap requirements, but to reinforce Amogh's point, >>>> removing those requirements would impact the openness and accessibility of >>>> Iceberg, which I feel would hamper adoption. >>>> >>>> -Dan >>>> >>>> >>>> >>>> On Thu, Feb 29, 2024 at 1:53 PM Yufei Gu <flyrain...@gmail.com> wrote: >>>> >>>>> We've periodically discussed removing the storage requirement and I >>>>>> think there's a path forward to do that and would agree that >>>>>> standardizing >>>>>> on REST, but I wouldn't say the justification for making this push is >>>>>> that >>>>>> REST is not compliant so we can just ignore the table spec requirements. >>>>>> There are a few more things to consider, which is that not everything >>>>>> can use REST currently and making a hard cut away from file based >>>>>> metadata >>>>>> could bifurcate access to Iceberg data. There are also aspects to the >>>>>> spec >>>>>> that reference the metadata paths (like metadata log, though it's >>>>>> optional), but would likely need to be addressed. >>>>> >>>>> >>>>> This is a bit off-topic. It makes sense to me to remove the storage >>>>> requirement moving foward. The metadata.json file isn't necessary in the >>>>> Rest catalog. For example, the rest catalog may not have the permission to >>>>> write to the table owner's storage. It still can save it as a file of >>>>> course, but doesn't quite make sense. Putting it in a key-value store or >>>>> RDMS could be a better option. >>>>> >>>>> Given that we are going to remove the storage requirement. Should we >>>>> avoid the file path in the current design for things like view spec? A >>>>> solution like table identifier + version uuid may serve the purpose. >>>>> >>>>> Yufei >>>>> >>>>> >>>>> On Thu, Feb 29, 2024 at 1:29 PM Jack Ye <yezhao...@gmail.com> wrote: >>>>> >>>>>> > There's no exemption that says if you're using REST you don't need >>>>>> to follow the spec. Why do you think that's the case? >>>>>> >>>>>> In that case are tables in a REST-compliant catalog still an Iceberg >>>>>> table? I don't think so, because it is a table that only partially >>>>>> follows >>>>>> the Iceberg table spec. >>>>>> >>>>>> I like the idea about validation for format compliance. But don't >>>>>> think you can technically validate this. You can validate the static >>>>>> table >>>>>> to see if it has all the Iceberg metadata components, but you can not >>>>>> validate the internal behavior of the service during a commit to see if >>>>>> it >>>>>> really atomically swapped a metadata file. >>>>>> >>>>>> So I think at minimum we should update the table/view spec to remove >>>>>> the metadata file swap requirement. The Iceberg table/view spec should >>>>>> be a >>>>>> pure format spec that specifies how the file is laid out in storage. >>>>>> >>>>>> -Jack >>>>>> >>>>>> On Thu, Feb 29, 2024 at 1:22 PM Amogh Jahagirdar <am...@tabular.io> >>>>>> wrote: >>>>>> >>>>>>> I want to echo Dan's point that just because there is a separate >>>>>>> spec for a REST Catalog does not mean that implementations can deviate >>>>>>> from >>>>>>> the spec's definition of the commit protocol or metadata layout, and >>>>>>> still >>>>>>> be considered "spec compliant". >>>>>>> >>>>>>> > Secondly, once we do that, we should declare REST spec as the >>>>>>> official catalog spec to interact with Iceberg tables. Otherwise at >>>>>>> least I >>>>>>> will be very tempted to just break the atomic pointer swap pattern and >>>>>>> store the entire metadata using the Glue Table object to achieve much >>>>>>> better performance and also Glue native feature integrations, and I >>>>>>> think >>>>>>> other players will be equally motivated to do something similar. That >>>>>>> will >>>>>>> lead to even more chaos in the Iceberg catalog space. >>>>>>> >>>>>>> On this, a second point I want to make is around the openness of >>>>>>> this ecosystem. We all already know that openness (the file formats, the >>>>>>> metadata layout, the spec itself) is a fundamental tenant of the >>>>>>> project. >>>>>>> If we take the provided example of removing the metadata JSON file and >>>>>>> moving it to some other storage, I think that goes against this >>>>>>> principle >>>>>>> since a JSON file is quite open by definition. Going back to the first >>>>>>> point, I think a catalog which has such a behavior would *not* be >>>>>>> considered spec compliant. Another reason this is important is if we >>>>>>> think >>>>>>> about what's healthiest for all users of Iceberg, is to have a healthy >>>>>>> list >>>>>>> of options for catalog choices. Storing the metadata JSON in non-open >>>>>>> ways >>>>>>> can make users lives harder for trying out new catalogs since now the >>>>>>> metadata would be stored in their own way, and the users will have a >>>>>>> harder >>>>>>> time accessing their own data. >>>>>>> >>>>>>> A last point I'd like to make is I think there's a good discussion >>>>>>> to be had on how do we validate that a REST Catalog implementation is >>>>>>> spec >>>>>>> compliant. I think that's really beneficial for the ecosystem as a >>>>>>> whole. >>>>>>> Before that, I think first though we'd want to conclude on this topic >>>>>>> itself. >>>>>>> >>>>>>> On Thu, Feb 29, 2024 at 12:29 PM Daniel Weeks < >>>>>>> daniel.c.we...@gmail.com> wrote: >>>>>>> >>>>>>>> > REST spec-compliant catalog does not need to follow the Iceberg >>>>>>>> spec to commit or store metadata >>>>>>>> >>>>>>>> If the REST implementation doesn't follow the Iceberg spec for >>>>>>>> commit requirements, it's not compliant with the spec. There's no >>>>>>>> exemption that says if you're using REST you don't need to follow the >>>>>>>> spec. Why do you think that's the case? >>>>>>>> >>>>>>>> I don't believe there's a reason to say that the REST spec needs to >>>>>>>> enforce the commit requirements either, that's a requirement of the >>>>>>>> Iceberg >>>>>>>> spec and still needs to be complied with. >>>>>>>> >>>>>>>> -Dan >>>>>>>> >>>>>>>> On Thu, Feb 29, 2024 at 12:19 PM Jack Ye <yezhao...@gmail.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> > The implementation of the spec can either be compliant or not. >>>>>>>>> >>>>>>>>> This is exactly the problem we are talking about right? Just to >>>>>>>>> give an example, we cannot technically say that tables/views in the >>>>>>>>> Tabular >>>>>>>>> catalog are Iceberg tables/views, because a REST spec-compliant >>>>>>>>> catalog >>>>>>>>> does not need to follow the Iceberg spec to commit or store metadata. >>>>>>>>> Even >>>>>>>>> if you say it is, there is no way to really prove that, because the >>>>>>>>> REST >>>>>>>>> spec does not enforce it. >>>>>>>>> >>>>>>>>> JB, what do you mean by participating on the Catalog RFC? Is there >>>>>>>>> already an ongoing RFC? >>>>>>>>> >>>>>>>>> -Jack >>>>>>>>> >>>>>>>>> >>>>>>>>> On Thu, Feb 29, 2024 at 12:08 PM Jean-Baptiste Onofré < >>>>>>>>> j...@nanthrax.net> wrote: >>>>>>>>> >>>>>>>>>> Hi Dan, >>>>>>>>>> >>>>>>>>>> I agree with your statement about REST Spec is not an implement >>>>>>>>>> but I strongly disagree with your statement "impl of the spec can >>>>>>>>>> either be >>>>>>>>>> compliant or not". >>>>>>>>>> >>>>>>>>>> The REST Catalog spec impl should be consistent with the REST >>>>>>>>>> Spec. That's why a reference implementation in Iceberg would be a >>>>>>>>>> must, >>>>>>>>>> with a TCK. >>>>>>>>>> >>>>>>>>>> The REST Spec should bridge/give access to Table/View metadata. I >>>>>>>>>> think it would make sense to have a resource to GET the Table/View >>>>>>>>>> metadata, also supporting PUT to update. >>>>>>>>>> JSON Schema and eventually JSON RPC could help on some area here >>>>>>>>>> (compliant with OpenAPI). >>>>>>>>>> >>>>>>>>>> In another thread, I propose to work on a Catalog RFC, exactly to >>>>>>>>>> target this. I think it would make sense to have the REST/Catalog >>>>>>>>>> RFC as >>>>>>>>>> the main catalog API, so it has to be both consistent (giving access >>>>>>>>>> to >>>>>>>>>> table/view metadata) and extensible (via OpenAPI Extensions for >>>>>>>>>> instance). >>>>>>>>>> >>>>>>>>>> So, I agree with Jack: the minimum would be to have JSON metadata >>>>>>>>>> exposed by the REST Spec. >>>>>>>>>> >>>>>>>>>> @Jack, short term I'm in favor of your proposal, long term, I >>>>>>>>>> propose to participate on the Catalog RFC (REST Spec). WDYT ? >>>>>>>>>> >>>>>>>>>> Thanks ! >>>>>>>>>> Regards >>>>>>>>>> JB >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Le jeu. 29 févr. 2024 à 20:47, Daniel Weeks < >>>>>>>>>> daniel.c.we...@gmail.com> a écrit : >>>>>>>>>> >>>>>>>>>>> Hey Jack, >>>>>>>>>>> >>>>>>>>>>> I'm not sure I agree with the framing of this argument. The >>>>>>>>>>> REST Spec defines a protocol, not an implementation. >>>>>>>>>>> >>>>>>>>>>> The implementation of the spec can either be compliant or not. >>>>>>>>>>> So a REST Implementation that adheres to all the requirements >>>>>>>>>>> (atomic >>>>>>>>>>> location swap, json representation, etc.), would be compliant. >>>>>>>>>>> There's no >>>>>>>>>>> requirement around who performs these operations and with REST, >>>>>>>>>>> that is >>>>>>>>>>> delegated to the server. The optional metadata location doesn't >>>>>>>>>>> mean that >>>>>>>>>>> there isn't a metadata location, just that it may not be exposed >>>>>>>>>>> directly >>>>>>>>>>> in the response. >>>>>>>>>>> >>>>>>>>>>> Therefore, an implementation where you just store the table >>>>>>>>>>> metadata in a Glue Table object, would not be compliant, currently. >>>>>>>>>>> >>>>>>>>>>> We've periodically discussed removing the storage requirement >>>>>>>>>>> and I think there's a path forward to do that and would agree that >>>>>>>>>>> standardizing on REST, but I wouldn't say the justification for >>>>>>>>>>> making this >>>>>>>>>>> push is that REST is not compliant so we can just ignore the table >>>>>>>>>>> spec >>>>>>>>>>> requirements. >>>>>>>>>>> >>>>>>>>>>> There are a few more things to consider, which is that not >>>>>>>>>>> everything can use REST currently and making a hard cut away from >>>>>>>>>>> file >>>>>>>>>>> based metadata could bifurcate access to Iceberg data. There are >>>>>>>>>>> also >>>>>>>>>>> aspects to the spec that reference the metadata paths (like >>>>>>>>>>> metadata log, >>>>>>>>>>> though it's optional), but would likely need to be addressed. >>>>>>>>>>> >>>>>>>>>>> -Dan >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On Thu, Feb 29, 2024 at 11:13 AM Jack Ye <yezhao...@gmail.com> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>>> Hi everyone, >>>>>>>>>>>> >>>>>>>>>>>> Just want to pull this specific topic out of the materialized >>>>>>>>>>>> view discussion thread. I noticed this during the MV discussion, >>>>>>>>>>>> and I >>>>>>>>>>>> think it is important to clarify this not just for the MV topic, >>>>>>>>>>>> but also >>>>>>>>>>>> for the ongoing discussion to consolidate all the different >>>>>>>>>>>> catalogs. >>>>>>>>>>>> >>>>>>>>>>>> *How the table/view spec defines Iceberg table/view* >>>>>>>>>>>> >>>>>>>>>>>> If we look into the table/view spec, the optimistic >>>>>>>>>>>> concurrency section >>>>>>>>>>>> <https://iceberg.apache.org/spec/#optimistic-concurrency> >>>>>>>>>>>> requires the existence of a metadata file, and the atomic swap of >>>>>>>>>>>> the >>>>>>>>>>>> metadata file ensures serializable isolation. This implies 2 >>>>>>>>>>>> things: >>>>>>>>>>>> 1. the metadata file in a storage that holds the information >>>>>>>>>>>> described in the rest of the spec. >>>>>>>>>>>> 2. there is an object in a catalog that holds the pointer of >>>>>>>>>>>> the metadata file. What object and what catalog is implementation >>>>>>>>>>>> dependent, but these generalized concepts are always intact. >>>>>>>>>>>> >>>>>>>>>>>> The JSON serialization parts of the spec plus the reader >>>>>>>>>>>> requirements also implies that the metadata file is in JSON format. >>>>>>>>>>>> >>>>>>>>>>>> So when we talk about an Iceberg table/view that is compliant >>>>>>>>>>>> with the spec, it is the combination of all these 5 requirements: >>>>>>>>>>>> 1. there is an object in the catalog representing this >>>>>>>>>>>> table/view >>>>>>>>>>>> 2. there is a pointer to a JSON metadata file in the object >>>>>>>>>>>> 3. the JSON metadata file exists in storage and contains the >>>>>>>>>>>> table/view metadata content >>>>>>>>>>>> 4. the metadata content is compliant with the standard >>>>>>>>>>>> described in the spec >>>>>>>>>>>> 5. serializable isolation is achieved by atomic swap of the >>>>>>>>>>>> object pointer >>>>>>>>>>>> >>>>>>>>>>>> *How non-REST catalogs are compliant with the table/view spec* >>>>>>>>>>>> >>>>>>>>>>>> An implementation of the Iceberg table/view is essentially >>>>>>>>>>>> specifying: >>>>>>>>>>>> 1. what is the exact implementation of the catalog, e.g. JDBC, >>>>>>>>>>>> Hive metastore (HMS), Glue, etc. >>>>>>>>>>>> 2. what is the object that represents a table, e.g. a row in >>>>>>>>>>>> the "iceberg_tables" table in JDBC, a Table object in HMS/Glue, >>>>>>>>>>>> etc. >>>>>>>>>>>> 3. how is the JSON metadata file pointer stored, e.g. a column >>>>>>>>>>>> in the table's row in JDBC, metadata_location key in the Table's >>>>>>>>>>>> parameter >>>>>>>>>>>> map in HMS/Glue, etc. >>>>>>>>>>>> 4. how the atomic swap is implemented, e.g. SQL atomic update >>>>>>>>>>>> in JDBC, conditional parameter update in HMS, conditional version >>>>>>>>>>>> update in >>>>>>>>>>>> Glue, etc. >>>>>>>>>>>> >>>>>>>>>>>> *How the REST spec is NOT compliant with the table/view spec* >>>>>>>>>>>> >>>>>>>>>>>> The REST spec technically does not match the following >>>>>>>>>>>> table/view spec requirements: >>>>>>>>>>>> 2. there is a pointer to a JSON metadata file in the object >>>>>>>>>>>> 3. the JSON metadata file exists in storage and contains the >>>>>>>>>>>> table/view metadata content >>>>>>>>>>>> 5. serializable isolation is achieved by atomic swap of the >>>>>>>>>>>> object pointer >>>>>>>>>>>> >>>>>>>>>>>> The key parts in REST spec that are not compliant are: >>>>>>>>>>>> 1. metadata-location field is optional in LoadTableResponse >>>>>>>>>>>> <https://github.com/apache/iceberg/blob/main/open-api/rest-catalog-open-api.yaml#L2721-L2728> >>>>>>>>>>>> 2. pointer swap is not enforced in the UpdateTable >>>>>>>>>>>> <https://github.com/apache/iceberg/blob/main/open-api/rest-catalog-open-api.yaml#L658> >>>>>>>>>>>> operation >>>>>>>>>>>> >>>>>>>>>>>> Therefore, it opens the door for a REST service to be >>>>>>>>>>>> completely not dependent on a JSON metadata file, store the Iceberg >>>>>>>>>>>> table/view metadata not as a file, and achieve much better >>>>>>>>>>>> performance >>>>>>>>>>>> characteristics than other catalogs. This technically gives a >>>>>>>>>>>> unique >>>>>>>>>>>> advantage for REST catalog adopters that is not there for non-REST >>>>>>>>>>>> catalogs >>>>>>>>>>>> like HMS and Glue. >>>>>>>>>>>> >>>>>>>>>>>> *How can we fix this?* >>>>>>>>>>>> >>>>>>>>>>>> I suggest the following: >>>>>>>>>>>> >>>>>>>>>>>> Firstly, I think it is good that we try to remove the >>>>>>>>>>>> requirements of JSON metadata file pointer and atomic pointer >>>>>>>>>>>> swap. We know >>>>>>>>>>>> these requirements have perf limitations based on production usage, >>>>>>>>>>>> especially when the metadata file is large. If that is the >>>>>>>>>>>> direction, we >>>>>>>>>>>> should make it official by changing the table/view spec to say >>>>>>>>>>>> that those >>>>>>>>>>>> requirements are catalog level implementation details that are no >>>>>>>>>>>> longer >>>>>>>>>>>> required. >>>>>>>>>>>> >>>>>>>>>>>> Secondly, once we do that, we should declare REST spec as the >>>>>>>>>>>> official catalog spec to interact with Iceberg tables. Otherwise >>>>>>>>>>>> at least I >>>>>>>>>>>> will be very tempted to just break the atomic pointer swap pattern >>>>>>>>>>>> and >>>>>>>>>>>> store the entire metadata using the Glue Table object to achieve >>>>>>>>>>>> much >>>>>>>>>>>> better performance and also Glue native feature integrations, and >>>>>>>>>>>> I think >>>>>>>>>>>> other players will be equally motivated to do something similar. >>>>>>>>>>>> That will >>>>>>>>>>>> lead to even more chaos in the Iceberg catalog space. >>>>>>>>>>>> >>>>>>>>>>>> With REST spec as the official catalog spec, we can actually >>>>>>>>>>>> support non-REST catalogs by using the HTTP execution chain >>>>>>>>>>>> handler. Dan >>>>>>>>>>>> has already done a prototype here >>>>>>>>>>>> <https://github.com/apache/iceberg/commit/619127ff69f89e43a1edef2ea94c3dd439396a8d#diff-869264a83ba9ca657e7defefaa16ad196b0de9fce6c87f97533db77f29e44762> >>>>>>>>>>>> that is based on this discussion >>>>>>>>>>>> <https://github.com/apache/iceberg/pull/8091#issuecomment-1647189146> >>>>>>>>>>>> in the past about using AWS Lambda as an alternative HTTP client >>>>>>>>>>>> for REST >>>>>>>>>>>> catalog. The same approach can be used to talk to >>>>>>>>>>>> HMS/Glue/JDBC/... while >>>>>>>>>>>> users will only interact with the RESTCatalog as the entry point. >>>>>>>>>>>> >>>>>>>>>>>> I think this can provide a good path forward overall for the >>>>>>>>>>>> catalog consolidation story, interested to know what others think. >>>>>>>>>>>> >>>>>>>>>>>> Best, >>>>>>>>>>>> Jack Ye >>>>>>>>>>>> >>>>>>>>>>>> > > -- > Ryan Blue > Tabular > -- Ryan Blue Tabular