Skip to content

Commit 70f73fa

Browse files
gtrettenerogtret
andauthored
[BDW-885]: Upgrade to Iceberg 1.9 (#666)
* Checkpoint progress * add test * typo in one case * address comments + change to 1.9 * add refs test + move to 1.4.3 * go back to 1.9 * update deps --------- Co-authored-by: gtret <[email protected]>
1 parent 99ec3d1 commit 70f73fa

File tree

10 files changed

+193
-46
lines changed

10 files changed

+193
-46
lines changed

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ allprojects {
7171
url "https://repo.spring.io/milestone"
7272
}
7373
maven {
74-
url "https://redshift-maven-repository.s3-website-us-east-1.amazonaws.com/release"
74+
url "https://repository.apache.org/content/repositories/releases"
7575
}
7676
maven {
7777
url 'https://jitpack.io'
@@ -153,7 +153,7 @@ configure(javaProjects) {
153153
dependency("org.elasticsearch.client:transport:5.4.1")
154154
dependency("net.snowflake:snowflake-jdbc:3.4.2")
155155
dependency("com.esotericsoftware.kryo:kryo:2.22")
156-
dependency("org.apache.iceberg:iceberg-spark-runtime:${iceberg_version}")
156+
dependency("org.apache.iceberg:iceberg-spark-runtime-${iceberg_spark_version}_${iceberg_scala_version}:${iceberg_version}")
157157
dependency("com.datastax.cassandra:cassandra-driver-core:3.7.2")
158158
dependency("mysql:mysql-connector-java:8.0.27")
159159
}

gradle.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ elasticsearch.version=5.4.1
3131

3232
hive_version=1.2.1
3333

34-
iceberg_version=0.13.1
34+
iceberg_version=1.9.1
35+
iceberg_spark_version=3.5
36+
iceberg_scala_version=2.13
3537

3638
org.gradle.jvmargs=-Xmx1g
3739

metacat-app/dependencies.lock

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -517,11 +517,11 @@
517517
],
518518
"locked": "5.2.3"
519519
},
520-
"org.apache.iceberg:iceberg-spark-runtime": {
520+
"org.apache.iceberg:iceberg-spark-runtime-3.5_2.13": {
521521
"firstLevelTransitive": [
522522
"com.netflix.metacat:metacat-connector-hive"
523523
],
524-
"locked": "0.13.1"
524+
"locked": "1.9.1"
525525
},
526526
"org.apache.logging.log4j:log4j-core": {
527527
"firstLevelTransitive": [
@@ -995,11 +995,11 @@
995995
],
996996
"locked": "5.2.3"
997997
},
998-
"org.apache.iceberg:iceberg-spark-runtime": {
998+
"org.apache.iceberg:iceberg-spark-runtime-3.5_2.13": {
999999
"firstLevelTransitive": [
10001000
"com.netflix.metacat:metacat-connector-hive"
10011001
],
1002-
"locked": "0.13.1"
1002+
"locked": "1.9.1"
10031003
},
10041004
"org.apache.logging.log4j:log4j-core": {
10051005
"firstLevelTransitive": [
@@ -1719,11 +1719,11 @@
17191719
],
17201720
"locked": "5.2.3"
17211721
},
1722-
"org.apache.iceberg:iceberg-spark-runtime": {
1722+
"org.apache.iceberg:iceberg-spark-runtime-3.5_2.13": {
17231723
"firstLevelTransitive": [
17241724
"com.netflix.metacat:metacat-connector-hive"
17251725
],
1726-
"locked": "0.13.1"
1726+
"locked": "1.9.1"
17271727
},
17281728
"org.apache.logging.log4j:log4j-core": {
17291729
"firstLevelTransitive": [

metacat-connector-hive/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ dependencies {
3131
}
3232

3333
api("commons-dbutils:commons-dbutils")
34-
api("org.apache.iceberg:iceberg-spark-runtime")
34+
api("org.apache.iceberg:iceberg-spark-runtime-${iceberg_spark_version}_${iceberg_scala_version}")
3535
/*******************************
3636
* Provided Dependencies
3737
*******************************/

metacat-connector-hive/dependencies.lock

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@
7777
"org.apache.hive:hive-metastore": {
7878
"locked": "1.2.1"
7979
},
80-
"org.apache.iceberg:iceberg-spark-runtime": {
81-
"locked": "0.13.1"
80+
"org.apache.iceberg:iceberg-spark-runtime-3.5_2.13": {
81+
"locked": "1.9.1"
8282
},
8383
"org.apache.tomcat:tomcat-jdbc": {
8484
"firstLevelTransitive": [
@@ -205,8 +205,8 @@
205205
"org.apache.hive:hive-metastore": {
206206
"locked": "1.2.1"
207207
},
208-
"org.apache.iceberg:iceberg-spark-runtime": {
209-
"locked": "0.13.1"
208+
"org.apache.iceberg:iceberg-spark-runtime-3.5_2.13": {
209+
"locked": "1.9.1"
210210
},
211211
"org.apache.tomcat:tomcat-jdbc": {
212212
"firstLevelTransitive": [
@@ -357,8 +357,8 @@
357357
"org.apache.hive:hive-metastore": {
358358
"locked": "1.2.1"
359359
},
360-
"org.apache.iceberg:iceberg-spark-runtime": {
361-
"locked": "0.13.1"
360+
"org.apache.iceberg:iceberg-spark-runtime-3.5_2.13": {
361+
"locked": "1.9.1"
362362
},
363363
"org.apache.tomcat:tomcat-jdbc": {
364364
"firstLevelTransitive": [
@@ -513,8 +513,8 @@
513513
"org.apache.hive:hive-metastore": {
514514
"locked": "1.2.1"
515515
},
516-
"org.apache.iceberg:iceberg-spark-runtime": {
517-
"locked": "0.13.1"
516+
"org.apache.iceberg:iceberg-spark-runtime-3.5_2.13": {
517+
"locked": "1.9.1"
518518
},
519519
"org.apache.tomcat:tomcat-jdbc": {
520520
"firstLevelTransitive": [
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
/*
2+
* Copyright 2024 Netflix, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.netflix.metacat.connector.hive.iceberg
18+
19+
import org.apache.iceberg.BaseMetastoreTableOperations
20+
import org.apache.iceberg.ScanSummary
21+
import org.apache.iceberg.Schema
22+
import org.apache.iceberg.UpdateSchema
23+
import org.apache.iceberg.TableMetadata
24+
import org.apache.iceberg.TableMetadataParser
25+
import org.apache.iceberg.types.Types
26+
import spock.lang.Specification
27+
28+
/**
29+
* Simple validation tests to ensure Iceberg 1.1.0 upgrade is working correctly.
30+
* These tests focus on API compatibility and version verification.
31+
*/
32+
class IcebergVersionValidationSpec extends Specification {
33+
34+
def "test Iceberg 1.1.0 API classes are available"() {
35+
expect: "All critical Iceberg classes should be available"
36+
Class.forName('org.apache.iceberg.ScanSummary') != null
37+
Class.forName('org.apache.iceberg.Table') != null
38+
Class.forName('org.apache.iceberg.TableMetadataParser') != null
39+
Class.forName('org.apache.iceberg.UpdateSchema') != null
40+
Class.forName('org.apache.iceberg.BaseMetastoreTableOperations') != null
41+
Class.forName('org.apache.iceberg.hadoop.HadoopFileIO') != null
42+
}
43+
44+
def "test ScanSummary.PartitionMetrics constructor works"() {
45+
when: "Create PartitionMetrics using Iceberg 1.1.0 constructor"
46+
def metrics = new ScanSummary.PartitionMetrics(
47+
fileCount: 10,
48+
recordCount: 1000,
49+
dataTimestampMillis: System.currentTimeMillis()
50+
)
51+
52+
then: "Should create successfully"
53+
metrics != null
54+
metrics.fileCount() == 10
55+
metrics.recordCount() == 1000
56+
metrics.dataTimestampMillis() != null
57+
}
58+
59+
def "test Schema creation and field access works"() {
60+
when: "Create Iceberg schema using 1.1.0 API"
61+
def schema = new Schema([
62+
Types.NestedField.required(1, "id", Types.LongType.get()),
63+
Types.NestedField.optional(2, "name", Types.StringType.get(), "Test comment"),
64+
Types.NestedField.optional(3, "value", Types.DoubleType.get())
65+
])
66+
67+
then: "Schema should be created correctly"
68+
schema != null
69+
schema.columns().size() == 3
70+
schema.findField("name").doc() == "Test comment"
71+
schema.findField("id").isRequired()
72+
schema.findField("name").isOptional()
73+
}
74+
75+
def "test TableMetadataParser API exists"() {
76+
expect: "TableMetadataParser.toJson method should exist"
77+
def method = TableMetadataParser.class.getDeclaredMethod('toJson', TableMetadata.class)
78+
method != null
79+
method.getReturnType() == String.class
80+
}
81+
82+
def "test UpdateSchema API exists"() {
83+
expect: "UpdateSchema should have expected methods"
84+
def updateColumnDocMethod = UpdateSchema.class.getDeclaredMethod('updateColumnDoc', String.class, String.class)
85+
updateColumnDocMethod != null
86+
87+
// Check if commit method exists (might be inherited or have different signature)
88+
def commitMethods = UpdateSchema.class.getMethods().findAll { it.name == 'commit' }
89+
commitMethods.size() > 0
90+
}
91+
92+
def "test BaseMetastoreTableOperations methods exist"() {
93+
expect: "BaseMetastoreTableOperations should have expected methods"
94+
def ioMethods = BaseMetastoreTableOperations.class.getMethods().findAll { it.name == 'io' }
95+
ioMethods.size() > 0
96+
97+
def currentMethods = BaseMetastoreTableOperations.class.getMethods().findAll { it.name == 'current' }
98+
currentMethods.size() > 0
99+
currentMethods.any { it.returnType == TableMetadata.class }
100+
}
101+
102+
def "test Table refs method exists for branching support"() {
103+
expect: "Table should have refs() method for branching and tagging functionality"
104+
def tableClass = Class.forName('org.apache.iceberg.Table')
105+
def refsMethods = tableClass.getMethods().findAll { it.name == 'refs' }
106+
refsMethods.size() > 0
107+
108+
// Verify the method returns something that could be table references
109+
def refsMethod = refsMethods.first()
110+
refsMethod.returnType != null
111+
refsMethod.parameterCount == 0
112+
}
113+
114+
def "test version detection"() {
115+
when: "Check Iceberg version information"
116+
def icebergVersion = getIcebergVersionInfo()
117+
118+
then: "Should indicate we're using version 1.x"
119+
println "Iceberg version info: ${icebergVersion}"
120+
icebergVersion.contains("1.")
121+
!icebergVersion.contains("0.13.1") && !icebergVersion.contains("pre-1.0") // Should not be the older than 1.1
122+
}
123+
124+
private String getIcebergVersionInfo() {
125+
try {
126+
// Try to get version from package
127+
def packageInfo = Package.getPackage("org.apache.iceberg")
128+
if (packageInfo?.implementationVersion) {
129+
return "Package version: ${packageInfo.implementationVersion}"
130+
}
131+
132+
// Check for new 1.1+ features that didn't exist in 0.13
133+
try {
134+
// This class exists in Iceberg 1.0+
135+
Class.forName("org.apache.iceberg.actions.RewriteDataFiles")
136+
return "1.0+ (has RewriteDataFiles)"
137+
} catch (ClassNotFoundException e) {
138+
// This means we're on an older version
139+
return "pre-1.0"
140+
}
141+
} catch (Exception e) {
142+
return "unknown: ${e.message}"
143+
}
144+
}
145+
}

metacat-connector-polaris/dependencies.lock

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,11 @@
109109
],
110110
"locked": "1.2.1"
111111
},
112-
"org.apache.iceberg:iceberg-spark-runtime": {
112+
"org.apache.iceberg:iceberg-spark-runtime-3.5_2.13": {
113113
"firstLevelTransitive": [
114114
"com.netflix.metacat:metacat-connector-hive"
115115
],
116-
"locked": "0.13.1"
116+
"locked": "1.9.1"
117117
},
118118
"org.apache.tomcat:tomcat-jdbc": {
119119
"firstLevelTransitive": [
@@ -284,11 +284,11 @@
284284
],
285285
"locked": "1.2.1"
286286
},
287-
"org.apache.iceberg:iceberg-spark-runtime": {
287+
"org.apache.iceberg:iceberg-spark-runtime-3.5_2.13": {
288288
"firstLevelTransitive": [
289289
"com.netflix.metacat:metacat-connector-hive"
290290
],
291-
"locked": "0.13.1"
291+
"locked": "1.9.1"
292292
},
293293
"org.apache.tomcat:tomcat-jdbc": {
294294
"firstLevelTransitive": [
@@ -490,11 +490,11 @@
490490
],
491491
"locked": "1.2.1"
492492
},
493-
"org.apache.iceberg:iceberg-spark-runtime": {
493+
"org.apache.iceberg:iceberg-spark-runtime-3.5_2.13": {
494494
"firstLevelTransitive": [
495495
"com.netflix.metacat:metacat-connector-hive"
496496
],
497-
"locked": "0.13.1"
497+
"locked": "1.9.1"
498498
},
499499
"org.apache.tomcat:tomcat-jdbc": {
500500
"firstLevelTransitive": [
@@ -709,11 +709,11 @@
709709
],
710710
"locked": "1.2.1"
711711
},
712-
"org.apache.iceberg:iceberg-spark-runtime": {
712+
"org.apache.iceberg:iceberg-spark-runtime-3.5_2.13": {
713713
"firstLevelTransitive": [
714714
"com.netflix.metacat:metacat-connector-hive"
715715
],
716-
"locked": "0.13.1"
716+
"locked": "1.9.1"
717717
},
718718
"org.apache.tomcat:tomcat-jdbc": {
719719
"firstLevelTransitive": [
@@ -903,11 +903,11 @@
903903
],
904904
"locked": "1.2.1"
905905
},
906-
"org.apache.iceberg:iceberg-spark-runtime": {
906+
"org.apache.iceberg:iceberg-spark-runtime-3.5_2.13": {
907907
"firstLevelTransitive": [
908908
"com.netflix.metacat:metacat-connector-hive"
909909
],
910-
"locked": "0.13.1"
910+
"locked": "1.9.1"
911911
},
912912
"org.apache.tomcat:tomcat-jdbc": {
913913
"firstLevelTransitive": [
@@ -1109,11 +1109,11 @@
11091109
],
11101110
"locked": "1.2.1"
11111111
},
1112-
"org.apache.iceberg:iceberg-spark-runtime": {
1112+
"org.apache.iceberg:iceberg-spark-runtime-3.5_2.13": {
11131113
"firstLevelTransitive": [
11141114
"com.netflix.metacat:metacat-connector-hive"
11151115
],
1116-
"locked": "0.13.1"
1116+
"locked": "1.9.1"
11171117
},
11181118
"org.apache.tomcat:tomcat-jdbc": {
11191119
"firstLevelTransitive": [

0 commit comments

Comments
 (0)