hello, I am trying to sync in CDC a collection in Mongo and I have selected the option to full sync and then CDC UPSERT. But what I find a bit strange is that i have multiple records in iceberg with the same identifier.
SELECT _id, count(**)
FROM "my_lab_table"
GROUP BY _id
HAVING count(**) >= 2
also the delete was not performed correctly (in the source the _id was deleted from the collection), while in Iceberg i have 2 entries (one with the real data and another one with all fields to null which corresponds to when the data was deleted). the _id is the primary key in mongo
Hi @Daniel, to help us debug this, could you please share:
Hi @Daniel, we have released olake version 0.7.3 in which this issue has been fixed. You will have to create a new job to check this.
Please try this version and let us know if you encounter any further issues.
found the description here: https://github.com/datazip-inc/olake/pull/951
how can i download my streams.json and recreate a new job? I will have to delete all tables from the lakehouse and full-resync+cdc everything.
@Daniel, the problem was related to primary key discovery in MongoDB. Earlier, the logic detected all indexed fields and treated them as primary keys.
olakeid is generated by concatenating and hashing all the primary keys in a stream. If any field changes, the olakeidchanges, which is why deduplication didnβt work.
You can also check the PR: https://github.com/datazip-inc/olake/pull/951
but indexed fields are not primary keys π so you didn't include the _id if i understand properly?
yeah indexed fields are not primary keys so we have pinned _id as the only primary key as its a mandatory field in every mongo collection (starting from mongo version 3.2+)
also how is a delete treated now? does it delete correctly from iceberg (keeping it in time travel) or will i have a row with every value at null that i will need to filter out?
but i don't want to filter out, i want it to be deleted in iceberg as well
if you have a record A in mongo, which is deleted, the streams from Mongo captures the deletion. Therefore i expect olake to delete the record from iceberg table as well.
@Daniel the record will also be deleted from main table, but as it is soft delete so a row also appears with op type d.
the olakeid seems to be well generated but the delete was not performed properly
hi @Daniel,
Have you created a new job with the new version? Also, could you please share the stream configuration and confirm whether you are running in upsert mode or append-only mode?
Please also share a screenshot of the stream configuration from the Edit Stream page.
is there an api endpoint to get the stream configuration @VIKASH CHOUDHARY? because through the interface it takes more than 5min to pen
@Daniel For the API endpoint, you can copy the cURL directly from the browserβs Network tab for the stream API request.
hey @Daniel,
Currently, your equality delete files are going into the null partition. Because of that, the deletes are not being applied correctly to your data, since the records being queried belong to a different partition.
This is happening because, in delete operations, the MongoDB oplog only contains the _id field and does not include the other column values. As a result, Olake is unable to determine the correct partition for the deleted record and creates the equality delete file in the null partition.
To fix this, we will be releasing a new patch soon that adds support for capturing the before image of delete operations from MongoDB oplogs. For this to work, you will need to enable the following setting for each collection:
changeStreamPreAndPostImages: { enabled: true }
Once this is enabled, Olake will be able to read all column values from the delete event and create the equality delete file in the correct partition.
so it is an option to enable with DBAs i guess. but let me ask a question so i am sure i understand, what happens if the partition change? if you have an update of this same record where the partition is year of field sampledate. let's say i have a first record with a sampledate=2025 and then an update to fix data that says the sample_date=2024 (it will write in another patition, will this be considered an update with only one record, or since there are 2 different partitions there will be 2 records in the lakehouse?)
@Daniel
there will be 2 records in the lakehouseyes, it will have 2 copies when you query. Ideally you should choose non-changing partition columns
is this a limitation of olake or iceberg? it seems a bit strange to me. because usually the sample_date does not change but it could be an error that needs to be updated and i don't see any field where it could not be an error. we are never safe of that. it s bad if we have duplicated records like that. so what could be the solution?
@Daniel yes its an Iceberg limitation.
But there is a way to handle it. If the previous row is deleted you can identify that from deleted flag that OLake creates (as one of the columns).
So while querying we can always filter out deleted rows.
Hey @Daniel, we have released Olake v0.7.4 with support for capturing deletes from Mongo CDC using pre-images.
Please enable: changeStreamPreAndPostImages: { enabled: true } for each collection.
Once enabled, equality deletes will be written to the correct partition and applied correctly.
Hi team, any possibility that olake may create corrupt parquet files in any situation?
source postgres , olake version v0.3.13
dest is aws s3,
reason why i ask is my donwstream jobs on databricks failed with a couple of errors which happen when corrupted files appear at src
i also had claude check the file in question and it gave a similar answer, attaching in thread
The file is corrupt. Here's the breakdown:
- Magic bytes (PAR1) are present at both start and end β so the file wasn't truncated mid-upload.
- Footer size is 106.8 MB on a 370 MB file β that's ~29% of the file just for metadata, which is wildly abnormal. A healthy parquet
footer is usually a few KB to a few MB at most.
- PyArrow's Thrift deserializer hits its size limit trying to parse that footer, hence Exceeded size limit.
What likely happened: the writer (RudderStack data plane or whatever produced this file) wrote an enormous number of tiny row
groups, bloating the footer metadata. Or the footer size field itself got bit-flipped/corrupted during write/flush.
What you can try:
not urgent as i could probably run a full load, but lmk in either case
@Anirudh Anirudh Can you share the corrupted parquet over the private chat, we will try to check and debug the issue and let you know soon.
@Anirudh Anirudh We investigated the file. It does not appear to be corrupt as the PAR1 magic bytes are valid and the row group data is intact.
The failure is caused by oversized Parquet footer metadata. Parquet stores column statistics (min/max values) in the footer, and in this file media_url column contains a ~106 MB base64-encoded MP4 value. That value ended up in the column statistics, inflating the footer to ~106 MB and triggering the reader's 100 MB Thrift deserialization limit.
Weβre looking into limiting/truncating metadata generation for such columns to avoid oversized footers.
You can raise an issue for this here: https://github.com/datazip-inc/olake/issues. Also, please let us know if this is urgent on your side
or as a workaround you can try increasing thrift deserialization limit of your downstream jobs greater than your metadata size.
Hi @Vaibhav Verma thanks for catching it, this is definitely a mistake on our end, of pushing the whole mp4 to a db row should not be intended, as for the urgency, i dont think this is very urgent as imo it shouldnt have happened in the first place, anyways, thanks again, good day
I have a kafka job which is running for 4 days... but it does nothing. see the last logs are from 4 days ago and no errors:
14/05/2026
08:40:15
info
Thread[topics.cmd.patient.patient_01KRJT947QVKG0GDNWRZ44XAXD:50053] 08:40:15.057 [grpc-default-executor-0] INFO io.debezium.server.iceberg.tableoperator.IcebergTableOperator - Successfully committed 1 data files and 0 delete files for thread: topics.cmd.patient.patient_01KRJT947QVKG0GDNWRZ44XAXD
14/05/2026
08:40:15
info
Thread[topics.cmd.patient.patient_01KRJT947QVKG0GDNWRZ44XAXD:50053] 08:40:15.058 [grpc-default-executor-0] INFO io.debezium.server.iceberg.rpc.OlakeRowsIngester - [Thread-26-21708437671527] Total time taken: 1278 ms
14/05/2026
08:40:15
info
Thread[topics.cmd.patient.patient_01KRJT947QVKG0GDNWRZ44XAXD]: shutting down Iceberg server on port 50053
14/05/2026
08:40:15
info
committed 1 partitions for reader group_01KRJT947PRYNFAGM6D1QXG31M
14/05/2026
08:40:15
info
updated global state with consumer_group_id: olake-consumer-group-1776698913 for 1 streams
Hi @Daniel, can you share the full logs of Kafka sync that is running, worker logs and kafka version? Also can you share all the pods which are running (if you are running via Kubernetes) or else provide all the docker containers running (if you are running via Docker). Also if possible do you know if consumer rebalance has taken place during sync, or the messages of a partition to be synced were expired mid sync? (as per kafka's retention policy)
Hi, i got this error when create job. how can i fix it. Im moving data from postgres rds to s3 parquet
Can you please share a screenshot of the API error response?
You can get this from the browserβs Network tab:
The error is coming from nginx reverse proxy. Please increase the clientmaxbody_size in your nginx config to 64mb. If it still fails with same error try to increase the value to match the size of your streams. If the issue still persists please let us know.
after i set it to 100mb, it worked. but i got another issue, i setup the job config through UI
hi team, i got this error, im hosting using helm. source is postgresql, output is s3 parquet. I setup job config and destination, sources though UI. How can i fix this? thank u so much
@Anh Nguyen Thach could you please download the logs and share it here. You could use the download button at the right bottom in the job logs page. Thanks
@Anh Nguyen Thach Could you please share the source config from the payload hiding all the sensitive info.
You can get it from the network tab:
{
"success": true,
"message": "source '1' retrieved successfully",
"data": {
"id": 1,
"name": "db",
"type": "postgres",
"version": "v0.7.3",
"config": "{\"database\":\"db\",\"host\":\"local.com\",\"max_threads\":3,\"password\":\"SADASDASD\",\"port\":5432,\"retry_count\":3,\"schemas\":[],\"ssh_config\":{\"type\":\"no_tunnel\"},\"ssl\":{\"mode\":\"disable\"},\"update_method\":{\"initial_wait_time\":120,\"publication\":\"olake_uat_publication\",\"replication_slot\":\"olake_uat_s3_slot\",\"type\":\"CDC\"},\"username\":\"db\"}",
"created_at": "2026-05-18T12:52:27Z",
"updated_at": "2026-05-18T12:52:27Z",
"created_by": "admin",
"updated_by": "admin",
"jobs": [
{
"name": "tst",
"id": 5,
"activate": true,
"destination_name": "sv-uat-shared-data-lake",
"destination_type": "parquet",
"last_run_time": "2026-05-19T06:32:00Z",
"last_run_state": "Running"
}
]
}
}
@Anh Nguyen Thach are you sure this is the source associated with the Job in the screenshot provided.
I can see the Job Name in the image is "avepoint_sync" and it's id is 2 but I couldn't find the same in the Associated Jobs in the provided payload. Could you please confirm this.
"jobs": [
{
"name": "tst",
"id": 5,
"activate": true,
"destination_name": "sv-uat-shared-data-lake",
"destination_type": "parquet",
"last_run_time": "2026-05-19T06:32:00Z",
"last_run_state": "Running"
}
]
Are there any ways to fix this? or i must using olake CLI? @Vishal M
@Anh Nguyen Thach We are looking into, will get back shortly.
@Anh Nguyen Thach can we get on a quick call to debug this issue? Let us know a good time anytime today
Please join here:
https://meet.google.com/fwo-fugn-cyc
looking at the logs of UI:
4)does it need to be able to connect to internet to download any proper docker images?
2026-05-21T15:34:17Z WRN failed to fetch image tags online for %s: %s. Cached fallback unavailable on Kubernetes (no Docker daemon)%!(EXTRA string=olakego/source-oracle, **errors.errorString=docker hub api request failed with status code: 504)
[GIN] 2026/05/21 - 15:34:25 | 200 | 2.61ms | 127.0.0.1 | GET "/api/v1/project/123/destinations"
2026-05-21T15:34:47Z WRN failed to fetch image tags online for %s: %s. Cached fallback unavailable on Kubernetes (no Docker daemon)%!(EXTRA string=olakego/source-mongodb, **errors.errorString=docker hub api request failed with status code: 504)
2026-05-21T15:35:17Z WRN failed to fetch image tags online for %s: %s. Cached fallback unavailable on Kubernetes (no Docker daemon)%!(EXTRA string=olakego/source-kafka, **errors.errorString=docker hub api request failed with status code: 504)
2026-05-21T15:35:47Z WRN failed to fetch image tags online for %s: %s. Cached fallback unavailable on Kubernetes (no Docker daemon)%!(EXTRA string=olakego/source-s3, **errors.errorString=docker hub api request failed with status code: 504)
2026-05-21T15:36:18Z WRN failed to fetch image tags online for %s: %s. Cached fallback unavailable on Kubernetes (no Docker daemon)%!(EXTRA string=olakego/source-db2, **errors.errorString=docker hub api request failed with status code: 504)
2026-05-21T15:36:48Z WRN failed to fetch image tags online for %s: %s. Cached fallback unavailable on Kubernetes (no Docker daemon)%!(EXTRA string=olakego/source-mssql, **errors.errorString=docker hub api request failed with status code: 504)
2026-05-21T15:36:48Z ERR error in request /api/v1/project/123/destinations/versions: failed to get driver image tags: no tags found for image:
[GIN] 2026/05/21 - 15:36:48 | 500 | 4m0s | 127.0.0.1 | GET "/api/v1/project/123/destinations/versions?type=iceberg"
[GIN] 2026/05/21 - 15:37:11 | 200 | 2.43ms | 127.0.0.1 | GET "/api/v1/project/123/destinations"
2026-05-21T15:37:19Z WRN failed to fetch image tags online for %s: %s. Cached fallback unavailable on Kubernetes (no Docker daemon)%!(EXTRA string=olakego/source-mysql, **errors.errorString=docker hub api request failed with status code: 504)
/api/v1/project/123/destinations/ where this rest call come from? I mean with project 123?
@Antonio Yes, OLake requires access to Docker images to fetch and run the connector images.
You currently have 2 options:
yep got it - open a issue regarding something - because clicking create a catalog it took 15 seconds to actually show up the dialog/prompt for doing it, and checking was due the connection against docker https://github.com/datazip-inc/olake-ui/issues/380
Regarding the issue above I can try to tackle some of those issue in a PR
Yes you can definitely do that. Once verified that its a valid issue.
@Antonio we have replied to the issue raised on GitHub, and asked a couple of questions could you please check: https://github.com/datazip-inc/olake-ui/issues/380#issuecomment-4533155841
@Antonio We have released the fix for issue https://github.com/datazip-inc/olake-ui/issues/380#issuecomment-4533155841 Please upgrade olake-ui and olake-fusion to latest version to verify the fix.
I opened a new issue https://github.com/datazip-inc/olake-ui/issues/381
is it ok for you if I work on these a little?
@Antonio We will check once if this issue is a genuine problem. Once verified, we will update you the same and you can start working on it. Until then please give us some time to check on the issue.
I am trying to do some maintanance - Configuring now some tables maintance for Fusion, but
2026/05/26 10:20:37 new sql script submit, current thread pool state. [Active: 1, PoolSize: 1]
2026/05/26 10:20:37 terminal session dose not exists. create session first
2026/05/26 10:20:40 create a new terminal session.
2026/05/26 10:20:40 fetch terminal session: b1d7d737-db02-4659-b3c5-616c34b07be5-null-null-airflow
Yes sure π
Meanwhile, jumping on a different namespace in same catalog
2026-05-26T10:22:29Z ERR error in request /api/opt/v1/airflow/talkdesk/tables: failed to fetch latest Lite process info: failed to get latest MINOR optimizing process for airflow.talkdesk.user_status: failed to get latest MINOR process for airflow.talkdesk.user_status: failed to send request: Get "http://olake-fusion-rest.olake.svc.cluster.local:1630/api/ams/v1/tables/catalogs/airflow/dbs/talkdesk/tables/user_status/optimizing-processes?apiKey=obfuscated: context canceled
Trying to understand where this issue come from - I need to probably see the logs of Polaris as well since could be something there
Regarding the first error above, this is the full error
2026/05/26 10:24:39 new sql script submit, current thread pool state. [Active: 0, PoolSize: 1]
2026/05/26 10:24:39 terminal session dose not exists. create session first
2026/05/26 10:24:39 create a new terminal session.
2026/05/26 10:24:39 fetch terminal session: 1ccf00f5-95e1-429d-9d10-a80be7dc1cb0-null-null-airflow
setup session, session factory: org.apache.amoro.server.terminal.local.LocalSessionFactory
spark.sql.catalog.airflow.catalog-impl org.apache.iceberg.rest.RESTCatalog
spark.sql.catalog.airflow.table.self-optimizing.quota 0.1
spark.sql.catalog.airflow.client.region eu-west-1
spark.sql.catalog.airflow.warehouse airflow
spark.sql.catalog.airflow.uri
spark.sql.catalog.airflow.table.self-optimizing.enabled false
spark.sql.catalog.airflow.cache-enabled false
spark.sql.catalog.airflow.rest.auth.type oauth2
spark.sql.catalog.airflow.table.self-optimizing.group spark-container
spark.sql.catalog.airflow.credentialspark.sql.catalog.airflow.table-formats ICEBERG
spark.sql.catalog.airflow.scope PRINCIPAL_ROLE:ALL
spark.sql.catalog.airflow.created-at 22 May 2026
spark.sql.catalog.airflow org.apache.iceberg.spark.SparkCatalog
spark.sql.mixed-format.refresh-catalog-before-usage true
2026/05/26 10:24:39 session configuration: catalog.airflow.table.self-optimizing.group => spark-container
2026/05/26 10:24:39 session configuration: spark.sql.catalog.airflow.created-at => 22 May 2026
2026/05/26 10:24:39 session configuration: spark.sql.mixed-format.refresh-catalog-before-usage => true
2026/05/26 10:24:39 session configuration: catalog.airflow.uri => https://VW79156.eu-west-1.snowflakecomputing.com/polaris/api/catalog
2026/05/26 10:24:39 session configuration: spark.sql.catalog.airflow.credential => MkvFvBEktCM7s50ZntdvKRxnCS0=:5iJ9qx58XxV7K97OkxdGPah3RRgSm9LY8IY6Zt0gmPY=
2026/05/26 10:24:39 session configuration: session.catalogs => airflow
2026/05/26 10:24:39 session configuration: spark.sql.catalog.airflow.uri => https:///polaris/api/catalog
2026/05/26 10:24:39 session configuration: session.fetch-size => 1000
2026/05/26 10:24:39 session configuration: spark.sql.catalog.airflow.table.self-optimizing.group => spark-container
2026/05/26 10:24:39 session configuration: spark.sql.catalog.airflow.warehouse => airflow
2026/05/26 10:24:39 session configuration: catalog.airflow.warehouse => airflow
2026/05/26 10:24:39 session configuration: spark.sql.catalog.airflow.table.self-optimizing.quota => 0.1
2026/05/26 10:24:39 session configuration: catalog.airflow.cache-enabled => false
2026/05/26 10:24:39 session configuration: catalog-url-base => thrift://127.0.0.1:1260
2026/05/26 10:24:39 session configuration: catalog.airflow.table.self-optimizing.enabled => false
2026/05/26 10:24:39 session configuration: spark.sql.catalog.airflow.catalog-impl => org.apache.iceberg.rest.RESTCatalog
2026/05/26 10:24:39 session configuration: spark.sql.catalog.airflow.client.region => eu-west-1
2026/05/26 10:24:39 session configuration: catalog.airflow.client.region => eu-west-1
2026/05/26 10:24:39 session configuration: session.catalog.airflow.connector => iceberg
2026/05/26 10:24:39 session configuration: spark.sql.catalog.airflow.table-formats => ICEBERG
2026/05/26 10:24:39 session configuration: catalog.airflow.table-formats => ICEBERG
2026/05/26 10:24:39 session configuration: catalog.airflow.table.self-optimizing.quota => 0.1
2026/05/26 10:24:39 session configuration: catalog.airflow.scope => PRINCIPAL_ROLE:ALL
2026/05/26 10:24:39 session configuration: terminal.sensitive-conf-keys =>
2026/05/26 10:24:39 session configuration: catalog.airflow.created-at => 22 May 2026
2026/05/26 10:24:39 session configuration: catalog.airflow.credential =>
2026/05/26 10:24:39 session configuration: catalog.airflow.rest.auth.type => oauth2
2026/05/26 10:24:39 session configuration: spark.sql.catalog.airflow.table.self-optimizing.enabled => false
2026/05/26 10:24:39 session configuration: spark.sql.catalog.airflow.scope => PRINCIPAL_ROLE:ALL
2026/05/26 10:24:39 session configuration: catalog.airflow.catalog-impl => org.apache.iceberg.rest.RESTCatalog
2026/05/26 10:24:39 session configuration: spark.sql.catalog.airflow => org.apache.iceberg.spark.SparkCatalog
2026/05/26 10:24:39 session configuration: spark.sql.catalog.airflow.cache-enabled => false
2026/05/26 10:24:39 session configuration: spark.sql.catalog.airflow.rest.auth.type => oauth2
2026/05/26 10:24:39
2026/05/26 10:24:39 prepare execute statement, line:1
2026/05/26 10:24:39 ALTER TABLE test_olake.test_olake SET TBLPROPERTIES ('self-optimizing.minor.trigger.cron' = '0 ** ** ** **', 'self-optimizing.major.trigger.cron' = '0 **/8 ** ** **', 'self-optimizing.full.trigger.cron' = '', 'self-optimizing.target-size' = '536870912')
Sorry After few retries it indeed was able to apply the changes to Amoro π
@Ankit Sharma if I need to check the logs for Fusion to run the scheduled maintance, which pods should I look at? of which service?
oh ok yes in the amoro-optimizer saw it
Hi, Iβm running OLAKE on Kubernetes using Helm.
Setup:
- Source: PostgreSQL
- Destination: S3 / Iceberg
- Pod memory: increased from 16GB to 32GB
- Sync mode: full load / CDC
At first I thought the job failed because of OOM or resource limits, so I increased memory from 16GB to
32GB. But the same error still happens, so it does not look like a memory/resource issue. Why does context canceled make the sync job fail?
@Anh Nguyen Thach can you share sync logs as well, from download logs button from ui
hey @Anh Nguyen Thach, Please let us know if youβre available for a call to debug this issue further, either now or at a time that works for you today.
@Anh Nguyen Thach meanwhile, could you please re-run the sync and share the pod logs so we can debug the crash further?
Once the sync pod starts, run:
kubectl logs -fLet it run until it fails, then share the sync.log file with us. This will help us capture the exact crash details.-n 2>&1 | tee sync.log
u mean this log? i can't find any error logs, but the pod is still crashing
@Anh Nguyen Thach please share from download logs button from ui
@Anh Nguyen Thach There are 572 selected streams, and 32 GB RAM is likely too low for a sync of this size. Let's try running it with 128 or 256 GB RAM and see if the issue persists.
What if I create an AWS Glue job for the full load and then trigger an OLake job mode CDC? Will it delete all the data I just loaded @VIKASH CHOUDHARY
@Anh Nguyen Thach What is the max_threads value configured in the source settings? You can check it by clicking Edit Source and reviewing the configuration.
@Anh Nguyen Thach You can either reduce the max_threads setting or increase the machine's RAM. Running 50 threads on 32 GB of RAM may not be sufficient for that workload.
Hello team, probably someone faced with situation when table loaded via OLake and integrated with Snowflake via Glue integration.
So in UPSERT mode it breaks this integration and I cant use OLake in UPSERT mode.
Hi @Ruslan Zhdan, could you please share the error you are receiving in Snowflake while syncing data using the "Full Refresh" mode in OLake?
Sorry for the delay. I've checked and looks like everything ok regarding to the last case with full refresh.
As far as I can tell it keeps the same table UUID. Correct?
Probably you know during the performing full refresh table will be temporary unavailable?
Hey @Ruslan Zhdan,
In case if i have small table which Im going to ingest. Table without any anchor colum with timestamp and records can be updated. Im going to use Full Replace each time and I have some doubts about data consistency and table can be unavailable because Olake perform "Clear destination" first. Is it correct?
And during the write phase. It works with Iceberg branches? Like first of all new snapshot on stage branch and after that merge main?
I've wanted to make sure with full replace table will exists and data will be consistent during writing new snapshot.
I get it, @Ruslan Zhdan
1. Yes. Every time you do a full refresh for the same job, clear destination first drops the iceberg table from the catalog, leading to table unavailability for a short period of time.
Another approach, would be to use append-only mode job for your iceberg table. But, this would create duplicate rows of data for your cdc changes. For now, from the query engine side you can write the logic to dedup the rows.
2. No, towards the write phase, we don't use Iceberg branches right now, we directly create the new snapshot on the main branch.
Internally, we are working on a solution which would make Snowflake, as a query engine, compatible with OLake's Upsert job mode.
@Anh Nguyen Thach We're looking into this internally and will get back to you shortly.
@Anh Nguyen Thach Can u also share datatypes of the null column ?
SELECT
COUNT(**) AS total_rows,
COUNT(**) FILTER (WHERE pg_column_size(invoice_details) > 2048) AS rows_over_2kb,
MAX(pg_column_size(invoice_details)) AS max_size_bytes,
ROUND(MAX(pg_column_size(invoice_details)) / 1024.0, 2) AS max_size_kb,
ROUND(AVG(pg_column_size(invoice_details)), 2) AS avg_size_bytes
FROM invoices;
almost all data in this column is between 3 kb and 15 kb
Hey @Anh Nguyen Thach,
For now, you can use append-only mode as a workaround and write your own deduplication logic on the query side by retaining the required columns.
We'll be picking up support for this soon. In the meantime, you can create a GitHub issue here:
https://github.com/datazip-inc/olake/issues
it turned on REPLICA IDENTITY FULL on this table invoices but it still null for that colmn π₯²
@Anh Nguyen Thach, yes, this is expected. If you're okay with enabling REPLICA IDENTITY FULL and the additional WAL overhead it introduces, we can provide a quick fix for this.
@Anh Nguyen Thach We're planning to release a fix for this within the next 2 days.
Hey @Anh Nguyen Thach, the fix has been released in v0.7.6. This patch specifically fixes the issue for REPLICA IDENTITY FULL tables.
Please test it when you get a chance and let us know if everything looks good. For previously lost data, you can run Clear Destination and resync.
So I must turn on REPLICA IDENTITY FULL, right? Is there any way to handle this issue without setting it to full in the future?
@Anh Nguyen Thach, yes, for now you'll need to enable REPLICA IDENTITY FULL to handle this case correctly. It's on our roadmap and we do plan to address it, but it's not something we're targeting in the near future. By the way, is the issue resolved on your end after enabling this mode?
@Anh Nguyen Thach,yes it is available now you can go to edit source and upgrade source version.
@Anh Nguyen Thach Can u upgrade version in source not in destination.
Hi
Can someone please help me with the difference between Full Refresh + Incremental and Full Refresh + CDC sync modes ? Please point me to the documentation
Hi! You can find the explanation of sync modes in the documentation here: https://olake.io/docs/understanding/terminologies/olake/#2-sync-modes
Hi Team,
I understand that Olake Fusion helps with Iceberg table compaction. I wanted to check if there is any dashboard or monitoring interface available, similar to Amoro, that provides visibility into Iceberg table maintenance and metadata.
Specifically, is there a way to view:
@Avinash Kumar 2 At the moment, OLake Fusion provides visibility into compaction runs, logs, and a set of table and run level metrics through the UI. The following documentation covers the currently available monitoring capabilities:
@Avinash Kumar 2 You can follow the OLake Fusion setup guide here:
https://olake.io/docs/fusion/getting-started/configure-first-compaction/
The guide covers the prerequisites required to get started with Fusion, whether you're a first-time user or upgrading an existing OLake deployment. It also walks through setting up your first compaction pipeline.
Please let us know if you need any assistance with the setup.
@Avinash Kumar 2 If you are using helm and you are a new user please checkout quick start with helm
Hi team, I did helm repo update and then I am trying helm upgrade --install olake but I am getting following error:
Error: UPGRADE FAILED: template: olake/templates/olake-ui/deployment.yamlπ―17: executing "olake/templates/olake-ui/deployment.yaml" atThis is happening due to following line: github.com/datazip-inc/olake-helm/blob/β¦/deployment.yaml#β¦: error calling index: reflect: slice index out of range
Hi @Shiv Kumar, we have fixed this issue in helm chart version 0.0.22. Instead of upgrading to version 0.0.21, you can directly upgrade to 0.0.22 and that will fix it.
Ohh my bad, it's working with latest version, thank you.
Hi team β hitting a wall adding a catalog in the OLake maintenance module (Amoro/Fusion) and wanted to check whether GCS-backed Lakekeeper is supported.
Setup: REST catalog β Lakekeeper on GKE, Iceberg warehouse on GCS (gs://). I'm connecting via the GCS S3-interop endpoint (storage.googleapis.com) with HMAC keys, SigV4 disabled.
Progress so far: Auth is fine now β the connection test gets past Lakekeeper, fetches the warehouse location, and tries to write the test record. It fails at the write step with:
UnsupportedFileSystemException: No FileSystem for scheme "gs"
Hey @Avinash Kumar 2,
For a GCS-backed Lakekeeper using HMAC keys, you can create the warehouse in Lakekeeper with the Flavor set to s3-compat, and then try connecting it through Fusion.
If you still run into any issues, please share your Lakekeeper warehouse configuration and your Fusion Catalog configuration. We'll be more than happy to take a look and help you resolve this.
Do let us know how it goes.
Hey @Badal, What is the recommended or optimal frequency for running CDC jobs in production? For example, is running them every minute generally recommended, or is a 5β15 minute interval a better balance between data freshness and system overhead?
Hey @Avinash Kumar 2,
There is no fix frequency to set for CDC. It primarily depends on the following factors:
@Badal I am unable to select Full Refresh + CDC option. Can you help?
Hey @Avinash Kumar 2, please make sure you have selected Update Method to CDC, while creating the source.
@Badal I have have selected Update Method to CDC, while creating the source. Please check
Hey @Avinash Kumar 2, can you please go through our doc for Setting up MySQL as a Source, and make sure you have all the CDC Prerequisite enabled.
This will help us verify that everything is configured correctly before we proceed.
@Badal
All the required CDC prerequisites appear to be enabled, except binlogrowmetadata, which is set to MINIMAL instead of FULL.
We've previously used CDC with Debezium using the same MySQL configuration, and it worked without any issues.
The current configuration is:
SHOW VARIABLES WHERE Variable_name IN (Does OLake CDC specifically require binlogrowmetadata=FULL, or should MINIMAL also work? Could this be the reason for the issue we're seeing?
'log_bin',
'binlog_format',
'binlog_row_image',
'binlog_row_metadata',
'gtid_mode'
);
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| binlog_format | ROW |
| binlog_row_image | FULL |
| binlog_row_metadata | MINIMAL |
| gtid_mode | ON |
| log_bin | ON |
+----------------------+---------+
hey @Avinash Kumar 2 ,
OLake CDC requires binlogrowmetadata = FULL . OLake relies on binary log events being self-describing to column metadata directly from row events, which requires binlogrowmetadata = FULL.
for more info:
dev.mysql.com/doc/refman/β¦/replication-options-binary-log.html#β¦
Hi
I'm working on backfilling historical data into Iceberg tables and need to replicate the olakeid generation logic for composite primary keys.
Context:
date: 2026-06-24 00:00:00.000 +0530
id: 019efc0f-2a40-78ff-aee0-c8fdeb922bdc
_olake_id: b26e33d8f97c7cb274345b3b1596e6c3
hey @Jeevansh Gagroo
OLake Go uses the standard MD5 algorithm.
- In the codebase, this is computed via md5.Sum([]byte(concatenatedString)).
for more info:
github.com/datazip-inc/olake/blob/β¦/utils.go#β¦
great. thanks.
can you please link this to the documentation here as well for ease of access ?
Hi Team,
I'm facing an issue with Fusion compaction on an append-only Iceberg table that is continuously ingesting data from Kafka.
Initially, the Fusion Run History showed entries whenever Lite Compaction was triggered. However, it has now stopped showing any new runs.
Earlier, the Fusion pod was failing with a CreateContainerConfigError. We increased the pod resources, and that error is no longer occurring. However, even after resolving that issue:
Hey @Avinash Kumar 2, are you using Helm for OLake-Fusion deployment?
In case yes, can you please share a screenshot of the pods running in your Olake namespace? (I just want to confirm whether a pod with optimizer in its name is running.)
Hi @Badal,
Yes optimizer pod is running
2026-06-30 09:47:24.968Z WARN [main[] [ThriftClientPool] [P:|T:] - Transport open failed, service address: olake-fusion-fusion-optimizing.olake-fusion.svc.cluster.local:1261
2026-06-30 09:47:24.968Z WARN [main[] [ThriftClientPool] [P:|T:] - Transport open failed, service address: olake-fusion-fusion-optimizing.olake-fusion.svc.cluster.local:1261
2026-06-30 09:47:24.968Z INFO [main[] [ThriftClientPool] [P:|T:] - Reconnecting service address: olake-fusion-fusion-optimizing.olake-fusion.svc.cluster.local:1261
2026-06-30 09:47:24.968Z INFO [main[] [ThriftClientPool] [P:|T:] - Reconnecting service address: olake-fusion-fusion-optimizing.olake-fusion.svc.cluster.local:1261
2026-06-30 09:47:25.992Z WARN [main[] [ThriftClientPool] [P:|T:] - Reconnected service address: olake-fusion-fusion-optimizing.olake-fusion.svc.cluster.local:1261 failed
org.apache.amoro.shade.thrift.org.apache.thrift.transport.TTransportException: java.net.ConnectException: Connection refused
at org.apache.amoro.shade.thrift.org.apache.thrift.transport.TSocket.open(TSocket.java:231) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.shade.thrift.org.apache.thrift.transport.layered.TFramedTransport.open(TFramedTransport.java:82) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.client.ThriftClientPool$1.create(ThriftClientPool.java:100) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.client.ThriftClientPool$1.create(ThriftClientPool.java:72) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:71) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:566) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:306) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:233) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.client.ThriftClientPool.iface(ThriftClientPool.java:189) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.client.OptimizingClientPools.getClient(OptimizingClientPools.java:38) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.optimizer.common.AbstractOptimizerOperator.callAms(AbstractOptimizerOperator.java:53) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.optimizer.common.OptimizerToucher.checkToken(OptimizerToucher.java:74) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.optimizer.common.OptimizerToucher.start(OptimizerToucher.java:59) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.optimizer.common.Optimizer.startOptimizing(Optimizer.java:65) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.optimizer.spark.SparkOptimizer.main(SparkOptimizer.java:69) ~[optimizer-job.jar:0.9-SNAPSHOT]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:569) ~[?:?]
at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52) ~[spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:1034) ~[spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkSubmit.$anonfun$submit$2(SparkSubmit.scala:174) ~[spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkHadoopUtil$$anon$1.run(SparkHadoopUtil.scala:62) ~[spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkHadoopUtil$$anon$1.run(SparkHadoopUtil.scala:61) ~[spark-core_2.12-3.5.8.jar:3.5.8]
at java.security.AccessController.doPrivileged(AccessController.java:712) [?:?]
at javax.security.auth.Subject.doAs(Subject.java:439) [?:?]
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1878) [hadoop-client-api-3.3.4.jar:?]
at org.apache.spark.deploy.SparkHadoopUtil.runAsSparkUser(SparkHadoopUtil.scala:61) [spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:174) [spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:222) [spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:91) [spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:1125) [spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:1134) [spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) [spark-core_2.12-3.5.8.jar:3.5.8]
Caused by: java.net.ConnectException: Connection refused
at sun.nio.ch.Net.connect0(Native Method) ~[?:?]
at sun.nio.ch.Net.connect(Net.java:579) ~[?:?]
at sun.nio.ch.Net.connect(Net.java:568) ~[?:?]
at sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:593) ~[?:?]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[?:?]
at java.net.Socket.connect(Socket.java:633) ~[?:?]
at org.apache.amoro.shade.thrift.org.apache.thrift.transport.TSocket.open(TSocket.java:226) ~[optimizer-job.jar:0.9-SNAPSHOT]
... 33 more
2026-06-30 09:47:25.992Z WARN [main[] [ThriftClientPool] [P:|T:] - Reconnected service address: olake-fusion-fusion-optimizing.olake-fusion.svc.cluster.local:1261 failed
org.apache.amoro.shade.thrift.org.apache.thrift.transport.TTransportException: java.net.ConnectException: Connection refused
at org.apache.amoro.shade.thrift.org.apache.thrift.transport.TSocket.open(TSocket.java:231) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.shade.thrift.org.apache.thrift.transport.layered.TFramedTransport.open(TFramedTransport.java:82) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.client.ThriftClientPool$1.create(ThriftClientPool.java:100) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.client.ThriftClientPool$1.create(ThriftClientPool.java:72) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:71) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:566) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:306) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:233) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.client.ThriftClientPool.iface(ThriftClientPool.java:189) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.client.OptimizingClientPools.getClient(OptimizingClientPools.java:38) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.optimizer.common.AbstractOptimizerOperator.callAms(AbstractOptimizerOperator.java:53) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.optimizer.common.OptimizerToucher.checkToken(OptimizerToucher.java:74) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.optimizer.common.OptimizerToucher.start(OptimizerToucher.java:59) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.optimizer.common.Optimizer.startOptimizing(Optimizer.java:65) ~[optimizer-job.jar:0.9-SNAPSHOT]
at org.apache.amoro.optimizer.spark.SparkOptimizer.main(SparkOptimizer.java:69) ~[optimizer-job.jar:0.9-SNAPSHOT]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:569) ~[?:?]
at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52) ~[spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:1034) ~[spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkSubmit.$anonfun$submit$2(SparkSubmit.scala:174) ~[spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkHadoopUtil$$anon$1.run(SparkHadoopUtil.scala:62) ~[spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkHadoopUtil$$anon$1.run(SparkHadoopUtil.scala:61) ~[spark-core_2.12-3.5.8.jar:3.5.8]
at java.security.AccessController.doPrivileged(AccessController.java:712) [?:?]
at javax.security.auth.Subject.doAs(Subject.java:439) [?:?]
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1878) [hadoop-client-api-3.3.4.jar:?]
at org.apache.spark.deploy.SparkHadoopUtil.runAsSparkUser(SparkHadoopUtil.scala:61) [spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:174) [spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:222) [spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:91) [spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:1125) [spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:1134) [spark-core_2.12-3.5.8.jar:3.5.8]
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) [spark-core_2.12-3.5.8.jar:3.5.8]
Caused by: java.net.ConnectException: Connection refused
at sun.nio.ch.Net.connect0(Native Method) ~[?:?]
at sun.nio.ch.Net.connect(Net.java:579) ~[?:?]
at sun.nio.ch.Net.connect(Net.java:568) ~[?:?]
at sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:593) ~[?:?]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[?:?]
at java.net.Socket.connect(Socket.java:633) ~[?:?]
at org.apache.amoro.shade.thrift.org.apache.thrift.transport.TSocket.open(TSocket.java:226) ~[optimizer-job.jar:0.9-SNAPSHOT]
... 33 more
2026-06-30 09:47:27.994Z INFO [main[] [ThriftClientPool] [P:|T:] - Reconnecting service address: olake-fusion-fusion-optimizing.olake-fusion.svc.cluster.local:1261
2026-06-30 09:47:27.994Z INFO [main[] [ThriftClientPool] [P:|T:] - Reconnecting service address: olake-fusion-fusion-optimizing.olake-fusion.svc.cluster.local:1261
2026-06-30 09:47:28.017Z INFO [main[] [OptimizerToucher] [P:|T:] - Adding register property heart-beat-interval:10000 into optimizer
2026-06-30 09:47:28.017Z INFO [main[] [OptimizerToucher] [P:|T:] - Adding register property heart-beat-interval:10000 into optimizer
2026-06-30 09:47:28.038Z INFO [main[] [OptimizerToucher] [P:|T:] - Registered optimizer to ams with token:618d2dfd-505a-49b8-bc4c-521ca690dbe0
2026-06-30 09:47:28.038Z INFO [main[] [OptimizerToucher] [P:|T:] - Registered optimizer to ams with token:618d2dfd-505a-49b8-bc4c-521ca690dbe0
Hey @Avinash Kumar 2, thanks for sharing the screenshot.
Could please share the complete logs, that would be great for us to debug. kubectl logs
Hey @Avinash Kumar 2, a few questions and requirements:
2.
a. optimizer has been running for 3h7m
b. No restarts ever since we increased the resources of Fusion pod (It's been running for 3h7m)
Hey @Avinash Kumar 2, can you please re-configure the cron for your iceberg table and check once.
In case you are applying a custom cron, **/5 ** ** ** ** this would be the format we support for an every 5 minute compaciton.
@Avinash Kumar 2 meet.google.com/qba-jjqa-woa
@Avinash Kumar 2 I have checked the issue, the table cron is not running because of abruptly kill of AMS, due to which table stuck in planning phase.
We will release a fix for it soon ETA 1 day.
If you need to do it urgently you can follow below instruction
-> stop amoro service
-> run the status update from 500 to 700 in db in table_runtime table (we did it on call)
-> start ams
thanks
@Avinash Kumar 2 we have released new image, if you have set latest and pod restart it will automatically fetch.
@Avinash Kumar 2 edit on last message:
currently helm has pull policy ifNotPresent that need to be changed to pull automatically,
@Ankit Sharma we tried the above steps, its working as of now.
Thank you so much
we upgrade the release is done.
Hi @Ankit Sharma, we have started the append-only Kafka ingestion job again. This time, however, compaction doesn't seem to be running for this table. Additionally, the table is not appearing under the Optimizing tab in Amoro.
Could you please help us understand why the compaction isn't being triggered or if there's anything we should check on the Olake/Fusion/Iceberg side?
@Avinash Kumar 2 could you please share logs of fusion pod?
and the logs of fusion optimizer pod
thanks
@Avinash Kumar 2 it seems table is not enabled for compaction, have you taken screenshot after refresh of page?
Also can you just try disabling it and reenabling back ?
While doing this please check the fusion pod logs if you see any error.
@Ankit Sharma Yes, the table is enabled for compaction. I also tried disabling it and enabling it again, but the compaction run still doesn't seem to be starting. I checked the Fusion pod logs during the process as well and couldn't find any related errors.
@Avinash Kumar 2 here is the link : meet.google.com/fhs-ekdb-spo
@Avinash Kumar 2 this is same error that is being discussed here
The issue is with gcp.
we will release a fix for it.
Hey team π
We are running OLake CDC into Iceberg tables on S3 (Glue catalog, EMR 7.3) for a high frequency write heavy , table β ~11M records/day with 1-minute write frequency.
We are seeing significant equality delete file (content=2) accumulation β currently at 92-96% of total file count per partition. After investigation we traced this to OLake writing one equality delete file per CDC event using _olake_id as the delete identifier.
Two questions:
1. Can we change the sorted_by column from _olake_id to the table's natural primary key (id, bigint)? The current _olake_id is a synthetic varchar UUID which has sort locality for compaction β Iceberg's rewrite_data_files with delete-file-threshold=1 is not resolving the equality deletes efficiently because it cannot binary-search a random UUID.
2. Does the sorted_by column control which column OLake uses as the equality delete identifier? Or is the equality delete column configured separately at the OLake connector/job level?
Context: the table is partitioned on date_modified_day, with 99.86% of updates happening same-day. Changing the equality delete identifier to id (integer, unique, partition-stable) should allow compaction to resolve deletes efficiently and bring delete file percentage down from 92-96% to < 5%.
BTW we're not using Olake Fusion for compaction instead Spark SQL for the same
cc @Sandeep Singh
hey @Prasanna Kumar,
olakeid is simply the stringified value of your table's primary key. OLake only generates an MD5 hash (which looks like a random UUID) if it can't detect a single primary key for the source table, could you confirm if your table has a primary key?
olakeid is used as the default identifier field in OLake, which means it automatically dictates both the equality delete column and the sorted_by order.
the table has one (id) auto inc based
While now I understand about the olakeid, The challenge we face is given this is a fast moving table (rapid c and u operations ) , partitioned based on datemodified as day (yyyy/mm/dd), 99% of the updates happen within the same day. The data to delete file ratio is still high. In terms of numbers when queried the $files table,
0 7000+
1 21000 +
2 23800 +
Since the equality deletes are more , 8 files for every data file - compaction on this table is not helping to bring down the equality writes count.
While exploring on how do we over come this challenge ... One of the hint I guessed is to see if the value of olakeid could be tweaked...
Tech Stack
hey @Prasanna Kumar, Can you please explain the problem you're currently facing and what outcome or solution you're expecting?
As explained the context above ,
problem
@Prasanna Kumar
In upsert mode, writing equality delete files cannot be avoided, whereas in append mode, no equality delete files are written. If you wants to reclaim disk space after compaction and remove orphan files, you'll need to configure your compaction job accordingly.
Expected Outcome / solution@Prasanna Kumar this is incorrect. Compaction do cleanup all deletes and make uniform data files set. (Now you might feel like its not cleaning up because while its running, more equality are coming as ingestion is happening at much fast pace)
Understood.... we are running compaction on 1 day older partition (t-1) i.e only on that partition on a daily basis
@Prasanna Kumar please try Fusion once. we are much efficient in compaction. 50% more faster than normal spark. you can run the light compaction at higher frequency to reduce small files overall. which is quite cheap as well
also, if we can have a 15 min call about your usecase. Happy to discuss on it and help
Sure @shubham we can ... Let us first try with Olake fusion on a a controlled env
We started olake-fusion on our uat env. While adding the catalog to olake fusion, I faced some issues and I have few questions:
Hey @Sandeep Singh, thanks for pointing it out!
Thank you.
Another doubt I had was regarding the driver version. I see there is a change in github.com/datazip-inc/olake/releases?page=2#β¦ regarding the create one positional delete file per data file ref . If I have cdc changes from a version earlier than 0.7.0, are they not compatible fully with spark fusion?
Hey @Sandeep Singh, just checking inβdid the OLake-UI v0.4.9 release resolve the issue you mentioned above?
Let us know if you're still facing any issues.
Hi team, since yesterday our Kafka ingestion jobs (cron every 5 min) have been failing. When checking logs, I'm getting:failed to get task logs: logs directory not found: /tmp/olake-config/<task_id>: stat /tmp/olake-config/<task_id>: no such file or directory
Could someone help me figure out why this logs directory isn't being created/found? Thanks!
hey @Avinash Kumar 2 ,
Could you please share the UI and worker logs? Also, are you using a Helm deployment or Docker?
@VIKASH CHOUDHARY
@Avinash Kumar 2
olake-workers 2026-07-05T08:40:00Z WRN failed to prepare workflow logger for workflowID=sync-123-2-2026-07-05T08:40:00Z: failed to create work directory: mkdir /data/olake-jobs/fe74286797419eb4aa8f462d75f6d8cd0d7ea59d579701ff8ce69a8224b77a2b: no space left on device
@Avinash Kumar 2
please follow this for prod use cases :
olake.io/docs/install/kubernetes#β¦
Hi @shubham,
We've now moved to an external Filestore-backed NFS instead of the built-in OLake NFS server.
Quick question β is there any built-in TTL / automatic cleanup for the job metadata, config, and log files that OLake writes to the shared storage volume (/data/olake-jobs, /tmp/olake-config)? We noticed these directories aren't purged after a task completes or fails, and they accumulated until our previous NFS volume filled up. Wanted to confirm whether this is expected behavior and if there's a recommended retention/cleanup mechanism, or if we should build our own pruning job.
CC: @Sricharan Sirpa
There is a log cleanup schedule/TTL in our docs. I am AFK. but you can search there. @Avinash Kumar 2
@Avinash Kumar 2 please checkout following doc:
https://olake.io/docs/install/olake-ui/#log-retention
Hi team,
We're running a Full Refresh + CDC sync from MySQL at 1-minute frequency, using Lakekeeper (REST catalog) with GCS storage via HMAC keys, warehouse flavor set to s3-compat.
Full Refresh completed successfully, and the first few CDC syncs ran fine too β but some recent CDC jobs have started failing.
Attached the logs for reference.
Thanks!
Hi @Avinash Kumar 2, we are looking into this issue , will get back to you soon.
Hi @Vaibhav Verma, just wanted to check if there's any update on this issue, as it will help us plan the next steps. Thanks!
@Avinash Kumar 2, we have figured out the issue and will be doing a release with the fix soon.
Will notify you once release is done
Hi @Avinash Kumar 2, we have fixed this in olake v0.8.2, you can try that version.
If you still face any issue please let us know
@Avinash Kumar 2 does the new version worked out for you? is your compaction job stable now?
Hi, I have a question about OLake + OAuth2.
We want to configure OLake to only accept logins from a specific user group in Entra ID. But it seems OLake doesn't support oauth2 for logins, only for connecting to sources. Is this correct? Are there plans for oauth support?
Hey @Kim Tore Jensen !
We are planning to keep this feature for managed SaaS offering of OLake, which is pretty close to its launch. Happy to chat for its beta access to you, if you are interested.
I see. Perhaps another time then. We are not ready to consider a SaaS offering at this time, but thanks for the info π
Hi team,
I'm trying to deploy OLake on AWS ECS Fargate instead of Kubernetes and have successfully deployed the following components:
starting OLake workerHowever, when I try to create a PostgreSQL source, the workflow fails with the following error:
executor environment: docker
database initialized
namespace default retention set to 168h0m0s
worker client created successfully
starting Temporal worker...
Started Worker
Namespace=default
TaskQueue=OLAKE_DOCKER_TASK_QUEUE
failed to get source spec:It appears the Worker is trying to execute connectors using the local Docker daemon.
workflow execution failed
activity error:
image pull
183124052567.dkr.ecr.ap-south-2.amazonaws.com/olakego/source-postgres:v0.9.0
failed to connect to the docker API at unix:///var/run/docker.sock
dial unix /var/run/docker.sock:
connect: no such file or directory
hey @vikassingh AWS ECS Fargate is not officially supported and we currently don't have any plan to support it any time soon in Olake but we do support docker and helm so you can try that out.
I'm a bit curious how to get the CLI to run continuously when syncing Postgres with CDC.
Right now I get this output when running with --state /mnt/config/state.json , and then exit.
How can I configure olake cli to run continuously as a daemon (i.e. we want to run it as a sidecar along user-defined applications)
(... removed ...)
2026-08-07T13:39:55Z INFO Iceberg[50051] 13:39:55.245 [grpc-default-executor-1] INFO io.debezium.server.iceberg.rpc.OlakeRowsIngester - [Thread-29-6395037162323] Total time taken: 1 ms
2026-08-07T13:39:55Z DEBUG Thread[public.sample_data_01KZE77A3R8EVHFEVYB2FXB5P9]: Sent commit message: [Thread-29-6395037162323] Successfully committed data for thread public.sample_data_01KZE77A3R8EVHFEVYB2FXB5P9 2026-08-07T13:39:55Z DEBUG sent standby status message at LSN#0/19BD100
2026-08-07T13:39:58Z INFO Total records read: 0 | Total bytes read: 0 B
2026-08-07T13:39:58Z INFO Sync completed, wait 5 seconds cleanup in progress... 2026-08-07T13:40:03Z INFO Shutting down shared Iceberg JVM on port 50051
I copied most of the configuration directly from examples in the documentation, modifying only for our Lakekeeper destination.
@Kim Tore Jensen currently there is no continuous feature in CLI. (if you use OLake-ui, we have temporal which continuously syncs data β configurable via cron).
so you need to schedule your own cron/orchestration which will keep running every 10-15mins.
Also we are planning continuous mode in next 2-3 months. You can discuss with our product team @Merlyn about requirements.
@Kim Tore Jensen no its not related to that. you can as low as 20-30 sec as well. depends on your use case.
{"level":"debug","time":"2026-08-09T09:34:05Z","message":"Thread[public.SegmentMember2_01KZJXQK2P9NFXCEJA7PQQJJV0]: sent batch to Iceberg server, response: successfully pushed records: 306"}
{"level":"info","time":"2026-08-09T09:34:05Z","message":"Thread[public.SegmentMember2_01KZJXQK2P9NFXCEJA7PQQJJV0]: successfully wrote 306 records"}
{"level":"info","message":"Thread[public.SegmentMember2_01KZJXQK2P9NFXCEJA7PQQJJV0:50055] 09:34:05.525 [grpc-default-executor-1] INFO io.debezium.server.iceberg.rpc.OlakeRowsIngester - [Thread-34-2951203554972590] Received commit request for thread: public.SegmentMember2_01KZJXQK2P9NFXCEJA7PQQJJV0","time":"20260809T09:34:05Z"}
{"level":"info","message":"Thread[public.SegmentMember2_01KZJXQK2P9NFXCEJA7PQQJJV0:50055] 09:34:06.879 [grpc-default-executor-1] INFO io.debezium.server.iceberg.tableoperator.IcebergTableOperator - Committing 13 data files and 13 delete files for thread: public.SegmentMember2_01KZJXQK2P9NFXCEJA7PQQJJV0","time":"20260809T09:34:06Z"}
{"level":"info","message":"Thread[public.SegmentMember2_01KZJXQK2P9NFXCEJA7PQQJJV0:50055] 09:34:07.924 [grpc-default-executor-1] INFO org.apache.iceberg.BaseMetastoreTableOperations - Successfully committed to table olake_iceberg.iceberg_mod_public.segmentmember2 in 457 ms","time":"20260809T09:34:07Z"}
{"level":"info","message":"Thread[public.SegmentMember2_01KZJXQK2P9NFXCEJA7PQQJJV0:50055] 09:34:07.924 [grpc-default-executor-1] INFO org.apache.iceberg.SnapshotProducer - Committed snapshot 7855686464676501021 (BaseRowDelta)","time":"20260809T09:34:07Z"}
{"level":"info","message":"Thread[public.SegmentMember2_01KZJXQK2P9NFXCEJA7PQQJJV0:50055] 09:34:08.091 [grpc-default-executor-1] INFO org.apache.iceberg.BaseMetastoreTableOperations - Refreshing table metadata from new version: s3://iceonnitish/iceberg_mod_public.db/segmentmember2/metadata/07727-34485458-e029-4d59-9c00-a8a0cc5c535b.metadata.json","time":"20260809T09:34:08Z"}
{"level":"info","message":"Thread[public.SegmentMember2_01KZJXQK2P9NFXCEJA7PQQJJV0:50055] 09:34:08.365 [grpc-default-executor-1] INFO org.apache.iceberg.metrics.LoggingMetricsReporter - Received metrics report: CommitReport{tableName=olake_iceberg.iceberg_mod_public.segmentmember2, snapshotId=7855686464676501021, sequenceNumber=7727, operation=overwrite, commitMetrics=CommitMetricsResult{totalDuration=TimerResult{timeUnit=NANOSECONDS, totalDuration=PT0.977623142S, count=1}, attempts=CounterResult{unit=COUNT, value=1}, addedDataFiles=CounterResult{unit=COUNT, value=13}, removedDataFiles=null, totalDataFiles=CounterResult{unit=COUNT, value=135812}, addedDeleteFiles=CounterResult{unit=COUNT, value=13}, addedEqualityDeleteFiles=CounterResult{unit=COUNT, value=13}, addedPositionalDeleteFiles=null, removedDeleteFiles=null, removedEqualityDeleteFiles=null, removedPositionalDeleteFiles=null, totalDeleteFiles=CounterResult{unit=COUNT, value=135764}, addedRecords=CounterResult{unit=COUNT, value=306}, removedRecords=null, totalRecords=CounterResult{unit=COUNT, value=1940799413}, addedFilesSizeInBytes=CounterResult{unit=BYTES, value=73602}, removedFilesSizeInBytes=null, totalFilesSizeInBytes=CounterResult{unit=BYTES, value=67303384638}, addedPositionalDeletes=null, removedPositionalDeletes=null, totalPositionalDeletes=CounterResult{unit=COUNT, value=86224613}, addedEqualityDeletes=CounterResult{unit=COUNT, value=306}, removedEqualityDeletes=null, totalEqualityDeletes=CounterResult{unit=COUNT, value=1104247064}}, metadata={iceberg-version=Apache Iceberg 1.7.2 (commit c4e11060db443b0f3e5b70d25e7784f5a8991ad2)}}","time":"20260809T09:34:08Z"}
{"level":"info","message":"Thread[public.SegmentMember2_01KZJXQK2P9NFXCEJA7PQQJJV0:50055] 09:34:08.397 [grpc-default-executor-1] INFO io.debezium.server.iceberg.tableoperator.IcebergTableOperator - Successfully committed 13 data files and 13 delete files for thread: public.SegmentMember2_01KZJXQK2P9NFXCEJA7PQQJJV0","time":"20260809T09:34:08Z"}
{"level":"info","message":"Thread[public.SegmentMember2_01KZJXQK2P9NFXCEJA7PQQJJV0:50055] 09:34:08.397 [grpc-default-executor-1] INFO io.debezium.server.iceberg.rpc.OlakeRowsIngester - [Thread-34-2951203554972590] Total time taken: 2872 ms","time":"20260809T09:34:08Z"}
{"level":"debug","time":"20260809T09:34:08Z","message":"Thread[public.SegmentMember2_01KZJXQK2P9NFXCEJA7PQQJJV0]: Sent commit message: [Thread-34-2951203554972590] Successfully committed data for thread public.SegmentMember2_01KZJXQK2P9NFXCEJA7PQQJJV0"}
{"level":"info","time":"2026-08-09T09:34:08Z","message":"Thread[public.SegmentMember2_01KZJXQK2P9NFXCEJA7PQQJJV0]: shutting down Iceberg server on port 50055"}
{"level":"info","time":"2026-08-09T09:34:08Z","message":"Sync completed, wait 5 seconds cleanup in progress..."}
{"level":"fatal","time":"2026-08-09T09:34:13Z","message":"error occurred while reading records: error occurred while waiting for connections: failed to insert cdc record of stream public.CallLog, insert func error: %!s(), thread error: failed to flush data while closing: failed to write records: failed to send batch: rpc error: code = ResourceExhausted desc = gRPC message exceeds maximum size 1073741824: 1359278013"} Sync broke the first time with this error and all the subsequent syncs are breaking with this error@Nitish Gupta Thanks for raising the issue ,we will get back to you in soon regarding this issue.
@Nitish Gupta Thanks for the full logs can you also confirm which deployment mode you are currently using k8s ,docker or CLI ?
@Nitish Gupta could you please let us know whether this is a high priority blocker for your use case with OLake? This will help us prioritize it appropriately. Thanks
Yes itβs a production table that had been running fine for the last 3-4 months, now I had to stop the sync from Olake leaving us with stale data at the source and weβd have to run slow queries on postgres until this is resolved
@Nitish Gupta Sure, weβll get back to you as soon as possible. Sorry for the inconvenience.
Hey @Nitish Gupta, the current gRPC request limit in OLake is 1 GB, and 10K rows from the CallLog table are exceeding that limit. As a quick fix, could you please turn off this table or any large columns associated with it for now?
Hey @Nitish Gupta, we've picked up this issue internally and will fix it soon.
Hey @Nitish Gupta, weβve included a patch for this issue in the latest OLake version, v0.9.1. Could you please try it out and let us know if the issue is resolved for you?
Hey team,
Had few questions regarding the new 0.9.0 release.
We have created iceberg tables using github.com/datazip-inc/olake/releases#β¦ 0.8.2
I noticed the new release github.com/datazip-inc/olake/releases#β¦ 0.9.0
bumps the apache iceberg version from 1.7.2 to 1.10.2
Question:
hey @Sandeep Singh, existing tables are untouched Iceberg library version and table format version are different things: 1.10.2 is the library, and OLake still pins format-version=2 at table creation
hi all, I'm running OLake on an AWS EKS cluster. As of today, I've started getting errors on our Postgres sources as follows:
failed to validate cdc configuration for slot cdc_user_olake_replication_slot: no record foundThis is true for existing Postgres sources as well as new ones, only with CDC. Does anyone have any idea what might cause this?
@Grayson Williams
@Grayson Williams can you please share your entire logs ,you can find them on Job Logs & History section ?