SeaTunnel FAQs
This section answers frequently asked questions about SeaTunnel architecture, state management, execution engines, resource management, and migration from Sqoop.
1. Where does SeaTunnel store its state and metadata? Does it require an external database?
SeaTunnel does not require an external database to store its state and metadata when using the Zeta engine.
The Zeta engine stores live state in the embedded Hazelcast in-memory data grid (IMDG) cluster, which runs within each Zeta master Java Virtual Machine (JVM).
State and metadata storage
The following table describes the Hazelcast maps used to store state and metadata.
State | Hazelcast IMap | Contents | Retention |
Live job graph | job-info | Directed acyclic graph (DAG), action list, JAR URLs, and configuration snapshot | Until the job terminates |
Running jobs index | running-jobs | Job ID and job status summary | Continuously updated |
Finished jobs index | finished-jobs | Final metrics, state, and execution timings | Limited by job-history.max-size in seatunnel.yaml (default: 1024) |
Per-task metrics | job-metrics | SourceReceivedCount, SinkWriteCount, and queries per second (QPS) | Time-to-live (TTL) based |
Checkpoint metadata | checkpoint-plan, checkpoint-state | Snapshot IDs and per-vertex offsets | Streaming jobs only |
ClassLoader URLs | job-classloader | JAR paths used to reconstruct action classes | For the lifetime of the job |
Data persisted outside the JVM
SeaTunnel persists the following data outside the JVM:
Checkpoint data
- Applies only to streaming jobs.
- Uses the state.checkpoints.dir property in seatunnel.yaml.
- The default location on this stack is HDFS: hdfs:///user/seatunnel/flink-checkpoints.
- Stores exactly-once, barrier-aligned snapshots.
Hazelcast Hot Restart
- Provides optional local disk persistence for IMDG partitions.
- Is disabled by default.
- Is configured under the persistence section in hazelcast-master.yaml.
- Is intended primarily for IMDG cache recovery after master restarts, rather than Zeta job state recovery.
SeaTunnel does not require a relational database management system (RDBMS), ZooKeeper, or an Amazon S3 metadata bucket for this state management.
The following REST endpoints retrieve information directly from Hazelcast IMaps:
- /running-jobs
- /finished-jobs/*
- /job-info/{id}
What happens if a Zeta master JVM fails?
If a Zeta master JVM fails while Hazelcast Hot Restart is disabled:
- Batch jobs: Restart from the beginning.
- Streaming jobs: Resume from the last successful checkpoint stored in HDFS.
For more information about the REST endpoints, see Section 1 in 04-monitoring.md.
2. What capabilities does Zeta provide that the Flink and Spark starters do not?
The Zeta engine provides several capabilities that simplify job execution, resource management, and high availability.
Although Flink also supports change data capture (CDC), Zeta provides operational advantages for certain workloads.
Multi-table synchronization
Zeta supports synchronizing multiple tables within a single job.
For example, a source configuration can specify:
table-names = ["db.t1", "db.t2"]
With the Flink and Spark starters, separate jobs are required for each table.
Schema evolution without restarting jobs
Zeta uses TableSchemaEvolveListener to detect data definition language (DDL) changes in CDC sources and propagate supported schema changes to sinks while jobs are running.
- ADD COLUMN: Supported.
- DROP COLUMN and RENAME COLUMN: Supported with limitations.
REST-based job lifecycle management
Zeta provides REST endpoints to manage and monitor jobs.
Endpoint | Purpose |
/submit-job | Submit a job |
/stop-job?isStopWithSavePoint=true | Stop a job with a savepoint |
/submit-job?restoreJobId=X | Restore a job |
/system-monitoring-information | Retrieve system monitoring information |
/thread-dump | Retrieve thread dump information |
These operations interact directly with Hazelcast IMaps and use a consistent job ID throughout the job lifecycle.
Flink also provides REST APIs. However, integrating SeaTunnel job management with Flink requires mapping SeaTunnel job identities to Flink job identities.
Resource groups using worker tags
Zeta supports assigning specific job categories to designated worker nodes by using tag.restrictions in seatunnel.yaml.
For example, you can assign resource-intensive CDC jobs to dedicated workers to prevent Kafka traffic spikes from affecting Hive sink jobs.
YARN provides queue-based resource management but does not provide the same job-level worker tag matching.
Lite workers
Zeta supports workers configured as lite-member.
These workers execute tasks without owning Hazelcast data partitions, reducing heap usage on nodes dedicated to task execution.
This worker configuration is specific to Zeta and does not have a direct equivalent in the Flink or Spark starters.
Faster job startup
Zeta masters run continuously, allowing jobs to be submitted through Hazelcast remote procedure calls (RPCs).
Typical startup times described for this deployment are:
Execution engine | Approximate job startup time |
Zeta | 100 milliseconds |
Flink or Spark on YARN | 15–45 seconds |
The shorter startup time makes Zeta suitable for frequently executed, short-lived jobs.
Simplified high availability
Zeta supports high availability (HA) using three master nodes without requiring an additional ZooKeeper service.
Flink HA requires ZooKeeper, HDFS, and additional configuration.
Limitations of Zeta
Consider the following limitations when selecting an execution engine:
- Large streaming state: Flink's checkpoint coordinator and RocksDB state backend are more established for workloads with streaming state exceeding 100 TB.
- Complex analytical queries: Spark's Catalyst optimizer provides advantages when planning complex Spark SQL queries.
3. Does Zeta spill data to disk? What happens when a job exceeds the JVM heap?
Zeta does not automatically spill row data to disk in the same way as Flink's RocksDB state backend or Spark's shuffle and broadcast spill mechanisms.
Runtime buffers reside in the Zeta JVM heap, including:
- Source batches
- Intermediate transformation data
- Sink accumulators
Hazelcast IMaps used for checkpoint state also reside in memory, with periodic persistence to the directory configured by state.checkpoints.dir.
Behavior for streaming jobs
For streaming jobs, Zeta uses backpressure to regulate data flow.
When a sink cannot process incoming data quickly enough:
- The Hazelcast queue between the source and sink fills.
- Zeta's credit-based flow control applies backpressure.
- The source reduces its data production rate.
- The pipeline continues processing at a reduced rate.
This mechanism helps prevent out-of-memory (OOM) errors caused by queue growth.
The memory limit is determined by:
taskmanager.memory.network.max × parallelism × workers
Behavior for batch jobs
For batch jobs, if a transformation's working set exceeds the available JVM heap, the Zeta worker can encounter an OOM error, causing the job to fail.
Zeta does not automatically spill this data to disk.
Recommended workarounds
Use the following approaches in the specified order:
- Increase source partitioning. Increase partition_num for the JDBC source so that each reader processes a smaller data range.
- Add more workers. Scale Zeta horizontally to increase aggregate heap capacity. For example, three workers provide approximately three times the aggregate heap capacity of one worker with the same configuration.
- Increase JVM heap size. Configure seatunnel_master_heap_mb and seatunnel_worker_heap_mb through Ambari.
- Use Flink or Spark. Select an execution engine that supports disk spilling for memory-intensive workloads.
For example, Spark 3.5 or 4.1 is more suitable than Zeta for a MySQL-to-Hive batch transfer containing 500 million rows.
Engine selection recommendations
- Use Zeta for small-to-medium batch workloads, typically fewer than 50 million rows per worker.
- Use Zeta for streaming workloads where throughput is constrained by sink processing capacity.
- Use Spark or Flink for large batch shuffles, complex joins, broadcast-intensive transformations, or workloads where state exceeds the available node memory.
For more information about heap configuration, see Section 13, Tuning, in 05-troubleshooting.md.
4. What are the differences between SeaTunnel and Sqoop, and when should each be used?
SeaTunnel and Sqoop support data ingestion and transfer, but they differ in connector availability, execution engines, streaming capabilities, and deployment requirements.
Feature comparison
Capability | Sqoop | SeaTunnel |
Source connectors | JDBC and selected native RDBMS connectors | More than 100 connectors, including JDBC, CDC, Kafka, S3, HDFS, HBase, Hive, Hudi, Iceberg, MongoDB, Redis, and Elasticsearch |
Streaming | Batch processing only | Streaming through Zeta or Flink, including MySQL, PostgreSQL, Oracle, and SQL Server CDC |
Transformations | SQL transformations through --query | SQL and built-in transformations, including Field, SQL, FilterRowKind, JsonPath, Split, and Replace |
Execution engine | MapReduce (deprecated in Hadoop 3.4 and later) | Zeta, Flink, and Spark |
Deployment | Command-line interface (CLI) | Zeta cluster with CLI, or client-only execution through Flink and Spark starters |
Incremental processing | --check-column, --last-value, and metastore | Watermark-based processing in HOCON or continuous CDC |
Operational maturity | Approximately 15 years of production use | Approximately five years of development, with some newer sinks still in beta |
JDBC-to-HDFS Parquet performance | Baseline: 1.0× | Approximately 0.9–1.1× with Zeta or Spark |
CDC performance | Not supported | Supported through Zeta and Flink |
When should you use SeaTunnel?
SeaTunnel is suitable for the following scenarios:
CDC workloads
Use SeaTunnel to continuously capture changes from supported databases, including MySQL, PostgreSQL, Oracle, and SQL Server.
Non-JDBC data sources
SeaTunnel supports data pipelines such as:
- Kafka to supported sinks
- Amazon S3 to supported sinks
- MongoDB to supported sinks
Modern data lakehouse integrations
SeaTunnel supports sinks such as Iceberg v2, Hudi Merge on Read (MOR), and Delta.
Sqoop can write data in formats such as Parquet and Avro but does not directly manage the metadata catalogs associated with these lakehouse formats.
Unified batch and streaming pipelines
SeaTunnel supports configuring batch and streaming execution through HOCON by changing the job.mode setting.
In-flight data transformations
SeaTunnel supports field-level transformations during pipeline execution.
Sqoop typically requires additional processing through tools such as Hive.
Multi-table synchronization
SeaTunnel can synchronize multiple tables within a single Zeta job, whereas Sqoop requires separate jobs.
When should you continue using Sqoop?
Sqoop remains suitable for the following scenarios:
Simple JDBC-to-HDFS transfers
For straightforward JDBC-to-HDFS Parquet transfers, Sqoop provides a simpler CLI-based workflow without requiring a HOCON configuration file and additional Kerberos settings.
Existing YARN deployments
Sqoop runs as a CLI tool on an existing YARN cluster.
SeaTunnel with Zeta requires additional master and worker JVMs that must be monitored, maintained, and upgraded.
You can reduce this overhead by using SeaTunnel in client-only mode with the Flink or Spark starters.
Database-specific type compatibility
Sqoop includes years of compatibility improvements for database-specific types, including:
- Oracle BLOB
- SQL Server datetimeoffset
- PostgreSQL BIT
- MySQL BIT(1) to Boolean conversions
SeaTunnel's JDBC connector supports most common data types but has limitations. For example, PostgreSQL JSONB values can be converted to strings.
Existing operational integrations
Continue using Sqoop when existing pipelines depend on tools such as Oozie, Autosys, cron, or custom monitoring scripts that parse Sqoop output.
Migrating stable pipelines might introduce unnecessary operational effort without providing additional business value.
Legacy MapReduce clusters
Sqoop remains an option for Hadoop 2.x clusters that use MapReduce without Spark or Flink.
SeaTunnel does not provide a MapReduce execution engine.
Recommendation
Use SeaTunnel for new data pipelines, particularly those involving streaming, CDC, non-JDBC sources, or modern lakehouse integrations.
Continue using Sqoop for stable, legacy JDBC bulk-transfer workloads unless there is a specific business requirement to migrate.
5. How can a Sqoop-to-SeaTunnel converter tool work?
A Sqoop-to-SeaTunnel converter translates Sqoop CLI commands into SeaTunnel HOCON configuration files.
High-level architecture
The conversion process follows this sequence:
Sqoop CLI command
|
v
Parser
|
v
Canonical intermediate representation (IR)
|
v
HOCON generator
|
v
SeaTunnel .conf file
Sqoop argument mapping
The following table describes how Sqoop arguments can be mapped to SeaTunnel configuration properties.
Sqoop argument | SeaTunnel configuration | Conversion notes |
--connect | source.Jdbc.url | Preserve the JDBC URL |
--driver | source.Jdbc.driver | Preserve the driver class name; the JAR might need to be added to plugins/jdbc/lib/ |
--username, -P, --password | source.Jdbc.user, password | Support ${PASSWORD} environment variable substitution |
--table T | source.Jdbc.query = "SELECT * FROM T" | Use an explicit SQL query |
--columns a,b,c | SQL query | Generate SELECT a,b,c FROM T |
--where "clause" | SQL query | Append the WHERE clause |
--query "..." --split-by col | query, partition_column, partition_num | Remove Sqoop's $CONDITIONS placeholder |
--split-by col | source.Jdbc.partition_column | Configure the partition column |
--num-mappers N, -m N | source.Jdbc.partition_num, env.parallelism | Set both properties to N |
--target-dir /path | sink.HdfsFile.path | Convert the path to an hdfs:// URL |
--as-parquetfile | sink.HdfsFile.file_format_type | Set to parquet |
--as-avrodatafile | sink.HdfsFile.file_format_type | Set to avro |
--as-textfile | sink.HdfsFile.file_format_type | Set to text; configure field delimiters |
--as-orc | sink.HdfsFile.file_format_type | Set to orc |
--hive-import --hive-table db.t | Hive sink | Replace the HdfsFile sink with a Hive sink and set table_name="db.t" |
--hive-overwrite | sink.Hive.save_mode | Set to overwrite |
--create-hive-table | Hive sink or preprocessing step | Create the table if permitted by the metastore; otherwise, execute DDL before the job |
--map-column-java col=Type | SQL query or transformation | Use SQL CAST or add a transformation block |
--null-string, --null-non-string | sink.HdfsFile.null_substitute_character and source transformation | Configure null-value handling |
--direct | Not supported | Remove the option and display a warning; use JDBC |
--incremental append --check-column C --last-value V | SQL query | Add WHERE C > V |
--incremental lastmodified --check-column ts --last-value T | SQL query | Add WHERE ts >= T; use a merge-capable sink for deduplication |
--compression-codec snappy | sink.HdfsFile.compress_codec | Set to snappy |
--fields-terminated-by '\t' | sink.HdfsFile.field_delimiter | Set to "\t" |
--lines-terminated-by '\n' | sink.HdfsFile.row_delimiter | Set to "\n" |
--enclosed-by '"' | sink.HdfsFile.text.enclose | Set to "\"" |
--batch (export) | sink.Jdbc.batch_size | Set the batch size to the applicable default |
When converting Hive imports, the generated configuration must also include the required settings:
- metastore_uri
- hive_site_path
- hdfs_site_path
- Kerberos configuration
Managing incremental state
Sqoop stores incremental watermarks in a Derby metastore when using sqoop job.
A converter must provide an alternative mechanism to manage incremental state.
Consider the following approaches.
Option A: Stateless watermark management
Generate SeaTunnel configurations that accept a watermark through an environment variable.
${WATERMARK}
This approach is simple but does not preserve Sqoop's automatic watermark advancement.
Option B: Watermark file
Generate a shell script that reads and updates a watermark file before and after SeaTunnel execution.
This approach reproduces Sqoop's state-management behavior but introduces additional filesystem state.
Option C: Query the target system
Retrieve the current watermark from the target before executing the generated SeaTunnel job.
For example:
SELECT MAX(check_column) FROM target;
This approach requires a queryable target system.
The lab example demo_04_incremental_load.sh demonstrates this pattern.
Recommended approach:
- Use Option C for Hive and Iceberg sinks.
- Use Option A for Kafka and file sinks.
- Use Option B when the other approaches are not suitable.
Validating converted jobs
Validate the converter by comparing the output of the original Sqoop job with the converted SeaTunnel job.
- Run the original Sqoop job against a test MySQL database and HDFS.
- Capture the job output.
- Run the converted SeaTunnel configuration against the same source and destination.
- Capture the SeaTunnel output.
- Compare the results for:
- Row counts
- Schema using parquet-tools
- Null-value handling
- Data type conversions
- File layout
A converter that performs only syntax mapping can miss approximately 15% of cases involving null handling, data type compatibility, string encoding, and unsupported direct-mode options.
Classify unsupported configurations as unsupported — manual review in the converter output.
Suggested implementation technologies
Component | Recommended implementation |
Parser | Python with argparse |
Intermediate representation | Python dataclass, such as SqoopJob |
HOCON generator | pyhocon for configuration generation and validation |
Validation tool | HDFS file listing and Parquet schema comparison |
Supported arguments | YAML allowlist with unsupported-argument reporting |
The estimated implementation effort is:
- Approximately 300 lines of Python for the parser and mapping framework.
- Approximately 200 lines of Python for the validation component.
6. Can SeaTunnel run without Zeta in client-only mode, similar to Sqoop?
Yes. SeaTunnel can run in client-only mode using the Flink or Spark starters without requiring a running Zeta cluster.
How does client-only execution work with Flink?
Consider the following command:
start-seatunnel-flink-2-connector-v2.sh --config x.conf -t yarn-application
- The SeaTunnel starter JAR acts as a lightweight CLI wrapper.
- The starter reads the HOCON configuration file.
- SeaTunnel generates a Flink DataStream graph using seatunnel-translation-flink-2.
- The starter submits the graph through flink run --target yarn-application.
- The Flink client communicates with the YARN ResourceManager (RM), allocates the ApplicationMaster (AM) and TaskManagers (TMs), and distributes the graph and application code.
- The SeaTunnel CLI exits after the Flink client returns.
No SeaTunnel-specific JVM remains running after submission.
How does client-only execution work with Spark?
The Spark 3.5 and 4.1 starters follow a similar process.
- The SeaTunnel starter reads the HOCON configuration.
- The starter generates the Spark execution graph.
- The starter submits the job through spark-submit.
- The SeaTunnel starter JVM exits after submission.
- The Spark driver and executors continue running on YARN.
In this execution mode, SeaTunnel functions as a client-only tool, similar to Sqoop.
The SeaTunnel Zeta service does not need to be running for Flink or Spark job execution.
What does the Ambari management pack provide without Zeta?
Even when Zeta is not used, the Ambari management pack (mpack) provides the following components and configurations.
Component | Description |
/usr/odp/current/seatunnel/ | Installation directory containing starter JARs and scripts in bin/ |
/etc/seatunnel/conf/seatunnel-env.sh | Environment configuration with SPARK_HOME, FLINK_HOME, HADOOP_CONF_DIR, and SEATUNNEL_CLASSPATH |
/etc/seatunnel/conf/hazelcast-client.yaml | Hazelcast client configuration, which is not used when Zeta is not running |
connectors/ and plugins/jdbc/lib/ | Connector JARs and JDBC dependencies, including the required Kerberos JAAS configuration |
odp-select integration | Maintains the correct installation path across ODP upgrades |
The environment configuration also includes the Java 17-dependent Spark 4 configuration block for cross-ODP compatibility.
The odp-select integration uses:
stack_select.select("seatunnel-server", version)
What are the limitations of client-only deployments?
The current Ambari mpack deploys master and worker service components even when only the Flink or Spark starters are required.
You cannot install SeaTunnel through Ambari without registering these components.
For client-only deployments, use the following configuration approach:
- Install SeaTunnel through Ambari.
- Set master_heap_mb and worker_heap_mb to their minimum values of 512 MB each.
- Stop the SeaTunnel master and worker services after installation to avoid unnecessary resource consumption.
- Run jobs only through the Flink or Spark starter scripts:
start-seatunnel-{flink,spark}-connector-v2.sh
Do not use seatunnel.sh or seatunnel-cluster.sh.- Disable the corresponding Ambari port alerts, including seatunnel_master_hazelcast_port, to prevent unnecessary alerts for intentionally stopped services.
Potential enhancement: Dedicated SeaTunnel client role
A dedicated SEATUNNEL_CLIENT component in metainfo.xml could simplify client-only deployments.
The component would:
- Use the CLIENT component type.
- Provide install() and configure() methods.
- Exclude start() and stop() methods.
- Follow the same design pattern as HDFS_CLIENT, YARN_CLIENT, and SPARK3_CLIENT.
This component is not currently available.
Adding a dedicated client role is a potential enhancement for environments that use only Flink or Spark execution.
The estimated implementation effort is approximately half a day.
Summary: SeaTunnel execution modes
Capability | Zeta mode | Flink or Spark client-only mode |
Execution model | Distributed Hazelcast-based ETL and CDC platform | Configuration-driven execution graph generation |
Cluster management | SeaTunnel master and worker services | Flink or Spark infrastructure |
High availability | Built-in Zeta HA | Managed by the selected execution engine |
REST job management | Zeta REST APIs | Execution-engine-specific APIs |
Metadata management | Hazelcast IMaps | Execution-engine-managed state |
Long-running jobs | Managed by Zeta | Managed by Flink or Spark |
SeaTunnel services required | Yes | No, after installation |
Typical use case | Streaming, CDC, and distributed ETL | Batch or streaming execution on existing Flink or Spark infrastructure |
Key takeaway: When Zeta is enabled, SeaTunnel operates as a distributed ETL and CDC platform with its own execution, state management, HA, and REST interfaces.
When using only the Flink or Spark starters, SeaTunnel acts as a configuration-driven job generator. The underlying execution engine manages the job, and the Zeta services do not need to remain running.

Have a suggestion?