I've opened a GitHub issue with the detailed design (packaging, listener, config, and task breakdown):
https://github.com/apache/incubator-xtable/issues/836 Happy to discuss the direction here and track the design details on the issue. Thanks, Vinish On Tue, Jun 30, 2026 06:37 PM, Vinish Reddy Pannala < [email protected]> wrote: > Hi all, > > I'd like to propose a new artifact, xtable-spark-runtime, to make XTable > dramatically easier to use inside existing Spark pipelines. > > Problem > ------- > XTable's modules are published to Maven, so today a user can pull in > xtable-core and assemble their own runtime, but everyone has to solve the > same shading/classpath problem themselves, or fall back to the > xtable-utilities bundle, which ships every dependency unshaded (~1GB) and > is impractical to add to a Spark job. Running it also means building the > fat jar and invoking a separate sync process with several config files. > There's no maintained, thin, drop-in artifact for the common case: "I > already write this table with Spark, keep it in sync in other formats." > > Proposal > -------- > A thin, relocated runtime jar that a user adds to an existing Spark job: > spark-submit --packages > org.apache.xtable:xtable-spark-runtime_2.12:<version>...and activates > purely through config, no code change: > > spark.sql.queryExecutionListeners = > org.apache.xtable.spark.XTableSyncListener > spark.xtable.tables = /warehouse/db/orders > spark.xtable.orders.sourceFormat = HUDI > spark.xtable.orders.targets = ICEBERG,DELTA > > After each successful write to the source table, XTable incrementally > translates its metadata to the target formats on the driver, so the table > becomes readable by other engines with no extra job or orchestration. > > This follows the bundle model Hudi and Iceberg already use: engine deps > marked provided, a curated dependency allowlist, and relocations so the jar > coexists with the cluster's own guava/jackson/avro. The result should be a > bundle in the tens of MB, not ~1GB. > > Why it helps the community > -------------------------- > - Lowest-friction on-ramp: add one dependency + a few configs to a > pipeline you already run, instead of hand-rolling a shaded runtime. > - One maintained, tested runtime instead of everyone reinventing shading. > - No standalone job to schedule or babysit. > > A couple of things worth settling here: > 1. Config-declared tables (explicit) vs. auto-detecting the written table > from the query plan (more magic, less predictable). > 2. Async vs Blocking sync for batch jobs? (a batch driver can exit before > an async sync finishes). > 3. Whether to also ship an Iceberg-style CALL xtable.sync(...) procedure > in the same jar for on-demand/backfill use. > > I'll open a GitHub issue with the detailed design. Feedback welcome on the > overall direction and the three questions above. > > Thanks, > Vinish >
