This is an automated email from the ASF dual-hosted git repository. github-merge-queue[bot] pushed a commit to branch gh-readonly-queue/dev/pr-12693-c6a240c4666e750cd88d8e1d59cb5cc2b2134db3 in repository https://gitbox.apache.org/repos/asf/seatunnel.git
commit 016f2c153f25d1e9ce20a7250b44ab9e626a3335 Author: Jast <[email protected]> AuthorDate: Sun Oct 25 14:33:53 2026 +0000 [Docs] Fix getting-started and engine docs verified against source code (#12693) Co-authored-by: zhangshenghang <[email protected]> Co-authored-by: jast <[email protected]> Co-authored-by: Claude Code <[email protected]> Co-authored-by: multica-agent <[email protected]> --- docs/en/getting-started/docker/docker.md | 8 +- .../kubernetes/hybrid-cluster-mode.md | 2 - .../kubernetes/separated-cluster-mode.md | 4 - docs/en/getting-started/locally/deployment.md | 10 +- .../getting-started/locally/quick-start-flink.md | 7 + .../getting-started/locally/run-your-first-job.md | 2 +- .../getting-started/recipes/file-to-starrocks.md | 4 +- docs/en/getting-started/recipes/http-to-jdbc.md | 4 +- docs/en/getting-started/recipes/jdbc-to-jdbc.md | 4 +- docs/en/getting-started/recipes/jdbc-to-s3.md | 6 +- .../en/getting-started/recipes/kafka-to-iceberg.md | 2 +- docs/en/getting-started/recipes/multi-table-cdc.md | 4 +- .../getting-started/recipes/mysql-cdc-to-doris.md | 4 +- .../submit-job-to-remote-zeta-cluster.md | 141 +++++++++++++-------- docs/en/introduction/concepts/config.md | 2 +- .../concepts/gravitino-type-mapping.md | 2 - .../configuration/config-encryption-decryption.md | 2 +- docs/en/transforms/rowkind-extractor.md | 6 +- docs/en/transforms/sql-udf.md | 2 +- docs/zh/getting-started/docker/docker.md | 10 +- .../kubernetes/hybrid-cluster-mode.md | 2 - .../kubernetes/separated-cluster-mode.md | 4 - docs/zh/getting-started/locally/deployment.md | 15 ++- .../getting-started/locally/quick-start-flink.md | 7 + .../locally/quick-start-seatunnel-engine.md | 15 ++- .../getting-started/locally/run-your-first-job.md | 2 +- .../getting-started/recipes/file-to-starrocks.md | 4 +- docs/zh/getting-started/recipes/http-to-jdbc.md | 4 +- docs/zh/getting-started/recipes/jdbc-to-jdbc.md | 4 +- docs/zh/getting-started/recipes/jdbc-to-s3.md | 6 +- .../zh/getting-started/recipes/kafka-to-iceberg.md | 2 +- docs/zh/getting-started/recipes/multi-table-cdc.md | 4 +- .../getting-started/recipes/mysql-cdc-to-doris.md | 4 +- .../submit-job-to-remote-zeta-cluster.md | 136 ++++++++++++-------- docs/zh/introduction/concepts/config.md | 2 +- .../introduction/concepts/connector-v2-features.md | 4 +- .../concepts/gravitino-type-mapping.md | 2 - .../configuration/config-encryption-decryption.md | 7 +- docs/zh/introduction/configuration/sql-config.md | 2 +- docs/zh/transforms/replace.md | 2 +- docs/zh/transforms/rowkind-extractor.md | 6 +- docs/zh/transforms/sql-udf.md | 5 +- 42 files changed, 289 insertions(+), 176 deletions(-) diff --git a/docs/en/getting-started/docker/docker.md b/docs/en/getting-started/docker/docker.md index 3a32367d71..ec660195ee 100644 --- a/docs/en/getting-started/docker/docker.md +++ b/docs/en/getting-started/docker/docker.md @@ -138,8 +138,10 @@ docker run --rm -it apache/seatunnel bash ./bin/start-seatunnel-spark-3-connecto ```shell # flink version between `1.12.x` and `1.14.x` docker run --rm -it apache/seatunnel bash -c '<YOUR_FLINK_HOME>/bin/start-cluster.sh && ./bin/start-seatunnel-flink-13-connector-v2.sh -c config/v2.streaming.conf.template' -# flink version between `1.15.x` and `1.16.x` +# flink version between `1.15.x` and `1.18.x` docker run --rm -it apache/seatunnel bash -c '<YOUR_FLINK_HOME>/bin/start-cluster.sh && ./bin/start-seatunnel-flink-15-connector-v2.sh -c config/v2.streaming.conf.template' +# flink version `1.20.x` +docker run --rm -it apache/seatunnel bash -c '<YOUR_FLINK_HOME>/bin/start-cluster.sh && ./bin/start-seatunnel-flink-20-connector-v2.sh -c config/v2.streaming.conf.template' ``` @@ -239,6 +241,7 @@ services: " ports: - "5801:5801" + - "8080:8080" networks: - seatunnel_network @@ -283,7 +286,7 @@ run `docker-compose up -d` command to start the cluster. You can run `docker logs -f seatunnel_master`, `docker logs -f seatunnel_worker_1` to check the node log. -And when you call `http://localhost:5801/hazelcast/rest/maps/system-monitoring-information`, you will see there are 2 nodes as we excepted. +And when you call `http://localhost:8080/system-monitoring-information`, you will see there are 3 nodes (1 master and 2 workers) as we expected. After that, you can use client or restapi to submit job to this cluster. @@ -306,6 +309,7 @@ services: " ports: - "5801:5801" + - "8080:8080" networks: - seatunnel_network diff --git a/docs/en/getting-started/kubernetes/hybrid-cluster-mode.md b/docs/en/getting-started/kubernetes/hybrid-cluster-mode.md index 4ae2a7cabd..1155a10221 100644 --- a/docs/en/getting-started/kubernetes/hybrid-cluster-mode.md +++ b/docs/en/getting-started/kubernetes/hybrid-cluster-mode.md @@ -244,8 +244,6 @@ spec: env: - name: SEATUNNEL_HOME value: /opt/seatunnel - - name: HAZELCAST_CLUSTER_NAME - value: seatunnel-cluster ports: - containerPort: 8080 name: rest-api diff --git a/docs/en/getting-started/kubernetes/separated-cluster-mode.md b/docs/en/getting-started/kubernetes/separated-cluster-mode.md index 9a297fae87..bfe0609e60 100644 --- a/docs/en/getting-started/kubernetes/separated-cluster-mode.md +++ b/docs/en/getting-started/kubernetes/separated-cluster-mode.md @@ -334,8 +334,6 @@ spec: env: - name: SEATUNNEL_HOME value: /opt/seatunnel - - name: HAZELCAST_CLUSTER_NAME - value: seatunnel-cluster ports: - containerPort: 8080 name: rest-api @@ -407,8 +405,6 @@ spec: env: - name: SEATUNNEL_HOME value: /opt/seatunnel - - name: HAZELCAST_CLUSTER_NAME - value: seatunnel-cluster ports: - containerPort: 8080 name: rest-api diff --git a/docs/en/getting-started/locally/deployment.md b/docs/en/getting-started/locally/deployment.md index 231c0851d2..41cdabb45e 100644 --- a/docs/en/getting-started/locally/deployment.md +++ b/docs/en/getting-started/locally/deployment.md @@ -1,5 +1,5 @@ --- -sidebar_position: 2 +sidebar_position: 5 --- import Tabs from '@theme/Tabs'; @@ -27,14 +27,14 @@ wget "https://archive.apache.org/dist/seatunnel/${version}/apache-seatunnel-${ve tar -xzvf "apache-seatunnel-${version}-bin.tar.gz" ``` -On Windows, download the `.zip` archive from the [SeaTunnel Download Page](https://seatunnel.apache.org/download), then extract it with File Explorer or PowerShell: +On Windows, download the `.tar.gz` archive from the [SeaTunnel Download Page](https://seatunnel.apache.org/download), then extract it with `tar` (bundled with Windows 10 1803+). Only the `.tar.gz` archive is published on archive.apache.org, there is no `.zip` release: ```powershell $version = "3.1.0" Invoke-WebRequest ` - "https://archive.apache.org/dist/seatunnel/$version/apache-seatunnel-$version-bin.zip" ` - -OutFile "apache-seatunnel-$version-bin.zip" -Expand-Archive "apache-seatunnel-$version-bin.zip" -DestinationPath . + "https://archive.apache.org/dist/seatunnel/$version/apache-seatunnel-$version-bin.tar.gz" ` + -OutFile "apache-seatunnel-$version-bin.tar.gz" +tar -xzf "apache-seatunnel-$version-bin.tar.gz" Set-Location "apache-seatunnel-$version" ``` diff --git a/docs/en/getting-started/locally/quick-start-flink.md b/docs/en/getting-started/locally/quick-start-flink.md index 1cad5a151a..096b792fa6 100644 --- a/docs/en/getting-started/locally/quick-start-flink.md +++ b/docs/en/getting-started/locally/quick-start-flink.md @@ -92,6 +92,13 @@ cd "apache-seatunnel-${version}" ./bin/start-seatunnel-flink-15-connector-v2.sh --config ./config/v2.streaming.conf.template ``` +Flink version `1.20.x` + +```shell +cd "apache-seatunnel-${version}" +./bin/start-seatunnel-flink-20-connector-v2.sh --config ./config/v2.streaming.conf.template +``` + **See The Output**: When you run the command, you can see its output in your console. This is a sign to determine whether the command ran successfully or not. diff --git a/docs/en/getting-started/locally/run-your-first-job.md b/docs/en/getting-started/locally/run-your-first-job.md index c0d42defbf..39b1a01374 100644 --- a/docs/en/getting-started/locally/run-your-first-job.md +++ b/docs/en/getting-started/locally/run-your-first-job.md @@ -27,7 +27,7 @@ Install the plugins and confirm they were downloaded into `${SEATUNNEL_HOME}/con ```bash cd "${SEATUNNEL_HOME}" sh bin/install-plugin.sh -ls connectors | rg 'connector-(fake|console)' +ls connectors | grep -E 'connector-(fake|console)' ``` ## Step 3: Use a minimal job diff --git a/docs/en/getting-started/recipes/file-to-starrocks.md b/docs/en/getting-started/recipes/file-to-starrocks.md index dfa08d8fcf..4c4d7ff9de 100644 --- a/docs/en/getting-started/recipes/file-to-starrocks.md +++ b/docs/en/getting-started/recipes/file-to-starrocks.md @@ -23,13 +23,13 @@ connector-starrocks ```bash cd "${SEATUNNEL_HOME}" sh bin/install-plugin.sh -ls connectors | rg 'connector-(file-local|starrocks)' +ls connectors | grep -E 'connector-(file-local|starrocks)' ``` 3. Put the MySQL JDBC driver required by the StarRocks sink into `${SEATUNNEL_HOME}/lib`, then confirm the jar is visible: ```bash -ls "${SEATUNNEL_HOME}/lib" | rg 'mysql-connector' +ls "${SEATUNNEL_HOME}/lib" | grep -E 'mysql-connector' ``` 4. Prepare the local input file and make sure the SeaTunnel process can read it: diff --git a/docs/en/getting-started/recipes/http-to-jdbc.md b/docs/en/getting-started/recipes/http-to-jdbc.md index 9d239fa053..9ebc41741c 100644 --- a/docs/en/getting-started/recipes/http-to-jdbc.md +++ b/docs/en/getting-started/recipes/http-to-jdbc.md @@ -23,13 +23,13 @@ connector-jdbc ```bash cd "${SEATUNNEL_HOME}" sh bin/install-plugin.sh -ls connectors | rg 'connector-(http-base|jdbc)' +ls connectors | grep -E 'connector-(http-base|jdbc)' ``` 3. Put the target database JDBC driver into `${SEATUNNEL_HOME}/lib`, then confirm the jar is visible: ```bash -ls "${SEATUNNEL_HOME}/lib" | rg 'postgresql' +ls "${SEATUNNEL_HOME}/lib" | grep -E 'postgresql' ``` 4. Inspect the HTTP response before running the job. The sample endpoint from the [Http source](../../connectors/source/Http.md) should return a JSON body that contains top-level fields such as `c_string` and `c_int`: diff --git a/docs/en/getting-started/recipes/jdbc-to-jdbc.md b/docs/en/getting-started/recipes/jdbc-to-jdbc.md index d62984c8a0..cbe549537b 100644 --- a/docs/en/getting-started/recipes/jdbc-to-jdbc.md +++ b/docs/en/getting-started/recipes/jdbc-to-jdbc.md @@ -22,7 +22,7 @@ connector-jdbc ```bash cd "${SEATUNNEL_HOME}" sh bin/install-plugin.sh -ls connectors | rg 'connector-jdbc' +ls connectors | grep -E 'connector-jdbc' ``` The `Sql` transform is included in the SeaTunnel distribution and does not require another connector entry. @@ -30,7 +30,7 @@ The `Sql` transform is included in the SeaTunnel distribution and does not requi 3. Put both database drivers into `${SEATUNNEL_HOME}/lib`, then confirm that SeaTunnel can see them: ```bash -ls "${SEATUNNEL_HOME}/lib" | rg 'mysql-connector|postgresql' +ls "${SEATUNNEL_HOME}/lib" | grep -E 'mysql-connector|postgresql' ``` 4. Create the MySQL source table and insert three deterministic rows: diff --git a/docs/en/getting-started/recipes/jdbc-to-s3.md b/docs/en/getting-started/recipes/jdbc-to-s3.md index 161b2c51c5..f565d22e8b 100644 --- a/docs/en/getting-started/recipes/jdbc-to-s3.md +++ b/docs/en/getting-started/recipes/jdbc-to-s3.md @@ -23,19 +23,19 @@ connector-file-s3 ```bash cd "${SEATUNNEL_HOME}" sh bin/install-plugin.sh -ls connectors | rg 'connector-(jdbc|file-s3)' +ls connectors | grep -E 'connector-(jdbc|file-s3)' ``` 3. Put the source database JDBC driver into `${SEATUNNEL_HOME}/lib` for SeaTunnel Zeta, then confirm the jar is visible: ```bash -ls "${SEATUNNEL_HOME}/lib" | rg 'mysql-connector' +ls "${SEATUNNEL_HOME}/lib" | grep -E 'mysql-connector' ``` 4. Put `hadoop-aws` and the AWS SDK bundle required by the S3 connector into `${SEATUNNEL_HOME}/lib`, then confirm both jars are present: ```bash -ls "${SEATUNNEL_HOME}/lib" | rg 'hadoop-aws|aws-java-sdk-bundle' +ls "${SEATUNNEL_HOME}/lib" | grep -E 'hadoop-aws|aws-java-sdk-bundle' ``` 5. Prepare the source table in the relational database. This example uses MySQL and exports two rows from `analytics.orders`: diff --git a/docs/en/getting-started/recipes/kafka-to-iceberg.md b/docs/en/getting-started/recipes/kafka-to-iceberg.md index ab50c86758..c401641e3e 100644 --- a/docs/en/getting-started/recipes/kafka-to-iceberg.md +++ b/docs/en/getting-started/recipes/kafka-to-iceberg.md @@ -23,7 +23,7 @@ connector-iceberg ```bash cd "${SEATUNNEL_HOME}" sh bin/install-plugin.sh -ls connectors | rg 'connector-(kafka|iceberg)' +ls connectors | grep -E 'connector-(kafka|iceberg)' ``` 3. If you use Flink or Spark, add the Iceberg dependencies required by your environment, including `hive-exec` and `libfb303` when needed. diff --git a/docs/en/getting-started/recipes/multi-table-cdc.md b/docs/en/getting-started/recipes/multi-table-cdc.md index 9f49d3521e..c154359237 100644 --- a/docs/en/getting-started/recipes/multi-table-cdc.md +++ b/docs/en/getting-started/recipes/multi-table-cdc.md @@ -23,13 +23,13 @@ connector-jdbc ```bash cd "${SEATUNNEL_HOME}" sh bin/install-plugin.sh -ls connectors | rg 'connector-(cdc-mysql|jdbc)' +ls connectors | grep -E 'connector-(cdc-mysql|jdbc)' ``` 3. If you use SeaTunnel Zeta, place both the MySQL JDBC driver and the PostgreSQL JDBC driver into `${SEATUNNEL_HOME}/lib`, then confirm they are visible: ```bash -ls "${SEATUNNEL_HOME}/lib" | rg 'mysql-connector|postgresql' +ls "${SEATUNNEL_HOME}/lib" | grep -E 'mysql-connector|postgresql' ``` 4. Prepare the MySQL source tables. Each upstream table should have a stable primary key because this recipe routes CDC changes to downstream upsert tables automatically. diff --git a/docs/en/getting-started/recipes/mysql-cdc-to-doris.md b/docs/en/getting-started/recipes/mysql-cdc-to-doris.md index e5e2fab1b9..e559b9dcee 100644 --- a/docs/en/getting-started/recipes/mysql-cdc-to-doris.md +++ b/docs/en/getting-started/recipes/mysql-cdc-to-doris.md @@ -23,13 +23,13 @@ connector-doris ```bash cd "${SEATUNNEL_HOME}" sh bin/install-plugin.sh -ls connectors | rg 'connector-(cdc-mysql|doris)' +ls connectors | grep -E 'connector-(cdc-mysql|doris)' ``` 3. If you use SeaTunnel Zeta, download the MySQL JDBC driver and place it in `${SEATUNNEL_HOME}/lib`, then confirm the jar is visible: ```bash -ls "${SEATUNNEL_HOME}/lib" | rg 'mysql-connector' +ls "${SEATUNNEL_HOME}/lib" | grep -E 'mysql-connector' ``` If you use Flink or Spark instead of Zeta, put the same driver jar into the engine plugin directory that your runtime loads. diff --git a/docs/en/getting-started/submit-job-to-remote-zeta-cluster.md b/docs/en/getting-started/submit-job-to-remote-zeta-cluster.md index b31a763e63..b62b422436 100644 --- a/docs/en/getting-started/submit-job-to-remote-zeta-cluster.md +++ b/docs/en/getting-started/submit-job-to-remote-zeta-cluster.md @@ -58,10 +58,16 @@ See [REST API v2](../engines/zeta/rest-api-v2.md) for the complete request and r ```bash docker run -d --name seatunnel \ -p 8080:8080 \ - -e ST_DOCKER_MEMBER_COUNT=1 \ - apache/seatunnel:<version> + apache/seatunnel:<version> \ + ./bin/seatunnel-cluster.sh ``` +The published image defines no `ENTRYPOINT` or `CMD`, so the cluster startup script must be +passed as the container command (the same pattern as the [Docker quickstart](docker/docker.md)). +Without `-r`, `seatunnel-cluster.sh` starts the node with the default role `master_and_worker`, +so this single container is a working one-node cluster and no extra environment variables +are needed. + ### 3.2 Submit a job from outside the container ```bash @@ -83,7 +89,8 @@ curl -X POST http://localhost:8080/submit-job \ docker run -d --name seatunnel \ -p 8080:8080 \ -v /path/to/your/jobs:/jobs \ - apache/seatunnel:<version> + apache/seatunnel:<version> \ + ./bin/seatunnel-cluster.sh # Execute inside the container docker exec seatunnel \ @@ -100,6 +107,11 @@ inside that container process. ### 4.1 Docker Compose example +The cluster membership is passed to each container with the `ST_DOCKER_MEMBER_LIST` environment +variable (this is the only cluster-discovery environment variable the engine reads). Because the +image defines no `ENTRYPOINT`, each service also starts `seatunnel-cluster.sh` explicitly with +its role, the same as the compose file in the [Docker quickstart](docker/docker.md): + ```yaml version: "3.8" services: @@ -110,7 +122,11 @@ services: - "8080:8080" - "5801:5801" environment: - ST_DOCKER_MEMBER_COUNT: 2 + ST_DOCKER_MEMBER_LIST: seatunnel-master:5801,seatunnel-worker:5801 + entrypoint: > + /bin/sh -c " + /opt/seatunnel/bin/seatunnel-cluster.sh -r master + " networks: - st-net @@ -118,7 +134,11 @@ services: image: apache/seatunnel:<version> container_name: seatunnel-worker environment: - ST_DOCKER_MEMBER_COUNT: 2 + ST_DOCKER_MEMBER_LIST: seatunnel-master:5801,seatunnel-worker:5801 + entrypoint: > + /bin/sh -c " + /opt/seatunnel/bin/seatunnel-cluster.sh -r worker + " networks: - st-net depends_on: @@ -163,12 +183,14 @@ After deploying SeaTunnel to Kubernetes (see [Kubernetes Deployment](kubernetes/ master pod's REST port to your local machine: ```bash -# Find the master pod -kubectl get pods -n seatunnel +# Find the master pod (the Helm chart deploys master as a Deployment) +MASTER_POD=$(kubectl get pods -n seatunnel \ + -l app.kubernetes.io/name=seatunnel-master \ + -o jsonpath='{.items[0].metadata.name}') # Forward REST port kubectl port-forward -n seatunnel \ - pod/seatunnel-master-0 8080:8080 + pod/${MASTER_POD} 8080:8080 ``` In a second terminal, submit a job: @@ -179,31 +201,37 @@ curl -X POST http://localhost:8080/submit-job \ -d @job.json ``` -### 5.2 Using NodePort service (staging / production) +### 5.2 Using the master Service (default chart deployment) -If your cluster exposes the SeaTunnel master via a `NodePort` service: +The Helm chart only creates a headless Service for the master, so there is no separate REST +Service or NodePort out of the box. Forward the master Service's REST port to your local machine: ```bash -# Get the NodePort -kubectl get svc -n seatunnel seatunnel-master-rest +kubectl port-forward -n seatunnel svc/seatunnel-master 8080:8080 +``` + +In a second terminal, submit a job: -# Submit via node IP and node port -curl -X POST http://<node-ip>:<node-port>/submit-job \ +```bash +curl -X POST http://localhost:8080/submit-job \ -H "Content-Type: application/json" \ -d @job.json ``` -### 5.3 Using LoadBalancer service +### 5.3 Using an Ingress (staging / production) -```bash -LB_IP=$(kubectl get svc -n seatunnel seatunnel-master-rest \ - -o jsonpath='{.status.loadBalancer.ingress[0].ip}') +If you enable the chart's Ingress (`ingress.enabled: true`, see the +[Helm Chart Reference](kubernetes/helm.md)), submit jobs through the Ingress host instead: -curl -X POST http://${LB_IP}:8080/submit-job \ +```bash +curl -X POST http://<your-ingress-host>/submit-job \ -H "Content-Type: application/json" \ -d @job.json ``` +If you expose the REST API with your own `NodePort` or `LoadBalancer` Service, submit to that +Service's address the same way. + --- ## 6. Kubernetes: Job Configuration via ConfigMap @@ -246,10 +274,15 @@ volumes: name: seatunnel-job-config ``` -Then submit via `kubectl exec`: +Then submit via `kubectl exec` (`${MASTER_POD}` is only defined in section 5.1, so repeat the +lookup here if you jumped straight to this section): ```bash -kubectl exec -n seatunnel seatunnel-master-0 -- \ +MASTER_POD=$(kubectl get pods -n seatunnel \ + -l app.kubernetes.io/name=seatunnel-master \ + -o jsonpath='{.items[0].metadata.name}') + +kubectl exec -n seatunnel ${MASTER_POD} -- \ /opt/seatunnel/bin/seatunnel.sh \ --config /opt/seatunnel/jobs/cdc-job.conf ``` @@ -260,42 +293,54 @@ kubectl exec -n seatunnel seatunnel-master-0 -- \ ### 7.1 Helm install +The SeaTunnel Helm chart is published as an OCI artifact on Docker Hub (there is no +`https://apache.github.io/seatunnel-helm-charts` chart repository): + ```bash -helm repo add seatunnel https://apache.github.io/seatunnel-helm-charts -helm repo update +# Keep the chart version in sync with kubernetes/helm.md +export VERSION=3.1.0 +helm pull oci://registry-1.docker.io/apache/seatunnel-helm --version ${VERSION} +tar -xvf seatunnel-helm-${VERSION}.tgz +cd seatunnel-helm -helm install seatunnel seatunnel/seatunnel \ +helm install seatunnel . \ --namespace seatunnel \ - --create-namespace \ - --set master.replicaCount=2 \ - --set worker.replicaCount=4 \ - --set master.service.type=LoadBalancer + --create-namespace ``` -### 7.2 EKS-specific: retrieve the load balancer hostname +Scale masters and workers with the `master.replicas` and `worker.replicas` values: ```bash -kubectl get svc -n seatunnel seatunnel-master \ - -o jsonpath='{.status.loadBalancer.ingress[0].hostname}' +helm upgrade seatunnel . --namespace seatunnel \ + --set master.replicas=2 \ + --set worker.replicas=4 ``` -Use that hostname as the API endpoint: +### 7.2 EKS-specific: reaching the REST API + +The default chart creates only headless Services, so there is no automatically provisioned load +balancer. Either enable the chart Ingress and read its address: ```bash -export ST_HOST=$(kubectl get svc -n seatunnel seatunnel-master \ - -o jsonpath='{.status.loadBalancer.ingress[0].hostname}') +kubectl get ingress -n seatunnel +``` + +and use that host as the API endpoint: -curl -X POST http://${ST_HOST}:8080/submit-job \ +```bash +curl -X POST http://<your-ingress-host>/submit-job \ -H "Content-Type: application/json" \ -d @job.json ``` +or use `kubectl port-forward svc/seatunnel-master 8080:8080` as shown in section 5.2. + ### 7.3 Customizing resources via Helm values ```yaml # values-prod.yaml master: - replicaCount: 2 + replicas: "2" resources: requests: memory: "4Gi" @@ -305,7 +350,7 @@ master: cpu: "4" worker: - replicaCount: 8 + replicas: "8" resources: requests: memory: "8Gi" @@ -313,22 +358,18 @@ worker: limits: memory: "16Gi" cpu: "8" - -seatunnel: - config: - engine: - backup-count: 2 - queue-type: blockingqueue - print-execution-info-interval: 60 - http: - enable-http: true - port: 8080 ``` +The chart has no `seatunnel.config` values tree. To customize engine files such as +`seatunnel.yaml` or `hazelcast*.yaml`, let the chart generate the ConfigMap from the chart's +`conf/` files (default), or ship your own ConfigMap and set `configMap.create: false` plus +`configMap.existingConfigMapName` — see the chart's `values.yaml` and the +[Helm Chart Reference](kubernetes/helm.md). + Apply with: ```bash -helm upgrade seatunnel seatunnel/seatunnel \ +helm upgrade seatunnel . \ --namespace seatunnel \ -f values-prod.yaml ``` @@ -359,7 +400,7 @@ spec: - from: - namespaceSelector: matchLabels: - name: seatunnel + kubernetes.io/metadata.name: seatunnel ports: - port: 5801 ``` @@ -374,7 +415,7 @@ spec: | Workers not joining the cluster | Firewall blocks port 5801 | Open TCP 5801 between all cluster nodes | | `kubectl port-forward` disconnects | Idle timeout or pod restart | Restart port-forward; consider NodePort instead | | Job submitted but status always `WAITING` | No available worker slots | Scale up worker replicas or check resource quotas | -| EKS LoadBalancer hostname not resolving | DNS propagation delay | Wait 1–2 minutes; verify with `nslookup` | +| EKS Ingress hostname not resolving | DNS propagation delay | Wait 1–2 minutes; verify with `nslookup` | | Helm install fails with `pending-install` | Previous failed release | Run `helm rollback` or `helm uninstall` then retry | --- diff --git a/docs/en/introduction/concepts/config.md b/docs/en/introduction/concepts/config.md index 85e5db9d28..ed9471be8b 100644 --- a/docs/en/introduction/concepts/config.md +++ b/docs/en/introduction/concepts/config.md @@ -305,7 +305,7 @@ transform { sql { plugin_input = "fake_test_table" plugin_output = "sql" - query = "select * from dual where name = 'abc' " + query = "select * from fake_test_table where name = 'abc' " } } diff --git a/docs/en/introduction/concepts/gravitino-type-mapping.md b/docs/en/introduction/concepts/gravitino-type-mapping.md index bcd159ccfa..0fd73ba7eb 100644 --- a/docs/en/introduction/concepts/gravitino-type-mapping.md +++ b/docs/en/introduction/concepts/gravitino-type-mapping.md @@ -85,5 +85,3 @@ Gravitino indexes are mapped to SeaTunnel constraints: - [Gravitino Column Types](https://gravitino.apache.org/docs/1.1.0/manage-relational-metadata-using-gravitino/#apache-gravitino-table-column-type) - [Schema Feature](./schema-feature.md) -- SeaTunnel Data Types -- [SeaTunnel Data Types](./schema-feature.md) diff --git a/docs/en/introduction/configuration/config-encryption-decryption.md b/docs/en/introduction/configuration/config-encryption-decryption.md index 432b114bea..96c7267dfc 100644 --- a/docs/en/introduction/configuration/config-encryption-decryption.md +++ b/docs/en/introduction/configuration/config-encryption-decryption.md @@ -24,7 +24,7 @@ for example `access.key`, `access_key`, and `access-key` can share the same mask Next, I'll show how to quickly use SeaTunnel's own `base64` encryption: -1. And new option `shade.identifier` and `shade.options` in env block of config file, `shade.identifier` indicate what the encryption method that you want to use, while `shade.options` specifies which parameters should be encrypted/decrypted. In this example, we should add `shade.identifier = base64` in config as the following shown: +1. Add new option `shade.identifier` and `shade.options` in env block of config file, `shade.identifier` indicate what the encryption method that you want to use, while `shade.options` specifies which parameters should be encrypted/decrypted. In this example, we should add `shade.identifier = base64` in config as the following shown: ```hocon # diff --git a/docs/en/transforms/rowkind-extractor.md b/docs/en/transforms/rowkind-extractor.md index 214b215311..025284db61 100644 --- a/docs/en/transforms/rowkind-extractor.md +++ b/docs/en/transforms/rowkind-extractor.md @@ -24,11 +24,13 @@ Input (CDC data): RowKind: -D (DELETE) Data: id=1, name="test1", age=20 -Output (Append-Only data): +Output (Append-Only data, with the default `transform_type = SHORT`): RowKind: +I (INSERT) - Data: id=1, name="test1", age=20, row_kind="DELETE" + Data: id=1, name="test1", age=20, row_kind="-D" ``` +With `transform_type = FULL`, the field stores the full name instead: `row_kind="DELETE"`. + **Typical Use Cases:** - Writing CDC data to data lakes that only support Append mode - Preserving complete change history in data warehouses diff --git a/docs/en/transforms/sql-udf.md b/docs/en/transforms/sql-udf.md index bc331b7051..e37e22bc6b 100644 --- a/docs/en/transforms/sql-udf.md +++ b/docs/en/transforms/sql-udf.md @@ -11,7 +11,7 @@ Use UDF SPI to extend the SQL transform functions lib. ```java package org.apache.seatunnel.transform.sql.zeta; -public interface ZetaUDF { +public interface ZetaUDF extends Serializable { /** * Function name * diff --git a/docs/zh/getting-started/docker/docker.md b/docs/zh/getting-started/docker/docker.md index 7163f7f831..d0893e77e5 100644 --- a/docs/zh/getting-started/docker/docker.md +++ b/docs/zh/getting-started/docker/docker.md @@ -49,7 +49,7 @@ docker images | grep apache/seatunnel ##### 分步骤构建 ```shell # Build binary package from source code -mvn clean package -DskipTests -Dskip.spotless=true +sh ./mvnw clean package -DskipTests -Dskip.spotless=true # Build docker image cd seatunnel-dist @@ -138,8 +138,10 @@ docker run --rm -it apache/seatunnel bash ./bin/start-seatunnel-spark-3-connecto ```shell # flink version between `1.12.x` and `1.14.x` docker run --rm -it apache/seatunnel bash -c '<YOUR_FLINK_HOME>/bin/start-cluster.sh && ./bin/start-seatunnel-flink-13-connector-v2.sh -c config/v2.streaming.conf.template' -# flink version between `1.15.x` and `1.16.x` +# flink version between `1.15.x` and `1.18.x` docker run --rm -it apache/seatunnel bash -c '<YOUR_FLINK_HOME>/bin/start-cluster.sh && ./bin/start-seatunnel-flink-15-connector-v2.sh -c config/v2.streaming.conf.template' +# flink version `1.20.x` +docker run --rm -it apache/seatunnel bash -c '<YOUR_FLINK_HOME>/bin/start-cluster.sh && ./bin/start-seatunnel-flink-20-connector-v2.sh -c config/v2.streaming.conf.template' ``` @@ -237,6 +239,7 @@ services: " ports: - "5801:5801" + - "8080:8080" networks: - seatunnel_network @@ -280,7 +283,7 @@ networks: 启动完成后,可以运行`docker logs -f seatunnel_master`, `docker logs -f seatunnel_worker_1`来查看节点的日志 -当你访问`http://localhost:5801/hazelcast/rest/maps/system-monitoring-information` 时,可以看到集群的状态为1个master节点,2个worker节点. +当你访问`http://localhost:8080/system-monitoring-information` 时,可以看到集群的状态为1个master节点,2个worker节点. #### 集群扩容 当你需要对集群扩容, 例如需要添加一个worker节点时 @@ -299,6 +302,7 @@ services: " ports: - "5801:5801" + - "8080:8080" networks: - seatunnel_network diff --git a/docs/zh/getting-started/kubernetes/hybrid-cluster-mode.md b/docs/zh/getting-started/kubernetes/hybrid-cluster-mode.md index 38ff8eea46..bb82b6a39d 100644 --- a/docs/zh/getting-started/kubernetes/hybrid-cluster-mode.md +++ b/docs/zh/getting-started/kubernetes/hybrid-cluster-mode.md @@ -244,8 +244,6 @@ spec: env: - name: SEATUNNEL_HOME value: /opt/seatunnel - - name: HAZELCAST_CLUSTER_NAME - value: seatunnel-cluster ports: - containerPort: 8080 name: rest-api diff --git a/docs/zh/getting-started/kubernetes/separated-cluster-mode.md b/docs/zh/getting-started/kubernetes/separated-cluster-mode.md index 207b335e1d..889c6d2fb4 100644 --- a/docs/zh/getting-started/kubernetes/separated-cluster-mode.md +++ b/docs/zh/getting-started/kubernetes/separated-cluster-mode.md @@ -334,8 +334,6 @@ spec: env: - name: SEATUNNEL_HOME value: /opt/seatunnel - - name: HAZELCAST_CLUSTER_NAME - value: seatunnel-cluster ports: - containerPort: 8080 name: rest-api @@ -407,8 +405,6 @@ spec: env: - name: SEATUNNEL_HOME value: /opt/seatunnel - - name: HAZELCAST_CLUSTER_NAME - value: seatunnel-cluster ports: - containerPort: 8080 name: rest-api diff --git a/docs/zh/getting-started/locally/deployment.md b/docs/zh/getting-started/locally/deployment.md index 63a32d4fb0..ed3f628ab4 100644 --- a/docs/zh/getting-started/locally/deployment.md +++ b/docs/zh/getting-started/locally/deployment.md @@ -1,5 +1,5 @@ --- -sidebar_position: 1 +sidebar_position: 5 --- import Tabs from '@theme/Tabs'; @@ -27,6 +27,19 @@ wget "https://archive.apache.org/dist/seatunnel/${version}/apache-seatunnel-${ve tar -xzvf "apache-seatunnel-${version}-bin.tar.gz" ``` +在 Windows 上,可以从 [SeaTunnel下载页面](https://seatunnel.apache.org/download) 下载 `.tar.gz` 压缩包, +然后使用 Windows 10 1803+ 自带的 `tar` 工具解压。archive.apache.org 上只发布 `.tar.gz` 包, +没有 `.zip` 发布包: + +```powershell +$version = "3.1.0" +Invoke-WebRequest ` + "https://archive.apache.org/dist/seatunnel/$version/apache-seatunnel-$version-bin.tar.gz" ` + -OutFile "apache-seatunnel-$version-bin.tar.gz" +tar -xzf "apache-seatunnel-$version-bin.tar.gz" +Set-Location "apache-seatunnel-$version" +``` + ### 下载连接器插件 从2.2.0-beta版本开始,二进制包不再默认提供连接器依赖,因此在第一次使用时,您需要执行以下命令来安装连接器:(当然,您也可以从 [Apache Maven Repository](https://repo.maven.apache.org/maven2/org/apache/seatunnel/) 手动下载连接器,然后将其移动至`connectors/`目录下,如果是2.3.5之前则需要放入`connectors/seatunnel`目录下)。 diff --git a/docs/zh/getting-started/locally/quick-start-flink.md b/docs/zh/getting-started/locally/quick-start-flink.md index 7a6cb6737b..2cdd8aea3c 100644 --- a/docs/zh/getting-started/locally/quick-start-flink.md +++ b/docs/zh/getting-started/locally/quick-start-flink.md @@ -92,6 +92,13 @@ cd "apache-seatunnel-${version}" ./bin/start-seatunnel-flink-15-connector-v2.sh --config ./config/v2.streaming.conf.template ``` +Flink版本`1.20.x` + +```shell +cd "apache-seatunnel-${version}" +./bin/start-seatunnel-flink-20-connector-v2.sh --config ./config/v2.streaming.conf.template +``` + **查看输出**: 当您运行该命令时,您可以在控制台中看到它的输出。您可以认为这是命令运行成功或失败的标志。 SeaTunnel控制台将会打印一些如下日志信息: diff --git a/docs/zh/getting-started/locally/quick-start-seatunnel-engine.md b/docs/zh/getting-started/locally/quick-start-seatunnel-engine.md index 9fc7cf38f2..08c6d24dca 100644 --- a/docs/zh/getting-started/locally/quick-start-seatunnel-engine.md +++ b/docs/zh/getting-started/locally/quick-start-seatunnel-engine.md @@ -36,6 +36,12 @@ connector-console sh bin/install-plugin.sh ``` +在 Windows 上,请改用批处理脚本: + +```bat +bin\install-plugin.cmd +``` + ### 步骤 1: 部署SeaTunnel及连接器 在开始前,请确保您已经按照[部署](deployment.md)中的描述下载并部署了SeaTunnel。 @@ -103,6 +109,13 @@ cd "apache-seatunnel-${version}" ``` +在 Windows 上,请在 SeaTunnel 目录下运行对应的批处理入口: + +```bat +cd apache-seatunnel-3.0.0 +bin\seatunnel.cmd --config config\v2.batch.config.template -m local +``` + **查看输出**: 当您运行该命令时,您可以在控制台中看到它的输出。您可以认为这是命令运行成功或失败的标志。 SeaTunnel控制台将会打印一些如下日志信息: @@ -220,7 +233,7 @@ Total Failed Count : 0 :::tip -如果您想优化自己的作业,请参照连接器使用文档 +如果您想优化自己的作业,请参照 [Source-MySQL](../../connectors/source/Mysql.md) 和 [Sink-Doris](../../connectors/sink/Doris.md) 的连接器使用文档。 ::: diff --git a/docs/zh/getting-started/locally/run-your-first-job.md b/docs/zh/getting-started/locally/run-your-first-job.md index 8a1b50cd8f..60331d9eb4 100644 --- a/docs/zh/getting-started/locally/run-your-first-job.md +++ b/docs/zh/getting-started/locally/run-your-first-job.md @@ -27,7 +27,7 @@ connector-console ```bash cd "${SEATUNNEL_HOME}" sh bin/install-plugin.sh -ls connectors | rg 'connector-(fake|console)' +ls connectors | grep -E 'connector-(fake|console)' ``` ## 步骤 3:使用最小可运行配置 diff --git a/docs/zh/getting-started/recipes/file-to-starrocks.md b/docs/zh/getting-started/recipes/file-to-starrocks.md index 9662c95308..7c370e2f32 100644 --- a/docs/zh/getting-started/recipes/file-to-starrocks.md +++ b/docs/zh/getting-started/recipes/file-to-starrocks.md @@ -23,13 +23,13 @@ connector-starrocks ```bash cd "${SEATUNNEL_HOME}" sh bin/install-plugin.sh -ls connectors | rg 'connector-(file-local|starrocks)' +ls connectors | grep -E 'connector-(file-local|starrocks)' ``` 3. 把 StarRocks sink 依赖的 MySQL JDBC 驱动放进 `${SEATUNNEL_HOME}/lib`,并确认 jar 已经落盘: ```bash -ls "${SEATUNNEL_HOME}/lib" | rg 'mysql-connector' +ls "${SEATUNNEL_HOME}/lib" | grep -E 'mysql-connector' ``` 4. 先准备本地输入文件,并确保 SeaTunnel 进程能读到它: diff --git a/docs/zh/getting-started/recipes/http-to-jdbc.md b/docs/zh/getting-started/recipes/http-to-jdbc.md index 5aa6873ae8..9f5fbafdac 100644 --- a/docs/zh/getting-started/recipes/http-to-jdbc.md +++ b/docs/zh/getting-started/recipes/http-to-jdbc.md @@ -23,13 +23,13 @@ connector-jdbc ```bash cd "${SEATUNNEL_HOME}" sh bin/install-plugin.sh -ls connectors | rg 'connector-(http-base|jdbc)' +ls connectors | grep -E 'connector-(http-base|jdbc)' ``` 3. 把目标数据库 JDBC 驱动放进 `${SEATUNNEL_HOME}/lib`,并确认 jar 已经落盘: ```bash -ls "${SEATUNNEL_HOME}/lib" | rg 'postgresql' +ls "${SEATUNNEL_HOME}/lib" | grep -E 'postgresql' ``` 4. 运行任务前,先看一眼 HTTP 返回内容。这里直接使用 [Http Source](../../connectors/source/Http.md) 里的示例接口,返回 JSON 顶层应该能看到 `c_string` 和 `c_int` 这些字段: diff --git a/docs/zh/getting-started/recipes/jdbc-to-jdbc.md b/docs/zh/getting-started/recipes/jdbc-to-jdbc.md index 1b9fd11874..12c5cd44e3 100644 --- a/docs/zh/getting-started/recipes/jdbc-to-jdbc.md +++ b/docs/zh/getting-started/recipes/jdbc-to-jdbc.md @@ -22,7 +22,7 @@ connector-jdbc ```bash cd "${SEATUNNEL_HOME}" sh bin/install-plugin.sh -ls connectors | rg 'connector-jdbc' +ls connectors | grep -E 'connector-jdbc' ``` `Sql` transform 已包含在 SeaTunnel 发布包中,不需要再添加 connector 配置。 @@ -30,7 +30,7 @@ ls connectors | rg 'connector-jdbc' 3. 把两个数据库的驱动都放入 `${SEATUNNEL_HOME}/lib`,然后确认 SeaTunnel 可以看到它们: ```bash -ls "${SEATUNNEL_HOME}/lib" | rg 'mysql-connector|postgresql' +ls "${SEATUNNEL_HOME}/lib" | grep -E 'mysql-connector|postgresql' ``` 4. 创建 MySQL 源表,并插入三条固定数据: diff --git a/docs/zh/getting-started/recipes/jdbc-to-s3.md b/docs/zh/getting-started/recipes/jdbc-to-s3.md index 2ea7a42e79..0945280250 100644 --- a/docs/zh/getting-started/recipes/jdbc-to-s3.md +++ b/docs/zh/getting-started/recipes/jdbc-to-s3.md @@ -23,19 +23,19 @@ connector-file-s3 ```bash cd "${SEATUNNEL_HOME}" sh bin/install-plugin.sh -ls connectors | rg 'connector-(jdbc|file-s3)' +ls connectors | grep -E 'connector-(jdbc|file-s3)' ``` 3. 把源端数据库 JDBC 驱动放进 `${SEATUNNEL_HOME}/lib`,并确认 jar 已经落盘: ```bash -ls "${SEATUNNEL_HOME}/lib" | rg 'mysql-connector' +ls "${SEATUNNEL_HOME}/lib" | grep -E 'mysql-connector' ``` 4. 把 S3 连接器依赖的 `hadoop-aws` 和 AWS SDK bundle 也放进 `${SEATUNNEL_HOME}/lib`,然后确认这两个依赖都能看到: ```bash -ls "${SEATUNNEL_HOME}/lib" | rg 'hadoop-aws|aws-java-sdk-bundle' +ls "${SEATUNNEL_HOME}/lib" | grep -E 'hadoop-aws|aws-java-sdk-bundle' ``` 5. 先准备源端数据库表。这个示例使用 MySQL,并从 `analytics.orders` 导出两条数据: diff --git a/docs/zh/getting-started/recipes/kafka-to-iceberg.md b/docs/zh/getting-started/recipes/kafka-to-iceberg.md index bb056feba8..0d205daa24 100644 --- a/docs/zh/getting-started/recipes/kafka-to-iceberg.md +++ b/docs/zh/getting-started/recipes/kafka-to-iceberg.md @@ -23,7 +23,7 @@ connector-iceberg ```bash cd "${SEATUNNEL_HOME}" sh bin/install-plugin.sh -ls connectors | rg 'connector-(kafka|iceberg)' +ls connectors | grep -E 'connector-(kafka|iceberg)' ``` 3. 如果你使用 Flink 或 Spark,请补齐 Iceberg 在对应环境里需要的依赖,例如 `hive-exec` 和 `libfb303`。 diff --git a/docs/zh/getting-started/recipes/multi-table-cdc.md b/docs/zh/getting-started/recipes/multi-table-cdc.md index 0a5e30c1cc..173ca7c19f 100644 --- a/docs/zh/getting-started/recipes/multi-table-cdc.md +++ b/docs/zh/getting-started/recipes/multi-table-cdc.md @@ -23,13 +23,13 @@ connector-jdbc ```bash cd "${SEATUNNEL_HOME}" sh bin/install-plugin.sh -ls connectors | rg 'connector-(cdc-mysql|jdbc)' +ls connectors | grep -E 'connector-(cdc-mysql|jdbc)' ``` 3. 如果你用的是 SeaTunnel Zeta,再把 MySQL JDBC 驱动和 PostgreSQL JDBC 驱动都放进 `${SEATUNNEL_HOME}/lib`,并确认 jar 已经能看到: ```bash -ls "${SEATUNNEL_HOME}/lib" | rg 'mysql-connector|postgresql' +ls "${SEATUNNEL_HOME}/lib" | grep -E 'mysql-connector|postgresql' ``` 4. 先准备 MySQL 源表。因为这条链路会自动把 CDC 事件路由到下游 upsert 表,所以每张上游表都要有稳定主键。 diff --git a/docs/zh/getting-started/recipes/mysql-cdc-to-doris.md b/docs/zh/getting-started/recipes/mysql-cdc-to-doris.md index c3f0f32d6b..e185aee5d0 100644 --- a/docs/zh/getting-started/recipes/mysql-cdc-to-doris.md +++ b/docs/zh/getting-started/recipes/mysql-cdc-to-doris.md @@ -23,13 +23,13 @@ connector-doris ```bash cd "${SEATUNNEL_HOME}" sh bin/install-plugin.sh -ls connectors | rg 'connector-(cdc-mysql|doris)' +ls connectors | grep -E 'connector-(cdc-mysql|doris)' ``` 3. 如果你用的是 SeaTunnel Zeta,再把 MySQL JDBC 驱动放进 `${SEATUNNEL_HOME}/lib`,并确认 jar 已经落盘: ```bash -ls "${SEATUNNEL_HOME}/lib" | rg 'mysql-connector' +ls "${SEATUNNEL_HOME}/lib" | grep -E 'mysql-connector' ``` 如果你用的是 Flink 或 Spark,就把同一个驱动 jar 放到对应引擎实际加载的插件目录里。 diff --git a/docs/zh/getting-started/submit-job-to-remote-zeta-cluster.md b/docs/zh/getting-started/submit-job-to-remote-zeta-cluster.md index 3a3b3001ff..659c0191db 100644 --- a/docs/zh/getting-started/submit-job-to-remote-zeta-cluster.md +++ b/docs/zh/getting-started/submit-job-to-remote-zeta-cluster.md @@ -56,10 +56,15 @@ curl -X POST http://192.168.1.100:8080/submit-job \ ```bash docker run -d --name seatunnel \ -p 8080:8080 \ - -e ST_DOCKER_MEMBER_COUNT=1 \ - apache/seatunnel:<version> + apache/seatunnel:<version> \ + ./bin/seatunnel-cluster.sh ``` +官方镜像没有定义 `ENTRYPOINT` 或 `CMD`,因此必须把集群启动脚本作为容器命令显式传入 +(与 [Docker 快速开始](docker/docker.md) 中的写法一致)。不带 `-r` 参数时, +`seatunnel-cluster.sh` 默认以 `master_and_worker` 角色启动节点,因此这个单容器就是 +一个可用的单节点集群,无需额外环境变量。 + ### 3.2 从容器外部提交作业 ```bash @@ -81,7 +86,8 @@ curl -X POST http://localhost:8080/submit-job \ docker run -d --name seatunnel \ -p 8080:8080 \ -v /path/to/your/jobs:/jobs \ - apache/seatunnel:<version> + apache/seatunnel:<version> \ + ./bin/seatunnel-cluster.sh # 在容器内执行 docker exec seatunnel \ @@ -97,6 +103,10 @@ docker exec seatunnel \ ### 4.1 Docker Compose 示例 +集群成员列表通过 `ST_DOCKER_MEMBER_LIST` 环境变量传给每个容器(这是引擎唯一读取的集群发现环境变量)。 +由于镜像没有定义 `ENTRYPOINT`,每个服务还需要显式以各自角色启动 `seatunnel-cluster.sh`, +与 [Docker 快速开始](docker/docker.md) 中的 compose 文件一致: + ```yaml version: "3.8" services: @@ -107,7 +117,11 @@ services: - "8080:8080" - "5801:5801" environment: - ST_DOCKER_MEMBER_COUNT: 2 + ST_DOCKER_MEMBER_LIST: seatunnel-master:5801,seatunnel-worker:5801 + entrypoint: > + /bin/sh -c " + /opt/seatunnel/bin/seatunnel-cluster.sh -r master + " networks: - st-net @@ -115,7 +129,11 @@ services: image: apache/seatunnel:<version> container_name: seatunnel-worker environment: - ST_DOCKER_MEMBER_COUNT: 2 + ST_DOCKER_MEMBER_LIST: seatunnel-master:5801,seatunnel-worker:5801 + entrypoint: > + /bin/sh -c " + /opt/seatunnel/bin/seatunnel-cluster.sh -r worker + " networks: - st-net depends_on: @@ -159,12 +177,14 @@ curl -X POST http://localhost:8080/submit-job \ Pod 的 REST 端口转发到本地: ```bash -# 查找 master pod -kubectl get pods -n seatunnel +# 查找 master pod(Helm chart 以 Deployment 方式部署 master) +MASTER_POD=$(kubectl get pods -n seatunnel \ + -l app.kubernetes.io/name=seatunnel-master \ + -o jsonpath='{.items[0].metadata.name}') # 转发 REST 端口 kubectl port-forward -n seatunnel \ - pod/seatunnel-master-0 8080:8080 + pod/${MASTER_POD} 8080:8080 ``` 在另一个终端提交作业: @@ -175,31 +195,37 @@ curl -X POST http://localhost:8080/submit-job \ -d @job.json ``` -### 5.2 使用 NodePort 服务(测试 / 生产) +### 5.2 通过 master Service 提交(默认 chart 部署) -若集群通过 `NodePort` 服务暴露 Master: +Helm chart 默认只为 master 创建 headless Service,不会额外创建 REST Service 或 NodePort。 +将 master Service 的 REST 端口转发到本地: ```bash -# 获取 NodePort -kubectl get svc -n seatunnel seatunnel-master-rest +kubectl port-forward -n seatunnel svc/seatunnel-master 8080:8080 +``` + +在另一个终端提交作业: -# 使用节点 IP 和节点端口提交 -curl -X POST http://<node-ip>:<node-port>/submit-job \ +```bash +curl -X POST http://localhost:8080/submit-job \ -H "Content-Type: application/json" \ -d @job.json ``` -### 5.3 使用 LoadBalancer 服务 +### 5.3 通过 Ingress 提交(测试 / 生产) -```bash -LB_IP=$(kubectl get svc -n seatunnel seatunnel-master-rest \ - -o jsonpath='{.status.loadBalancer.ingress[0].ip}') +如果启用了 chart 的 Ingress(`ingress.enabled: true`,参见 [Helm Chart 参考](kubernetes/helm.md)), +可以直接通过 Ingress 主机提交作业: -curl -X POST http://${LB_IP}:8080/submit-job \ +```bash +curl -X POST http://<your-ingress-host>/submit-job \ -H "Content-Type: application/json" \ -d @job.json ``` +如果你自行创建了 `NodePort` 或 `LoadBalancer` 类型的 Service 来暴露 REST API,按同样的方式向该 +Service 地址提交即可。 + --- ## 6. Kubernetes:通过 ConfigMap 管理作业配置 @@ -241,10 +267,14 @@ volumes: name: seatunnel-job-config ``` -通过 `kubectl exec` 提交: +通过 `kubectl exec` 提交(`${MASTER_POD}` 只在 5.1 节定义过,如果直接从本节开始,请先重复一次查找): ```bash -kubectl exec -n seatunnel seatunnel-master-0 -- \ +MASTER_POD=$(kubectl get pods -n seatunnel \ + -l app.kubernetes.io/name=seatunnel-master \ + -o jsonpath='{.items[0].metadata.name}') + +kubectl exec -n seatunnel ${MASTER_POD} -- \ /opt/seatunnel/bin/seatunnel.sh \ --config /opt/seatunnel/jobs/cdc-job.conf ``` @@ -255,42 +285,53 @@ kubectl exec -n seatunnel seatunnel-master-0 -- \ ### 7.1 Helm 安装 +SeaTunnel 的 Helm chart 以 OCI 构件形式发布在 Docker Hub 上(不存在 +`https://apache.github.io/seatunnel-helm-charts` 这个 chart 仓库): + ```bash -helm repo add seatunnel https://apache.github.io/seatunnel-helm-charts -helm repo update +# 版本号请与 kubernetes/helm.md 保持一致 +export VERSION=3.1.0 +helm pull oci://registry-1.docker.io/apache/seatunnel-helm --version ${VERSION} +tar -xvf seatunnel-helm-${VERSION}.tgz +cd seatunnel-helm -helm install seatunnel seatunnel/seatunnel \ +helm install seatunnel . \ --namespace seatunnel \ - --create-namespace \ - --set master.replicaCount=2 \ - --set worker.replicaCount=4 \ - --set master.service.type=LoadBalancer + --create-namespace ``` -### 7.2 EKS 获取 Load Balancer 主机名 +使用 `master.replicas` 和 `worker.replicas` 调整 master / worker 副本数: ```bash -kubectl get svc -n seatunnel seatunnel-master \ - -o jsonpath='{.status.loadBalancer.ingress[0].hostname}' +helm upgrade seatunnel . --namespace seatunnel \ + --set master.replicas=2 \ + --set worker.replicas=4 ``` -以该主机名作为 API 端点: +### 7.2 EKS 访问 REST API + +默认 chart 只创建 headless Service,不会自动创建负载均衡器。可以启用 chart 的 Ingress 后读取其地址: ```bash -export ST_HOST=$(kubectl get svc -n seatunnel seatunnel-master \ - -o jsonpath='{.status.loadBalancer.ingress[0].hostname}') +kubectl get ingress -n seatunnel +``` + +以该主机作为 API 端点: -curl -X POST http://${ST_HOST}:8080/submit-job \ +```bash +curl -X POST http://<your-ingress-host>/submit-job \ -H "Content-Type: application/json" \ -d @job.json ``` +或者按照 5.2 节的方式使用 `kubectl port-forward svc/seatunnel-master 8080:8080`。 + ### 7.3 通过 Helm values 自定义资源配置 ```yaml # values-prod.yaml master: - replicaCount: 2 + replicas: "2" resources: requests: memory: "4Gi" @@ -300,7 +341,7 @@ master: cpu: "4" worker: - replicaCount: 8 + replicas: "8" resources: requests: memory: "8Gi" @@ -308,22 +349,17 @@ worker: limits: memory: "16Gi" cpu: "8" - -seatunnel: - config: - engine: - backup-count: 2 - queue-type: blockingqueue - print-execution-info-interval: 60 - http: - enable-http: true - port: 8080 ``` +chart 不存在 `seatunnel.config` 这个 values 配置树。若要自定义 `seatunnel.yaml`、`hazelcast*.yaml` +等引擎配置文件,可以使用 chart 自带 `conf/` 文件生成的 ConfigMap(默认行为),或自行创建 ConfigMap +并设置 `configMap.create: false` 与 `configMap.existingConfigMapName` —— 参见 chart 的 +`values.yaml` 和 [Helm Chart 参考](kubernetes/helm.md)。 + 应用配置: ```bash -helm upgrade seatunnel seatunnel/seatunnel \ +helm upgrade seatunnel . \ --namespace seatunnel \ -f values-prod.yaml ``` @@ -354,7 +390,7 @@ spec: - from: - namespaceSelector: matchLabels: - name: seatunnel + kubernetes.io/metadata.name: seatunnel ports: - port: 5801 ``` @@ -369,7 +405,7 @@ spec: | Worker 无法加入集群 | 防火墙阻断 5801 端口 | 开放所有集群节点间 TCP 5801 | | `kubectl port-forward` 断开 | 空闲超时或 Pod 重启 | 重新执行 port-forward;考虑改用 NodePort | | 作业已提交但状态始终为 `WAITING` | 无可用 Worker 槽位 | 扩容 Worker 副本数或检查资源配额 | -| EKS LoadBalancer 主机名无法解析 | DNS 传播延迟 | 等待 1–2 分钟;用 `nslookup` 验证 | +| EKS Ingress 主机名无法解析 | DNS 传播延迟 | 等待 1–2 分钟;用 `nslookup` 验证 | | Helm 安装卡在 `pending-install` | 上次安装失败残留 | 执行 `helm rollback` 或 `helm uninstall` 后重试 | --- diff --git a/docs/zh/introduction/concepts/config.md b/docs/zh/introduction/concepts/config.md index 627a42753f..52ffb947f3 100644 --- a/docs/zh/introduction/concepts/config.md +++ b/docs/zh/introduction/concepts/config.md @@ -306,7 +306,7 @@ transform { sql { plugin_input = "fake_test_table" plugin_output = "sql" - query = "select * from dual where name = 'abc' " + query = "select * from fake_test_table where name = 'abc' " } } diff --git a/docs/zh/introduction/concepts/connector-v2-features.md b/docs/zh/introduction/concepts/connector-v2-features.md index d0894d3bfb..a67d59a35c 100644 --- a/docs/zh/introduction/concepts/connector-v2-features.md +++ b/docs/zh/introduction/concepts/connector-v2-features.md @@ -68,13 +68,13 @@ Sink connector有一些公共的核心特性,每个sink connector在不同程 对于sink connector,如果任何数据只写入目标一次,则sink connector支持精确一次。 通常有两种方法可以实现这一目标: * 目标数据库支持key去重。例如 `MySQL`, `Kudu`。 -* 目标支持 **XA 事务**(事务可以跨会话使用,即使创建事务的程序已经结束,新启动的程序也只需要知道最后一个事务的ID就可以重新提交或回滚事务)。 然后我们可以使用 **两阶段提交** 来确保 * 精确一次**。 例如:`File`, `MySQL`. +* 目标支持 **XA 事务**(事务可以跨会话使用,即使创建事务的程序已经结束,新启动的程序也只需要知道最后一个事务的ID就可以重新提交或回滚事务)。 然后我们可以使用 **两阶段提交** 来确保 **精确一次**。 例如:`File`, `MySQL`. ### cdc(更改数据捕获,change data capture) 如果sink connector支持基于主键写入行类型(INSERT/UPDATE_BEFORE/UPDATE_AFTER/DELETE),我们认为它支持cdc(更改数据捕获,change data capture)。 -### 支持多表读取 +### 支持多表写入 支持在一个 SeaTunnel 作业中写入多个表,用户可以通过[配置占位符](../configuration/sink-options-placeholders.md)动态指定表的标识符。 diff --git a/docs/zh/introduction/concepts/gravitino-type-mapping.md b/docs/zh/introduction/concepts/gravitino-type-mapping.md index 43f3f3a289..e03dbd8f61 100644 --- a/docs/zh/introduction/concepts/gravitino-type-mapping.md +++ b/docs/zh/introduction/concepts/gravitino-type-mapping.md @@ -85,5 +85,3 @@ Gravitino 索引映射到 SeaTunnel 约束: - [Gravitino 列类型](https://gravitino.apache.org/docs/1.1.0/manage-relational-metadata-using-gravitino/#apache-gravitino-table-column-type) - [Schema 特性](./schema-feature.md) -- SeaTunnel 数据类型 -- [SeaTunnel 数据类型](./schema-feature.md) diff --git a/docs/zh/introduction/configuration/config-encryption-decryption.md b/docs/zh/introduction/configuration/config-encryption-decryption.md index 6a1f5d649c..594ab0820c 100644 --- a/docs/zh/introduction/configuration/config-encryption-decryption.md +++ b/docs/zh/introduction/configuration/config-encryption-decryption.md @@ -23,8 +23,7 @@ Base64编码默认支持加密以下参数: 接下来,将展示如何快速使用 SeaTunnel 自带的 `base64` 加密功能: -1. 在配置文件的环境变量(env)部分新增了选项 `shade.identifier` 和 `shade.options`。`shade.identifier`用于表示您想要使用的加密方法,`shade.options`用于指定您想加解密的参数。 - 2. 在这个示例中,我们在配置文件中添加了 `shade.identifier = base64`,如下所示: +1. 在配置文件的环境变量(env)部分新增了选项 `shade.identifier` 和 `shade.options`。`shade.identifier`用于表示您想要使用的加密方法,`shade.options`用于指定您想加解密的参数。在这个示例中,我们在配置文件中添加了 `shade.identifier = base64`,如下所示: ```hocon # @@ -87,7 +86,7 @@ Base64编码默认支持加密以下参数: } } ``` -3. 通过Shell脚本调用不同的计算引擎来对配置文件进行加密操作。在本示例中,我们使用 Zeta 引擎对配置文件进行加密。 +2. 通过Shell脚本调用不同的计算引擎来对配置文件进行加密操作。在本示例中,我们使用 Zeta 引擎对配置文件进行加密。 ```shell ${SEATUNNEL_HOME}/bin/seatunnel.sh --config config/v2.batch.template --encrypt @@ -135,7 +134,7 @@ Base64编码默认支持加密以下参数: ] } ``` -4. 当然,不仅支持加密配置文件,还支持对配置文件的解密。如果用户想要查看解密后的配置文件,可以执行以下命令: +3. 当然,不仅支持加密配置文件,还支持对配置文件的解密。如果用户想要查看解密后的配置文件,可以执行以下命令: ```shell ${SEATUNNEL_HOME}/bin/seatunnel.sh --config config/v2.batch.template --decrypt diff --git a/docs/zh/introduction/configuration/sql-config.md b/docs/zh/introduction/configuration/sql-config.md index c6b50baf73..4f9e79d3aa 100644 --- a/docs/zh/introduction/configuration/sql-config.md +++ b/docs/zh/introduction/configuration/sql-config.md @@ -136,7 +136,7 @@ INSERT INTO sink_table SELECT source_table; ``` * `SELECT` 部分直接使用源端映射表的表名,表示将源端表的所有数据插入到目标端表中 -* 使用该语法不会生成`trasform`的相关配置,这种语法一般用在多表同步的场景,示例: +* 使用该语法不会生成`transform`的相关配置,这种语法一般用在多表同步的场景,示例: ```sql CREATE TABLE source_table WITH ( diff --git a/docs/zh/transforms/replace.md b/docs/zh/transforms/replace.md index cdefbff965..b1222f04ed 100644 --- a/docs/zh/transforms/replace.md +++ b/docs/zh/transforms/replace.md @@ -55,7 +55,7 @@ | Kin Dom | 20 | 123 | | Joy Dom | 20 | 123 | -我们想要将 `name` 字段中的字符 ``替换为 `_`。然后我们可以添加一个 `Replace` 转换,像这样: +我们想要将 `name` 字段中的字符 ` `(空格)替换为 `_`。然后我们可以添加一个 `Replace` 转换,像这样: ``` transform { diff --git a/docs/zh/transforms/rowkind-extractor.md b/docs/zh/transforms/rowkind-extractor.md index 5fb90b03cd..c0622f03e2 100644 --- a/docs/zh/transforms/rowkind-extractor.md +++ b/docs/zh/transforms/rowkind-extractor.md @@ -24,11 +24,13 @@ RowKindExtractor 转换插件用于将 CDC(Change Data Capture)数据流改 RowKind: -D (DELETE) 数据: id=1, name="test1", age=20 -输出(Append-Only 数据): +输出(Append-Only 数据,默认 `transform_type = SHORT`): RowKind: +I (INSERT) - 数据: id=1, name="test1", age=20, row_kind="DELETE" + 数据: id=1, name="test1", age=20, row_kind="-D" ``` +若设置 `transform_type = FULL`,该字段保存完整名称:`row_kind="DELETE"`。 + **典型应用场景:** - 将 CDC 数据写入只支持 Append 的数据湖 - 需要在数据仓库中保留完整的变更历史记录 diff --git a/docs/zh/transforms/sql-udf.md b/docs/zh/transforms/sql-udf.md index ee6c56a159..a2363b555a 100644 --- a/docs/zh/transforms/sql-udf.md +++ b/docs/zh/transforms/sql-udf.md @@ -11,7 +11,7 @@ ```java package org.apache.seatunnel.transform.sql.zeta; -public interface ZetaUDF { +public interface ZetaUDF extends Serializable { /** * Function name * @@ -130,7 +130,8 @@ public class ExampleUDF implements ZetaUDF { } ``` -打包UDF项目并将jar文件复制到路径:${SEATUNNEL_HOME}/lib +打包UDF项目并将jar文件复制到路径:`${SEATUNNEL_HOME}/lib`。如果您的 UDF 使用了第三方库,也需要将其放入 `${SEATUNNEL_HOME}/lib`。 +如果使用集群模式,您需要将相关 jar 放到所有节点的 `${SEATUNNEL_HOME}/lib` 目录下,并重启集群。 ## 支持上下文与生命周期的 UDF 示例
