You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by ma...@apache.org on 2026/01/19 16:42:17 UTC
(flink) branch release-1.15 updated (e78e3cd29aa -> ce716bf8086)
This is an automated email from the ASF dual-hosted git repository.
martijnvisser pushed a change to branch release-1.15
in repository https://gitbox.apache.org/repos/asf/flink.git
from e78e3cd29aa [hotfix][docs] Update KDA to MSF in vendor solutions docs
new f5fe53ecd25 [hotfix][docs] Fix broken refs
new d6bee5d2b11 [FLINK-38914][docs] Preserve page path when linking to stable version
new 9b1a65281e8 [FLINK-38914][docs] Add canonical tags pointing to stable docs
new 72253168721 [FLINK-38925][docs] Update Matomo URL to the right domain
new c5b53051dc3 [FLINK-38924][docs] Redirect users to documentation home page when encountering a 404
new e3ef3e0814d [hotfix][docs] Configures Apache to serve the custom 404.html page with proper 404 status code and always serve index.html for dirs
new ce716bf8086 [hotfix][docs] Fix git permission issue in Docker build
The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.github/workflows/docs.sh | 4 +-
.../docs/connectors/datastream/dynamodb.md | 171 ++++++++++++
docs/content.zh/docs/connectors/table/dynamodb.md | 306 +++++++++++++++++++++
.../resource-providers/standalone/overview.md | 8 +-
.../content/docs/connectors/datastream/dynamodb.md | 171 ++++++++++++
docs/content/docs/connectors/table/dynamodb.md | 306 +++++++++++++++++++++
docs/layouts/404.html | 119 ++++++++
docs/layouts/_default/baseof.html | 2 +-
.../partials/docs/inject/content-before.html | 6 +-
docs/layouts/partials/docs/inject/head.html | 10 +
.../archetype.properties => docs/static/.htaccess | 11 +-
11 files changed, 1101 insertions(+), 13 deletions(-)
create mode 100644 docs/content.zh/docs/connectors/datastream/dynamodb.md
create mode 100644 docs/content.zh/docs/connectors/table/dynamodb.md
create mode 100644 docs/content/docs/connectors/datastream/dynamodb.md
create mode 100644 docs/content/docs/connectors/table/dynamodb.md
create mode 100644 docs/layouts/404.html
copy flink-quickstart/flink-quickstart-scala/src/test/resources/projects/testArtifact/archetype.properties => docs/static/.htaccess (77%)
(flink) 04/07: [FLINK-38925][docs] Update Matomo URL to the right domain
Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
martijnvisser pushed a commit to branch release-1.15
in repository https://gitbox.apache.org/repos/asf/flink.git
commit 72253168721b1e7b36de296b3955fb90a99eb7d9
Author: Martijn Visser <29...@users.noreply.github.com>
AuthorDate: Thu Jan 15 14:21:30 2026 +0100
[FLINK-38925][docs] Update Matomo URL to the right domain
---
.github/workflows/docs.sh | 2 +-
docs/layouts/_default/baseof.html | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/docs.sh b/.github/workflows/docs.sh
index e99ddc311a8..3715060a15b 100755
--- a/.github/workflows/docs.sh
+++ b/.github/workflows/docs.sh
@@ -57,7 +57,7 @@ mvn javadoc:aggregate -B \
-Dcheckstyle.skip=true \
-Dspotless.check.skip=true \
-Denforcer.skip=true \
- -Dheader="<a href=\"http://flink.apache.org/\" target=\"_top\"><h1>Back to Flink Website</h1></a> <script>var _paq=window._paq=window._paq||[];_paq.push([\"disableCookies\"]),_paq.push([\"setDomains\",[\"*.flink.apache.org\",\"*.nightlies.apache.org/flink\"]]),_paq.push([\"trackPageView\"]),_paq.push([\"enableLinkTracking\"]),function(){var u=\"//matomo.privacy.apache.org/\";_paq.push([\"setTrackerUrl\",u+\"matomo.php\"]),_paq.push([\"setSiteId\",\"1\"]);var d=document, g=d.createEle [...]
+ -Dheader="<a href=\"http://flink.apache.org/\" target=\"_top\"><h1>Back to Flink Website</h1></a> <script>var _paq=window._paq=window._paq||[];_paq.push([\"disableCookies\"]),_paq.push([\"setDomains\",[\"*.flink.apache.org\",\"*.nightlies.apache.org/flink\"]]),_paq.push([\"trackPageView\"]),_paq.push([\"enableLinkTracking\"]),function(){var u=\"//analytics.apache.org/\";_paq.push([\"setTrackerUrl\",u+\"matomo.php\"]),_paq.push([\"setSiteId\",\"1\"]);var d=document, g=d.createElement( [...]
mv target/site/apidocs docs/target/api/java
pushd flink-scala
mvn scala:doc -B
diff --git a/docs/layouts/_default/baseof.html b/docs/layouts/_default/baseof.html
index f9b76002fa0..7ce1dad33e3 100644
--- a/docs/layouts/_default/baseof.html
+++ b/docs/layouts/_default/baseof.html
@@ -34,7 +34,7 @@ under the License.
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
- var u="//matomo.privacy.apache.org/";
+ var u="//analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
(flink) 05/07: [FLINK-38924][docs] Redirect users to documentation home page when encountering a 404
Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
martijnvisser pushed a commit to branch release-1.15
in repository https://gitbox.apache.org/repos/asf/flink.git
commit c5b53051dc3ec42e1668c48f0aec8fbfba3e0621
Author: Martijn Visser <29...@users.noreply.github.com>
AuthorDate: Thu Jan 15 13:56:27 2026 +0100
[FLINK-38924][docs] Redirect users to documentation home page when encountering a 404
(cherry picked from commit 1047406a76620bf8ee5898c795b0009fb8fb5d64)
---
docs/layouts/404.html | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 119 insertions(+)
diff --git a/docs/layouts/404.html b/docs/layouts/404.html
new file mode 100644
index 00000000000..0a90ca9a5fb
--- /dev/null
+++ b/docs/layouts/404.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+{{- $stableUrl := "https://nightlies.apache.org/flink/flink-docs-stable/" -}}
+{{- $stableUrlZh := "https://nightlies.apache.org/flink/flink-docs-stable/zh/" -}}
+{{- $isZh := eq .Site.Language.Lang "zh" -}}
+<html lang="{{ .Site.Language.Lang }}" dir={{ .Site.Language.LanguageDirection }}>
+
+<head>
+ {{ hugo.Generator }}
+ {{ partial "docs/html-head" . }}
+ {{ partial "docs/inject/head" . }}
+ <style>
+ .not-found-options {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 1rem;
+ margin-top: 1.5rem;
+ }
+ .not-found-option {
+ flex: 1;
+ min-width: 200px;
+ max-width: 300px;
+ }
+ .not-found-option a {
+ display: block;
+ padding: 0.75rem 1rem;
+ border: 1px solid var(--color-link);
+ border-radius: 4px;
+ text-decoration: none;
+ font-weight: 500;
+ }
+ .not-found-option a:hover {
+ background: var(--color-link);
+ color: white;
+ }
+ .not-found-option small {
+ display: block;
+ margin-top: 0.5rem;
+ color: var(--gray-600, #666);
+ font-size: 0.875rem;
+ }
+ </style>
+</head>
+
+<body dir={{ .Site.Language.LanguageDirection }}>
+ <input type="checkbox" class="hidden toggle" id="menu-control" />
+ <input type="checkbox" class="hidden toggle" id="toc-control" />
+ <main class="container flex">
+ <aside class="book-menu">
+ {{ partial "docs/menu" . }}
+ </aside>
+
+ <div class="book-page">
+ <header class="book-header">
+ {{ partial "docs/header" . }}
+ </header>
+
+ <article class="markdown">
+ {{- if $isZh }}
+ <h1>页面未找到</h1>
+ <p>我们无法在当前版本中找到此页面。这有时发生在页面在版本之间移动或内容是特定版本的情况下。尝试使用搜索来查找您要找的内容。</p>
+ <div class="not-found-options">
+ <div class="not-found-option">
+ <a href="{{ $stableUrlZh }}">查看最新版本文档</a>
+ <small>推荐大多数用户使用。查看稳定版文档。</small>
+ </div>
+ <div class="not-found-option">
+ <a href="{{ .Site.Home.RelPermalink }}">留在当前版本</a>
+ <small>继续浏览 {{ .Site.Params.VersionTitle }} 开发文档。</small>
+ </div>
+ </div>
+ {{- else }}
+ <h1>Page Not Found</h1>
+ <p>We couldn't find this page in the current version. This sometimes happens when pages move between releases or when content is version-specific. Try using the search to find what you're looking for.</p>
+ <div class="not-found-options">
+ <div class="not-found-option">
+ <a href="{{ $stableUrl }}">View Latest Release Docs</a>
+ <small>Recommended for most users. View the stable documentation.</small>
+ </div>
+ <div class="not-found-option">
+ <a href="{{ .Site.Home.RelPermalink }}">Stay on This Version</a>
+ <small>Continue browsing {{ .Site.Params.VersionTitle }} development docs.</small>
+ </div>
+ </div>
+ {{- end }}
+ </article>
+
+ {{ partial "docs/inject/content-after" . }}
+
+ <footer class="book-footer">
+ {{ partial "docs/footer" . }}
+ {{ partial "docs/inject/footer" . }}
+ </footer>
+
+ <label for="menu-control" class="hidden book-menu-overlay"></label>
+ </div>
+ </main>
+
+ {{ partial "docs/inject/body" . }}
+</body>
+
+</html>
(flink) 01/07: [hotfix][docs] Fix broken refs
Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
martijnvisser pushed a commit to branch release-1.15
in repository https://gitbox.apache.org/repos/asf/flink.git
commit f5fe53ecd2515b03c12852c003693aa3450338ea
Author: Martijn Visser <29...@users.noreply.github.com>
AuthorDate: Mon Jan 19 17:02:32 2026 +0100
[hotfix][docs] Fix broken refs
- Remove .zh suffix from refs in standalone/overview.md
- Manually added externalized docs for DynamoDB, since this repo doesn't contain external sync anymore
---
.../docs/connectors/datastream/dynamodb.md | 171 ++++++++++++
docs/content.zh/docs/connectors/table/dynamodb.md | 306 +++++++++++++++++++++
.../resource-providers/standalone/overview.md | 8 +-
.../content/docs/connectors/datastream/dynamodb.md | 171 ++++++++++++
docs/content/docs/connectors/table/dynamodb.md | 306 +++++++++++++++++++++
5 files changed, 958 insertions(+), 4 deletions(-)
diff --git a/docs/content.zh/docs/connectors/datastream/dynamodb.md b/docs/content.zh/docs/connectors/datastream/dynamodb.md
new file mode 100644
index 00000000000..a8e44f70f21
--- /dev/null
+++ b/docs/content.zh/docs/connectors/datastream/dynamodb.md
@@ -0,0 +1,171 @@
+---
+title: DynamoDB
+weight: 5
+type: docs
+aliases:
+- /zh/dev/connectors/dynamodb.html
+---
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# Amazon DynamoDB Sink
+
+The DynamoDB sink writes to [Amazon DynamoDB](https://aws.amazon.com/dynamodb) using the [AWS v2 SDK for Java](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/home.html). Follow the instructions from the [Amazon DynamoDB Developer Guide](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)
+to setup a table.
+
+To use the connector, add the following Maven dependency to your project:
+
+{{< connector_artifact flink-connector-dynamodb 3.0.0 >}}
+
+{{< tabs "ec24a4ae-6a47-11ed-a1eb-0242ac120002" >}}
+{{< tab "Java" >}}
+```java
+Properties sinkProperties = new Properties();
+// Required
+sinkProperties.put(AWSConfigConstants.AWS_REGION, "eu-west-1");
+// Optional, provide via alternative routes e.g. environment variables
+sinkProperties.put(AWSConfigConstants.AWS_ACCESS_KEY_ID, "aws_access_key_id");
+sinkProperties.put(AWSConfigConstants.AWS_SECRET_ACCESS_KEY, "aws_secret_access_key");
+
+ElementConverter<InputType, DynamoDbWriteRequest> elementConverter = new CustomElementConverter();
+
+DynamoDbSink<String> dynamoDbSink =
+ DynamoDbSink.<InputType>builder()
+ .setDynamoDbProperties(sinkProperties) // Required
+ .setTableName("my-dynamodb-table") // Required
+ .setElementConverter(elementConverter) // Required
+ .setOverwriteByPartitionKeys(singletonList("key")) // Optional
+ .setFailOnError(false) // Optional
+ .setMaxBatchSize(25) // Optional
+ .setMaxInFlightRequests(50) // Optional
+ .setMaxBufferedRequests(10_000) // Optional
+ .setMaxTimeInBufferMS(5000) // Optional
+ .build();
+
+flinkStream.sinkTo(dynamoDbSink);
+```
+{{< /tab >}}
+{{< tab "Scala" >}}
+```scala
+val sinkProperties = new Properties()
+// Required
+sinkProperties.put(AWSConfigConstants.AWS_REGION, "eu-west-1")
+// Optional, provide via alternative routes e.g. environment variables
+sinkProperties.put(AWSConfigConstants.AWS_ACCESS_KEY_ID, "aws_access_key_id")
+sinkProperties.put(AWSConfigConstants.AWS_SECRET_ACCESS_KEY, "aws_secret_access_key")
+
+val elementConverter = new CustomElementConverter();
+
+val dynamoDbSink =
+ DynamoDbSink.<InputType>builder()
+ .setDynamoDbProperties(sinkProperties) // Required
+ .setTableName("my-dynamodb-table") // Required
+ .setElementConverter(elementConverter) // Required
+ .setOverwriteByPartitionKeys(singletonList("key")) // Optional
+ .setFailOnError(false) // Optional
+ .setMaxBatchSize(25) // Optional
+ .setMaxInFlightRequests(50) // Optional
+ .setMaxBufferedRequests(10_000) // Optional
+ .setMaxTimeInBufferMS(5000) // Optional
+ .build()
+
+flinkStream.sinkTo(dynamoDbSink)
+```
+{{< /tab >}}
+{{< /tabs >}}
+
+## Configurations
+
+Flink's DynamoDB sink is created by using the static builder `DynamoDBSink.<InputType>builder()`.
+
+1. __setDynamoDbProperties(Properties sinkProperties)__
+ * Required.
+ * Supplies credentials, region and other parameters to the DynamoDB client.
+2. __setTableName(String tableName)__
+ * Required.
+ * Name of the table to sink to.
+3. __setElementConverter(ElementConverter<InputType, DynamoDbWriteRequest> elementConverter)__
+ * Required.
+ * Converts generic records of type `InputType` to `DynamoDbWriteRequest`.
+4. _setOverwriteByPartitionKeys(List<String> partitionKeys)_
+ * Optional. Default: [].
+ * Used to deduplicate write requests within each batch pushed to DynamoDB.
+5. _setFailOnError(boolean failOnError)_
+ * Optional. Default: `false`.
+ * Whether failed requests to write records are treated as fatal exceptions in the sink.
+6. _setMaxBatchSize(int maxBatchSize)_
+ * Optional. Default: `25`.
+ * Maximum size of a batch to write.
+7. _setMaxInFlightRequests(int maxInFlightRequests)_
+ * Optional. Default: `50`.
+ * The maximum number of in flight requests allowed before the sink applies backpressure.
+8. _setMaxBufferedRequests(int maxBufferedRequests)_
+ * Optional. Default: `10_000`.
+ * The maximum number of records that may be buffered in the sink before backpressure is applied.
+9. _setMaxBatchSizeInBytes(int maxBatchSizeInBytes)_
+ * N/A.
+ * This configuration is not supported, see [FLINK-29854](https://issues.apache.org/jira/browse/FLINK-29854).
+10. _setMaxTimeInBufferMS(int maxTimeInBufferMS)_
+ * Optional. Default: `5000`.
+ * The maximum time a record may stay in the sink before being flushed.
+11. _setMaxRecordSizeInBytes(int maxRecordSizeInBytes)_
+ * N/A.
+ * This configuration is not supported, see [FLINK-29854](https://issues.apache.org/jira/browse/FLINK-29854).
+12. _build()_
+ * Constructs and returns the DynamoDB sink.
+
+## Element Converter
+
+An element converter is used to convert from a record in the DataStream to a DynamoDbWriteRequest which the sink will write to the destination DynamoDB table. The DynamoDB sink allows the user to supply a custom element converter, or use the provided
+`DynamoDbBeanElementConverter` when you are working with `@DynamoDbBean` objects. For more information on supported
+annotations see [here](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/examples-dynamodb-enhanced.html#dynamodb-enhanced-mapper-tableschema).
+
+A sample application using a custom `ElementConverter` can be found [here](https://github.com/apache/flink-connector-aws/blob/main/flink-connector-dynamodb/src/test/java/org/apache/flink/connector/dynamodb/sink/examples/SinkIntoDynamoDb.java). A sample application using the `DynamoDbBeanElementConverter` can be found [here](https://github.com/apache/flink-connector-aws/blob/main/flink-connector-dynamodb/src/test/java/org/apache/flink/connector/dynamodb/sink/examples/SinkDynamoDbBeanIntoD [...]
+
+## Using Custom DynamoDB Endpoints
+
+It is sometimes desirable to have Flink operate as a consumer or producer against a DynamoDB VPC endpoint or a non-AWS
+DynamoDB endpoint such as [Localstack](https://localstack.cloud/); this is especially useful when performing
+functional testing of a Flink application. The AWS endpoint that would normally be inferred by the AWS region set in the
+Flink configuration must be overridden via a configuration property.
+
+To override the AWS endpoint, set the `AWSConfigConstants.AWS_ENDPOINT` and `AWSConfigConstants.AWS_REGION` properties. The region will be used to sign the endpoint URL.
+
+{{< tabs "bcadd466-8416-4d3c-a6a7-c46eee0cbd4a" >}}
+{{< tab "Java" >}}
+```java
+Properties producerConfig = new Properties();
+producerConfig.put(AWSConfigConstants.AWS_REGION, "eu-west-1");
+producerConfig.put(AWSConfigConstants.AWS_ACCESS_KEY_ID, "aws_access_key_id");
+producerConfig.put(AWSConfigConstants.AWS_SECRET_ACCESS_KEY, "aws_secret_access_key");
+producerConfig.put(AWSConfigConstants.AWS_ENDPOINT, "http://localhost:4566");
+```
+{{< /tab >}}
+{{< tab "Scala" >}}
+```scala
+val producerConfig = new Properties()
+producerConfig.put(AWSConfigConstants.AWS_REGION, "eu-west-1")
+producerConfig.put(AWSConfigConstants.AWS_ACCESS_KEY_ID, "aws_access_key_id")
+producerConfig.put(AWSConfigConstants.AWS_SECRET_ACCESS_KEY, "aws_secret_access_key")
+producerConfig.put(AWSConfigConstants.AWS_ENDPOINT, "http://localhost:4566")
+```
+{{< /tab >}}
+{{< /tabs >}}
+
+{{< top >}}
diff --git a/docs/content.zh/docs/connectors/table/dynamodb.md b/docs/content.zh/docs/connectors/table/dynamodb.md
new file mode 100644
index 00000000000..28d23ed12ae
--- /dev/null
+++ b/docs/content.zh/docs/connectors/table/dynamodb.md
@@ -0,0 +1,306 @@
+---
+title: DynamoDB
+weight: 5
+type: docs
+aliases:
+- /zh/dev/table/connectors/dynamodb.html
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# Amazon DynamoDB SQL Connector
+
+{{< label "Sink: Batch" >}}
+{{< label "Sink: Streaming Append & Upsert Mode" >}}
+
+The DynamoDB connector allows for writing data into [Amazon DynamoDB](https://aws.amazon.com/dynamodb).
+
+Dependencies
+------------
+
+{{< sql_connector_download_table "dynamodb" 3.0.0 >}}
+
+How to create a DynamoDB table
+-----------------------------------------
+
+Follow the instructions from the [Amazon DynamoDB Developer Guide](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)
+to set up a DynamoDB table. The following example shows how to create a table backed by a DynamoDB table with minimum required options:
+
+```sql
+CREATE TABLE DynamoDbTable (
+ `user_id` BIGINT,
+ `item_id` BIGINT,
+ `category_id` BIGINT,
+ `behavior` STRING
+)
+WITH (
+ 'connector' = 'dynamodb',
+ 'table-name' = 'user_behavior',
+ 'aws.region' = 'us-east-2'
+);
+```
+
+Connector Options
+-----------------
+
+<table class="table table-bordered">
+ <thead>
+ <tr>
+ <th class="text-left" style="width: 25%">Option</th>
+ <th class="text-center" style="width: 8%">Required</th>
+ <th class="text-center" style="width: 7%">Default</th>
+ <th class="text-center" style="width: 10%">Type</th>
+ <th class="text-center" style="width: 50%">Description</th>
+ </tr>
+ <tr>
+ <th colspan="5" class="text-left" style="width: 100%">Common Options</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><h5>connector</h5></td>
+ <td>required</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>Specify what connector to use. For DynamoDB use <code>'dynamodb'</code>.</td>
+ </tr>
+ <tr>
+ <td><h5>table-name</h5></td>
+ <td>required</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>Name of the DynamoDB table to use.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.region</h5></td>
+ <td>required</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The AWS region where the DynamoDB table is defined.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.endpoint</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The AWS endpoint for DynamoDB.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.trust.all.certificates</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">false</td>
+ <td>Boolean</td>
+ <td>If true accepts all SSL certificates.</td>
+ </tr>
+ </tbody>
+ <thead>
+ <tr>
+ <th colspan="5" class="text-left" style="width: 100%">Authentication Options</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><h5>aws.credentials.provider</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">AUTO</td>
+ <td>String</td>
+ <td>A credentials provider to use when authenticating against the Kinesis endpoint. See <a href="#authentication">Authentication</a> for details.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.basic.accesskeyid</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The AWS access key ID to use when setting credentials provider type to BASIC.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.basic.secretkey</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The AWS secret key to use when setting credentials provider type to BASIC.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.profile.path</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>Optional configuration for profile path if credential provider type is set to be PROFILE.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.profile.name</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>Optional configuration for profile name if credential provider type is set to be PROFILE.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.role.arn</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The role ARN to use when credential provider type is set to ASSUME_ROLE or WEB_IDENTITY_TOKEN.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.role.sessionName</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The role session name to use when credential provider type is set to ASSUME_ROLE or WEB_IDENTITY_TOKEN.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.role.externalId</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The external ID to use when credential provider type is set to ASSUME_ROLE.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.role.provider</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The credentials provider that provides credentials for assuming the role when credential provider type is set to ASSUME_ROLE. Roles can be nested, so this value can again be set to ASSUME_ROLE</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.webIdentityToken.file</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The absolute path to the web identity token file that should be used if provider type is set to WEB_IDENTITY_TOKEN.</td>
+ </tr>
+ </tbody>
+ <thead>
+ <tr>
+ <th colspan="5" class="text-left" style="width: 100%">Sink Options</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><h5>sink.batch.max-size</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">25</td>
+ <td>Integer</td>
+ <td>Maximum batch size of elements to be written to DynamoDB.</td>
+ </tr>
+ <tr>
+ <td><h5>sink.requests.max-inflight</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">50</td>
+ <td>Integer</td>
+ <td>Maximum number of parallel batch requests to DynamoDB.</td>
+ </tr>
+ <tr>
+ <td><h5>sink.requests.max-buffered</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">10000</td>
+ <td>String</td>
+ <td>Size of input buffer before applying backpressure to upstream job graph</td>
+ </tr>
+ <tr>
+ <td><h5>sink.flush-buffer.timeout</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">5000</td>
+ <td>Long</td>
+ <td>Threshold time in ms for an element to be in a buffer before flushing.</td>
+ </tr>
+ <tr>
+ <td><h5>sink.fail-on-error</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">false</td>
+ <td>Boolean</td>
+ <td>Flag used for retrying failed requests. If set any request failure will not be retried and will fail the job.</td>
+ </tr>
+ </tbody>
+ <thead>
+ <tr>
+ <th colspan="5" class="text-left" style="width: 100%">HTTP Client Options</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><h5>sink.http-client.max-concurrency</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">10000</td>
+ <td>Integer</td>
+ <td>Maximum number of allowed concurrent requests by the HTTP client.</td>
+ </tr>
+ <tr>
+ <td><h5>sink.http-client.read-timeout</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">360000</td>
+ <td>Integer</td>
+ <td>Timeout for each read to the underlying socket.</td>
+ </tr>
+ </tbody>
+</table>
+
+## Authorization
+
+Make sure to [create an appropriate IAM policy](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/using-identity-based-policies.html) to allow writing to the DynamoDB table.
+
+## Authentication
+
+Depending on your deployment you would choose an appropriate Credentials Provider to allow access to DynamoDB.
+By default, the `AUTO` Credentials Provider is used.
+If the access key ID and secret key are set in the deployment configuration, this results in using the `BASIC` provider.
+
+A specific [AWSCredentialsProvider](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/index.html?com/amazonaws/auth/AWSCredentialsProvider.html) can be **optionally** set using the `aws.credentials.provider` setting.
+Supported values are:
+
+- `AUTO` - Use the default AWS Credentials Provider chain that searches for credentials in the following order: `ENV_VARS`, `SYS_PROPS`, `WEB_IDENTITY_TOKEN`, `PROFILE`, and EC2/ECS credentials provider.
+- `BASIC` - Use access key ID and secret key supplied as configuration.
+- `ENV_VAR` - Use `AWS_ACCESS_KEY_ID` & `AWS_SECRET_ACCESS_KEY` environment variables.
+- `SYS_PROP` - Use Java system properties `aws.accessKeyId` and `aws.secretKey`.
+- `PROFILE` - Use an AWS credentials profile to create the AWS credentials.
+- `ASSUME_ROLE` - Create AWS credentials by assuming a role. The credentials for assuming the role must be supplied.
+- `WEB_IDENTITY_TOKEN` - Create AWS credentials by assuming a role using Web Identity Token.
+
+## Sink Partitioning
+
+The DynamoDB sink supports client side deduplication of data via the `PARTITIONED BY` clause. You can specify a list of
+partition keys, the sink will only send the latest record for each composite key within a batch. For example:
+
+```sql
+CREATE TABLE DynamoDbTable (
+ `user_id` BIGINT,
+ `item_id` BIGINT,
+ `category_id` BIGINT,
+ `behavior` STRING
+) PARTITIONED BY ( user_id )
+WITH (
+ 'connector' = 'dynamodb',
+ 'table-name' = 'user_behavior',
+ 'aws.region' = 'us-east-2'
+);
+```
+
+## Notice
+
+The current implementation of the DynamoDB SQL connector is write-only and doesn't provide an implementation for source queries.
+Queries similar to:
+```sql
+SELECT * FROM DynamoDbTable;
+```
+should result in an error similar to
+```
+Connector dynamodb can only be used as a sink. It cannot be used as a source.
+```
+{{< top >}}
diff --git a/docs/content.zh/docs/deployment/resource-providers/standalone/overview.md b/docs/content.zh/docs/deployment/resource-providers/standalone/overview.md
index 6498b2cb3e3..8312ab55c84 100644
--- a/docs/content.zh/docs/deployment/resource-providers/standalone/overview.md
+++ b/docs/content.zh/docs/deployment/resource-providers/standalone/overview.md
@@ -116,12 +116,12 @@ cd flink-*
Flink 目录必须放在所有 worker 节点的相同目录下。你可以使用共享的 NFS 目录,或将 Flink 目录复制到每个 worker 节点上。
-请参考 [配置参数页面]({{< ref "docs/deployment/config.zh" >}}) 获取更多细节以及额外的配置项。
+请参考 [配置参数页面]({{< ref "docs/deployment/config" >}}) 获取更多细节以及额外的配置项。
特别地,
* 每个 JobManager 的可用内存值(`jobmanager.memory.process.size`),
-* 每个 TaskManager 的可用内存值 (`taskmanager.memory.process.size`,并检查 [内存调优指南]({{< ref "docs/deployment/memory/mem_tuning.zh" >}}#configure-memory-for-standalone-deployment)),
+* 每个 TaskManager 的可用内存值 (`taskmanager.memory.process.size`,并检查 [内存调优指南]({{< ref "docs/deployment/memory/mem_tuning" >}}#configure-memory-for-standalone-deployment)),
* 每台机器的可用 CPU 数(`taskmanager.numberOfTaskSlots`),
* 集群中所有 CPU 数(`parallelism.default`)和
* 临时目录(`io.tmp.dirs`)
@@ -172,7 +172,7 @@ bin/taskmanager.sh start|start-foreground|stop|stop-all
## High-Availability with Standalone
-In order to enable HA for a standalone cluster, you have to use the [ZooKeeper HA services]({{< ref "docs/deployment/ha/zookeeper_ha.zh" >}}).
+In order to enable HA for a standalone cluster, you have to use the [ZooKeeper HA services]({{< ref "docs/deployment/ha/zookeeper_ha" >}}).
Additionally, you have to configure your cluster to start multiple JobManagers.
@@ -188,7 +188,7 @@ jobManagerAddress1:webUIPort1
jobManagerAddressX:webUIPortX
</pre>
-By default, the job manager will pick a *random port* for inter process communication. You can change this via the [high-availability.jobmanager.port]({{< ref "docs/deployment/config.zh" >}}#high-availability-jobmanager-port) key. This key accepts single ports (e.g. `50010`), ranges (`50000-50025`), or a combination of both (`50010,50011,50020-50025,50050-50075`).
+By default, the job manager will pick a *random port* for inter process communication. You can change this via the [high-availability.jobmanager.port]({{< ref "docs/deployment/config" >}}#high-availability-jobmanager-port) key. This key accepts single ports (e.g. `50010`), ranges (`50000-50025`), or a combination of both (`50010,50011,50020-50025,50050-50075`).
### Example: Standalone Cluster with 2 JobManagers
diff --git a/docs/content/docs/connectors/datastream/dynamodb.md b/docs/content/docs/connectors/datastream/dynamodb.md
new file mode 100644
index 00000000000..4564d79f1a2
--- /dev/null
+++ b/docs/content/docs/connectors/datastream/dynamodb.md
@@ -0,0 +1,171 @@
+---
+title: DynamoDB
+weight: 5
+type: docs
+aliases:
+- /dev/connectors/dynamodb.html
+---
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# Amazon DynamoDB Sink
+
+The DynamoDB sink writes to [Amazon DynamoDB](https://aws.amazon.com/dynamodb) using the [AWS v2 SDK for Java](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/home.html). Follow the instructions from the [Amazon DynamoDB Developer Guide](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)
+to setup a table.
+
+To use the connector, add the following Maven dependency to your project:
+
+{{< connector_artifact flink-connector-dynamodb 3.0.0 >}}
+
+{{< tabs "ec24a4ae-6a47-11ed-a1eb-0242ac120002" >}}
+{{< tab "Java" >}}
+```java
+Properties sinkProperties = new Properties();
+// Required
+sinkProperties.put(AWSConfigConstants.AWS_REGION, "eu-west-1");
+// Optional, provide via alternative routes e.g. environment variables
+sinkProperties.put(AWSConfigConstants.AWS_ACCESS_KEY_ID, "aws_access_key_id");
+sinkProperties.put(AWSConfigConstants.AWS_SECRET_ACCESS_KEY, "aws_secret_access_key");
+
+ElementConverter<InputType, DynamoDbWriteRequest> elementConverter = new CustomElementConverter();
+
+DynamoDbSink<String> dynamoDbSink =
+ DynamoDbSink.<InputType>builder()
+ .setDynamoDbProperties(sinkProperties) // Required
+ .setTableName("my-dynamodb-table") // Required
+ .setElementConverter(elementConverter) // Required
+ .setOverwriteByPartitionKeys(singletonList("key")) // Optional
+ .setFailOnError(false) // Optional
+ .setMaxBatchSize(25) // Optional
+ .setMaxInFlightRequests(50) // Optional
+ .setMaxBufferedRequests(10_000) // Optional
+ .setMaxTimeInBufferMS(5000) // Optional
+ .build();
+
+flinkStream.sinkTo(dynamoDbSink);
+```
+{{< /tab >}}
+{{< tab "Scala" >}}
+```scala
+val sinkProperties = new Properties()
+// Required
+sinkProperties.put(AWSConfigConstants.AWS_REGION, "eu-west-1")
+// Optional, provide via alternative routes e.g. environment variables
+sinkProperties.put(AWSConfigConstants.AWS_ACCESS_KEY_ID, "aws_access_key_id")
+sinkProperties.put(AWSConfigConstants.AWS_SECRET_ACCESS_KEY, "aws_secret_access_key")
+
+val elementConverter = new CustomElementConverter();
+
+val dynamoDbSink =
+ DynamoDbSink.<InputType>builder()
+ .setDynamoDbProperties(sinkProperties) // Required
+ .setTableName("my-dynamodb-table") // Required
+ .setElementConverter(elementConverter) // Required
+ .setOverwriteByPartitionKeys(singletonList("key")) // Optional
+ .setFailOnError(false) // Optional
+ .setMaxBatchSize(25) // Optional
+ .setMaxInFlightRequests(50) // Optional
+ .setMaxBufferedRequests(10_000) // Optional
+ .setMaxTimeInBufferMS(5000) // Optional
+ .build()
+
+flinkStream.sinkTo(dynamoDbSink)
+```
+{{< /tab >}}
+{{< /tabs >}}
+
+## Configurations
+
+Flink's DynamoDB sink is created by using the static builder `DynamoDBSink.<InputType>builder()`.
+
+1. __setDynamoDbProperties(Properties sinkProperties)__
+ * Required.
+ * Supplies credentials, region and other parameters to the DynamoDB client.
+2. __setTableName(String tableName)__
+ * Required.
+ * Name of the table to sink to.
+3. __setElementConverter(ElementConverter<InputType, DynamoDbWriteRequest> elementConverter)__
+ * Required.
+ * Converts generic records of type `InputType` to `DynamoDbWriteRequest`.
+4. _setOverwriteByPartitionKeys(List<String> partitionKeys)_
+ * Optional. Default: [].
+ * Used to deduplicate write requests within each batch pushed to DynamoDB.
+5. _setFailOnError(boolean failOnError)_
+ * Optional. Default: `false`.
+ * Whether failed requests to write records are treated as fatal exceptions in the sink.
+6. _setMaxBatchSize(int maxBatchSize)_
+ * Optional. Default: `25`.
+ * Maximum size of a batch to write.
+7. _setMaxInFlightRequests(int maxInFlightRequests)_
+ * Optional. Default: `50`.
+ * The maximum number of in flight requests allowed before the sink applies backpressure.
+8. _setMaxBufferedRequests(int maxBufferedRequests)_
+ * Optional. Default: `10_000`.
+ * The maximum number of records that may be buffered in the sink before backpressure is applied.
+9. _setMaxBatchSizeInBytes(int maxBatchSizeInBytes)_
+ * N/A.
+ * This configuration is not supported, see [FLINK-29854](https://issues.apache.org/jira/browse/FLINK-29854).
+10. _setMaxTimeInBufferMS(int maxTimeInBufferMS)_
+ * Optional. Default: `5000`.
+ * The maximum time a record may stay in the sink before being flushed.
+11. _setMaxRecordSizeInBytes(int maxRecordSizeInBytes)_
+ * N/A.
+ * This configuration is not supported, see [FLINK-29854](https://issues.apache.org/jira/browse/FLINK-29854).
+12. _build()_
+ * Constructs and returns the DynamoDB sink.
+
+## Element Converter
+
+An element converter is used to convert from a record in the DataStream to a DynamoDbWriteRequest which the sink will write to the destination DynamoDB table. The DynamoDB sink allows the user to supply a custom element converter, or use the provided
+`DynamoDbBeanElementConverter` when you are working with `@DynamoDbBean` objects. For more information on supported
+annotations see [here](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/examples-dynamodb-enhanced.html#dynamodb-enhanced-mapper-tableschema).
+
+A sample application using a custom `ElementConverter` can be found [here](https://github.com/apache/flink-connector-aws/blob/main/flink-connector-dynamodb/src/test/java/org/apache/flink/connector/dynamodb/sink/examples/SinkIntoDynamoDb.java). A sample application using the `DynamoDbBeanElementConverter` can be found [here](https://github.com/apache/flink-connector-aws/blob/main/flink-connector-dynamodb/src/test/java/org/apache/flink/connector/dynamodb/sink/examples/SinkDynamoDbBeanIntoD [...]
+
+## Using Custom DynamoDB Endpoints
+
+It is sometimes desirable to have Flink operate as a consumer or producer against a DynamoDB VPC endpoint or a non-AWS
+DynamoDB endpoint such as [Localstack](https://localstack.cloud/); this is especially useful when performing
+functional testing of a Flink application. The AWS endpoint that would normally be inferred by the AWS region set in the
+Flink configuration must be overridden via a configuration property.
+
+To override the AWS endpoint, set the `AWSConfigConstants.AWS_ENDPOINT` and `AWSConfigConstants.AWS_REGION` properties. The region will be used to sign the endpoint URL.
+
+{{< tabs "bcadd466-8416-4d3c-a6a7-c46eee0cbd4a" >}}
+{{< tab "Java" >}}
+```java
+Properties producerConfig = new Properties();
+producerConfig.put(AWSConfigConstants.AWS_REGION, "eu-west-1");
+producerConfig.put(AWSConfigConstants.AWS_ACCESS_KEY_ID, "aws_access_key_id");
+producerConfig.put(AWSConfigConstants.AWS_SECRET_ACCESS_KEY, "aws_secret_access_key");
+producerConfig.put(AWSConfigConstants.AWS_ENDPOINT, "http://localhost:4566");
+```
+{{< /tab >}}
+{{< tab "Scala" >}}
+```scala
+val producerConfig = new Properties()
+producerConfig.put(AWSConfigConstants.AWS_REGION, "eu-west-1")
+producerConfig.put(AWSConfigConstants.AWS_ACCESS_KEY_ID, "aws_access_key_id")
+producerConfig.put(AWSConfigConstants.AWS_SECRET_ACCESS_KEY, "aws_secret_access_key")
+producerConfig.put(AWSConfigConstants.AWS_ENDPOINT, "http://localhost:4566")
+```
+{{< /tab >}}
+{{< /tabs >}}
+
+{{< top >}}
diff --git a/docs/content/docs/connectors/table/dynamodb.md b/docs/content/docs/connectors/table/dynamodb.md
new file mode 100644
index 00000000000..a51c5e718d2
--- /dev/null
+++ b/docs/content/docs/connectors/table/dynamodb.md
@@ -0,0 +1,306 @@
+---
+title: DynamoDB
+weight: 5
+type: docs
+aliases:
+- /dev/table/connectors/dynamodb.html
+---
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+# Amazon DynamoDB SQL Connector
+
+{{< label "Sink: Batch" >}}
+{{< label "Sink: Streaming Append & Upsert Mode" >}}
+
+The DynamoDB connector allows for writing data into [Amazon DynamoDB](https://aws.amazon.com/dynamodb).
+
+Dependencies
+------------
+
+{{< sql_connector_download_table "dynamodb" 3.0.0 >}}
+
+How to create a DynamoDB table
+-----------------------------------------
+
+Follow the instructions from the [Amazon DynamoDB Developer Guide](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)
+to set up a DynamoDB table. The following example shows how to create a table backed by a DynamoDB table with minimum required options:
+
+```sql
+CREATE TABLE DynamoDbTable (
+ `user_id` BIGINT,
+ `item_id` BIGINT,
+ `category_id` BIGINT,
+ `behavior` STRING
+)
+WITH (
+ 'connector' = 'dynamodb',
+ 'table-name' = 'user_behavior',
+ 'aws.region' = 'us-east-2'
+);
+```
+
+Connector Options
+-----------------
+
+<table class="table table-bordered">
+ <thead>
+ <tr>
+ <th class="text-left" style="width: 25%">Option</th>
+ <th class="text-center" style="width: 8%">Required</th>
+ <th class="text-center" style="width: 7%">Default</th>
+ <th class="text-center" style="width: 10%">Type</th>
+ <th class="text-center" style="width: 50%">Description</th>
+ </tr>
+ <tr>
+ <th colspan="5" class="text-left" style="width: 100%">Common Options</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><h5>connector</h5></td>
+ <td>required</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>Specify what connector to use. For DynamoDB use <code>'dynamodb'</code>.</td>
+ </tr>
+ <tr>
+ <td><h5>table-name</h5></td>
+ <td>required</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>Name of the DynamoDB table to use.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.region</h5></td>
+ <td>required</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The AWS region where the DynamoDB table is defined.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.endpoint</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The AWS endpoint for DynamoDB.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.trust.all.certificates</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">false</td>
+ <td>Boolean</td>
+ <td>If true accepts all SSL certificates.</td>
+ </tr>
+ </tbody>
+ <thead>
+ <tr>
+ <th colspan="5" class="text-left" style="width: 100%">Authentication Options</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><h5>aws.credentials.provider</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">AUTO</td>
+ <td>String</td>
+ <td>A credentials provider to use when authenticating against the Kinesis endpoint. See <a href="#authentication">Authentication</a> for details.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.basic.accesskeyid</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The AWS access key ID to use when setting credentials provider type to BASIC.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.basic.secretkey</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The AWS secret key to use when setting credentials provider type to BASIC.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.profile.path</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>Optional configuration for profile path if credential provider type is set to be PROFILE.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.profile.name</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>Optional configuration for profile name if credential provider type is set to be PROFILE.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.role.arn</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The role ARN to use when credential provider type is set to ASSUME_ROLE or WEB_IDENTITY_TOKEN.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.role.sessionName</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The role session name to use when credential provider type is set to ASSUME_ROLE or WEB_IDENTITY_TOKEN.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.role.externalId</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The external ID to use when credential provider type is set to ASSUME_ROLE.</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.role.provider</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The credentials provider that provides credentials for assuming the role when credential provider type is set to ASSUME_ROLE. Roles can be nested, so this value can again be set to ASSUME_ROLE</td>
+ </tr>
+ <tr>
+ <td><h5>aws.credentials.webIdentityToken.file</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">(none)</td>
+ <td>String</td>
+ <td>The absolute path to the web identity token file that should be used if provider type is set to WEB_IDENTITY_TOKEN.</td>
+ </tr>
+ </tbody>
+ <thead>
+ <tr>
+ <th colspan="5" class="text-left" style="width: 100%">Sink Options</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><h5>sink.batch.max-size</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">25</td>
+ <td>Integer</td>
+ <td>Maximum batch size of elements to be written to DynamoDB.</td>
+ </tr>
+ <tr>
+ <td><h5>sink.requests.max-inflight</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">50</td>
+ <td>Integer</td>
+ <td>Maximum number of parallel batch requests to DynamoDB.</td>
+ </tr>
+ <tr>
+ <td><h5>sink.requests.max-buffered</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">10000</td>
+ <td>String</td>
+ <td>Size of input buffer before applying backpressure to upstream job graph</td>
+ </tr>
+ <tr>
+ <td><h5>sink.flush-buffer.timeout</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">5000</td>
+ <td>Long</td>
+ <td>Threshold time in ms for an element to be in a buffer before flushing.</td>
+ </tr>
+ <tr>
+ <td><h5>sink.fail-on-error</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">false</td>
+ <td>Boolean</td>
+ <td>Flag used for retrying failed requests. If set any request failure will not be retried and will fail the job.</td>
+ </tr>
+ </tbody>
+ <thead>
+ <tr>
+ <th colspan="5" class="text-left" style="width: 100%">HTTP Client Options</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><h5>sink.http-client.max-concurrency</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">10000</td>
+ <td>Integer</td>
+ <td>Maximum number of allowed concurrent requests by the HTTP client.</td>
+ </tr>
+ <tr>
+ <td><h5>sink.http-client.read-timeout</h5></td>
+ <td>optional</td>
+ <td style="word-wrap: break-word;">360000</td>
+ <td>Integer</td>
+ <td>Timeout for each read to the underlying socket.</td>
+ </tr>
+ </tbody>
+</table>
+
+## Authorization
+
+Make sure to [create an appropriate IAM policy](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/using-identity-based-policies.html) to allow writing to the DynamoDB table.
+
+## Authentication
+
+Depending on your deployment you would choose an appropriate Credentials Provider to allow access to DynamoDB.
+By default, the `AUTO` Credentials Provider is used.
+If the access key ID and secret key are set in the deployment configuration, this results in using the `BASIC` provider.
+
+A specific [AWSCredentialsProvider](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/index.html?com/amazonaws/auth/AWSCredentialsProvider.html) can be **optionally** set using the `aws.credentials.provider` setting.
+Supported values are:
+
+- `AUTO` - Use the default AWS Credentials Provider chain that searches for credentials in the following order: `ENV_VARS`, `SYS_PROPS`, `WEB_IDENTITY_TOKEN`, `PROFILE`, and EC2/ECS credentials provider.
+- `BASIC` - Use access key ID and secret key supplied as configuration.
+- `ENV_VAR` - Use `AWS_ACCESS_KEY_ID` & `AWS_SECRET_ACCESS_KEY` environment variables.
+- `SYS_PROP` - Use Java system properties `aws.accessKeyId` and `aws.secretKey`.
+- `PROFILE` - Use an AWS credentials profile to create the AWS credentials.
+- `ASSUME_ROLE` - Create AWS credentials by assuming a role. The credentials for assuming the role must be supplied.
+- `WEB_IDENTITY_TOKEN` - Create AWS credentials by assuming a role using Web Identity Token.
+
+## Sink Partitioning
+
+The DynamoDB sink supports client side deduplication of data via the `PARTITIONED BY` clause. You can specify a list of
+partition keys, the sink will only send the latest record for each composite key within a batch. For example:
+
+```sql
+CREATE TABLE DynamoDbTable (
+ `user_id` BIGINT,
+ `item_id` BIGINT,
+ `category_id` BIGINT,
+ `behavior` STRING
+) PARTITIONED BY ( user_id )
+WITH (
+ 'connector' = 'dynamodb',
+ 'table-name' = 'user_behavior',
+ 'aws.region' = 'us-east-2'
+);
+```
+
+## Notice
+
+The current implementation of the DynamoDB SQL connector is write-only and doesn't provide an implementation for source queries.
+Queries similar to:
+```sql
+SELECT * FROM DynamoDbTable;
+```
+should result in an error similar to
+```
+Connector dynamodb can only be used as a sink. It cannot be used as a source.
+```
+{{< top >}}
(flink) 06/07: [hotfix][docs] Configures Apache to serve the custom 404.html page with proper 404 status code and always serve index.html for dirs
Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
martijnvisser pushed a commit to branch release-1.15
in repository https://gitbox.apache.org/repos/asf/flink.git
commit e3ef3e0814d81a88c53851ed3de0dd57508eb995
Author: Martijn Visser <29...@users.noreply.github.com>
AuthorDate: Mon Jan 19 16:33:49 2026 +0100
[hotfix][docs] Configures Apache to serve the custom 404.html page with proper 404 status code and always serve index.html for dirs
---
docs/static/.htaccess | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/docs/static/.htaccess b/docs/static/.htaccess
new file mode 100644
index 00000000000..e8dfa09bbc4
--- /dev/null
+++ b/docs/static/.htaccess
@@ -0,0 +1,22 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# Ensure index.html is served for directory requests
+DirectoryIndex index.html
+
+# Custom 404 error page
+ErrorDocument 404 /flink/flink-docs-release-1.15/404.html
(flink) 07/07: [hotfix][docs] Fix git permission issue in Docker build
Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
martijnvisser pushed a commit to branch release-1.15
in repository https://gitbox.apache.org/repos/asf/flink.git
commit ce716bf80861daa46f58e18ad0a4f48f7596aa69
Author: Martijn Visser <29...@users.noreply.github.com>
AuthorDate: Mon Jan 19 16:48:17 2026 +0100
[hotfix][docs] Fix git permission issue in Docker build
Add safe.directory workaround for git security patch that causes "dubious ownership" errors when running in Docker containers.
---
.github/workflows/docs.sh | 2 ++
1 file changed, 2 insertions(+)
diff --git a/.github/workflows/docs.sh b/.github/workflows/docs.sh
index 3715060a15b..3187113da5f 100755
--- a/.github/workflows/docs.sh
+++ b/.github/workflows/docs.sh
@@ -30,6 +30,8 @@ if ! curl --fail -OL $HUGO_REPO ; then
exit 1
fi
tar -zxvf $HUGO_ARTIFACT
+# workaround for a git security patch
+git config --global --add safe.directory /root/flink
git submodule update --init --recursive
# Setup the external documentation modules
cd docs
(flink) 02/07: [FLINK-38914][docs] Preserve page path when linking to stable version
Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
martijnvisser pushed a commit to branch release-1.15
in repository https://gitbox.apache.org/repos/asf/flink.git
commit d6bee5d2b11d7292529f791de5c1e0350a5f781b
Author: Martijn Visser <29...@users.noreply.github.com>
AuthorDate: Mon Dec 29 13:08:42 2025 +0100
[FLINK-38914][docs] Preserve page path when linking to stable version
The "stable version" link in the warning banner for unreleased/out-of-date docs now redirects to the equivalent page in the stable docs instead of always redirecting to the homepage.
---
docs/layouts/partials/docs/inject/content-before.html | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/docs/layouts/partials/docs/inject/content-before.html b/docs/layouts/partials/docs/inject/content-before.html
index bfbea6ce7ab..35d7dde271f 100644
--- a/docs/layouts/partials/docs/inject/content-before.html
+++ b/docs/layouts/partials/docs/inject/content-before.html
@@ -20,16 +20,18 @@ under the License.
Partial that renders before the content on every page.
-->
{{ if $.Site.Params.ShowOutDatedWarning }}
+{{ $stableURL := replaceRE "/flink-docs-[^/]+/" "/flink-docs-stable/" .Permalink }}
<article class="markdown">
<blockquote style="border-color:#f66">
- {{ markdownify "This documentation is for an out-of-date version of Apache Flink. We recommend you use the latest [stable version](https://nightlies.apache.org/flink/flink-docs-stable/)."}}
+ {{ markdownify (printf "This documentation is for an out-of-date version of Apache Flink. We recommend you use the latest [stable version](%s)." $stableURL) }}
</blockquote>
</article>
{{ end }}
{{ if (not $.Site.Params.IsStable) }}
+{{ $stableURL := replaceRE "/flink-docs-[^/]+/" "/flink-docs-stable/" .Permalink }}
<article class="markdown">
<blockquote style="border-color:#f66">
- {{ markdownify "This documentation is for an unreleased version of Apache Flink. We recommend you use the latest [stable version](https://nightlies.apache.org/flink/flink-docs-stable/)."}}
+ {{ markdownify (printf "This documentation is for an unreleased version of Apache Flink. We recommend you use the latest [stable version](%s)." $stableURL) }}
</blockquote>
</article>
{{ end }}
(flink) 03/07: [FLINK-38914][docs] Add canonical tags pointing to stable docs
Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
martijnvisser pushed a commit to branch release-1.15
in repository https://gitbox.apache.org/repos/asf/flink.git
commit 9b1a65281e8fc04023df9a68f0f973d5d36e3774
Author: Martijn Visser <29...@users.noreply.github.com>
AuthorDate: Wed Jan 14 14:42:50 2026 +0100
[FLINK-38914][docs] Add canonical tags pointing to stable docs
All documentation pages now include a canonical link tag pointing to the stable version (flink-docs-stable). This prevents search engines from indexing duplicate content across master, release, and stable versions, consolidating SEO value on the stable docs where users should land.
---
docs/layouts/partials/docs/inject/head.html | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/docs/layouts/partials/docs/inject/head.html b/docs/layouts/partials/docs/inject/head.html
index f456c36bdc2..822b64ae3f3 100644
--- a/docs/layouts/partials/docs/inject/head.html
+++ b/docs/layouts/partials/docs/inject/head.html
@@ -19,6 +19,16 @@ under the License.
<!--
Misc other content that should run in the header
-->
+<!-- Canonical URL pointing to stable docs to avoid duplicate content issues across versions -->
+{{- $basePath := (urls.Parse .Site.BaseURL).Path -}}
+{{- $pagePath := strings.TrimPrefix $basePath .RelPermalink -}}
+{{- if eq $pagePath "" -}}
+ {{- $pagePath = "/" -}}
+{{- else if not (hasPrefix $pagePath "/") -}}
+ {{- $pagePath = printf "/%s" $pagePath -}}
+{{- end -}}
+<link rel="canonical" href="https://nightlies.apache.org/flink/flink-docs-stable{{ $pagePath }}" />
+
<link rel="stylesheet" type="text/css" href="{{.Site.BaseURL}}/font-awesome/css/font-awesome.min.css">
<script src="{{.Site.BaseURL}}/js/anchor.min.js"></script>
<script src="{{.Site.BaseURL}}/js/flink.js"></script>