diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-aerospike-sink.md b/site2/website-next/versioned_docs/version-2.7.2/io-aerospike-sink.md
new file mode 100644
index 0000000000000..7ff980521a489
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-aerospike-sink.md
@@ -0,0 +1,30 @@
+---
+id: io-aerospike-sink
+title: Aerospike sink connector
+sidebar_label: "Aerospike sink connector"
+original_id: io-aerospike-sink
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The Aerospike sink connector pulls messages from Pulsar topics to Aerospike clusters.
+
+## Configuration
+
+The configuration of the Aerospike sink connector has the following properties.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `seedHosts` |String| true | No default value| The comma-separated list of one or more Aerospike cluster hosts.
Each host can be specified as a valid IP address or hostname followed by an optional port number. |
+| `keyspace` | String| true |No default value |The Aerospike namespace. |
+| `columnName` | String | true| No default value|The Aerospike column name. |
+|`userName`|String|false|NULL|The Aerospike username.|
+|`password`|String|false|NULL|The Aerospike password.|
+| `keySet` | String|false |NULL | The Aerospike set name. |
+| `maxConcurrentRequests` |int| false | 100 | The maximum number of concurrent Aerospike transactions that a sink can open. |
+| `timeoutMs` | int|false | 100 | This property controls `socketTimeout` and `totalTimeout` for Aerospike transactions. |
+| `retries` | int|false | 1 |The maximum number of retries before aborting a write transaction to Aerospike. |
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-canal-source.md b/site2/website-next/versioned_docs/version-2.7.2/io-canal-source.md
new file mode 100644
index 0000000000000..853b387164d65
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-canal-source.md
@@ -0,0 +1,239 @@
+---
+id: io-canal-source
+title: Canal source connector
+sidebar_label: "Canal source connector"
+original_id: io-canal-source
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The Canal source connector pulls messages from MySQL to Pulsar topics.
+
+## Configuration
+
+The configuration of Canal source connector has the following properties.
+
+### Property
+
+| Name | Required | Default | Description |
+|------|----------|---------|-------------|
+| `username` | true | None | Canal server account (not MySQL).|
+| `password` | true | None | Canal server password (not MySQL). |
+|`destination`|true|None|Source destination that Canal source connector connects to.
+| `singleHostname` | false | None | Canal server address.|
+| `singlePort` | false | None | Canal server port.|
+| `cluster` | true | false | Whether to enable cluster mode based on Canal server configuration or not.
true: **cluster** mode.
If set to true, it talks to `zkServers` to figure out the actual database host.
false: **standalone** mode.
If set to false, it connects to the database specified by `singleHostname` and `singlePort`. |
+| `zkServers` | true | None | Address and port of the Zookeeper that Canal source connector talks to figure out the actual database host.|
+| `batchSize` | false | 1000 | Batch size to fetch from Canal. |
+
+### Example
+
+Before using the Canal connector, you can create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "zkServers": "127.0.0.1:2181",
+ "batchSize": "5120",
+ "destination": "example",
+ "username": "",
+ "password": "",
+ "cluster": false,
+ "singleHostname": "127.0.0.1",
+ "singlePort": "11111",
+ }
+
+ ```
+
+* YAML
+
+ You can create a YAML file and copy the [contents](https://github.com/apache/pulsar/blob/master/pulsar-io/canal/src/main/resources/canal-mysql-source-config.yaml) below to your YAML file.
+
+ ```yaml
+
+ configs:
+ zkServers: "127.0.0.1:2181"
+ batchSize: 5120
+ destination: "example"
+ username: ""
+ password: ""
+ cluster: false
+ singleHostname: "127.0.0.1"
+ singlePort: 11111
+
+ ```
+
+## Usage
+
+Here is an example of storing MySQL data using the configuration file as above.
+
+1. Start a MySQL server.
+
+ ```bash
+
+ $ docker pull mysql:5.7
+ $ docker run -d -it --rm --name pulsar-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=canal -e MYSQL_USER=mysqluser -e MYSQL_PASSWORD=mysqlpw mysql:5.7
+
+ ```
+
+2. Create a configuration file `mysqld.cnf`.
+
+ ```bash
+
+ [mysqld]
+ pid-file = /var/run/mysqld/mysqld.pid
+ socket = /var/run/mysqld/mysqld.sock
+ datadir = /var/lib/mysql
+ #log-error = /var/log/mysql/error.log
+ # By default we only accept connections from localhost
+ #bind-address = 127.0.0.1
+ # Disabling symbolic-links is recommended to prevent assorted security risks
+ symbolic-links=0
+ log-bin=mysql-bin
+ binlog-format=ROW
+ server_id=1
+
+ ```
+
+3. Copy the configuration file `mysqld.cnf` to MySQL server.
+
+ ```bash
+
+ $ docker cp mysqld.cnf pulsar-mysql:/etc/mysql/mysql.conf.d/
+
+ ```
+
+4. Restart the MySQL server.
+
+ ```bash
+
+ $ docker restart pulsar-mysql
+
+ ```
+
+5. Create a test database in MySQL server.
+
+ ```bash
+
+ $ docker exec -it pulsar-mysql /bin/bash
+ $ mysql -h 127.0.0.1 -uroot -pcanal -e 'create database test;'
+
+ ```
+
+6. Start a Canal server and connect to MySQL server.
+
+ ```
+
+ $ docker pull canal/canal-server:v1.1.2
+ $ docker run -d -it --link pulsar-mysql -e canal.auto.scan=false -e canal.destinations=test -e canal.instance.master.address=pulsar-mysql:3306 -e canal.instance.dbUsername=root -e canal.instance.dbPassword=canal -e canal.instance.connectionCharset=UTF-8 -e canal.instance.tsdb.enable=true -e canal.instance.gtidon=false --name=pulsar-canal-server -p 8000:8000 -p 2222:2222 -p 11111:11111 -p 11112:11112 -m 4096m canal/canal-server:v1.1.2
+
+ ```
+
+7. Start Pulsar standalone.
+
+ ```bash
+
+ $ docker pull apachepulsar/pulsar:2.3.0
+ $ docker run -d -it --link pulsar-canal-server -p 6650:6650 -p 8080:8080 -v $PWD/data:/pulsar/data --name pulsar-standalone apachepulsar/pulsar:2.3.0 bin/pulsar standalone
+
+ ```
+
+8. Modify the configuration file `canal-mysql-source-config.yaml`.
+
+ ```yaml
+
+ configs:
+ zkServers: ""
+ batchSize: "5120"
+ destination: "test"
+ username: ""
+ password: ""
+ cluster: false
+ singleHostname: "pulsar-canal-server"
+ singlePort: "11111"
+
+ ```
+
+9. Create a consumer file `pulsar-client.py`.
+
+ ```python
+
+ import pulsar
+
+ client = pulsar.Client('pulsar://localhost:6650')
+ consumer = client.subscribe('my-topic',
+ subscription_name='my-sub')
+
+ while True:
+ msg = consumer.receive()
+ print("Received message: '%s'" % msg.data())
+ consumer.acknowledge(msg)
+
+ client.close()
+
+ ```
+
+10. Copy the configuration file `canal-mysql-source-config.yaml` and the consumer file `pulsar-client.py` to Pulsar server.
+
+ ```bash
+
+ $ docker cp canal-mysql-source-config.yaml pulsar-standalone:/pulsar/conf/
+ $ docker cp pulsar-client.py pulsar-standalone:/pulsar/
+
+ ```
+
+11. Download a Canal connector and start it.
+
+ ```bash
+
+ $ docker exec -it pulsar-standalone /bin/bash
+ $ wget https://archive.apache.org/dist/pulsar/pulsar-2.3.0/connectors/pulsar-io-canal-2.3.0.nar -P connectors
+ $ ./bin/pulsar-admin source localrun \
+ --archive ./connectors/pulsar-io-canal-2.3.0.nar \
+ --classname org.apache.pulsar.io.canal.CanalStringSource \
+ --tenant public \
+ --namespace default \
+ --name canal \
+ --destination-topic-name my-topic \
+ --source-config-file /pulsar/conf/canal-mysql-source-config.yaml \
+ --parallelism 1
+
+ ```
+
+12. Consume data from MySQL.
+
+ ```bash
+
+ $ docker exec -it pulsar-standalone /bin/bash
+ $ python pulsar-client.py
+
+ ```
+
+13. Open another window to log in MySQL server.
+
+ ```bash
+
+ $ docker exec -it pulsar-mysql /bin/bash
+ $ mysql -h 127.0.0.1 -uroot -pcanal
+
+ ```
+
+14. Create a table, and insert, delete, and update data in MySQL server.
+
+ ```bash
+
+ mysql> use test;
+ mysql> show tables;
+ mysql> CREATE TABLE IF NOT EXISTS `test_table`(`test_id` INT UNSIGNED AUTO_INCREMENT,`test_title` VARCHAR(100) NOT NULL,
+ `test_author` VARCHAR(40) NOT NULL,
+ `test_date` DATE,PRIMARY KEY ( `test_id` ))ENGINE=InnoDB DEFAULT CHARSET=utf8;
+ mysql> INSERT INTO test_table (test_title, test_author, test_date) VALUES("a", "b", NOW());
+ mysql> UPDATE test_table SET test_title='c' WHERE test_title='a';
+ mysql> DELETE FROM test_table WHERE test_title='c';
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-cassandra-sink.md b/site2/website-next/versioned_docs/version-2.7.2/io-cassandra-sink.md
new file mode 100644
index 0000000000000..c79917ca80eec
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-cassandra-sink.md
@@ -0,0 +1,61 @@
+---
+id: io-cassandra-sink
+title: Cassandra sink connector
+sidebar_label: "Cassandra sink connector"
+original_id: io-cassandra-sink
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The Cassandra sink connector pulls messages from Pulsar topics to Cassandra clusters.
+
+## Configuration
+
+The configuration of the Cassandra sink connector has the following properties.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `roots` | String|true | " " (empty string) | A comma-separated list of Cassandra hosts to connect to.|
+| `keyspace` | String|true| " " (empty string)| The key space used for writing pulsar messages.
**Note: `keyspace` should be created prior to a Cassandra sink.**|
+| `keyname` | String|true| " " (empty string)| The key name of the Cassandra column family.
The column is used for storing Pulsar message keys.
If a Pulsar message doesn't have any key associated, the message value is used as the key. |
+| `columnFamily` | String|true| " " (empty string)| The Cassandra column family name.
**Note: `columnFamily` should be created prior to a Cassandra sink.**|
+| `columnName` | String|true| " " (empty string) | The column name of the Cassandra column family.
The column is used for storing Pulsar message values. |
+
+### Example
+
+Before using the Cassandra sink connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "roots": "localhost:9042",
+ "keyspace": "pulsar_test_keyspace",
+ "columnFamily": "pulsar_test_table",
+ "keyname": "key",
+ "columnName": "col"
+ }
+
+ ```
+
+* YAML
+
+ ```
+
+ configs:
+ roots: "localhost:9042"
+ keyspace: "pulsar_test_keyspace"
+ columnFamily: "pulsar_test_table"
+ keyname: "key"
+ columnName: "col"
+
+ ```
+
+## Usage
+
+For more information about **how to connect Pulsar with Cassandra**, see [here](io-quickstart.md#connect-pulsar-to-apache-cassandra).
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-cdc-debezium.md b/site2/website-next/versioned_docs/version-2.7.2/io-cdc-debezium.md
new file mode 100644
index 0000000000000..bc32077f562ae
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-cdc-debezium.md
@@ -0,0 +1,554 @@
+---
+id: io-cdc-debezium
+title: Debezium source connector
+sidebar_label: "Debezium source connector"
+original_id: io-cdc-debezium
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The Debezium source connector pulls messages from MySQL or PostgreSQL
+and persists the messages to Pulsar topics.
+
+## Configuration
+
+The configuration of Debezium source connector has the following properties.
+
+| Name | Required | Default | Description |
+|------|----------|---------|-------------|
+| `task.class` | true | null | A source task class that implemented in Debezium. |
+| `database.hostname` | true | null | The address of a database server. |
+| `database.port` | true | null | The port number of a database server.|
+| `database.user` | true | null | The name of a database user that has the required privileges. |
+| `database.password` | true | null | The password for a database user that has the required privileges. |
+| `database.server.id` | true | null | The connector’s identifier that must be unique within a database cluster and similar to the database’s server-id configuration property. |
+| `database.server.name` | true | null | The logical name of a database server/cluster, which forms a namespace and it is used in all the names of Kafka topics to which the connector writes, the Kafka Connect schema names, and the namespaces of the corresponding Avro schema when the Avro Connector is used. |
+| `database.whitelist` | false | null | A list of all databases hosted by this server which is monitored by the connector.
This is optional, and there are other properties for listing databases and tables to include or exclude from monitoring. |
+| `key.converter` | true | null | The converter provided by Kafka Connect to convert record key. |
+| `value.converter` | true | null | The converter provided by Kafka Connect to convert record value. |
+| `database.history` | true | null | The name of the database history class. |
+| `database.history.pulsar.topic` | true | null | The name of the database history topic where the connector writes and recovers DDL statements.
**Note: this topic is for internal use only and should not be used by consumers.** |
+| `database.history.pulsar.service.url` | true | null | Pulsar cluster service URL for history topic. |
+| `pulsar.service.url` | true | null | Pulsar cluster service URL for the offset topic used in Debezium. You can use the `bin/pulsar-admin --admin-url http://pulsar:8080 sources localrun --source-config-file configs/pg-pulsar-config.yaml` command to point to the target Pulsar cluster. |
+| `offset.storage.topic` | true | null | Record the last committed offsets that the connector successfully completes. |
+| `mongodb.hosts` | true | null | The comma-separated list of hostname and port pairs (in the form 'host' or 'host:port') of the MongoDB servers in the replica set. The list contains a single hostname and a port pair. If mongodb.members.auto.discover is set to false, the host and port pair are prefixed with the replica set name (e.g., rs0/localhost:27017). |
+| `mongodb.name` | true | null | A unique name that identifies the connector and/or MongoDB replica set or shared cluster that this connector monitors. Each server should be monitored by at most one Debezium connector, since this server name prefixes all persisted Kafka topics emanating from the MongoDB replica set or cluster. |
+| `mongodb.user` | true | null | Name of the database user to be used when connecting to MongoDB. This is required only when MongoDB is configured to use authentication. |
+| `mongodb.password` | true | null | Password to be used when connecting to MongoDB. This is required only when MongoDB is configured to use authentication. |
+| `mongodb.task.id` | true | null | The taskId of the MongoDB connector that attempts to use a separate task for each replica set. |
+
+
+
+## Example of MySQL
+
+You need to create a configuration file before using the Pulsar Debezium connector.
+
+### Configuration
+
+You can use one of the following methods to create a configuration file.
+
+* JSON
+
+ ```json
+
+ {
+ "database.hostname": "localhost",
+ "database.port": "3306",
+ "database.user": "debezium",
+ "database.password": "dbz",
+ "database.server.id": "184054",
+ "database.server.name": "dbserver1",
+ "database.whitelist": "inventory",
+ "database.history": "org.apache.pulsar.io.debezium.PulsarDatabaseHistory",
+ "database.history.pulsar.topic": "history-topic",
+ "database.history.pulsar.service.url": "pulsar://127.0.0.1:6650",
+ "key.converter": "org.apache.kafka.connect.json.JsonConverter",
+ "value.converter": "org.apache.kafka.connect.json.JsonConverter",
+ "pulsar.service.url": "pulsar://127.0.0.1:6650",
+ "offset.storage.topic": "offset-topic"
+ }
+
+ ```
+
+* YAML
+
+ You can create a `debezium-mysql-source-config.yaml` file and copy the [contents](https://github.com/apache/pulsar/blob/master/pulsar-io/debezium/mysql/src/main/resources/debezium-mysql-source-config.yaml) below to the `debezium-mysql-source-config.yaml` file.
+
+ ```yaml
+
+ tenant: "public"
+ namespace: "default"
+ name: "debezium-mysql-source"
+ topicName: "debezium-mysql-topic"
+ archive: "connectors/pulsar-io-debezium-mysql-@pulsar:version@.nar"
+ parallelism: 1
+
+ configs:
+
+ ## config for mysql, docker image: debezium/example-mysql:0.8
+ database.hostname: "localhost"
+ database.port: "3306"
+ database.user: "debezium"
+ database.password: "dbz"
+ database.server.id: "184054"
+ database.server.name: "dbserver1"
+ database.whitelist: "inventory"
+ database.history: "org.apache.pulsar.io.debezium.PulsarDatabaseHistory"
+ database.history.pulsar.topic: "history-topic"
+ database.history.pulsar.service.url: "pulsar://127.0.0.1:6650"
+
+ ## KEY_CONVERTER_CLASS_CONFIG, VALUE_CONVERTER_CLASS_CONFIG
+ key.converter: "org.apache.kafka.connect.json.JsonConverter"
+ value.converter: "org.apache.kafka.connect.json.JsonConverter"
+
+ ## PULSAR_SERVICE_URL_CONFIG
+ pulsar.service.url: "pulsar://127.0.0.1:6650"
+
+ ## OFFSET_STORAGE_TOPIC_CONFIG
+ offset.storage.topic: "offset-topic"
+
+ ```
+
+### Usage
+
+This example shows how to change the data of a MySQL table using the Pulsar Debezium connector.
+
+1. Start a MySQL server with a database from which Debezium can capture changes.
+
+ ```bash
+
+ $ docker run -it --rm \
+ --name mysql \
+ -p 3306:3306 \
+ -e MYSQL_ROOT_PASSWORD=debezium \
+ -e MYSQL_USER=mysqluser \
+ -e MYSQL_PASSWORD=mysqlpw debezium/example-mysql:0.8
+
+ ```
+
+2. Start a Pulsar service locally in standalone mode.
+
+ ```bash
+
+ $ bin/pulsar standalone
+
+ ```
+
+3. Start the Pulsar Debezium connector in local run mode using one of the following methods.
+
+ * Use the **JSON** configuration file as shown previously.
+
+ Make sure the nar file is available at `connectors/pulsar-io-debezium-mysql-@pulsar:version@.nar`.
+
+ ```bash
+
+ $ bin/pulsar-admin source localrun \
+ --archive connectors/pulsar-io-debezium-mysql-@pulsar:version@.nar \
+ --name debezium-mysql-source --destination-topic-name debezium-mysql-topic \
+ --tenant public \
+ --namespace default \
+ --source-config '{"database.hostname": "localhost","database.port": "3306","database.user": "debezium","database.password": "dbz","database.server.id": "184054","database.server.name": "dbserver1","database.whitelist": "inventory","database.history": "org.apache.pulsar.io.debezium.PulsarDatabaseHistory","database.history.pulsar.topic": "history-topic","database.history.pulsar.service.url": "pulsar://127.0.0.1:6650","key.converter": "org.apache.kafka.connect.json.JsonConverter","value.converter": "org.apache.kafka.connect.json.JsonConverter","pulsar.service.url": "pulsar://127.0.0.1:6650","offset.storage.topic": "offset-topic"}'
+
+ ```
+
+ * Use the **YAML** configuration file as shown previously.
+
+ ```bash
+
+ $ bin/pulsar-admin source localrun \
+ --source-config-file debezium-mysql-source-config.yaml
+
+ ```
+
+4. Subscribe the topic _sub-products_ for the table _inventory.products_.
+
+ ```bash
+
+ $ bin/pulsar-client consume -s "sub-products" public/default/dbserver1.inventory.products -n 0
+
+ ```
+
+5. Start a MySQL client in docker.
+
+ ```bash
+
+ $ docker run -it --rm \
+ --name mysqlterm \
+ --link mysql \
+ --rm mysql:5.7 sh \
+ -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
+
+ ```
+
+6. A MySQL client pops out.
+
+ Use the following commands to change the data of the table _products_.
+
+ ```
+
+ mysql> use inventory;
+ mysql> show tables;
+ mysql> SELECT * FROM products;
+ mysql> UPDATE products SET name='1111111111' WHERE id=101;
+ mysql> UPDATE products SET name='1111111111' WHERE id=107;
+
+ ```
+
+ In the terminal window of subscribing topic, you can find the data changes have been kept in the _sub-products_ topic.
+
+## Example of PostgreSQL
+
+You need to create a configuration file before using the Pulsar Debezium connector.
+
+### Configuration
+
+You can use one of the following methods to create a configuration file.
+
+* JSON
+
+ ```json
+
+ {
+ "database.hostname": "localhost",
+ "database.port": "5432",
+ "database.user": "postgres",
+ "database.password": "postgres",
+ "database.dbname": "postgres",
+ "database.server.name": "dbserver1",
+ "schema.whitelist": "inventory",
+ "pulsar.service.url": "pulsar://127.0.0.1:6650"
+ }
+
+ ```
+
+* YAML
+
+ You can create a `debezium-postgres-source-config.yaml` file and copy the [contents](https://github.com/apache/pulsar/blob/master/pulsar-io/debezium/postgres/src/main/resources/debezium-postgres-source-config.yaml) below to the `debezium-postgres-source-config.yaml` file.
+
+ ```yaml
+
+ tenant: "public"
+ namespace: "default"
+ name: "debezium-postgres-source"
+ topicName: "debezium-postgres-topic"
+ archive: "connectors/pulsar-io-debezium-postgres-@pulsar:version@.nar"
+ parallelism: 1
+
+ configs:
+
+ ## config for pg, docker image: debezium/example-postgress:0.8
+ database.hostname: "localhost"
+ database.port: "5432"
+ database.user: "postgres"
+ database.password: "postgres"
+ database.dbname: "postgres"
+ database.server.name: "dbserver1"
+ schema.whitelist: "inventory"
+
+ ## PULSAR_SERVICE_URL_CONFIG
+ pulsar.service.url: "pulsar://127.0.0.1:6650"
+
+ ```
+
+### Usage
+
+This example shows how to change the data of a PostgreSQL table using the Pulsar Debezium connector.
+
+
+1. Start a PostgreSQL server with a database from which Debezium can capture changes.
+
+ ```bash
+
+ $ docker pull debezium/example-postgres:0.8
+ $ docker run -d -it --rm --name pulsar-postgresql -p 5432:5432 debezium/example-postgres:0.8
+
+ ```
+
+2. Start a Pulsar service locally in standalone mode.
+
+ ```bash
+
+ $ bin/pulsar standalone
+
+ ```
+
+3. Start the Pulsar Debezium connector in local run mode using one of the following methods.
+
+ * Use the **JSON** configuration file as shown previously.
+
+ Make sure the nar file is available at `connectors/pulsar-io-debezium-postgres-@pulsar:version@.nar`.
+
+ ```bash
+
+ $ bin/pulsar-admin source localrun \
+ --archive connectors/pulsar-io-debezium-postgres-@pulsar:version@.nar \
+ --name debezium-postgres-source \
+ --destination-topic-name debezium-postgres-topic \
+ --tenant public \
+ --namespace default \
+ --source-config '{"database.hostname": "localhost","database.port": "5432","database.user": "postgres","database.password": "postgres","database.dbname": "postgres","database.server.name": "dbserver1","schema.whitelist": "inventory","pulsar.service.url": "pulsar://127.0.0.1:6650"}'
+
+ ```
+
+ * Use the **YAML** configuration file as shown previously.
+
+ ```bash
+
+ $ bin/pulsar-admin source localrun \
+ --source-config-file debezium-postgres-source-config.yaml
+
+ ```
+
+4. Subscribe the topic _sub-products_ for the _inventory.products_ table.
+
+ ```
+
+ $ bin/pulsar-client consume -s "sub-products" public/default/dbserver1.inventory.products -n 0
+
+ ```
+
+5. Start a PostgreSQL client in docker.
+
+ ```bash
+
+ $ docker exec -it pulsar-postgresql /bin/bash
+
+ ```
+
+6. A PostgreSQL client pops out.
+
+ Use the following commands to change the data of the table _products_.
+
+ ```
+
+ psql -U postgres postgres
+ postgres=# \c postgres;
+ You are now connected to database "postgres" as user "postgres".
+ postgres=# SET search_path TO inventory;
+ SET
+ postgres=# select * from products;
+ id | name | description | weight
+ -----+--------------------+---------------------------------------------------------+--------
+ 102 | car battery | 12V car battery | 8.1
+ 103 | 12-pack drill bits | 12-pack of drill bits with sizes ranging from #40 to #3 | 0.8
+ 104 | hammer | 12oz carpenter's hammer | 0.75
+ 105 | hammer | 14oz carpenter's hammer | 0.875
+ 106 | hammer | 16oz carpenter's hammer | 1
+ 107 | rocks | box of assorted rocks | 5.3
+ 108 | jacket | water resistent black wind breaker | 0.1
+ 109 | spare tire | 24 inch spare tire | 22.2
+ 101 | 1111111111 | Small 2-wheel scooter | 3.14
+ (9 rows)
+
+ postgres=# UPDATE products SET name='1111111111' WHERE id=107;
+ UPDATE 1
+
+ ```
+
+ In the terminal window of subscribing topic, you can receive the following messages.
+
+ ```bash
+
+ ----- got message -----
+ {"schema":{"type":"struct","fields":[{"type":"int32","optional":false,"field":"id"}],"optional":false,"name":"dbserver1.inventory.products.Key"},"payload":{"id":107}}�{"schema":{"type":"struct","fields":[{"type":"struct","fields":[{"type":"int32","optional":false,"field":"id"},{"type":"string","optional":false,"field":"name"},{"type":"string","optional":true,"field":"description"},{"type":"double","optional":true,"field":"weight"}],"optional":true,"name":"dbserver1.inventory.products.Value","field":"before"},{"type":"struct","fields":[{"type":"int32","optional":false,"field":"id"},{"type":"string","optional":false,"field":"name"},{"type":"string","optional":true,"field":"description"},{"type":"double","optional":true,"field":"weight"}],"optional":true,"name":"dbserver1.inventory.products.Value","field":"after"},{"type":"struct","fields":[{"type":"string","optional":true,"field":"version"},{"type":"string","optional":true,"field":"connector"},{"type":"string","optional":false,"field":"name"},{"type":"string","optional":false,"field":"db"},{"type":"int64","optional":true,"field":"ts_usec"},{"type":"int64","optional":true,"field":"txId"},{"type":"int64","optional":true,"field":"lsn"},{"type":"string","optional":true,"field":"schema"},{"type":"string","optional":true,"field":"table"},{"type":"boolean","optional":true,"default":false,"field":"snapshot"},{"type":"boolean","optional":true,"field":"last_snapshot_record"}],"optional":false,"name":"io.debezium.connector.postgresql.Source","field":"source"},{"type":"string","optional":false,"field":"op"},{"type":"int64","optional":true,"field":"ts_ms"}],"optional":false,"name":"dbserver1.inventory.products.Envelope"},"payload":{"before":{"id":107,"name":"rocks","description":"box of assorted rocks","weight":5.3},"after":{"id":107,"name":"1111111111","description":"box of assorted rocks","weight":5.3},"source":{"version":"0.9.2.Final","connector":"postgresql","name":"dbserver1","db":"postgres","ts_usec":1559208957661080,"txId":577,"lsn":23862872,"schema":"inventory","table":"products","snapshot":false,"last_snapshot_record":null},"op":"u","ts_ms":1559208957692}}
+
+ ```
+
+## Example of MongoDB
+
+You need to create a configuration file before using the Pulsar Debezium connector.
+
+* JSON
+
+ ```json
+
+ {
+ "mongodb.hosts": "rs0/mongodb:27017",
+ "mongodb.name": "dbserver1",
+ "mongodb.user": "debezium",
+ "mongodb.password": "dbz",
+ "mongodb.task.id": "1",
+ "database.whitelist": "inventory",
+ "pulsar.service.url": "pulsar://127.0.0.1:6650"
+ }
+
+ ```
+
+* YAML
+
+ You can create a `debezium-mongodb-source-config.yaml` file and copy the [contents](https://github.com/apache/pulsar/blob/master/pulsar-io/debezium/mongodb/src/main/resources/debezium-mongodb-source-config.yaml) below to the `debezium-mongodb-source-config.yaml` file.
+
+ ```yaml
+
+ tenant: "public"
+ namespace: "default"
+ name: "debezium-mongodb-source"
+ topicName: "debezium-mongodb-topic"
+ archive: "connectors/pulsar-io-debezium-mongodb-@pulsar:version@.nar"
+ parallelism: 1
+
+ configs:
+
+ ## config for pg, docker image: debezium/example-postgress:0.10
+ mongodb.hosts: "rs0/mongodb:27017",
+ mongodb.name: "dbserver1",
+ mongodb.user: "debezium",
+ mongodb.password: "dbz",
+ mongodb.task.id: "1",
+ database.whitelist: "inventory",
+
+ ## PULSAR_SERVICE_URL_CONFIG
+ pulsar.service.url: "pulsar://127.0.0.1:6650"
+
+ ```
+
+### Usage
+
+This example shows how to change the data of a MongoDB table using the Pulsar Debezium connector.
+
+
+1. Start a MongoDB server with a database from which Debezium can capture changes.
+
+ ```bash
+
+ $ docker pull debezium/example-mongodb:0.10
+ $ docker run -d -it --rm --name pulsar-mongodb -e MONGODB_USER=mongodb -e MONGODB_PASSWORD=mongodb -p 27017:27017 debezium/example-mongodb:0.10
+
+ ```
+
+ Use the following commands to initialize the data.
+
+ ``` bash
+
+ ./usr/local/bin/init-inventory.sh
+
+ ```
+
+ If the local host cannot access the container network, you can update the file ```/etc/hosts``` and add a rule ```127.0.0.1 6 f114527a95f```. f114527a95f is container id, you can try to get by ```docker ps -a```
+
+
+2. Start a Pulsar service locally in standalone mode.
+
+ ```
+
+
+ $ bin/pulsar standalone
+
+ ```
+
+3. Start the Pulsar Debezium connector in local run mode using one of the following methods.
+
+ * Use the **JSON** configuration file as shown previously.
+
+ Make sure the nar file is available at `connectors/pulsar-io-mongodb-@pulsar:version@.nar`.
+
+ ```
+
+
+ $ bin/pulsar-admin source localrun \
+ --archive connectors/pulsar-io-debezium-mongodb-@pulsar:version@.nar \
+ --name debezium-mongodb-source \
+ --destination-topic-name debezium-mongodb-topic \
+ --tenant public \
+ --namespace default \
+ --source-config '{"mongodb.hosts": "rs0/mongodb:27017","mongodb.name": "dbserver1","mongodb.user": "debezium","mongodb.password": "dbz","mongodb.task.id": "1","database.whitelist": "inventory","pulsar.service.url": "pulsar://127.0.0.1:6650"}'
+
+ ```
+
+ * Use the **YAML** configuration file as shown previously.
+
+ ```
+
+
+ $ bin/pulsar-admin source localrun \
+ --source-config-file debezium-mongodb-source-config.yaml
+
+ ```
+
+4. Subscribe the topic _sub-products_ for the _inventory.products_ table.
+
+ ```
+
+
+ $ bin/pulsar-client consume -s "sub-products" public/default/dbserver1.inventory.products -n 0
+
+ ```
+
+5. Start a MongoDB client in docker.
+
+ ```
+
+
+ $ docker exec -it pulsar-mongodb /bin/bash
+
+ ```
+
+6. A MongoDB client pops out.
+
+ ```
+
+
+ mongo -u debezium -p dbz --authenticationDatabase admin localhost:27017/inventory
+ db.products.update({"_id":NumberLong(104)},{$set:{weight:1.25}})
+
+ ```
+
+ In the terminal window of subscribing topic, you can receive the following messages.
+
+ ```
+
+
+ ----- got message -----
+ {"schema":{"type":"struct","fields":[{"type":"string","optional":false,"field":"id"}],"optional":false,"name":"dbserver1.inventory.products.Key"},"payload":{"id":"104"}}, value = {"schema":{"type":"struct","fields":[{"type":"string","optional":true,"name":"io.debezium.data.Json","version":1,"field":"after"},{"type":"string","optional":true,"name":"io.debezium.data.Json","version":1,"field":"patch"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"version"},{"type":"string","optional":false,"field":"connector"},{"type":"string","optional":false,"field":"name"},{"type":"int64","optional":false,"field":"ts_ms"},{"type":"string","optional":true,"name":"io.debezium.data.Enum","version":1,"parameters":{"allowed":"true,last,false"},"default":"false","field":"snapshot"},{"type":"string","optional":false,"field":"db"},{"type":"string","optional":false,"field":"rs"},{"type":"string","optional":false,"field":"collection"},{"type":"int32","optional":false,"field":"ord"},{"type":"int64","optional":true,"field":"h"}],"optional":false,"name":"io.debezium.connector.mongo.Source","field":"source"},{"type":"string","optional":true,"field":"op"},{"type":"int64","optional":true,"field":"ts_ms"}],"optional":false,"name":"dbserver1.inventory.products.Envelope"},"payload":{"after":"{\"_id\": {\"$numberLong\": \"104\"},\"name\": \"hammer\",\"description\": \"12oz carpenter's hammer\",\"weight\": 1.25,\"quantity\": 4}","patch":null,"source":{"version":"0.10.0.Final","connector":"mongodb","name":"dbserver1","ts_ms":1573541905000,"snapshot":"true","db":"inventory","rs":"rs0","collection":"products","ord":1,"h":4983083486544392763},"op":"r","ts_ms":1573541909761}}.
+
+ ```
+
+## FAQ
+
+### Debezium postgres connector will hang when create snap
+
+```
+
+#18 prio=5 os_prio=31 tid=0x00007fd83096f800 nid=0xa403 waiting on condition [0x000070000f534000]
+ java.lang.Thread.State: WAITING (parking)
+ at sun.misc.Unsafe.park(Native Method)
+ - parking to wait for <0x00000007ab025a58> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
+ at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
+ at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
+ at java.util.concurrent.LinkedBlockingDeque.putLast(LinkedBlockingDeque.java:396)
+ at java.util.concurrent.LinkedBlockingDeque.put(LinkedBlockingDeque.java:649)
+ at io.debezium.connector.base.ChangeEventQueue.enqueue(ChangeEventQueue.java:132)
+ at io.debezium.connector.postgresql.PostgresConnectorTask$Lambda$203/385424085.accept(Unknown Source)
+ at io.debezium.connector.postgresql.RecordsSnapshotProducer.sendCurrentRecord(RecordsSnapshotProducer.java:402)
+ at io.debezium.connector.postgresql.RecordsSnapshotProducer.readTable(RecordsSnapshotProducer.java:321)
+ at io.debezium.connector.postgresql.RecordsSnapshotProducer.lambda$takeSnapshot$6(RecordsSnapshotProducer.java:226)
+ at io.debezium.connector.postgresql.RecordsSnapshotProducer$Lambda$240/1347039967.accept(Unknown Source)
+ at io.debezium.jdbc.JdbcConnection.queryWithBlockingConsumer(JdbcConnection.java:535)
+ at io.debezium.connector.postgresql.RecordsSnapshotProducer.takeSnapshot(RecordsSnapshotProducer.java:224)
+ at io.debezium.connector.postgresql.RecordsSnapshotProducer.lambda$start$0(RecordsSnapshotProducer.java:87)
+ at io.debezium.connector.postgresql.RecordsSnapshotProducer$Lambda$206/589332928.run(Unknown Source)
+ at java.util.concurrent.CompletableFuture.uniRun(CompletableFuture.java:705)
+ at java.util.concurrent.CompletableFuture.uniRunStage(CompletableFuture.java:717)
+ at java.util.concurrent.CompletableFuture.thenRun(CompletableFuture.java:2010)
+ at io.debezium.connector.postgresql.RecordsSnapshotProducer.start(RecordsSnapshotProducer.java:87)
+ at io.debezium.connector.postgresql.PostgresConnectorTask.start(PostgresConnectorTask.java:126)
+ at io.debezium.connector.common.BaseSourceTask.start(BaseSourceTask.java:47)
+ at org.apache.pulsar.io.kafka.connect.KafkaConnectSource.open(KafkaConnectSource.java:127)
+ at org.apache.pulsar.io.debezium.DebeziumSource.open(DebeziumSource.java:100)
+ at org.apache.pulsar.functions.instance.JavaInstanceRunnable.setupInput(JavaInstanceRunnable.java:690)
+ at org.apache.pulsar.functions.instance.JavaInstanceRunnable.setupJavaInstance(JavaInstanceRunnable.java:200)
+ at org.apache.pulsar.functions.instance.JavaInstanceRunnable.run(JavaInstanceRunnable.java:230)
+ at java.lang.Thread.run(Thread.java:748)
+
+```
+
+If you encounter the above problems in synchronizing data, please refer to [this](https://github.com/apache/pulsar/issues/4075) and add the following configuration to the configuration file:
+
+```
+
+max.queue.size=
+
+```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-cdc.md b/site2/website-next/versioned_docs/version-2.7.2/io-cdc.md
new file mode 100644
index 0000000000000..9ce8f7fc39101
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-cdc.md
@@ -0,0 +1,30 @@
+---
+id: io-cdc
+title: CDC connector
+sidebar_label: "CDC connector"
+original_id: io-cdc
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+CDC source connectors capture log changes of databases (such as MySQL, MongoDB, and PostgreSQL) into Pulsar.
+
+> CDC source connectors are built on top of [Canal](https://github.com/alibaba/canal) and [Debezium](https://debezium.io/) and store all data into Pulsar cluster in a persistent, replicated, and partitioned way.
+
+Currently, Pulsar has the following CDC connectors.
+
+Name|Java Class
+|---|---
+[Canal source connector](io-canal-source)|[org.apache.pulsar.io.canal.CanalStringSource.java](https://github.com/apache/pulsar/blob/master/pulsar-io/canal/src/main/java/org/apache/pulsar/io/canal/CanalStringSource.java)
+[Debezium source connector](io-cdc-debezium)|[org.apache.pulsar.io.debezium.DebeziumSource.java](https://github.com/apache/pulsar/blob/master/pulsar-io/debezium/core/src/main/java/org/apache/pulsar/io/debezium/DebeziumSource.java)
[org.apache.pulsar.io.debezium.mysql.DebeziumMysqlSource.java](https://github.com/apache/pulsar/blob/master/pulsar-io/debezium/mysql/src/main/java/org/apache/pulsar/io/debezium/mysql/DebeziumMysqlSource.java)
[org.apache.pulsar.io.debezium.postgres.DebeziumPostgresSource.java](https://github.com/apache/pulsar/blob/master/pulsar-io/debezium/postgres/src/main/java/org/apache/pulsar/io/debezium/postgres/DebeziumPostgresSource.java)
+
+For more information about Canal and Debezium, see the information below.
+
+Subject | Reference
+|---|---
+How to use Canal source connector with MySQL|[Canal guide](https://github.com/alibaba/canal/wiki)
+How does Canal work | [Canal tutorial](https://github.com/alibaba/canal/wiki)
+How to use Debezium source connector with MySQL | [Debezium guide](https://debezium.io/docs/connectors/mysql/)
+How does Debezium work | [Debezium tutorial](https://debezium.io/docs/tutorial/)
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-cli.md b/site2/website-next/versioned_docs/version-2.7.2/io-cli.md
new file mode 100644
index 0000000000000..81c3cd665e8c5
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-cli.md
@@ -0,0 +1,664 @@
+---
+id: io-cli
+title: Connector Admin CLI
+sidebar_label: "CLI"
+original_id: io-cli
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The `pulsar-admin` tool helps you manage Pulsar connectors.
+
+## `sources`
+
+An interface for managing Pulsar IO sources (ingress data into Pulsar).
+
+```bash
+
+$ pulsar-admin sources subcommands
+
+```
+
+Subcommands are:
+
+* `create`
+
+* `update`
+
+* `delete`
+
+* `get`
+
+* `status`
+
+* `list`
+
+* `stop`
+
+* `start`
+
+* `restart`
+
+* `localrun`
+
+* `available-sources`
+
+* `reload`
+
+
+### `create`
+
+Submit a Pulsar IO source connector to run in a Pulsar cluster.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sources create options
+
+```
+
+#### Options
+
+|Flag|Description|
+|----|---|
+| `-a`, `--archive` | The path to the NAR archive for the source.
It also supports url-path (http/https/file [file protocol assumes that file already exists on worker host]) from which worker can download the package.
+| `--batch-source-config` | BatchSource configuration key/values pairs provided as a JSON string, e.g., { "discoveryTriggererClassName" : "org.apache.pulsar.io.batchdiscovery.CronTriggerer", "discoveryTriggererConfig": {"cron": "*/5 * * * *"} }
+| `--classname` | The source's class name if `archive` is file-url-path (file://).
+| `--cpu` | The CPU (in cores) that needs to be allocated per source instance (applicable only to Docker runtime).
+| `--deserialization-classname` | The SerDe classname for the source.
+| `--destination-topic-name` | The Pulsar topic to which data is sent.
+| `--disk` | The disk (in bytes) that needs to be allocated per source instance (applicable only to Docker runtime).
+|`--name` | The source's name.
+| `--namespace` | The source's namespace.
+| ` --parallelism` | The source's parallelism factor, that is, the number of source instances to run.
+| `--processing-guarantees` | The processing guarantees (also named as delivery semantics) applied to the source. A source connector receives messages from external system and writes messages to a Pulsar topic. The `--processing-guarantees` is used to ensure the processing guarantees for writing messages to the Pulsar topic.
The available values are ATLEAST_ONCE, ATMOST_ONCE, EFFECTIVELY_ONCE.
+| `--ram` | The RAM (in bytes) that needs to be allocated per source instance (applicable only to the process and Docker runtimes).
+| `-st`, `--schema-type` | The schema type.
Either a builtin schema (for example, AVRO and JSON) or custom schema class name to be used to encode messages emitted from source.
+| `--source-config` | Source config key/values.
+| `--source-config-file` | The path to a YAML config file specifying the source's configuration.
+| `-t`, `--source-type` | The source's connector provider.
+| `--tenant` | The source's tenant.
+|`--producer-config`| The custom producer configuration (as a JSON string).
+
+### `update`
+
+Update a already submitted Pulsar IO source connector.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sources update options
+
+```
+
+#### Options
+
+|Flag|Description|
+|----|---|
+| `-a`, `--archive` | The path to the NAR archive for the source.
It also supports url-path (http/https/file [file protocol assumes that file already exists on worker host]) from which worker can download the package.
+| `--batch-source-config` | BatchSource configuration key/values pairs provided as a JSON string, e.g., { "discoveryTriggererClassName" : "org.apache.pulsar.io.batchdiscovery.CronTriggerer", "discoveryTriggererConfig": {"cron": "*/5 * * * *"} }
+| `--classname` | The source's class name if `archive` is file-url-path (file://).
+| `--cpu` | The CPU (in cores) that needs to be allocated per source instance (applicable only to Docker runtime).
+| `--deserialization-classname` | The SerDe classname for the source.
+| `--destination-topic-name` | The Pulsar topic to which data is sent.
+| `--disk` | The disk (in bytes) that needs to be allocated per source instance (applicable only to Docker runtime).
+|`--name` | The source's name.
+| `--namespace` | The source's namespace.
+| ` --parallelism` | The source's parallelism factor, that is, the number of source instances to run.
+| `--processing-guarantees` | The processing guarantees (also named as delivery semantics) applied to the source. A source connector receives messages from external system and writes messages to a Pulsar topic. The `--processing-guarantees` is used to ensure the processing guarantees for writing messages to the Pulsar topic.
The available values are ATLEAST_ONCE, ATMOST_ONCE, EFFECTIVELY_ONCE.
+| `--ram` | The RAM (in bytes) that needs to be allocated per source instance (applicable only to the process and Docker runtimes).
+| `-st`, `--schema-type` | The schema type.
Either a builtin schema (for example, AVRO and JSON) or custom schema class name to be used to encode messages emitted from source.
+| `--source-config` | Source config key/values.
+| `--source-config-file` | The path to a YAML config file specifying the source's configuration.
+| `-t`, `--source-type` | The source's connector provider. The `source-type` parameter of the currently built-in connectors is determined by the setting of the `name` parameter specified in the pulsar-io.yaml file.
+| `--tenant` | The source's tenant.
+| `--update-auth-data` | Whether or not to update the auth data.
**Default value: false.**
+
+
+### `delete`
+
+Delete a Pulsar IO source connector.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sources delete options
+
+```
+
+#### Option
+
+|Flag|Description|
+|---|---|
+|`--name`|The source's name.|
+|`--namespace`|The source's namespace.|
+|`--tenant`|The source's tenant.|
+
+### `get`
+
+Get the information about a Pulsar IO source connector.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sources get options
+
+```
+
+#### Options
+|Flag|Description|
+|---|---|
+|`--name`|The source's name.|
+|`--namespace`|The source's namespace.|
+|`--tenant`|The source's tenant.|
+
+
+### `status`
+
+Check the current status of a Pulsar Source.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sources status options
+
+```
+
+#### Options
+
+|Flag|Description|
+|---|---|
+|`--instance-id`|The source ID.
If `instance-id` is not provided, Pulasr gets status of all instances.|
+|`--name`|The source's name.|
+|`--namespace`|The source's namespace.|
+|`--tenant`|The source's tenant.|
+
+### `list`
+
+List all running Pulsar IO source connectors.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sources list options
+
+```
+
+#### Options
+
+|Flag|Description|
+|---|---|
+|`--namespace`|The source's namespace.|
+|`--tenant`|The source's tenant.|
+
+
+### `stop`
+
+Stop a source instance.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sources stop options
+
+```
+
+#### Options
+
+|Flag|Description|
+|---|---|
+|`--instance-id`|The source instanceID.
If `instance-id` is not provided, Pulsar stops all instances.|
+|`--name`|The source's name.|
+|`--namespace`|The source's namespace.|
+|`--tenant`|The source's tenant.|
+
+### `start`
+
+Start a source instance.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sources start options
+
+```
+
+#### Options
+
+|Flag|Description|
+|---|---|
+|`--instance-id`|The source instanceID.
If `instance-id` is not provided, Pulsar starts all instances.|
+|`--name`|The source's name.|
+|`--namespace`|The source's namespace.|
+|`--tenant`|The source's tenant.|
+
+
+### `restart`
+
+Restart a source instance.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sources restart options
+
+```
+
+#### Options
+|Flag|Description|
+|---|---|
+|`--instance-id`|The source instanceID.
If `instance-id` is not provided, Pulsar restarts all instances.
+|`--name`|The source's name.|
+|`--namespace`|The source's namespace.|
+|`--tenant`|The source's tenant.|
+
+
+### `localrun`
+
+Run a Pulsar IO source connector locally rather than deploying it to the Pulsar cluster.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sources localrun options
+
+```
+
+#### Options
+
+|Flag|Description|
+|----|---|
+| `-a`, `--archive` | The path to the NAR archive for the Source.
It also supports url-path (http/https/file [file protocol assumes that file already exists on worker host]) from which worker can download the package.
+| `--broker-service-url` | The URL for the Pulsar broker.
+|`--classname`|The source's class name if `archive` is file-url-path (file://).
+| `--client-auth-params` | Client authentication parameter.
+| `--client-auth-plugin` | Client authentication plugin using which function-process can connect to broker.
+|`--cpu`|The CPU (in cores) that needs to be allocated per source instance (applicable only to the Docker runtime).|
+|`--deserialization-classname`|The SerDe classname for the source.
+|`--destination-topic-name`|The Pulsar topic to which data is sent.
+|`--disk`|The disk (in bytes) that needs to be allocated per source instance (applicable only to the Docker runtime).|
+|`--hostname-verification-enabled`|Enable hostname verification.
**Default value: false**.
+|`--name`|The source’s name.|
+|`--namespace`|The source’s namespace.|
+|`--parallelism`|The source’s parallelism factor, that is, the number of source instances to run).|
+|`--processing-guarantees` | The processing guarantees (also named as delivery semantics) applied to the source. A source connector receives messages from external system and writes messages to a Pulsar topic. The `--processing-guarantees` is used to ensure the processing guarantees for writing messages to the Pulsar topic.
The available values are ATLEAST_ONCE, ATMOST_ONCE, EFFECTIVELY_ONCE.
+|`--ram`|The RAM (in bytes) that needs to be allocated per source instance (applicable only to the Docker runtime).|
+| `-st`, `--schema-type` | The schema type.
Either a builtin schema (for example, AVRO and JSON) or custom schema class name to be used to encode messages emitted from source.
+|`--source-config`|Source config key/values.
+|`--source-config-file`|The path to a YAML config file specifying the source’s configuration.
+|`--source-type`|The source's connector provider.
+|`--tenant`|The source’s tenant.
+|`--tls-allow-insecure`|Allow insecure tls connection.
**Default value: false**.
+|`--tls-trust-cert-path`|The tls trust cert file path.
+|`--use-tls`|Use tls connection.
**Default value: false**.
+|`--producer-config`| The custom producer configuration (as a JSON string).
+
+### `available-sources`
+
+Get the list of Pulsar IO connector sources supported by Pulsar cluster.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sources available-sources
+
+```
+
+### `reload`
+
+Reload the available built-in connectors.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sources reload
+
+```
+
+## `sinks`
+
+An interface for managing Pulsar IO sinks (egress data from Pulsar).
+
+```bash
+
+$ pulsar-admin sinks subcommands
+
+```
+
+Subcommands are:
+
+* `create`
+
+* `update`
+
+* `delete`
+
+* `get`
+
+* `status`
+
+* `list`
+
+* `stop`
+
+* `start`
+
+* `restart`
+
+* `localrun`
+
+* `available-sinks`
+
+* `reload`
+
+
+### `create`
+
+Submit a Pulsar IO sink connector to run in a Pulsar cluster.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sinks create options
+
+```
+
+#### Options
+
+|Flag|Description|
+|----|---|
+| `-a`, `--archive` | The path to the archive file for the sink.
It also supports url-path (http/https/file [file protocol assumes that file already exists on worker host]) from which worker can download the package.
+| `--auto-ack` | Whether or not the framework will automatically acknowledge messages.
+| `--classname` | The sink's class name if `archive` is file-url-path (file://).
+| `--cpu` | The CPU (in cores) that needs to be allocated per sink instance (applicable only to Docker runtime).
+| `--custom-schema-inputs` | The map of input topics to schema types or class names (as a JSON string).
+| `--custom-serde-inputs` | The map of input topics to SerDe class names (as a JSON string).
+| `--disk` | The disk (in bytes) that needs to be allocated per sink instance (applicable only to Docker runtime).
+|`-i, --inputs` | The sink's input topic or topics (multiple topics can be specified as a comma-separated list).
+|`--name` | The sink's name.
+| `--namespace` | The sink's namespace.
+| ` --parallelism` | The sink's parallelism factor, that is, the number of sink instances to run.
+| `--processing-guarantees` | The processing guarantees (also known as delivery semantics) applied to the sink. The `--processing-guarantees` implementation in Pulsar also relies on sink implementation.
The available values are ATLEAST_ONCE, ATMOST_ONCE, EFFECTIVELY_ONCE.
+| `--ram` | The RAM (in bytes) that needs to be allocated per sink instance (applicable only to the process and Docker runtimes).
+| `--retain-ordering` | Sink consumes and sinks messages in order.
+| `--sink-config` | sink config key/values.
+| `--sink-config-file` | The path to a YAML config file specifying the sink's configuration.
+| `-t`, `--sink-type` | The sink's connector provider. The `sink-type` parameter of the currently built-in connectors is determined by the setting of the `name` parameter specified in the pulsar-io.yaml file.
+| `--subs-name` | Pulsar source subscription name if user wants a specific subscription-name for input-topic consumer.
+| `--tenant` | The sink's tenant.
+| `--timeout-ms` | The message timeout in milliseconds.
+| `--topics-pattern` | TopicsPattern to consume from list of topics under a namespace that match the pattern.
`--input` and `--topics-Pattern` are mutually exclusive.
Add SerDe class name for a pattern in `--customSerdeInputs` (supported for java fun only).
+
+### `update`
+
+Update a Pulsar IO sink connector.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sinks update options
+
+```
+
+#### Options
+
+|Flag|Description|
+|----|---|
+| `-a`, `--archive` | The path to the archive file for the sink.
It also supports url-path (http/https/file [file protocol assumes that file already exists on worker host]) from which worker can download the package.
+| `--auto-ack` | Whether or not the framework will automatically acknowledge messages.
+| `--classname` | The sink's class name if `archive` is file-url-path (file://).
+| `--cpu` | The CPU (in cores) that needs to be allocated per sink instance (applicable only to Docker runtime).
+| `--custom-schema-inputs` | The map of input topics to schema types or class names (as a JSON string).
+| `--custom-serde-inputs` | The map of input topics to SerDe class names (as a JSON string).
+| `--disk` | The disk (in bytes) that needs to be allocated per sink instance (applicable only to Docker runtime).
+|`-i, --inputs` | The sink's input topic or topics (multiple topics can be specified as a comma-separated list).
+|`--name` | The sink's name.
+| `--namespace` | The sink's namespace.
+| ` --parallelism` | The sink's parallelism factor, that is, the number of sink instances to run.
+| `--processing-guarantees` | The processing guarantees (also known as delivery semantics) applied to the sink. The `--processing-guarantees` implementation in Pulsar also relies on sink implementation.
The available values are ATLEAST_ONCE, ATMOST_ONCE, EFFECTIVELY_ONCE.
+| `--ram` | The RAM (in bytes) that needs to be allocated per sink instance (applicable only to the process and Docker runtimes).
+| `--retain-ordering` | Sink consumes and sinks messages in order.
+| `--sink-config` | sink config key/values.
+| `--sink-config-file` | The path to a YAML config file specifying the sink's configuration.
+| `-t`, `--sink-type` | The sink's connector provider.
+| `--subs-name` | Pulsar source subscription name if user wants a specific subscription-name for input-topic consumer.
+| `--tenant` | The sink's tenant.
+| `--timeout-ms` | The message timeout in milliseconds.
+| `--topics-pattern` | TopicsPattern to consume from list of topics under a namespace that match the pattern.
`--input` and `--topics-Pattern` are mutually exclusive.
Add SerDe class name for a pattern in `--customSerdeInputs` (supported for java fun only).
+| `--update-auth-data` | Whether or not to update the auth data.
**Default value: false.**
+
+### `delete`
+
+Delete a Pulsar IO sink connector.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sinks delete options
+
+```
+
+#### Option
+
+|Flag|Description|
+|---|---|
+|`--name`|The sink's name.|
+|`--namespace`|The sink's namespace.|
+|`--tenant`|The sink's tenant.|
+
+### `get`
+
+Get the information about a Pulsar IO sink connector.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sinks get options
+
+```
+
+#### Options
+|Flag|Description|
+|---|---|
+|`--name`|The sink's name.|
+|`--namespace`|The sink's namespace.|
+|`--tenant`|The sink's tenant.|
+
+
+### `status`
+
+Check the current status of a Pulsar sink.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sinks status options
+
+```
+
+#### Options
+
+|Flag|Description|
+|---|---|
+|`--instance-id`|The sink ID.
If `instance-id` is not provided, Pulasr gets status of all instances.|
+|`--name`|The sink's name.|
+|`--namespace`|The sink's namespace.|
+|`--tenant`|The sink's tenant.|
+
+
+### `list`
+
+List all running Pulsar IO sink connectors.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sinks list options
+
+```
+
+#### Options
+
+|Flag|Description|
+|---|---|
+|`--namespace`|The sink's namespace.|
+|`--tenant`|The sink's tenant.|
+
+
+### `stop`
+
+Stop a sink instance.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sinks stop options
+
+```
+
+#### Options
+
+|Flag|Description|
+|---|---|
+|`--instance-id`|The sink instanceID.
If `instance-id` is not provided, Pulsar stops all instances.|
+|`--name`|The sink's name.|
+|`--namespace`|The sink's namespace.|
+|`--tenant`|The sink's tenant.|
+
+### `start`
+
+Start a sink instance.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sinks start options
+
+```
+
+#### Options
+
+|Flag|Description|
+|---|---|
+|`--instance-id`|The sink instanceID.
If `instance-id` is not provided, Pulsar starts all instances.|
+|`--name`|The sink's name.|
+|`--namespace`|The sink's namespace.|
+|`--tenant`|The sink's tenant.|
+
+
+### `restart`
+
+Restart a sink instance.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sinks restart options
+
+```
+
+#### Options
+
+|Flag|Description|
+|---|---|
+|`--instance-id`|The sink instanceID.
If `instance-id` is not provided, Pulsar restarts all instances.
+|`--name`|The sink's name.|
+|`--namespace`|The sink's namespace.|
+|`--tenant`|The sink's tenant.|
+
+
+### `localrun`
+
+Run a Pulsar IO sink connector locally rather than deploying it to the Pulsar cluster.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sinks localrun options
+
+```
+
+#### Options
+
+|Flag|Description|
+|----|---|
+| `-a`, `--archive` | The path to the archive file for the sink.
It also supports url-path (http/https/file [file protocol assumes that file already exists on worker host]) from which worker can download the package.
+| `--auto-ack` | Whether or not the framework will automatically acknowledge messages.
+| `--broker-service-url` | The URL for the Pulsar broker.
+|`--classname`|The sink's class name if `archive` is file-url-path (file://).
+| `--client-auth-params` | Client authentication parameter.
+| `--client-auth-plugin` | Client authentication plugin using which function-process can connect to broker.
+|`--cpu`|The CPU (in cores) that needs to be allocated per sink instance (applicable only to the Docker runtime).
+| `--custom-schema-inputs` | The map of input topics to Schema types or class names (as a JSON string).
+| `--max-redeliver-count` | Maximum number of times that a message is redelivered before being sent to the dead letter queue.
+| `--dead-letter-topic` | Name of the dead letter topic where the failing messages are sent.
+| `--custom-serde-inputs` | The map of input topics to SerDe class names (as a JSON string).
+|`--disk`|The disk (in bytes) that needs to be allocated per sink instance (applicable only to the Docker runtime).|
+|`--hostname-verification-enabled`|Enable hostname verification.
**Default value: false**.
+| `-i`, `--inputs` | The sink's input topic or topics (multiple topics can be specified as a comma-separated list).
+|`--name`|The sink’s name.|
+|`--namespace`|The sink’s namespace.|
+|`--parallelism`|The sink’s parallelism factor, that is, the number of sink instances to run).|
+|`--processing-guarantees`|The processing guarantees (also known as delivery semantics) applied to the sink. The `--processing-guarantees` implementation in Pulsar also relies on sink implementation.
The available values are ATLEAST_ONCE, ATMOST_ONCE, EFFECTIVELY_ONCE.
+|`--ram`|The RAM (in bytes) that needs to be allocated per sink instance (applicable only to the Docker runtime).|
+|`--retain-ordering` | Sink consumes and sinks messages in order.
+|`--sink-config`|sink config key/values.
+|`--sink-config-file`|The path to a YAML config file specifying the sink’s configuration.
+|`--sink-type`|The sink's connector provider.
+|`--subs-name` | Pulsar source subscription name if user wants a specific subscription-name for input-topic consumer.
+|`--tenant`|The sink’s tenant.
+| `--timeout-ms` | The message timeout in milliseconds.
+| `--negative-ack-redelivery-delay-ms` | The negatively-acknowledged message redelivery delay in milliseconds. |
+|`--tls-allow-insecure`|Allow insecure tls connection.
**Default value: false**.
+|`--tls-trust-cert-path`|The tls trust cert file path.
+| `--topics-pattern` | TopicsPattern to consume from list of topics under a namespace that match the pattern.
`--input` and `--topics-Pattern` are mutually exclusive.
Add SerDe class name for a pattern in `--customSerdeInputs` (supported for java fun only).
+|`--use-tls`|Use tls connection.
**Default value: false**.
+
+### `available-sinks`
+
+Get the list of Pulsar IO connector sinks supported by Pulsar cluster.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sinks available-sinks
+
+```
+
+### `reload`
+
+Reload the available built-in connectors.
+
+#### Usage
+
+```bash
+
+$ pulsar-admin sinks reload
+
+```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-connectors.md b/site2/website-next/versioned_docs/version-2.7.2/io-connectors.md
new file mode 100644
index 0000000000000..3e0924a7f3c91
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-connectors.md
@@ -0,0 +1,236 @@
+---
+id: io-connectors
+title: Built-in connector
+sidebar_label: "Built-in connector"
+original_id: io-connectors
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+Pulsar distribution includes a set of common connectors that have been packaged and tested with the rest of Apache Pulsar. These connectors import and export data from some of the most commonly used data systems.
+
+Using any of these connectors is as easy as writing a simple connector and running the connector locally or submitting the connector to a Pulsar Functions cluster.
+
+## Source connector
+
+Pulsar has various source connectors, which are sorted alphabetically as below.
+
+### Canal
+
+* [Configuration](io-canal-source.md#configuration)
+
+* [Example](io-canal-source.md#usage)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/canal/src/main/java/org/apache/pulsar/io/canal/CanalStringSource.java)
+
+
+### Debezium MySQL
+
+* [Configuration](io-debezium-source.md#configuration)
+
+* [Example](io-debezium-source.md#example-of-mysql)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/debezium/mysql/src/main/java/org/apache/pulsar/io/debezium/mysql/DebeziumMysqlSource.java)
+
+### Debezium PostgreSQL
+
+* [Configuration](io-debezium-source.md#configuration)
+
+* [Example](io-debezium-source.md#example-of-postgresql)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/debezium/postgres/src/main/java/org/apache/pulsar/io/debezium/postgres/DebeziumPostgresSource.java)
+
+### Debezium MongoDB
+
+* [Configuration](io-debezium-source.md#configuration)
+
+* [Example](io-debezium-source.md#example-of-mongodb)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/debezium/mongodb/src/main/java/org/apache/pulsar/io/debezium/mongodb/DebeziumMongoDbSource.java)
+
+### DynamoDB
+
+* [Configuration](io-dynamodb-source.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/dynamodb/src/main/java/org/apache/pulsar/io/dynamodb/DynamoDBSource.java)
+
+### File
+
+* [Configuration](io-file-source.md#configuration)
+
+* [Example](io-file-source.md#usage)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/file/src/main/java/org/apache/pulsar/io/file/FileSource.java)
+
+### Flume
+
+* [Configuration](io-flume-source.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/flume/src/main/java/org/apache/pulsar/io/flume/FlumeConnector.java)
+
+### Twitter firehose
+
+* [Configuration](io-twitter-source.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/twitter/src/main/java/org/apache/pulsar/io/twitter/TwitterFireHose.java)
+
+### Kafka
+
+* [Configuration](io-kafka-source.md#configuration)
+
+* [Example](io-kafka-source.md#usage)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/kafka/src/main/java/org/apache/pulsar/io/kafka/KafkaAbstractSource.java)
+
+### Kinesis
+
+* [Configuration](io-kinesis-source.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/kinesis/src/main/java/org/apache/pulsar/io/kinesis/KinesisSource.java)
+
+### Netty
+
+* [Configuration](io-netty-source.md#configuration)
+
+* [Example of TCP](io-netty-source.md#tcp)
+
+* [Example of HTTP](io-netty-source.md#http)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/netty/src/main/java/org/apache/pulsar/io/netty/NettySource.java)
+
+### NSQ
+
+* [Configuration](io-nsq-source.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/nsq/src/main/java/org/apache/pulsar/io/nsq/NSQSource.java)
+
+### RabbitMQ
+
+* [Configuration](io-rabbitmq-source.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/rabbitmq/src/main/java/org/apache/pulsar/io/rabbitmq/RabbitMQSource.java)
+
+## Sink connector
+
+Pulsar has various sink connectors, which are sorted alphabetically as below.
+
+### Aerospike
+
+* [Configuration](io-aerospike-sink.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/aerospike/src/main/java/org/apache/pulsar/io/aerospike/AerospikeStringSink.java)
+
+### Cassandra
+
+* [Configuration](io-cassandra-sink.md#configuration)
+
+* [Example](io-cassandra-sink.md#usage)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/cassandra/src/main/java/org/apache/pulsar/io/cassandra/CassandraStringSink.java)
+
+### ElasticSearch
+
+* [Configuration](io-elasticsearch-sink.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/elastic-search/src/main/java/org/apache/pulsar/io/elasticsearch/ElasticSearchSink.java)
+
+### Flume
+
+* [Configuration](io-flume-sink.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/flume/src/main/java/org/apache/pulsar/io/flume/sink/StringSink.java)
+
+### HBase
+
+* [Configuration](io-hbase-sink.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/hbase/src/main/java/org/apache/pulsar/io/hbase/HbaseAbstractConfig.java)
+
+### HDFS2
+
+* [Configuration](io-hdfs2-sink.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/hdfs2/src/main/java/org/apache/pulsar/io/hdfs2/AbstractHdfsConnector.java)
+
+### HDFS3
+
+* [Configuration](io-hdfs3-sink.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/hdfs3/src/main/java/org/apache/pulsar/io/hdfs3/AbstractHdfsConnector.java)
+
+### InfluxDB
+
+* [Configuration](io-influxdb-sink.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/influxdb/src/main/java/org/apache/pulsar/io/influxdb/InfluxDBGenericRecordSink.java)
+
+### JDBC ClickHouse
+
+* [Configuration](io-jdbc-sink.md#configuration)
+
+* [Example](io-jdbc-sink.md#example-for-clickhouse)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/jdbc/clickhouse/src/main/java/org/apache/pulsar/io/jdbc/ClickHouseJdbcAutoSchemaSink.java)
+
+### JDBC MariaDB
+
+* [Configuration](io-jdbc-sink.md#configuration)
+
+* [Example](io-jdbc-sink.md#example-for-mariadb)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/jdbc/mariadb/src/main/java/org/apache/pulsar/io/jdbc/MariadbJdbcAutoSchemaSink.java)
+
+### JDBC PostgreSQL
+
+* [Configuration](io-jdbc-sink.md#configuration)
+
+* [Example](io-jdbc-sink.md#example-for-postgresql)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/jdbc/postgres/src/main/java/org/apache/pulsar/io/jdbc/PostgresJdbcAutoSchemaSink.java)
+
+### JDBC SQLite
+
+* [Configuration](io-jdbc-sink.md#configuration)
+
+* [Example](io-jdbc-sink.md#example-for-sqlite)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/jdbc/sqlite/src/main/java/org/apache/pulsar/io/jdbc/SqliteJdbcAutoSchemaSink.java)
+
+### Kafka
+
+* [Configuration](io-kafka-sink.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/kafka/src/main/java/org/apache/pulsar/io/kafka/KafkaAbstractSink.java)
+
+### Kinesis
+
+* [Configuration](io-kinesis-sink.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/kinesis/src/main/java/org/apache/pulsar/io/kinesis/KinesisSink.java)
+
+### MongoDB
+
+* [Configuration](io-mongo-sink.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/mongo/src/main/java/org/apache/pulsar/io/mongodb/MongoSink.java)
+
+### RabbitMQ
+
+* [Configuration](io-rabbitmq-sink.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/rabbitmq/src/main/java/org/apache/pulsar/io/rabbitmq/RabbitMQSink.java)
+
+### Redis
+
+* [Configuration](io-redis-sink.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/redis/src/main/java/org/apache/pulsar/io/redis/RedisAbstractConfig.java)
+
+### Solr
+
+* [Configuration](io-solr-sink.md#configuration)
+
+* [Java class](https://github.com/apache/pulsar/blob/master/pulsar-io/solr/src/main/java/org/apache/pulsar/io/solr/SolrSinkConfig.java)
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-debezium-source.md b/site2/website-next/versioned_docs/version-2.7.2/io-debezium-source.md
new file mode 100644
index 0000000000000..692d1d64e9ead
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-debezium-source.md
@@ -0,0 +1,589 @@
+---
+id: io-debezium-source
+title: Debezium source connector
+sidebar_label: "Debezium source connector"
+original_id: io-debezium-source
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The Debezium source connector pulls messages from MySQL or PostgreSQL
+and persists the messages to Pulsar topics.
+
+## Configuration
+
+The configuration of Debezium source connector has the following properties.
+
+| Name | Required | Default | Description |
+|------|----------|---------|-------------|
+| `task.class` | true | null | A source task class that implemented in Debezium. |
+| `database.hostname` | true | null | The address of a database server. |
+| `database.port` | true | null | The port number of a database server.|
+| `database.user` | true | null | The name of a database user that has the required privileges. |
+| `database.password` | true | null | The password for a database user that has the required privileges. |
+| `database.server.id` | true | null | The connector’s identifier that must be unique within a database cluster and similar to the database’s server-id configuration property. |
+| `database.server.name` | true | null | The logical name of a database server/cluster, which forms a namespace and it is used in all the names of Kafka topics to which the connector writes, the Kafka Connect schema names, and the namespaces of the corresponding Avro schema when the Avro Connector is used. |
+| `database.whitelist` | false | null | A list of all databases hosted by this server which is monitored by the connector.
This is optional, and there are other properties for listing databases and tables to include or exclude from monitoring. |
+| `key.converter` | true | null | The converter provided by Kafka Connect to convert record key. |
+| `value.converter` | true | null | The converter provided by Kafka Connect to convert record value. |
+| `database.history` | true | null | The name of the database history class. |
+| `database.history.pulsar.topic` | true | null | The name of the database history topic where the connector writes and recovers DDL statements.
**Note: this topic is for internal use only and should not be used by consumers.** |
+| `database.history.pulsar.service.url` | true | null | Pulsar cluster service URL for history topic. |
+| `pulsar.service.url` | true | null | Pulsar cluster service URL. |
+| `offset.storage.topic` | true | null | Record the last committed offsets that the connector successfully completes. |
+| `json-with-envelope` | false | false | Present the message only consist of payload.
+
+### Converter Options
+
+1. org.apache.kafka.connect.json.JsonConverter
+
+This config `json-with-envelope` is valid only for the JsonConverter. It's default value is false, the consumer use the schema `
+Schema.KeyValue(Schema.AUTO_CONSUME(), Schema.AUTO_CONSUME(), KeyValueEncodingType.SEPARATED)`,
+and the message only consist of payload.
+
+If the config `json-with-envelope` value is true, the consumer use the schema
+`Schema.KeyValue(Schema.BYTES, Schema.BYTES`, the message consist of schema and payload.
+
+2. org.apache.pulsar.kafka.shade.io.confluent.connect.avro.AvroConverter
+
+If users select the AvroConverter, then the pulsar consumer should use the schema `Schema.KeyValue(Schema.AUTO_CONSUME(),
+Schema.AUTO_CONSUME(), KeyValueEncodingType.SEPARATED)`, and the message consist of payload.
+
+### MongoDB Configuration
+| Name | Required | Default | Description |
+|------|----------|---------|-------------|
+| `mongodb.hosts` | true | null | The comma-separated list of hostname and port pairs (in the form 'host' or 'host:port') of the MongoDB servers in the replica set. The list contains a single hostname and a port pair. If mongodb.members.auto.discover is set to false, the host and port pair are prefixed with the replica set name (e.g., rs0/localhost:27017). |
+| `mongodb.name` | true | null | A unique name that identifies the connector and/or MongoDB replica set or shared cluster that this connector monitors. Each server should be monitored by at most one Debezium connector, since this server name prefixes all persisted Kafka topics emanating from the MongoDB replica set or cluster. |
+| `mongodb.user` | true | null | Name of the database user to be used when connecting to MongoDB. This is required only when MongoDB is configured to use authentication. |
+| `mongodb.password` | true | null | Password to be used when connecting to MongoDB. This is required only when MongoDB is configured to use authentication. |
+| `mongodb.task.id` | true | null | The taskId of the MongoDB connector that attempts to use a separate task for each replica set. |
+
+
+
+## Example of MySQL
+
+You need to create a configuration file before using the Pulsar Debezium connector.
+
+### Configuration
+
+You can use one of the following methods to create a configuration file.
+
+* JSON
+
+ ```json
+
+ {
+ "database.hostname": "localhost",
+ "database.port": "3306",
+ "database.user": "debezium",
+ "database.password": "dbz",
+ "database.server.id": "184054",
+ "database.server.name": "dbserver1",
+ "database.whitelist": "inventory",
+ "database.history": "org.apache.pulsar.io.debezium.PulsarDatabaseHistory",
+ "database.history.pulsar.topic": "history-topic",
+ "database.history.pulsar.service.url": "pulsar://127.0.0.1:6650",
+ "key.converter": "org.apache.kafka.connect.json.JsonConverter",
+ "value.converter": "org.apache.kafka.connect.json.JsonConverter",
+ "pulsar.service.url": "pulsar://127.0.0.1:6650",
+ "offset.storage.topic": "offset-topic"
+ }
+
+ ```
+
+* YAML
+
+ You can create a `debezium-mysql-source-config.yaml` file and copy the [contents](https://github.com/apache/pulsar/blob/master/pulsar-io/debezium/mysql/src/main/resources/debezium-mysql-source-config.yaml) below to the `debezium-mysql-source-config.yaml` file.
+
+ ```yaml
+
+ tenant: "public"
+ namespace: "default"
+ name: "debezium-mysql-source"
+ topicName: "debezium-mysql-topic"
+ archive: "connectors/pulsar-io-debezium-mysql-@pulsar:version@.nar"
+ parallelism: 1
+
+ configs:
+
+ ## config for mysql, docker image: debezium/example-mysql:0.8
+ database.hostname: "localhost"
+ database.port: "3306"
+ database.user: "debezium"
+ database.password: "dbz"
+ database.server.id: "184054"
+ database.server.name: "dbserver1"
+ database.whitelist: "inventory"
+ database.history: "org.apache.pulsar.io.debezium.PulsarDatabaseHistory"
+ database.history.pulsar.topic: "history-topic"
+ database.history.pulsar.service.url: "pulsar://127.0.0.1:6650"
+
+ ## KEY_CONVERTER_CLASS_CONFIG, VALUE_CONVERTER_CLASS_CONFIG
+ key.converter: "org.apache.kafka.connect.json.JsonConverter"
+ value.converter: "org.apache.kafka.connect.json.JsonConverter"
+
+ ## PULSAR_SERVICE_URL_CONFIG
+ pulsar.service.url: "pulsar://127.0.0.1:6650"
+
+ ## OFFSET_STORAGE_TOPIC_CONFIG
+ offset.storage.topic: "offset-topic"
+
+ ```
+
+### Usage
+
+This example shows how to change the data of a MySQL table using the Pulsar Debezium connector.
+
+1. Start a MySQL server with a database from which Debezium can capture changes.
+
+ ```bash
+
+ $ docker run -it --rm \
+ --name mysql \
+ -p 3306:3306 \
+ -e MYSQL_ROOT_PASSWORD=debezium \
+ -e MYSQL_USER=mysqluser \
+ -e MYSQL_PASSWORD=mysqlpw debezium/example-mysql:0.8
+
+ ```
+
+2. Start a Pulsar service locally in standalone mode.
+
+ ```bash
+
+ $ bin/pulsar standalone
+
+ ```
+
+3. Start the Pulsar Debezium connector in local run mode using one of the following methods.
+
+ * Use the **JSON** configuration file as shown previously.
+
+ Make sure the nar file is available at `connectors/pulsar-io-debezium-mysql-@pulsar:version@.nar`.
+
+ ```bash
+
+ $ bin/pulsar-admin source localrun \
+ --archive connectors/pulsar-io-debezium-mysql-@pulsar:version@.nar \
+ --name debezium-mysql-source --destination-topic-name debezium-mysql-topic \
+ --tenant public \
+ --namespace default \
+ --source-config '{"database.hostname": "localhost","database.port": "3306","database.user": "debezium","database.password": "dbz","database.server.id": "184054","database.server.name": "dbserver1","database.whitelist": "inventory","database.history": "org.apache.pulsar.io.debezium.PulsarDatabaseHistory","database.history.pulsar.topic": "history-topic","database.history.pulsar.service.url": "pulsar://127.0.0.1:6650","key.converter": "org.apache.kafka.connect.json.JsonConverter","value.converter": "org.apache.kafka.connect.json.JsonConverter","pulsar.service.url": "pulsar://127.0.0.1:6650","offset.storage.topic": "offset-topic"}'
+
+ ```
+
+ * Use the **YAML** configuration file as shown previously.
+
+ ```bash
+
+ $ bin/pulsar-admin source localrun \
+ --source-config-file debezium-mysql-source-config.yaml
+
+ ```
+
+4. Subscribe the topic _sub-products_ for the table _inventory.products_.
+
+ ```bash
+
+ $ bin/pulsar-client consume -s "sub-products" public/default/dbserver1.inventory.products -n 0
+
+ ```
+
+5. Start a MySQL client in docker.
+
+ ```bash
+
+ $ docker run -it --rm \
+ --name mysqlterm \
+ --link mysql \
+ --rm mysql:5.7 sh \
+ -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
+
+ ```
+
+6. A MySQL client pops out.
+
+ Use the following commands to change the data of the table _products_.
+
+ ```
+
+ mysql> use inventory;
+ mysql> show tables;
+ mysql> SELECT * FROM products;
+ mysql> UPDATE products SET name='1111111111' WHERE id=101;
+ mysql> UPDATE products SET name='1111111111' WHERE id=107;
+
+ ```
+
+ In the terminal window of subscribing topic, you can find the data changes have been kept in the _sub-products_ topic.
+
+## Example of PostgreSQL
+
+You need to create a configuration file before using the Pulsar Debezium connector.
+
+### Configuration
+
+You can use one of the following methods to create a configuration file.
+
+* JSON
+
+ ```json
+
+ {
+ "database.hostname": "localhost",
+ "database.port": "5432",
+ "database.user": "postgres",
+ "database.password": "changeme",
+ "database.dbname": "postgres",
+ "database.server.name": "dbserver1",
+ "plugin.name": "pgoutput",
+ "schema.whitelist": "public",
+ "table.whitelist": "public.users",
+ "pulsar.service.url": "pulsar://127.0.0.1:6650"
+ }
+
+ ```
+
+* YAML
+
+ You can create a `debezium-postgres-source-config.yaml` file and copy the [contents](https://github.com/apache/pulsar/blob/master/pulsar-io/debezium/postgres/src/main/resources/debezium-postgres-source-config.yaml) below to the `debezium-postgres-source-config.yaml` file.
+
+ ```yaml
+
+ tenant: "public"
+ namespace: "default"
+ name: "debezium-postgres-source"
+ topicName: "debezium-postgres-topic"
+ archive: "connectors/pulsar-io-debezium-postgres-@pulsar:version@.nar"
+ parallelism: 1
+
+ configs:
+
+ ## config for postgres version 10+, official docker image: postgres:<10+>
+ database.hostname: "localhost"
+ database.port: "5432"
+ database.user: "postgres"
+ database.password: "changeme"
+ database.dbname: "postgres"
+ database.server.name: "dbserver1"
+ plugin.name: "pgoutput"
+ schema.whitelist: "public"
+ table.whitelist: "public.users"
+
+ ## PULSAR_SERVICE_URL_CONFIG
+ pulsar.service.url: "pulsar://127.0.0.1:6650"
+
+ ```
+
+Notice that `pgoutput` is a standard plugin of Postgres introduced in version 10 - [see Postgres architecture docu](https://www.postgresql.org/docs/10/logical-replication-architecture.html). You don't need to install anything, just make sure the WAL level is set to `logical` (see docker command below and [Postgres docu](https://www.postgresql.org/docs/current/runtime-config-wal.html)).
+
+### Usage
+
+This example shows how to change the data of a PostgreSQL table using the Pulsar Debezium connector.
+
+
+1. Start a PostgreSQL server with a database from which Debezium can capture changes.
+
+ ```bash
+
+ $ docker run -d -it --rm \
+ --name pulsar-postgres \
+ -p 5432:5432 \
+ -e POSTGRES_PASSWORD=changeme \
+ postgres:13.3 -c wal_level=logical
+
+ ```
+
+2. Start a Pulsar service locally in standalone mode.
+
+ ```bash
+
+ $ bin/pulsar standalone
+
+ ```
+
+3. Start the Pulsar Debezium connector in local run mode using one of the following methods.
+
+ * Use the **JSON** configuration file as shown previously.
+
+ Make sure the nar file is available at `connectors/pulsar-io-debezium-postgres-@pulsar:version@.nar`.
+
+ ```bash
+
+ $ bin/pulsar-admin source localrun \
+ --archive connectors/pulsar-io-debezium-postgres-@pulsar:version@.nar \
+ --name debezium-postgres-source \
+ --destination-topic-name debezium-postgres-topic \
+ --tenant public \
+ --namespace default \
+ --source-config '{"database.hostname": "localhost","database.port": "5432","database.user": "postgres","database.password": "changeme","database.dbname": "postgres","database.server.name": "dbserver1","schema.whitelist": "public","table.whitelist": "public.users","pulsar.service.url": "pulsar://127.0.0.1:6650"}'
+
+ ```
+
+ * Use the **YAML** configuration file as shown previously.
+
+ ```bash
+
+ $ bin/pulsar-admin source localrun \
+ --source-config-file debezium-postgres-source-config.yaml
+
+ ```
+
+4. Subscribe the topic _sub-users_ for the _public.users_ table.
+
+ ```
+
+ $ bin/pulsar-client consume -s "sub-users" public/default/dbserver1.public.users -n 0
+
+ ```
+
+5. Start a PostgreSQL client in docker.
+
+ ```bash
+
+ $ docker exec -it pulsar-postgresql /bin/bash
+
+ ```
+
+6. A PostgreSQL client pops out.
+
+ Use the following commands to create sample data in the table _users_.
+
+ ```
+
+ psql -U postgres -h localhost -p 5432
+ Password for user postgres:
+
+ CREATE TABLE users(
+ id BIGINT GENERATED ALWAYS AS IDENTITY, PRIMARY KEY(id),
+ hash_firstname TEXT NOT NULL,
+ hash_lastname TEXT NOT NULL,
+ gender VARCHAR(6) NOT NULL CHECK (gender IN ('male', 'female'))
+ );
+
+ INSERT INTO users(hash_firstname, hash_lastname, gender)
+ SELECT md5(RANDOM()::TEXT), md5(RANDOM()::TEXT), CASE WHEN RANDOM() < 0.5 THEN 'male' ELSE 'female' END FROM generate_series(1, 100);
+
+ postgres=# select * from users;
+
+ id | hash_firstname | hash_lastname | gender
+ -------+----------------------------------+----------------------------------+--------
+ 1 | 02bf7880eb489edc624ba637f5ab42bd | 3e742c2cc4217d8e3382cc251415b2fb | female
+ 2 | dd07064326bb9119189032316158f064 | 9c0e938f9eddbd5200ba348965afbc61 | male
+ 3 | 2c5316fdd9d6595c1cceb70eed12e80c | 8a93d7d8f9d76acfaaa625c82a03ea8b | female
+ 4 | 3dfa3b4f70d8cd2155567210e5043d2b | 32c156bc28f7f03ab5d28e2588a3dc19 | female
+
+
+ postgres=# UPDATE users SET hash_firstname='maxim' WHERE id=1;
+ UPDATE 1
+
+ ```
+
+ In the terminal window of subscribing topic, you can receive the following messages.
+
+ ```bash
+
+ ----- got message -----
+ {"before":null,"after":{"id":1,"hash_firstname":"maxim","hash_lastname":"292113d30a3ccee0e19733dd7f88b258","gender":"male"},"source:{"version":"1.0.0.Final","connector":"postgresql","name":"foobar","ts_ms":1624045862644,"snapshot":"false","db":"postgres","schema":"public","table":"users","txId":595,"lsn":24419784,"xmin":null},"op":"u","ts_ms":1624045862648}
+ ...many more
+
+ ```
+
+## Example of MongoDB
+
+You need to create a configuration file before using the Pulsar Debezium connector.
+
+* JSON
+
+ ```json
+
+ {
+ "mongodb.hosts": "rs0/mongodb:27017",
+ "mongodb.name": "dbserver1",
+ "mongodb.user": "debezium",
+ "mongodb.password": "dbz",
+ "mongodb.task.id": "1",
+ "database.whitelist": "inventory",
+ "pulsar.service.url": "pulsar://127.0.0.1:6650"
+ }
+
+ ```
+
+* YAML
+
+ You can create a `debezium-mongodb-source-config.yaml` file and copy the [contents](https://github.com/apache/pulsar/blob/master/pulsar-io/debezium/mongodb/src/main/resources/debezium-mongodb-source-config.yaml) below to the `debezium-mongodb-source-config.yaml` file.
+
+ ```yaml
+
+ tenant: "public"
+ namespace: "default"
+ name: "debezium-mongodb-source"
+ topicName: "debezium-mongodb-topic"
+ archive: "connectors/pulsar-io-debezium-mongodb-@pulsar:version@.nar"
+ parallelism: 1
+
+ configs:
+
+ ## config for pg, docker image: debezium/example-mongodb:0.10
+ mongodb.hosts: "rs0/mongodb:27017",
+ mongodb.name: "dbserver1",
+ mongodb.user: "debezium",
+ mongodb.password: "dbz",
+ mongodb.task.id: "1",
+ database.whitelist: "inventory",
+
+ ## PULSAR_SERVICE_URL_CONFIG
+ pulsar.service.url: "pulsar://127.0.0.1:6650"
+
+ ```
+
+### Usage
+
+This example shows how to change the data of a MongoDB table using the Pulsar Debezium connector.
+
+
+1. Start a MongoDB server with a database from which Debezium can capture changes.
+
+ ```bash
+
+ $ docker pull debezium/example-mongodb:0.10
+ $ docker run -d -it --rm --name pulsar-mongodb -e MONGODB_USER=mongodb -e MONGODB_PASSWORD=mongodb -p 27017:27017 debezium/example-mongodb:0.10
+
+ ```
+
+ Use the following commands to initialize the data.
+
+ ``` bash
+
+ ./usr/local/bin/init-inventory.sh
+
+ ```
+
+ If the local host cannot access the container network, you can update the file ```/etc/hosts``` and add a rule ```127.0.0.1 6 f114527a95f```. f114527a95f is container id, you can try to get by ```docker ps -a```
+
+
+2. Start a Pulsar service locally in standalone mode.
+
+ ```
+
+
+ $ bin/pulsar standalone
+
+ ```
+
+3. Start the Pulsar Debezium connector in local run mode using one of the following methods.
+
+ * Use the **JSON** configuration file as shown previously.
+
+ Make sure the nar file is available at `connectors/pulsar-io-mongodb-@pulsar:version@.nar`.
+
+ ```
+
+
+ $ bin/pulsar-admin source localrun \
+ --archive connectors/pulsar-io-debezium-mongodb-@pulsar:version@.nar \
+ --name debezium-mongodb-source \
+ --destination-topic-name debezium-mongodb-topic \
+ --tenant public \
+ --namespace default \
+ --source-config '{"mongodb.hosts": "rs0/mongodb:27017","mongodb.name": "dbserver1","mongodb.user": "debezium","mongodb.password": "dbz","mongodb.task.id": "1","database.whitelist": "inventory","pulsar.service.url": "pulsar://127.0.0.1:6650"}'
+
+ ```
+
+ * Use the **YAML** configuration file as shown previously.
+
+ ```
+
+
+ $ bin/pulsar-admin source localrun \
+ --source-config-file debezium-mongodb-source-config.yaml
+
+ ```
+
+4. Subscribe the topic _sub-products_ for the _inventory.products_ table.
+
+ ```
+
+
+ $ bin/pulsar-client consume -s "sub-products" public/default/dbserver1.inventory.products -n 0
+
+ ```
+
+5. Start a MongoDB client in docker.
+
+ ```
+
+
+ $ docker exec -it pulsar-mongodb /bin/bash
+
+ ```
+
+6. A MongoDB client pops out.
+
+ ```
+
+
+ mongo -u debezium -p dbz --authenticationDatabase admin localhost:27017/inventory
+ db.products.update({"_id":NumberLong(104)},{$set:{weight:1.25}})
+
+ ```
+
+ In the terminal window of subscribing topic, you can receive the following messages.
+
+ ```
+
+
+ ----- got message -----
+ {"schema":{"type":"struct","fields":[{"type":"string","optional":false,"field":"id"}],"optional":false,"name":"dbserver1.inventory.products.Key"},"payload":{"id":"104"}}, value = {"schema":{"type":"struct","fields":[{"type":"string","optional":true,"name":"io.debezium.data.Json","version":1,"field":"after"},{"type":"string","optional":true,"name":"io.debezium.data.Json","version":1,"field":"patch"},{"type":"struct","fields":[{"type":"string","optional":false,"field":"version"},{"type":"string","optional":false,"field":"connector"},{"type":"string","optional":false,"field":"name"},{"type":"int64","optional":false,"field":"ts_ms"},{"type":"string","optional":true,"name":"io.debezium.data.Enum","version":1,"parameters":{"allowed":"true,last,false"},"default":"false","field":"snapshot"},{"type":"string","optional":false,"field":"db"},{"type":"string","optional":false,"field":"rs"},{"type":"string","optional":false,"field":"collection"},{"type":"int32","optional":false,"field":"ord"},{"type":"int64","optional":true,"field":"h"}],"optional":false,"name":"io.debezium.connector.mongo.Source","field":"source"},{"type":"string","optional":true,"field":"op"},{"type":"int64","optional":true,"field":"ts_ms"}],"optional":false,"name":"dbserver1.inventory.products.Envelope"},"payload":{"after":"{\"_id\": {\"$numberLong\": \"104\"},\"name\": \"hammer\",\"description\": \"12oz carpenter's hammer\",\"weight\": 1.25,\"quantity\": 4}","patch":null,"source":{"version":"0.10.0.Final","connector":"mongodb","name":"dbserver1","ts_ms":1573541905000,"snapshot":"true","db":"inventory","rs":"rs0","collection":"products","ord":1,"h":4983083486544392763},"op":"r","ts_ms":1573541909761}}.
+
+ ```
+
+## FAQ
+
+### Debezium postgres connector will hang when create snap
+
+```
+
+#18 prio=5 os_prio=31 tid=0x00007fd83096f800 nid=0xa403 waiting on condition [0x000070000f534000]
+ java.lang.Thread.State: WAITING (parking)
+ at sun.misc.Unsafe.park(Native Method)
+ - parking to wait for <0x00000007ab025a58> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
+ at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
+ at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
+ at java.util.concurrent.LinkedBlockingDeque.putLast(LinkedBlockingDeque.java:396)
+ at java.util.concurrent.LinkedBlockingDeque.put(LinkedBlockingDeque.java:649)
+ at io.debezium.connector.base.ChangeEventQueue.enqueue(ChangeEventQueue.java:132)
+ at io.debezium.connector.postgresql.PostgresConnectorTask$Lambda$203/385424085.accept(Unknown Source)
+ at io.debezium.connector.postgresql.RecordsSnapshotProducer.sendCurrentRecord(RecordsSnapshotProducer.java:402)
+ at io.debezium.connector.postgresql.RecordsSnapshotProducer.readTable(RecordsSnapshotProducer.java:321)
+ at io.debezium.connector.postgresql.RecordsSnapshotProducer.lambda$takeSnapshot$6(RecordsSnapshotProducer.java:226)
+ at io.debezium.connector.postgresql.RecordsSnapshotProducer$Lambda$240/1347039967.accept(Unknown Source)
+ at io.debezium.jdbc.JdbcConnection.queryWithBlockingConsumer(JdbcConnection.java:535)
+ at io.debezium.connector.postgresql.RecordsSnapshotProducer.takeSnapshot(RecordsSnapshotProducer.java:224)
+ at io.debezium.connector.postgresql.RecordsSnapshotProducer.lambda$start$0(RecordsSnapshotProducer.java:87)
+ at io.debezium.connector.postgresql.RecordsSnapshotProducer$Lambda$206/589332928.run(Unknown Source)
+ at java.util.concurrent.CompletableFuture.uniRun(CompletableFuture.java:705)
+ at java.util.concurrent.CompletableFuture.uniRunStage(CompletableFuture.java:717)
+ at java.util.concurrent.CompletableFuture.thenRun(CompletableFuture.java:2010)
+ at io.debezium.connector.postgresql.RecordsSnapshotProducer.start(RecordsSnapshotProducer.java:87)
+ at io.debezium.connector.postgresql.PostgresConnectorTask.start(PostgresConnectorTask.java:126)
+ at io.debezium.connector.common.BaseSourceTask.start(BaseSourceTask.java:47)
+ at org.apache.pulsar.io.kafka.connect.KafkaConnectSource.open(KafkaConnectSource.java:127)
+ at org.apache.pulsar.io.debezium.DebeziumSource.open(DebeziumSource.java:100)
+ at org.apache.pulsar.functions.instance.JavaInstanceRunnable.setupInput(JavaInstanceRunnable.java:690)
+ at org.apache.pulsar.functions.instance.JavaInstanceRunnable.setupJavaInstance(JavaInstanceRunnable.java:200)
+ at org.apache.pulsar.functions.instance.JavaInstanceRunnable.run(JavaInstanceRunnable.java:230)
+ at java.lang.Thread.run(Thread.java:748)
+
+```
+
+If you encounter the above problems in synchronizing data, please refer to [this](https://github.com/apache/pulsar/issues/4075) and add the following configuration to the configuration file:
+
+```
+
+max.queue.size=
+
+```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-debug.md b/site2/website-next/versioned_docs/version-2.7.2/io-debug.md
new file mode 100644
index 0000000000000..f815e862cae42
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-debug.md
@@ -0,0 +1,411 @@
+---
+id: io-debug
+title: How to debug Pulsar connectors
+sidebar_label: "Debug"
+original_id: io-debug
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+This guide explains how to debug connectors in localrun or cluster mode and gives a debugging checklist.
+To better demonstrate how to debug Pulsar connectors, here takes a Mongo sink connector as an example.
+
+**Deploy a Mongo sink environment**
+1. Start a Mongo service.
+
+ ```bash
+
+ docker pull mongo:4
+ docker run -d -p 27017:27017 --name pulsar-mongo -v $PWD/data:/data/db mongo:4
+
+ ```
+
+2. Create a DB and a collection.
+
+ ```bash
+
+ docker exec -it pulsar-mongo /bin/bash
+ mongo
+ > use pulsar
+ > db.createCollection('messages')
+ > exit
+
+ ```
+
+3. Start Pulsar standalone.
+
+ ```bash
+
+ docker pull apachepulsar/pulsar:2.4.0
+ docker run -d -it -p 6650:6650 -p 8080:8080 -v $PWD/data:/pulsar/data --link pulsar-mongo --name pulsar-mongo-standalone apachepulsar/pulsar:2.4.0 bin/pulsar standalone
+
+ ```
+
+4. Configure the Mongo sink with the `mongo-sink-config.yaml` file.
+
+ ```bash
+
+ configs:
+ mongoUri: "mongodb://pulsar-mongo:27017"
+ database: "pulsar"
+ collection: "messages"
+ batchSize: 2
+ batchTimeMs: 500
+
+ ```
+
+ ```bash
+
+ docker cp mongo-sink-config.yaml pulsar-mongo-standalone:/pulsar/
+
+ ```
+
+5. Download the Mongo sink nar package.
+
+ ```bash
+
+ docker exec -it pulsar-mongo-standalone /bin/bash
+ curl -O http://apache.01link.hk/pulsar/pulsar-2.4.0/connectors/pulsar-io-mongo-2.4.0.nar
+
+ ```
+
+## Debug in localrun mode
+Start the Mongo sink in localrun mode using the `localrun` command.
+:::tip
+
+For more information about the `localrun` command, see [`localrun`](reference-connector-admin.md/#localrun-1).
+
+:::
+
+```bash
+
+./bin/pulsar-admin sinks localrun \
+--archive pulsar-io-mongo-2.4.0.nar \
+--tenant public --namespace default \
+--inputs test-mongo \
+--name pulsar-mongo-sink \
+--sink-config-file mongo-sink-config.yaml \
+--parallelism 1
+
+```
+
+### Use connector log
+Use one of the following methods to get a connector log in localrun mode:
+* After executing the `localrun` command, the **log is automatically printed on the console**.
+* The log is located at:
+
+ ```bash
+
+ logs/functions/tenant/namespace/function-name/function-name-instance-id.log
+
+ ```
+
+ **Example**
+
+ The path of the Mongo sink connector is:
+
+ ```bash
+
+ logs/functions/public/default/pulsar-mongo-sink/pulsar-mongo-sink-0.log
+
+ ```
+
+To clearly explain the log information, here breaks down the large block of information into small blocks and add descriptions for each block.
+* This piece of log information shows the storage path of the nar package after decompression.
+
+ ```
+
+ 08:21:54.132 [main] INFO org.apache.pulsar.common.nar.NarClassLoader - Created class loader with paths: [file:/tmp/pulsar-nar/pulsar-io-mongo-2.4.0.nar-unpacked/, file:/tmp/pulsar-nar/pulsar-io-mongo-2.4.0.nar-unpacked/META-INF/bundled-dependencies/,
+
+ ```
+
+ :::tip
+
+ If `class cannot be found` exception is thrown, check whether the nar file is decompressed in the folder `file:/tmp/pulsar-nar/pulsar-io-mongo-2.4.0.nar-unpacked/META-INF/bundled-dependencies/` or not.
+
+ :::
+
+* This piece of log information illustrates the basic information about the Mongo sink connector, such as tenant, namespace, name, parallelism, resources, and so on, which can be used to **check whether the Mongo sink connector is configured correctly or not**.
+
+ ```bash
+
+ 08:21:55.390 [main] INFO org.apache.pulsar.functions.runtime.ThreadRuntime - ThreadContainer starting function with instance config InstanceConfig(instanceId=0, functionId=853d60a1-0c48-44d5-9a5c-6917386476b2, functionVersion=c2ce1458-b69e-4175-88c0-a0a856a2be8c, functionDetails=tenant: "public"
+ namespace: "default"
+ name: "pulsar-mongo-sink"
+ className: "org.apache.pulsar.functions.api.utils.IdentityFunction"
+ autoAck: true
+ parallelism: 1
+ source {
+ typeClassName: "[B"
+ inputSpecs {
+ key: "test-mongo"
+ value {
+ }
+ }
+ cleanupSubscription: true
+ }
+ sink {
+ className: "org.apache.pulsar.io.mongodb.MongoSink"
+ configs: "{\"mongoUri\":\"mongodb://pulsar-mongo:27017\",\"database\":\"pulsar\",\"collection\":\"messages\",\"batchSize\":2,\"batchTimeMs\":500}"
+ typeClassName: "[B"
+ }
+ resources {
+ cpu: 1.0
+ ram: 1073741824
+ disk: 10737418240
+ }
+ componentType: SINK
+ , maxBufferedTuples=1024, functionAuthenticationSpec=null, port=38459, clusterName=local)
+
+ ```
+
+* This piece of log information demonstrates the status of the connections to Mongo and configuration information.
+
+ ```bash
+
+ 08:21:56.231 [cluster-ClusterId{value='5d6396a3c9e77c0569ff00eb', description='null'}-pulsar-mongo:27017] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:1, serverValue:8}] to pulsar-mongo:27017
+ 08:21:56.326 [cluster-ClusterId{value='5d6396a3c9e77c0569ff00eb', description='null'}-pulsar-mongo:27017] INFO org.mongodb.driver.cluster - Monitor thread successfully connected to server with description ServerDescription{address=pulsar-mongo:27017, type=STANDALONE, state=CONNECTED, ok=true, version=ServerVersion{versionList=[4, 2, 0]}, minWireVersion=0, maxWireVersion=8, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=89058800}
+
+ ```
+
+* This piece of log information explains the configuration of consumers and clients, including the topic name, subscription name, subscription type, and so on.
+
+ ```bash
+
+ 08:21:56.719 [pulsar-client-io-1-1] INFO org.apache.pulsar.client.impl.ConsumerStatsRecorderImpl - Starting Pulsar consumer status recorder with config: {
+ "topicNames" : [ "test-mongo" ],
+ "topicsPattern" : null,
+ "subscriptionName" : "public/default/pulsar-mongo-sink",
+ "subscriptionType" : "Shared",
+ "receiverQueueSize" : 1000,
+ "acknowledgementsGroupTimeMicros" : 100000,
+ "negativeAckRedeliveryDelayMicros" : 60000000,
+ "maxTotalReceiverQueueSizeAcrossPartitions" : 50000,
+ "consumerName" : null,
+ "ackTimeoutMillis" : 0,
+ "tickDurationMillis" : 1000,
+ "priorityLevel" : 0,
+ "cryptoFailureAction" : "CONSUME",
+ "properties" : {
+ "application" : "pulsar-sink",
+ "id" : "public/default/pulsar-mongo-sink",
+ "instance_id" : "0"
+ },
+ "readCompacted" : false,
+ "subscriptionInitialPosition" : "Latest",
+ "patternAutoDiscoveryPeriod" : 1,
+ "regexSubscriptionMode" : "PersistentOnly",
+ "deadLetterPolicy" : null,
+ "autoUpdatePartitions" : true,
+ "replicateSubscriptionState" : false,
+ "resetIncludeHead" : false
+ }
+ 08:21:56.726 [pulsar-client-io-1-1] INFO org.apache.pulsar.client.impl.ConsumerStatsRecorderImpl - Pulsar client config: {
+ "serviceUrl" : "pulsar://localhost:6650",
+ "authPluginClassName" : null,
+ "authParams" : null,
+ "operationTimeoutMs" : 30000,
+ "statsIntervalSeconds" : 60,
+ "numIoThreads" : 1,
+ "numListenerThreads" : 1,
+ "connectionsPerBroker" : 1,
+ "useTcpNoDelay" : true,
+ "useTls" : false,
+ "tlsTrustCertsFilePath" : null,
+ "tlsAllowInsecureConnection" : false,
+ "tlsHostnameVerificationEnable" : false,
+ "concurrentLookupRequest" : 5000,
+ "maxLookupRequest" : 50000,
+ "maxNumberOfRejectedRequestPerConnection" : 50,
+ "keepAliveIntervalSeconds" : 30,
+ "connectionTimeoutMs" : 10000,
+ "requestTimeoutMs" : 60000,
+ "defaultBackoffIntervalNanos" : 100000000,
+ "maxBackoffIntervalNanos" : 30000000000
+ }
+
+ ```
+
+## Debug in cluster mode
+You can use the following methods to debug a connector in cluster mode:
+* [Use connector log](#use-connector-log)
+* [Use admin CLI](#use-admin-cli)
+### Use connector log
+In cluster mode, multiple connectors can run on a worker. To find the log path of a specified connector, use the `workerId` to locate the connector log.
+### Use admin CLI
+Pulsar admin CLI helps you debug Pulsar connectors with the following subcommands:
+* [`get`](#get)
+
+* [`status`](#status)
+* [`topics stats`](#topics-stats)
+
+**Create a Mongo sink**
+
+```bash
+
+./bin/pulsar-admin sinks create \
+--archive pulsar-io-mongo-2.4.0.nar \
+--tenant public \
+--namespace default \
+--inputs test-mongo \
+--name pulsar-mongo-sink \
+--sink-config-file mongo-sink-config.yaml \
+--parallelism 1
+
+```
+
+### `get`
+Use the `get` command to get the basic information about the Mongo sink connector, such as tenant, namespace, name, parallelism, and so on.
+
+```bash
+
+./bin/pulsar-admin sinks get --tenant public --namespace default --name pulsar-mongo-sink
+{
+ "tenant": "public",
+ "namespace": "default",
+ "name": "pulsar-mongo-sink",
+ "className": "org.apache.pulsar.io.mongodb.MongoSink",
+ "inputSpecs": {
+ "test-mongo": {
+ "isRegexPattern": false
+ }
+ },
+ "configs": {
+ "mongoUri": "mongodb://pulsar-mongo:27017",
+ "database": "pulsar",
+ "collection": "messages",
+ "batchSize": 2.0,
+ "batchTimeMs": 500.0
+ },
+ "parallelism": 1,
+ "processingGuarantees": "ATLEAST_ONCE",
+ "retainOrdering": false,
+ "autoAck": true
+}
+
+```
+
+:::tip
+
+For more information about the `get` command, see [`get`](reference-connector-admin.md/#get-1).
+
+:::
+
+### `status`
+Use the `status` command to get the current status about the Mongo sink connector, such as the number of instance, the number of running instance, instanceId, workerId and so on.
+
+```bash
+
+./bin/pulsar-admin sinks status
+--tenant public \
+--namespace default \
+--name pulsar-mongo-sink
+{
+"numInstances" : 1,
+"numRunning" : 1,
+"instances" : [ {
+ "instanceId" : 0,
+ "status" : {
+ "running" : true,
+ "error" : "",
+ "numRestarts" : 0,
+ "numReadFromPulsar" : 0,
+ "numSystemExceptions" : 0,
+ "latestSystemExceptions" : [ ],
+ "numSinkExceptions" : 0,
+ "latestSinkExceptions" : [ ],
+ "numWrittenToSink" : 0,
+ "lastReceivedTime" : 0,
+ "workerId" : "c-standalone-fw-5d202832fd18-8080"
+ }
+} ]
+}
+
+```
+
+:::tip
+
+For more information about the `status` command, see [`status`](reference-connector-admin.md/#stauts-1).
+If there are multiple connectors running on a worker, `workerId` can locate the worker on which the specified connector is running.
+
+:::
+
+### `topics stats`
+Use the `topics stats` command to get the stats for a topic and its connected producer and consumer, such as whether the topic has received messages or not, whether there is a backlog of messages or not, the available permits and other key information. All rates are computed over a 1-minute window and are relative to the last completed 1-minute period.
+
+```bash
+
+./bin/pulsar-admin topics stats test-mongo
+{
+ "msgRateIn" : 0.0,
+ "msgThroughputIn" : 0.0,
+ "msgRateOut" : 0.0,
+ "msgThroughputOut" : 0.0,
+ "averageMsgSize" : 0.0,
+ "storageSize" : 1,
+ "publishers" : [ ],
+ "subscriptions" : {
+ "public/default/pulsar-mongo-sink" : {
+ "msgRateOut" : 0.0,
+ "msgThroughputOut" : 0.0,
+ "msgRateRedeliver" : 0.0,
+ "msgBacklog" : 0,
+ "blockedSubscriptionOnUnackedMsgs" : false,
+ "msgDelayed" : 0,
+ "unackedMessages" : 0,
+ "type" : "Shared",
+ "msgRateExpired" : 0.0,
+ "consumers" : [ {
+ "msgRateOut" : 0.0,
+ "msgThroughputOut" : 0.0,
+ "msgRateRedeliver" : 0.0,
+ "consumerName" : "dffdd",
+ "availablePermits" : 999,
+ "unackedMessages" : 0,
+ "blockedConsumerOnUnackedMsgs" : false,
+ "metadata" : {
+ "instance_id" : "0",
+ "application" : "pulsar-sink",
+ "id" : "public/default/pulsar-mongo-sink"
+ },
+ "connectedSince" : "2019-08-26T08:48:07.582Z",
+ "clientVersion" : "2.4.0",
+ "address" : "/172.17.0.3:57790"
+ } ],
+ "isReplicated" : false
+ }
+ },
+ "replication" : { },
+ "deduplicationStatus" : "Disabled"
+}
+
+```
+
+:::tip
+
+For more information about the `topic stats` command, see [`topic stats`](http://pulsar.apache.org/docs/en/pulsar-admin/#stats-1).
+
+:::
+
+## Checklist
+This checklist indicates the major areas to check when you debug connectors. It is a reminder of what to look for to ensure a thorough review and an evaluation tool to get the status of connectors.
+* Does Pulsar start successfully?
+
+* Does the external service run normally?
+
+* Is the nar package complete?
+
+* Is the connector configuration file correct?
+
+* In localrun mode, run a connector and check the printed information (connector log) on the console.
+
+* In cluster mode:
+
+ * Use the `get` command to get the basic information.
+
+ * Use the `status` command to get the current status.
+ * Use the `topics stats` command to get the stats for a specified topic and its connected producers and consumers.
+
+ * Check the connector log.
+* Enter into the external system and verify the result.
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-develop.md b/site2/website-next/versioned_docs/version-2.7.2/io-develop.md
new file mode 100644
index 0000000000000..cbcb555b9b9cc
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-develop.md
@@ -0,0 +1,267 @@
+---
+id: io-develop
+title: How to develop Pulsar connectors
+sidebar_label: "Develop"
+original_id: io-develop
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+This guide describes how to develop Pulsar connectors to move data
+between Pulsar and other systems.
+
+Pulsar connectors are special [Pulsar Functions](functions-overview), so creating
+a Pulsar connector is similar to creating a Pulsar function.
+
+Pulsar connectors come in two types:
+
+| Type | Description | Example
+|---|---|---
+{@inject: github:Source:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Source.java}|Import data from another system to Pulsar.|[RabbitMQ source connector](io-rabbitmq) imports the messages of a RabbitMQ queue to a Pulsar topic.
+{@inject: github:Sink:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Sink.java}|Export data from Pulsar to another system.|[Kinesis sink connector](io-kinesis) exports the messages of a Pulsar topic to a Kinesis stream.
+
+## Develop
+
+You can develop Pulsar source connectors and sink connectors.
+
+### Source
+
+Developing a source connector is to implement the {@inject: github:Source:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Source.java}
+interface, which means you need to implement the {@inject: github:open:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Source.java} method and the {@inject: github:read:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Source.java} method.
+
+1. Implement the {@inject: github:open:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Source.java} method.
+
+ ```java
+
+ /**
+ * Open connector with configuration
+ *
+ * @param config initialization config
+ * @param sourceContext
+ * @throws Exception IO type exceptions when opening a connector
+ */
+ void open(final Map config, SourceContext sourceContext) throws Exception;
+
+ ```
+
+ This method is called when the source connector is initialized.
+
+ In this method, you can retrieve all connector specific settings through the passed-in `config` parameter and initialize all necessary resources.
+
+ For example, a Kafka connector can create a Kafka client in this `open` method.
+
+ Besides, Pulsar runtime also provides a `SourceContext` for the
+ connector to access runtime resources for tasks like collecting metrics. The implementation can save the `SourceContext` for future use.
+
+2. Implement the {@inject: github:read:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Source.java} method.
+
+ ```java
+
+ /**
+ * Reads the next message from source.
+ * If source does not have any new messages, this call should block.
+ * @return next message from source. The return result should never be null
+ * @throws Exception
+ */
+ Record read() throws Exception;
+
+ ```
+
+ If nothing to return, the implementation should be blocking rather than returning `null`.
+
+ The returned {@inject: github:Record:/pulsar-functions/api-java/src/main/java/org/apache/pulsar/functions/api/Record.java} should encapsulate the following information, which is needed by Pulsar IO runtime.
+
+ * {@inject: github:Record:/pulsar-functions/api-java/src/main/java/org/apache/pulsar/functions/api/Record.java} should provide the following variables:
+
+ |Variable|Required|Description
+ |---|---|---
+ `TopicName`|No|Pulsar topic name from which the record is originated from.
+ `Key`|No| Messages can optionally be tagged with keys.
For more information, see [Routing modes](concepts-messaging.md#routing-modes).|
+ `Value`|Yes|Actual data of the record.
+ `EventTime`|No|Event time of the record from the source.
+ `PartitionId`|No| If the record is originated from a partitioned source, it returns its `PartitionId`.
`PartitionId` is used as a part of the unique identifier by Pulsar IO runtime to deduplicate messages and achieve exactly-once processing guarantee.
+ `RecordSequence`|No|If the record is originated from a sequential source, it returns its `RecordSequence`.
`RecordSequence` is used as a part of the unique identifier by Pulsar IO runtime to deduplicate messages and achieve exactly-once processing guarantee.
+ `Properties` |No| If the record carries user-defined properties, it returns those properties.
+ `DestinationTopic`|No|Topic to which message should be written.
+ `Message`|No|A class which carries data sent by users.
For more information, see [Message.java](https://github.com/apache/pulsar/blob/master/pulsar-client-api/src/main/java/org/apache/pulsar/client/api/Message.java).|
+
+ * {@inject: github:Record:/pulsar-functions/api-java/src/main/java/org/apache/pulsar/functions/api/Record.java} should provide the following methods:
+
+ Method|Description
+ |---|---
+ `ack` |Acknowledge that the record is fully processed.
+ `fail`|Indicate that the record fails to be processed.
+
+ :::tip
+
+ For more information about **how to create a source connector**, see {@inject: github:KafkaSource:/pulsar-io/kafka/src/main/java/org/apache/pulsar/io/kafka/KafkaAbstractSource.java}.
+
+ :::
+
+### Sink
+
+Developing a sink connector **is similar to** developing a source connector, that is, you need to implement the {@inject: github:Sink:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Sink.java} interface, which means implementing the {@inject: github:open:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Sink.java} method and the {@inject: github:write:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Sink.java} method.
+
+1. Implement the {@inject: github:open:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Sink.java} method.
+
+ ```java
+
+ /**
+ * Open connector with configuration
+ *
+ * @param config initialization config
+ * @param sinkContext
+ * @throws Exception IO type exceptions when opening a connector
+ */
+ void open(final Map config, SinkContext sinkContext) throws Exception;
+
+ ```
+
+2. Implement the {@inject: github:write:/pulsar-io/core/src/main/java/org/apache/pulsar/io/core/Sink.java} method.
+
+ ```java
+
+ /**
+ * Write a message to Sink
+ * @param record record to write to sink
+ * @throws Exception
+ */
+ void write(Record record) throws Exception;
+
+ ```
+
+ During the implementation, you can decide how to write the `Value` and
+ the `Key` to the actual source, and leverage all the provided information such as
+ `PartitionId` and `RecordSequence` to achieve different processing guarantees.
+
+ You also need to ack records (if messages are sent successfully) or fail records (if messages fail to send).
+
+## Test
+
+Testing connectors can be challenging because Pulsar IO connectors interact with two systems
+that may be difficult to mock—Pulsar and the system to which the connector is connecting.
+
+It is
+recommended writing special tests to test the connector functionalities as below
+while mocking the external service.
+
+### Unit test
+
+You can create unit tests for your connector.
+
+### Integration test
+
+Once you have written sufficient unit tests, you can add
+separate integration tests to verify end-to-end functionality.
+
+Pulsar uses [testcontainers](https://www.testcontainers.org/) **for all integration tests**.
+
+:::tip
+
+For more information about **how to create integration tests for Pulsar connectors**, see {@inject: github:IntegrationTests:/tests/integration/src/test/java/org/apache/pulsar/tests/integration/io}.
+
+:::
+
+## Package
+
+Once you've developed and tested your connector, you need to package it so that it can be submitted
+to a [Pulsar Functions](functions-overview) cluster.
+
+There are two methods to
+work with Pulsar Functions' runtime, that is, [NAR](#nar) and [uber JAR](#uber-jar).
+
+:::note
+
+If you plan to package and distribute your connector for others to use, you are obligated to
+
+:::
+
+license and copyright your own code properly. Remember to add the license and copyright to
+all libraries your code uses and to your distribution.
+>
+> If you use the [NAR](#nar) method, the NAR plugin
+automatically creates a `DEPENDENCIES` file in the generated NAR package, including the proper
+licensing and copyrights of all libraries of your connector.
+
+### NAR
+
+**NAR** stands for NiFi Archive, which is a custom packaging mechanism used by Apache NiFi, to provide
+a bit of Java ClassLoader isolation.
+
+:::tip
+
+For more information about **how NAR works**, see [here](https://medium.com/hashmapinc/nifi-nar-files-explained-14113f7796fd).
+
+:::
+
+Pulsar uses the same mechanism for packaging **all** [built-in connectors](io-connectors).
+
+The easiest approach to package a Pulsar connector is to create a NAR package using [nifi-nar-maven-plugin](https://mvnrepository.com/artifact/org.apache.nifi/nifi-nar-maven-plugin).
+
+Include this [nifi-nar-maven-plugin](https://mvnrepository.com/artifact/org.apache.nifi/nifi-nar-maven-plugin) in your maven project for your connector as below.
+
+```xml
+
+
+
+ org.apache.nifi
+ nifi-nar-maven-plugin
+ 1.2.0
+
+
+
+```
+
+You must also create a `resources/META-INF/services/pulsar-io.yaml` file with the following contents:
+
+```yaml
+
+name: connector name
+description: connector description
+sourceClass: fully qualified class name (only if source connector)
+sinkClass: fully qualified class name (only if sink connector)
+
+```
+
+For Gradle users, there is a [Gradle Nar plugin available on the Gradle Plugin Portal](https://plugins.gradle.org/plugin/io.github.lhotari.gradle-nar-plugin).
+
+:::tip
+
+For more information about an **how to use NAR for Pulsar connectors**, see {@inject: github:TwitterFirehose:/pulsar-io/twitter/pom.xml}.
+
+:::
+
+### Uber JAR
+
+An alternative approach is to create an **uber JAR** that contains all of the connector's JAR files
+and other resource files. No directory internal structure is necessary.
+
+You can use [maven-shade-plugin](https://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html) to create a uber JAR as below:
+
+```xml
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.1.1
+
+
+ package
+
+ shade
+
+
+
+
+ *:*
+
+
+
+
+
+
+
+```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-dynamodb-source.md b/site2/website-next/versioned_docs/version-2.7.2/io-dynamodb-source.md
new file mode 100644
index 0000000000000..4a93683eb4a5b
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-dynamodb-source.md
@@ -0,0 +1,84 @@
+---
+id: io-dynamodb-source
+title: AWS DynamoDB source connector
+sidebar_label: "AWS DynamoDB source connector"
+original_id: io-dynamodb-source
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The DynamoDB source connector pulls data from DynamoDB table streams and persists data into Pulsar.
+
+This connector uses the [DynamoDB Streams Kinesis Adapter](https://github.com/awslabs/dynamodb-streams-kinesis-adapter),
+which uses the [Kinesis Consumer Library](https://github.com/awslabs/amazon-kinesis-client) (KCL) to do the actual
+consuming of messages. The KCL uses DynamoDB to track state for consumers and requires cloudwatch access to log metrics.
+
+
+## Configuration
+
+The configuration of the DynamoDB source connector has the following properties.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+`initialPositionInStream`|InitialPositionInStream|false|LATEST|The position where the connector starts from.
Below are the available options:
`AT_TIMESTAMP`: start from the record at or after the specified timestamp.
`LATEST`: start after the most recent data record.
`TRIM_HORIZON`: start from the oldest available data record.
+`startAtTime`|Date|false|" " (empty string)|If set to `AT_TIMESTAMP`, it specifies the point in time to start consumption.
+`applicationName`|String|false|Pulsar IO connector|The name of the KCL application. Must be unique, as it is used to define the table name for the dynamo table used for state tracking.
By default, the application name is included in the user agent string used to make AWS requests. This can assist with troubleshooting, for example, distinguish requests made by separate connector instances.
+`checkpointInterval`|long|false|60000|The frequency of the KCL checkpoint in milliseconds.
+`backoffTime`|long|false|3000|The amount of time to delay between requests when the connector encounters a throttling exception from AWS Kinesis in milliseconds.
+`numRetries`|int|false|3|The number of re-attempts when the connector encounters an exception while trying to set a checkpoint.
+`receiveQueueSize`|int|false|1000|The maximum number of AWS records that can be buffered inside the connector.
Once the `receiveQueueSize` is reached, the connector does not consume any messages from Kinesis until some messages in the queue are successfully consumed.
+`dynamoEndpoint`|String|false|" " (empty string)|The Dynamo end-point URL, which can be found at [here](https://docs.aws.amazon.com/general/latest/gr/rande.html).
+`cloudwatchEndpoint`|String|false|" " (empty string)|The Cloudwatch end-point URL, which can be found at [here](https://docs.aws.amazon.com/general/latest/gr/rande.html).
+`awsEndpoint`|String|false|" " (empty string)|The DynamoDB Streams end-point URL, which can be found at [here](https://docs.aws.amazon.com/general/latest/gr/rande.html).
+`awsRegion`|String|false|" " (empty string)|The AWS region.
**Example**
us-west-1, us-west-2
+`awsDynamodbStreamArn`|String|true|" " (empty string)|The DynamoDB stream arn.
+`awsCredentialPluginName`|String|false|" " (empty string)|The fully-qualified class name of implementation of {@inject: github:AwsCredentialProviderPlugin:/pulsar-io/aws/src/main/java/org/apache/pulsar/io/aws/AwsCredentialProviderPlugin.java}.
`awsCredentialProviderPlugin` has the following built-in plugs:
`org.apache.pulsar.io.kinesis.AwsDefaultProviderChainPlugin`:
this plugin uses the default AWS provider chain.
For more information, see [using the default credential provider chain](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default).
`org.apache.pulsar.io.kinesis.STSAssumeRoleProviderPlugin`:
this plugin takes a configuration via the `awsCredentialPluginParam` that describes a role to assume when running the KCL.
**JSON configuration example**
`{"roleArn": "arn...", "roleSessionName": "name"}`
`awsCredentialPluginName` is a factory class which creates an AWSCredentialsProvider that is used by Kinesis sink.
If `awsCredentialPluginName` set to empty, the Kinesis sink creates a default AWSCredentialsProvider which accepts json-map of credentials in `awsCredentialPluginParam`.
+`awsCredentialPluginParam`|String |false|" " (empty string)|The JSON parameter to initialize `awsCredentialsProviderPlugin`.
+
+### Example
+
+Before using the DynamoDB source connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "awsEndpoint": "https://some.endpoint.aws",
+ "awsRegion": "us-east-1",
+ "awsDynamodbStreamArn": "arn:aws:dynamodb:us-west-2:111122223333:table/TestTable/stream/2015-05-11T21:21:33.291",
+ "awsCredentialPluginParam": "{\"accessKey\":\"myKey\",\"secretKey\":\"my-Secret\"}",
+ "applicationName": "My test application",
+ "checkpointInterval": "30000",
+ "backoffTime": "4000",
+ "numRetries": "3",
+ "receiveQueueSize": 2000,
+ "initialPositionInStream": "TRIM_HORIZON",
+ "startAtTime": "2019-03-05T19:28:58.000Z"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ awsEndpoint: "https://some.endpoint.aws"
+ awsRegion: "us-east-1"
+ awsDynamodbStreamArn: "arn:aws:dynamodb:us-west-2:111122223333:table/TestTable/stream/2015-05-11T21:21:33.291"
+ awsCredentialPluginParam: "{\"accessKey\":\"myKey\",\"secretKey\":\"my-Secret\"}"
+ applicationName: "My test application"
+ checkpointInterval: 30000
+ backoffTime: 4000
+ numRetries: 3
+ receiveQueueSize: 2000
+ initialPositionInStream: "TRIM_HORIZON"
+ startAtTime: "2019-03-05T19:28:58.000Z"
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-elasticsearch-sink.md b/site2/website-next/versioned_docs/version-2.7.2/io-elasticsearch-sink.md
new file mode 100644
index 0000000000000..a2624bdca129d
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-elasticsearch-sink.md
@@ -0,0 +1,177 @@
+---
+id: io-elasticsearch-sink
+title: ElasticSearch sink connector
+sidebar_label: "ElasticSearch sink connector"
+original_id: io-elasticsearch-sink
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The ElasticSearch sink connector pulls messages from Pulsar topics and persists the messages to indexes.
+
+## Configuration
+
+The configuration of the ElasticSearch sink connector has the following properties.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `elasticSearchUrl` | String| true |" " (empty string)| The URL of elastic search cluster to which the connector connects. |
+| `indexName` | String| true |" " (empty string)| The index name to which the connector writes messages. |
+| `typeName` | String | false | "_doc" | The type name to which the connector writes messages to.
The value should be set explicitly to a valid type name other than "_doc" for Elasticsearch version before 6.2, and left to default otherwise. |
+| `indexNumberOfShards` | int| false |1| The number of shards of the index. |
+| `indexNumberOfReplicas` | int| false |1 | The number of replicas of the index. |
+| `username` | String| false |" " (empty string)| The username used by the connector to connect to the elastic search cluster.
If `username` is set, then `password` should also be provided. |
+| `password` | String| false | " " (empty string)|The password used by the connector to connect to the elastic search cluster.
If `username` is set, then `password` should also be provided. |
+
+## Example
+
+Before using the ElasticSearch sink connector, you need to create a configuration file through one of the following methods.
+
+### Configuration
+
+#### For Elasticsearch After 6.2
+
+* JSON
+
+ ```json
+
+ {
+ "elasticSearchUrl": "http://localhost:9200",
+ "indexName": "my_index",
+ "username": "scooby",
+ "password": "doobie"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ elasticSearchUrl: "http://localhost:9200"
+ indexName: "my_index"
+ username: "scooby"
+ password: "doobie"
+
+ ```
+
+#### For Elasticsearch Before 6.2
+
+* JSON
+
+ ```json
+
+ {
+ "elasticSearchUrl": "http://localhost:9200",
+ "indexName": "my_index",
+ "typeName": "doc",
+ "username": "scooby",
+ "password": "doobie"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ elasticSearchUrl: "http://localhost:9200"
+ indexName: "my_index"
+ typeName: "doc"
+ username: "scooby"
+ password: "doobie"
+
+ ```
+
+### Usage
+
+1. Start a single node Elasticsearch cluster.
+
+ ```bash
+
+ $ docker run -p 9200:9200 -p 9300:9300 \
+ -e "discovery.type=single-node" \
+ docker.elastic.co/elasticsearch/elasticsearch:7.5.1
+
+ ```
+
+2. Start a Pulsar service locally in standalone mode.
+
+ ```bash
+
+ $ bin/pulsar standalone
+
+ ```
+
+ Make sure the NAR file is available at `connectors/pulsar-io-elastic-search-@pulsar:version@.nar`.
+
+3. Start the Pulsar Elasticsearch connector in local run mode using one of the following methods.
+ * Use the **JSON** configuration as shown previously.
+
+ ```bash
+
+ $ bin/pulsar-admin sinks localrun \
+ --archive connectors/pulsar-io-elastic-search-@pulsar:version@.nar \
+ --tenant public \
+ --namespace default \
+ --name elasticsearch-test-sink \
+ --sink-config '{"elasticSearchUrl":"http://localhost:9200","indexName": "my_index","username": "scooby","password": "doobie"}' \
+ --inputs elasticsearch_test
+
+ ```
+
+ * Use the **YAML** configuration file as shown previously.
+
+ ```bash
+
+ $ bin/pulsar-admin sinks localrun \
+ --archive connectors/pulsar-io-elastic-search-@pulsar:version@.nar \
+ --tenant public \
+ --namespace default \
+ --name elasticsearch-test-sink \
+ --sink-config-file elasticsearch-sink.yml \
+ --inputs elasticsearch_test
+
+ ```
+
+4. Publish records to the topic.
+
+ ```bash
+
+ $ bin/pulsar-client produce elasticsearch_test --messages "{\"a\":1}"
+
+ ```
+
+5. Check documents in Elasticsearch.
+
+ * refresh the index
+
+ ```bash
+
+ $ curl -s http://localhost:9200/my_index/_refresh
+
+ ```
+
+
+ * search documents
+
+ ```bash
+
+ $ curl -s http://localhost:9200/my_index/_search
+
+ ```
+
+ You can see the record that published earlier has been successfully written into Elasticsearch.
+
+ ```json
+
+ {"took":2,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":1,"relation":"eq"},"max_score":1.0,"hits":[{"_index":"my_index","_type":"_doc","_id":"FSxemm8BLjG_iC0EeTYJ","_score":1.0,"_source":{"a":1}}]}}
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-file-source.md b/site2/website-next/versioned_docs/version-2.7.2/io-file-source.md
new file mode 100644
index 0000000000000..4e34dfd9a1f02
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-file-source.md
@@ -0,0 +1,163 @@
+---
+id: io-file-source
+title: File source connector
+sidebar_label: "File source connector"
+original_id: io-file-source
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The File source connector pulls messages from files in directories and persists the messages to Pulsar topics.
+
+## Configuration
+
+The configuration of the File source connector has the following properties.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `inputDirectory` | String|true | No default value|The input directory to pull files. |
+| `recurse` | Boolean|false | true | Whether to pull files from subdirectory or not.|
+| `keepFile` |Boolean|false | false | If set to true, the file is not deleted after it is processed, which means the file can be picked up continually. |
+| `fileFilter` | String|false| [^\\.].* | The file whose name matches the given regular expression is picked up. |
+| `pathFilter` | String |false | NULL | If `recurse` is set to true, the subdirectory whose path matches the given regular expression is scanned. |
+| `minimumFileAge` | Integer|false | 0 | The minimum age that a file can be processed.
Any file younger than `minimumFileAge` (according to the last modification date) is ignored. |
+| `maximumFileAge` | Long|false |Long.MAX_VALUE | The maximum age that a file can be processed.
Any file older than `maximumFileAge` (according to last modification date) is ignored. |
+| `minimumSize` |Integer| false |1 | The minimum size (in bytes) that a file can be processed. |
+| `maximumSize` | Double|false |Double.MAX_VALUE| The maximum size (in bytes) that a file can be processed. |
+| `ignoreHiddenFiles` |Boolean| false | true| Whether the hidden files should be ignored or not. |
+| `pollingInterval`|Long | false | 10000L | Indicates how long to wait before performing a directory listing. |
+| `numWorkers` | Integer | false | 1 | The number of worker threads that process files.
This allows you to process a larger number of files concurrently.
However, setting this to a value greater than 1 makes the data from multiple files mixed in the target topic. |
+
+### Example
+
+Before using the File source connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "inputDirectory": "/Users/david",
+ "recurse": true,
+ "keepFile": true,
+ "fileFilter": "[^\\.].*",
+ "pathFilter": "*",
+ "minimumFileAge": 0,
+ "maximumFileAge": 9999999999,
+ "minimumSize": 1,
+ "maximumSize": 5000000,
+ "ignoreHiddenFiles": true,
+ "pollingInterval": 5000,
+ "numWorkers": 1
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ inputDirectory: "/Users/david"
+ recurse: true
+ keepFile: true
+ fileFilter: "[^\\.].*"
+ pathFilter: "*"
+ minimumFileAge: 0
+ maximumFileAge: 9999999999
+ minimumSize: 1
+ maximumSize: 5000000
+ ignoreHiddenFiles: true
+ pollingInterval: 5000
+ numWorkers: 1
+
+ ```
+
+## Usage
+
+Here is an example of using the File source connecter.
+
+1. Pull a Pulsar image.
+
+ ```bash
+
+ $ docker pull apachepulsar/pulsar:{version}
+
+ ```
+
+2. Start Pulsar standalone.
+
+ ```bash
+
+ $ docker run -d -it -p 6650:6650 -p 8080:8080 -v $PWD/data:/pulsar/data --name pulsar-standalone apachepulsar/pulsar:{version} bin/pulsar standalone
+
+ ```
+
+3. Create a configuration file _file-connector.yaml_.
+
+ ```yaml
+
+ configs:
+ inputDirectory: "/opt"
+
+ ```
+
+4. Copy the configuration file _file-connector.yaml_ to the container.
+
+ ```bash
+
+ $ docker cp connectors/file-connector.yaml pulsar-standalone:/pulsar/
+
+ ```
+
+5. Download the File source connector.
+
+ ```bash
+
+ $ curl -O https://mirrors.tuna.tsinghua.edu.cn/apache/pulsar/pulsar-{version}/connectors/pulsar-io-file-{version}.nar
+
+ ```
+
+6. Start the File source connector.
+
+ ```bash
+
+ $ docker exec -it pulsar-standalone /bin/bash
+
+ $ ./bin/pulsar-admin sources localrun \
+ --archive /pulsar/pulsar-io-file-{version}.nar \
+ --name file-test \
+ --destination-topic-name pulsar-file-test \
+ --source-config-file /pulsar/file-connector.yaml
+
+ ```
+
+7. Start a consumer.
+
+ ```bash
+
+ ./bin/pulsar-client consume -s file-test -n 0 pulsar-file-test
+
+ ```
+
+8. Write the message to the file _test.txt_.
+
+ ```bash
+
+ echo "hello world!" > /opt/test.txt
+
+ ```
+
+ The following information appears on the consumer terminal window.
+
+ ```bash
+
+ ----- got message -----
+ hello world!
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-flume-sink.md b/site2/website-next/versioned_docs/version-2.7.2/io-flume-sink.md
new file mode 100644
index 0000000000000..ded05d80726f1
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-flume-sink.md
@@ -0,0 +1,60 @@
+---
+id: io-flume-sink
+title: Flume sink connector
+sidebar_label: "Flume sink connector"
+original_id: io-flume-sink
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The Flume sink connector pulls messages from Pulsar topics to logs.
+
+## Configuration
+
+The configuration of the Flume sink connector has the following properties.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+`name`|String|true|"" (empty string)|The name of the agent.
+`confFile`|String|true|"" (empty string)|The configuration file.
+`noReloadConf`|Boolean|false|false|Whether to reload configuration file if changed.
+`zkConnString`|String|true|"" (empty string)|The ZooKeeper connection.
+`zkBasePath`|String|true|"" (empty string)|The base path in ZooKeeper for agent configuration.
+
+### Example
+
+Before using the Flume sink connector, you need to create a configuration file through one of the following methods.
+
+> For more information about the `sink.conf` in the example below, see [here](https://github.com/apache/pulsar/blob/master/pulsar-io/flume/src/main/resources/flume/sink.conf).
+
+* JSON
+
+ ```json
+
+ {
+ "name": "a1",
+ "confFile": "sink.conf",
+ "noReloadConf": "false",
+ "zkConnString": "",
+ "zkBasePath": ""
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ name: a1
+ confFile: sink.conf
+ noReloadConf: false
+ zkConnString: ""
+ zkBasePath: ""
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-flume-source.md b/site2/website-next/versioned_docs/version-2.7.2/io-flume-source.md
new file mode 100644
index 0000000000000..42f35e7ea499d
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-flume-source.md
@@ -0,0 +1,60 @@
+---
+id: io-flume-source
+title: Flume source connector
+sidebar_label: "Flume source connector"
+original_id: io-flume-source
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The Flume source connector pulls messages from logs to Pulsar topics.
+
+## Configuration
+
+The configuration of the Flume source connector has the following properties.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+`name`|String|true|"" (empty string)|The name of the agent.
+`confFile`|String|true|"" (empty string)|The configuration file.
+`noReloadConf`|Boolean|false|false|Whether to reload configuration file if changed.
+`zkConnString`|String|true|"" (empty string)|The ZooKeeper connection.
+`zkBasePath`|String|true|"" (empty string)|The base path in ZooKeeper for agent configuration.
+
+### Example
+
+Before using the Flume source connector, you need to create a configuration file through one of the following methods.
+
+> For more information about the `source.conf` in the example below, see [here](https://github.com/apache/pulsar/blob/master/pulsar-io/flume/src/main/resources/flume/source.conf).
+
+* JSON
+
+ ```json
+
+ {
+ "name": "a1",
+ "confFile": "source.conf",
+ "noReloadConf": "false",
+ "zkConnString": "",
+ "zkBasePath": ""
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ name: a1
+ confFile: source.conf
+ noReloadConf: false
+ zkConnString: ""
+ zkBasePath: ""
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-hbase-sink.md b/site2/website-next/versioned_docs/version-2.7.2/io-hbase-sink.md
new file mode 100644
index 0000000000000..8d39551a05ddb
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-hbase-sink.md
@@ -0,0 +1,70 @@
+---
+id: io-hbase-sink
+title: HBase sink connector
+sidebar_label: "HBase sink connector"
+original_id: io-hbase-sink
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The HBase sink connector pulls the messages from Pulsar topics
+and persists the messages to HBase tables
+
+## Configuration
+
+The configuration of the HBase sink connector has the following properties.
+
+### Property
+
+| Name | Type|Default | Required | Description |
+|------|---------|----------|-------------|---
+| `hbaseConfigResources` | String|None | false | HBase system configuration `hbase-site.xml` file. |
+| `zookeeperQuorum` | String|None | true | HBase system configuration about `hbase.zookeeper.quorum` value. |
+| `zookeeperClientPort` | String|2181 | false | HBase system configuration about `hbase.zookeeper.property.clientPort` value. |
+| `zookeeperZnodeParent` | String|/hbase | false | HBase system configuration about `zookeeper.znode.parent` value. |
+| `tableName` | None |String | true | HBase table, the value is `namespace:tableName`. |
+| `rowKeyName` | String|None | true | HBase table rowkey name. |
+| `familyName` | String|None | true | HBase table column family name. |
+| `qualifierNames` |String| None | true | HBase table column qualifier names. |
+| `batchTimeMs` | Long|1000l| false | HBase table operation timeout in milliseconds. |
+| `batchSize` | int|200| false | Batch size of updates made to the HBase table. |
+
+### Example
+
+Before using the HBase sink connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "hbaseConfigResources": "hbase-site.xml",
+ "zookeeperQuorum": "localhost",
+ "zookeeperClientPort": "2181",
+ "zookeeperZnodeParent": "/hbase",
+ "tableName": "pulsar_hbase",
+ "rowKeyName": "rowKey",
+ "familyName": "info",
+ "qualifierNames": [ 'name', 'address', 'age']
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ hbaseConfigResources: "hbase-site.xml"
+ zookeeperQuorum: "localhost"
+ zookeeperClientPort: "2181"
+ zookeeperZnodeParent: "/hbase"
+ tableName: "pulsar_hbase"
+ rowKeyName: "rowKey"
+ familyName: "info"
+ qualifierNames: [ 'name', 'address', 'age']
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-hdfs2-sink.md b/site2/website-next/versioned_docs/version-2.7.2/io-hdfs2-sink.md
new file mode 100644
index 0000000000000..10369997588d6
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-hdfs2-sink.md
@@ -0,0 +1,68 @@
+---
+id: io-hdfs2-sink
+title: HDFS2 sink connector
+sidebar_label: "HDFS2 sink connector"
+original_id: io-hdfs2-sink
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The HDFS2 sink connector pulls the messages from Pulsar topics
+and persists the messages to HDFS files.
+
+## Configuration
+
+The configuration of the HDFS2 sink connector has the following properties.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `hdfsConfigResources` | String|true| None | A file or a comma-separated list containing the Hadoop file system configuration.
**Example**
'core-site.xml'
'hdfs-site.xml' |
+| `directory` | String | true | None|The HDFS directory where files read from or written to. |
+| `encoding` | String |false |None |The character encoding for the files.
**Example**
UTF-8
ASCII |
+| `compression` | Compression |false |None |The compression code used to compress or de-compress the files on HDFS.
Below are the available options:
BZIP2
DEFLATE
GZIP
LZ4
SNAPPY|
+| `kerberosUserPrincipal` |String| false| None|The principal account of Kerberos user used for authentication. |
+| `keytab` | String|false|None| The full pathname of the Kerberos keytab file used for authentication. |
+| `filenamePrefix` |String| true, if `compression` is set to `None`. | None |The prefix of the files created inside the HDFS directory.
**Example**
The value of topicA result in files named topicA-. |
+| `fileExtension` | String| true | None | The extension added to the files written to HDFS.
**Example**
'.txt'
'.seq' |
+| `separator` | char|false |None |The character used to separate records in a text file.
If no value is provided, the contents from all records are concatenated together in one continuous byte array. |
+| `syncInterval` | long| false |0| The interval between calls to flush data to HDFS disk in milliseconds. |
+| `maxPendingRecords` |int| false|Integer.MAX_VALUE | The maximum number of records that hold in memory before acking.
Setting this property to 1 makes every record send to disk before the record is acked.
Setting this property to a higher value allows buffering records before flushing them to disk.
+| `subdirectoryPattern` | String | false | None | A subdirectory associated with the created time of the sink.
The pattern is the formatted pattern of `directory`'s subdirectory.
See [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html) for pattern's syntax. |
+
+### Example
+
+Before using the HDFS2 sink connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "hdfsConfigResources": "core-site.xml",
+ "directory": "/foo/bar",
+ "filenamePrefix": "prefix",
+ "fileExtension": ".log",
+ "compression": "SNAPPY",
+ "subdirectoryPattern": "yyyy-MM-dd"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ hdfsConfigResources: "core-site.xml"
+ directory: "/foo/bar"
+ filenamePrefix: "prefix"
+ fileExtension: ".log"
+ compression: "SNAPPY"
+ subdirectoryPattern: "yyyy-MM-dd"
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-hdfs3-sink.md b/site2/website-next/versioned_docs/version-2.7.2/io-hdfs3-sink.md
new file mode 100644
index 0000000000000..6bd77ee58d277
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-hdfs3-sink.md
@@ -0,0 +1,63 @@
+---
+id: io-hdfs3-sink
+title: HDFS3 sink connector
+sidebar_label: "HDFS3 sink connector"
+original_id: io-hdfs3-sink
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The HDFS3 sink connector pulls the messages from Pulsar topics
+and persists the messages to HDFS files.
+
+## Configuration
+
+The configuration of the HDFS3 sink connector has the following properties.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `hdfsConfigResources` | String|true| None | A file or a comma-separated list containing the Hadoop file system configuration.
**Example**
'core-site.xml'
'hdfs-site.xml' |
+| `directory` | String | true | None|The HDFS directory where files read from or written to. |
+| `encoding` | String |false |None |The character encoding for the files.
**Example**
UTF-8
ASCII |
+| `compression` | Compression |false |None |The compression code used to compress or de-compress the files on HDFS.
Below are the available options:
BZIP2
DEFLATE
GZIP
LZ4
SNAPPY|
+| `kerberosUserPrincipal` |String| false| None|The principal account of Kerberos user used for authentication. |
+| `keytab` | String|false|None| The full pathname of the Kerberos keytab file used for authentication. |
+| `filenamePrefix` |String| false |None |The prefix of the files created inside the HDFS directory.
**Example**
The value of topicA result in files named topicA-. |
+| `fileExtension` | String| false | None| The extension added to the files written to HDFS.
**Example**
'.txt'
'.seq' |
+| `separator` | char|false |None |The character used to separate records in a text file.
If no value is provided, the contents from all records are concatenated together in one continuous byte array. |
+| `syncInterval` | long| false |0| The interval between calls to flush data to HDFS disk in milliseconds. |
+| `maxPendingRecords` |int| false|Integer.MAX_VALUE | The maximum number of records that hold in memory before acking.
Setting this property to 1 makes every record send to disk before the record is acked.
Setting this property to a higher value allows buffering records before flushing them to disk.
+
+### Example
+
+Before using the HDFS3 sink connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "hdfsConfigResources": "core-site.xml",
+ "directory": "/foo/bar",
+ "filenamePrefix": "prefix",
+ "compression": "SNAPPY"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ hdfsConfigResources: "core-site.xml"
+ directory: "/foo/bar"
+ filenamePrefix: "prefix"
+ compression: "SNAPPY"
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-influxdb-sink.md b/site2/website-next/versioned_docs/version-2.7.2/io-influxdb-sink.md
new file mode 100644
index 0000000000000..4023423964e34
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-influxdb-sink.md
@@ -0,0 +1,123 @@
+---
+id: io-influxdb-sink
+title: InfluxDB sink connector
+sidebar_label: "InfluxDB sink connector"
+original_id: io-influxdb-sink
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The InfluxDB sink connector pulls messages from Pulsar topics
+and persists the messages to InfluxDB.
+
+The InfluxDB sink provides different configurations for InfluxDBv1 and v2 respectively.
+
+## Configuration
+
+The configuration of the InfluxDB sink connector has the following properties.
+
+### Property
+#### InfluxDBv2
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `influxdbUrl` |String| true|" " (empty string) | The URL of the InfluxDB instance. |
+| `token` | String|true| " " (empty string) |The authentication token used to authenticate to InfluxDB. |
+| `organization` | String| true|" " (empty string) | The InfluxDB organization to write to. |
+| `bucket` |String| true | " " (empty string)| The InfluxDB bucket to write to. |
+| `precision` | String|false| ns | The timestamp precision for writing data to InfluxDB.
Below are the available options:ns
us
ms
s|
+| `logLevel` | String|false| NONE|The log level for InfluxDB request and response.
Below are the available options:NONE
BASIC
HEADERS
FULL|
+| `gzipEnable` | boolean|false | false | Whether to enable gzip or not. |
+| `batchTimeMs` |long|false| 1000L | The InfluxDB operation time in milliseconds. |
+| `batchSize` | int|false|200| The batch size of writing to InfluxDB. |
+
+#### InfluxDBv1
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `influxdbUrl` |String| true|" " (empty string) | The URL of the InfluxDB instance. |
+| `username` | String|false| " " (empty string) |The username used to authenticate to InfluxDB. |
+| `password` | String| false|" " (empty string) | The password used to authenticate to InfluxDB. |
+| `database` |String| true | " " (empty string)| The InfluxDB to which write messages. |
+| `consistencyLevel` | String|false|ONE | The consistency level for writing data to InfluxDB.
Below are the available options:ALL
ANY
ONE
QUORUM |
+| `logLevel` | String|false| NONE|The log level for InfluxDB request and response.
Below are the available options:NONE
BASIC
HEADERS
FULL|
+| `retentionPolicy` | String|false| autogen| The retention policy for InfluxDB. |
+| `gzipEnable` | boolean|false | false | Whether to enable gzip or not. |
+| `batchTimeMs` |long|false| 1000L | The InfluxDB operation time in milliseconds. |
+| `batchSize` | int|false|200| The batch size of writing to InfluxDB. |
+
+### Example
+Before using the InfluxDB sink connector, you need to create a configuration file through one of the following methods.
+#### InfluxDBv2
+* JSON
+
+ ```json
+
+ {
+ "influxdbUrl": "http://localhost:9999",
+ "organization": "example-org",
+ "bucket": "example-bucket",
+ "token": "xxxx",
+ "precision": "ns",
+ "logLevel": "NONE",
+ "gzipEnable": false,
+ "batchTimeMs": 1000,
+ "batchSize": 100
+ }
+
+ ```
+
+
+* YAML
+
+ ```yaml
+
+ configs:
+ influxdbUrl: "http://localhost:9999"
+ organization: "example-org"
+ bucket: "example-bucket"
+ token: "xxxx"
+ precision: "ns"
+ logLevel: "NONE"
+ gzipEnable: false
+ batchTimeMs: 1000
+ batchSize: 100
+
+ ```
+
+
+#### InfluxDBv1
+
+* JSON
+
+ ```json
+
+ {
+ "influxdbUrl": "http://localhost:8086",
+ "database": "test_db",
+ "consistencyLevel": "ONE",
+ "logLevel": "NONE",
+ "retentionPolicy": "autogen",
+ "gzipEnable": false,
+ "batchTimeMs": 1000,
+ "batchSize": 100
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ influxdbUrl: "http://localhost:8086"
+ database: "test_db"
+ consistencyLevel: "ONE"
+ logLevel: "NONE"
+ retentionPolicy: "autogen"
+ gzipEnable: false
+ batchTimeMs: 1000
+ batchSize: 100
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-jdbc-sink.md b/site2/website-next/versioned_docs/version-2.7.2/io-jdbc-sink.md
new file mode 100644
index 0000000000000..e992e724e534d
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-jdbc-sink.md
@@ -0,0 +1,161 @@
+---
+id: io-jdbc-sink
+title: JDBC sink connector
+sidebar_label: "JDBC sink connector"
+original_id: io-jdbc-sink
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The JDBC sink connectors allow pulling messages from Pulsar topics
+and persists the messages to ClickHouse, MariaDB, PostgreSQL, and SQLite.
+
+> Currently, INSERT, DELETE and UPDATE operations are supported.
+
+## Configuration
+
+The configuration of all JDBC sink connectors has the following properties.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `userName` | String|false | " " (empty string) | The username used to connect to the database specified by `jdbcUrl`.
**Note: `userName` is case-sensitive.**|
+| `password` | String|false | " " (empty string)| The password used to connect to the database specified by `jdbcUrl`.
**Note: `password` is case-sensitive.**|
+| `jdbcUrl` | String|true | " " (empty string) | The JDBC URL of the database to which the connector connects. |
+| `tableName` | String|true | " " (empty string) | The name of the table to which the connector writes. |
+| `nonKey` | String|false | " " (empty string) | A comma-separated list contains the fields used in updating events. |
+| `key` | String|false | " " (empty string) | A comma-separated list contains the fields used in `where` condition of updating and deleting events. |
+| `timeoutMs` | int| false|500 | The JDBC operation timeout in milliseconds. |
+| `batchSize` | int|false | 200 | The batch size of updates made to the database. |
+
+### Example for ClickHouse
+
+* JSON
+
+ ```json
+
+ {
+ "userName": "clickhouse",
+ "password": "password",
+ "jdbcUrl": "jdbc:clickhouse://localhost:8123/pulsar_clickhouse_jdbc_sink",
+ "tableName": "pulsar_clickhouse_jdbc_sink"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ tenant: "public"
+ namespace: "default"
+ name: "jdbc-clickhouse-sink"
+ topicName: "persistent://public/default/jdbc-clickhouse-topic"
+ sinkType: "jdbc-clickhouse"
+ configs:
+ userName: "clickhouse"
+ password: "password"
+ jdbcUrl: "jdbc:clickhouse://localhost:8123/pulsar_clickhouse_jdbc_sink"
+ tableName: "pulsar_clickhouse_jdbc_sink"
+
+ ```
+
+### Example for MariaDB
+
+* JSON
+
+ ```json
+
+ {
+ "userName": "mariadb",
+ "password": "password",
+ "jdbcUrl": "jdbc:mariadb://localhost:3306/pulsar_mariadb_jdbc_sink",
+ "tableName": "pulsar_mariadb_jdbc_sink"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ tenant: "public"
+ namespace: "default"
+ name: "jdbc-mariadb-sink"
+ topicName: "persistent://public/default/jdbc-mariadb-topic"
+ sinkType: "jdbc-mariadb"
+ configs:
+ userName: "mariadb"
+ password: "password"
+ jdbcUrl: "jdbc:mariadb://localhost:3306/pulsar_mariadb_jdbc_sink"
+ tableName: "pulsar_mariadb_jdbc_sink"
+
+ ```
+
+### Example for PostgreSQL
+
+Before using the JDBC PostgreSQL sink connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "userName": "postgres",
+ "password": "password",
+ "jdbcUrl": "jdbc:postgresql://localhost:5432/pulsar_postgres_jdbc_sink",
+ "tableName": "pulsar_postgres_jdbc_sink"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ tenant: "public"
+ namespace: "default"
+ name: "jdbc-postgres-sink"
+ topicName: "persistent://public/default/jdbc-postgres-topic"
+ sinkType: "jdbc-postgres"
+ configs:
+ userName: "postgres"
+ password: "password"
+ jdbcUrl: "jdbc:postgresql://localhost:5432/pulsar_postgres_jdbc_sink"
+ tableName: "pulsar_postgres_jdbc_sink"
+
+ ```
+
+For more information on **how to use this JDBC sink connector**, see [connect Pulsar to PostgreSQL](io-quickstart.md#connect-pulsar-to-postgresql).
+
+### Example for SQLite
+
+* JSON
+
+ ```json
+
+ {
+ "jdbcUrl": "jdbc:sqlite:db.sqlite",
+ "tableName": "pulsar_sqlite_jdbc_sink"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ tenant: "public"
+ namespace: "default"
+ name: "jdbc-sqlite-sink"
+ topicName: "persistent://public/default/jdbc-sqlite-topic"
+ sinkType: "jdbc-sqlite"
+ configs:
+ jdbcUrl: "jdbc:sqlite:db.sqlite"
+ tableName: "pulsar_sqlite_jdbc_sink"
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-kafka-sink.md b/site2/website-next/versioned_docs/version-2.7.2/io-kafka-sink.md
new file mode 100644
index 0000000000000..743f78514e068
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-kafka-sink.md
@@ -0,0 +1,76 @@
+---
+id: io-kafka-sink
+title: Kafka sink connector
+sidebar_label: "Kafka sink connector"
+original_id: io-kafka-sink
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The Kafka sink connector pulls messages from Pulsar topics and persists the messages
+to Kafka topics.
+
+This guide explains how to configure and use the Kafka sink connector.
+
+## Configuration
+
+The configuration of the Kafka sink connector has the following parameters.
+
+### Property
+
+| Name | Type| Required | Default | Description
+|------|----------|---------|-------------|-------------|
+| `bootstrapServers` |String| true | " " (empty string) | A comma-separated list of host and port pairs for establishing the initial connection to the Kafka cluster. |
+|`acks`|String|true|" " (empty string) |The number of acknowledgments that the producer requires the leader to receive before a request completes.
This controls the durability of the sent records.
+|`batchsize`|long|false|16384L|The batch size that a Kafka producer attempts to batch records together before sending them to brokers.
+|`maxRequestSize`|long|false|1048576L|The maximum size of a Kafka request in bytes.
+|`topic`|String|true|" " (empty string) |The Kafka topic which receives messages from Pulsar.
+| `keyDeserializationClass` | String|false | org.apache.kafka.common.serialization.StringSerializer | The serializer class for Kafka producers to serialize keys.
+| `valueDeserializationClass` | String|false | org.apache.kafka.common.serialization.ByteArraySerializer | The serializer class for Kafka producers to serialize values.
The serializer is set by a specific implementation of [`KafkaAbstractSink`](https://github.com/apache/pulsar/blob/master/pulsar-io/kafka/src/main/java/org/apache/pulsar/io/kafka/KafkaAbstractSink.java).
+|`producerConfigProperties`|Map|false|" " (empty string)|The producer configuration properties to be passed to producers.
**Note: other properties specified in the connector configuration file take precedence over this configuration**.
+
+
+### Example
+
+Before using the Kafka sink connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "bootstrapServers": "localhost:6667",
+ "topic": "test",
+ "acks": "1",
+ "batchSize": "16384",
+ "maxRequestSize": "1048576",
+ "producerConfigProperties":
+ {
+ "client.id": "test-pulsar-producer",
+ "security.protocol": "SASL_PLAINTEXT",
+ "sasl.mechanism": "GSSAPI",
+ "sasl.kerberos.service.name": "kafka",
+ "acks": "all"
+ }
+ }
+
+* YAML
+
+ ```
+
+yaml
+ configs:
+ bootstrapServers: "localhost:6667"
+ topic: "test"
+ acks: "1"
+ batchSize: "16384"
+ maxRequestSize: "1048576"
+ producerConfigProperties:
+ client.id: "test-pulsar-producer"
+ security.protocol: "SASL_PLAINTEXT"
+ sasl.mechanism: "GSSAPI"
+ sasl.kerberos.service.name: "kafka"
+ acks: "all"
+ ```
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-kafka-source.md b/site2/website-next/versioned_docs/version-2.7.2/io-kafka-source.md
new file mode 100644
index 0000000000000..e353aea21c4b7
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-kafka-source.md
@@ -0,0 +1,201 @@
+---
+id: io-kafka-source
+title: Kafka source connector
+sidebar_label: "Kafka source connector"
+original_id: io-kafka-source
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The Kafka source connector pulls messages from Kafka topics and persists the messages
+to Pulsar topics.
+
+This guide explains how to configure and use the Kafka source connector.
+
+## Configuration
+
+The configuration of the Kafka source connector has the following properties.
+
+### Property
+
+| Name | Type| Required | Default | Description
+|------|----------|---------|-------------|-------------|
+| `bootstrapServers` |String| true | " " (empty string) | A comma-separated list of host and port pairs for establishing the initial connection to the Kafka cluster. |
+| `groupId` |String| true | " " (empty string) | A unique string that identifies the group of consumer processes to which this consumer belongs. |
+| `fetchMinBytes` | long|false | 1 | The minimum byte expected for each fetch response. |
+| `autoCommitEnabled` | boolean |false | true | If set to true, the consumer's offset is periodically committed in the background.
This committed offset is used when the process fails as the position from which a new consumer begins. |
+| `autoCommitIntervalMs` | long|false | 5000 | The frequency in milliseconds that the consumer offsets are auto-committed to Kafka if `autoCommitEnabled` is set to true. |
+| `heartbeatIntervalMs` | long| false | 3000 | The interval between heartbeats to the consumer when using Kafka's group management facilities.
**Note: `heartbeatIntervalMs` must be smaller than `sessionTimeoutMs`**.|
+| `sessionTimeoutMs` | long|false | 30000 | The timeout used to detect consumer failures when using Kafka's group management facility. |
+| `topic` | String|true | " " (empty string)| The Kafka topic which sends messages to Pulsar. |
+| `consumerConfigProperties` | Map| false | " " (empty string) | The consumer configuration properties to be passed to consumers.
**Note: other properties specified in the connector configuration file take precedence over this configuration**. |
+| `keyDeserializationClass` | String|false | org.apache.kafka.common.serialization.StringDeserializer | The deserializer class for Kafka consumers to deserialize keys.
The deserializer is set by a specific implementation of [`KafkaAbstractSource`](https://github.com/apache/pulsar/blob/master/pulsar-io/kafka/src/main/java/org/apache/pulsar/io/kafka/KafkaAbstractSource.java).
+| `valueDeserializationClass` | String|false | org.apache.kafka.common.serialization.ByteArrayDeserializer | The deserializer class for Kafka consumers to deserialize values.
+
+
+### Example
+
+Before using the Kafka source connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "bootstrapServers": "pulsar-kafka:9092",
+ "groupId": "test-pulsar-io",
+ "topic": "my-topic",
+ "sessionTimeoutMs": "10000",
+ "autoCommitEnabled": false
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ bootstrapServers: "pulsar-kafka:9092"
+ groupId: "test-pulsar-io"
+ topic: "my-topic"
+ sessionTimeoutMs: "10000"
+ autoCommitEnabled: false
+
+ ```
+
+## Usage
+
+Here is an example of using the Kafka source connecter with the configuration file as shown previously.
+
+1. Download a Kafka client and a Kafka connector.
+
+ ```bash
+
+ $ wget https://repo1.maven.org/maven2/org/apache/kafka/kafka-clients/0.10.2.1/kafka-clients-0.10.2.1.jar
+
+ $ wget https://archive.apache.org/dist/pulsar/pulsar-2.4.0/connectors/pulsar-io-kafka-2.4.0.nar
+
+ ```
+
+2. Create a network.
+
+ ```bash
+
+ $ docker network create kafka-pulsar
+
+ ```
+
+3. Pull a ZooKeeper image and start ZooKeeper.
+
+ ```bash
+
+ $ docker pull wurstmeister/zookeeper
+
+ $ docker run -d -it -p 2181:2181 --name pulsar-kafka-zookeeper --network kafka-pulsar wurstmeister/zookeeper
+
+ ```
+
+4. Pull a Kafka image and start Kafka.
+
+ ```bash
+
+ $ docker pull wurstmeister/kafka:2.11-1.0.2
+
+ $ docker run -d -it --network kafka-pulsar -p 6667:6667 -p 9092:9092 -e KAFKA_ADVERTISED_HOST_NAME=pulsar-kafka -e KAFKA_ZOOKEEPER_CONNECT=pulsar-kafka-zookeeper:2181 --name pulsar-kafka wurstmeister/kafka:2.11-1.0.2
+
+ ```
+
+5. Pull a Pulsar image and start Pulsar standalone.
+
+ ```bash
+
+ $ docker pull apachepulsar/pulsar:2.4.0
+
+ $ docker run -d -it --network kafka-pulsar -p 6650:6650 -p 8080:8080 -v $PWD/data:/pulsar/data --name pulsar-kafka-standalone apachepulsar/pulsar:2.4.0 bin/pulsar standalone
+
+ ```
+
+6. Create a producer file _kafka-producer.py_.
+
+ ```python
+
+ from kafka import KafkaProducer
+ producer = KafkaProducer(bootstrap_servers='pulsar-kafka:9092')
+ future = producer.send('my-topic', b'hello world')
+ future.get()
+
+ ```
+
+7. Create a consumer file _pulsar-client.py_.
+
+ ```python
+
+ import pulsar
+
+ client = pulsar.Client('pulsar://localhost:6650')
+ consumer = client.subscribe('my-topic', subscription_name='my-aa')
+
+ while True:
+ msg = consumer.receive()
+ print msg
+ print dir(msg)
+ print("Received message: '%s'" % msg.data())
+ consumer.acknowledge(msg)
+
+ client.close()
+
+ ```
+
+8. Copy the following files to Pulsar.
+
+ ```bash
+
+ $ docker cp pulsar-io-kafka-2.4.0.nar pulsar-kafka-standalone:/pulsar
+ $ docker cp kafkaSourceConfig.yaml pulsar-kafka-standalone:/pulsar/conf
+ $ docker cp kafka-clients-0.10.2.1.jar pulsar-kafka-standalone:/pulsar/lib
+ $ docker cp pulsar-client.py pulsar-kafka-standalone:/pulsar/
+ $ docker cp kafka-producer.py pulsar-kafka-standalone:/pulsar/
+
+ ```
+
+9. Open a new terminal window and start the Kafka source connector in local run mode.
+
+ ```bash
+
+ $ docker exec -it pulsar-kafka-standalone /bin/bash
+
+ $ ./bin/pulsar-admin source localrun \
+ --archive ./pulsar-io-kafka-2.4.0.nar \
+ --classname org.apache.pulsar.io.kafka.KafkaBytesSource \
+ --tenant public \
+ --namespace default \
+ --name kafka \
+ --destination-topic-name my-topic \
+ --source-config-file ./conf/kafkaSourceConfig.yaml \
+ --parallelism 1
+
+ ```
+
+10. Open a new terminal window and run the consumer.
+
+ ```bash
+
+ $ docker exec -it pulsar-kafka-standalone /bin/bash
+
+ $ pip install kafka-python
+
+ $ python3 kafka-producer.py
+
+ ```
+
+ The following information appears on the consumer terminal window.
+
+ ```bash
+
+ Received message: 'hello world'
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-kinesis-sink.md b/site2/website-next/versioned_docs/version-2.7.2/io-kinesis-sink.md
new file mode 100644
index 0000000000000..483c861db284d
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-kinesis-sink.md
@@ -0,0 +1,84 @@
+---
+id: io-kinesis-sink
+title: Kinesis sink connector
+sidebar_label: "Kinesis sink connector"
+original_id: io-kinesis-sink
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The Kinesis sink connector pulls data from Pulsar and persists data into Amazon Kinesis.
+
+## Configuration
+
+The configuration of the Kinesis sink connector has the following property.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+`messageFormat`|MessageFormat|true|ONLY_RAW_PAYLOAD|Message format in which Kinesis sink converts Pulsar messages and publishes to Kinesis streams.
Below are the available options:
`ONLY_RAW_PAYLOAD`: Kinesis sink directly publishes Pulsar message payload as a message into the configured Kinesis stream.
`FULL_MESSAGE_IN_JSON`: Kinesis sink creates a JSON payload with Pulsar message payload, properties and encryptionCtx, and publishes JSON payload into the configured Kinesis stream.
`FULL_MESSAGE_IN_FB`: Kinesis sink creates a flatbuffer serialized payload with Pulsar message payload, properties and encryptionCtx, and publishes flatbuffer payload into the configured Kinesis stream.
+`retainOrdering`|boolean|false|false|Whether Pulsar connectors to retain ordering when moving messages from Pulsar to Kinesis or not.
+`awsEndpoint`|String|false|" " (empty string)|The Kinesis end-point URL, which can be found at [here](https://docs.aws.amazon.com/general/latest/gr/rande.html).
+`awsRegion`|String|false|" " (empty string)|The AWS region.
**Example**
us-west-1, us-west-2
+`awsKinesisStreamName`|String|true|" " (empty string)|The Kinesis stream name.
+`awsCredentialPluginName`|String|false|" " (empty string)|The fully-qualified class name of implementation of {@inject: github:AwsCredentialProviderPlugin:/pulsar-io/aws/src/main/java/org/apache/pulsar/io/aws/AwsCredentialProviderPlugin.java}.
It is a factory class which creates an AWSCredentialsProvider that is used by Kinesis sink.
If it is empty, the Kinesis sink creates a default AWSCredentialsProvider which accepts json-map of credentials in `awsCredentialPluginParam`.
+`awsCredentialPluginParam`|String |false|" " (empty string)|The JSON parameter to initialize `awsCredentialsProviderPlugin`.
+
+### Built-in plugins
+
+The following are built-in `AwsCredentialProviderPlugin` plugins:
+
+* `org.apache.pulsar.io.aws.AwsDefaultProviderChainPlugin`
+
+ This plugin takes no configuration, it uses the default AWS provider chain.
+
+ For more information, see [AWS documentation](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default).
+
+* `org.apache.pulsar.io.aws.STSAssumeRoleProviderPlugin`
+
+ This plugin takes a configuration (via the `awsCredentialPluginParam`) that describes a role to assume when running the KCL.
+
+ This configuration takes the form of a small json document like:
+
+ ```json
+
+ {"roleArn": "arn...", "roleSessionName": "name"}
+
+ ```
+
+### Example
+
+Before using the Kinesis sink connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "awsEndpoint": "some.endpoint.aws",
+ "awsRegion": "us-east-1",
+ "awsKinesisStreamName": "my-stream",
+ "awsCredentialPluginParam": "{\"accessKey\":\"myKey\",\"secretKey\":\"my-Secret\"}",
+ "messageFormat": "ONLY_RAW_PAYLOAD",
+ "retainOrdering": "true"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ awsEndpoint: "some.endpoint.aws"
+ awsRegion: "us-east-1"
+ awsKinesisStreamName: "my-stream"
+ awsCredentialPluginParam: "{\"accessKey\":\"myKey\",\"secretKey\":\"my-Secret\"}"
+ messageFormat: "ONLY_RAW_PAYLOAD"
+ retainOrdering: "true"
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-kinesis-source.md b/site2/website-next/versioned_docs/version-2.7.2/io-kinesis-source.md
new file mode 100644
index 0000000000000..3e593a31161ad
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-kinesis-source.md
@@ -0,0 +1,85 @@
+---
+id: io-kinesis-source
+title: Kinesis source connector
+sidebar_label: "Kinesis source connector"
+original_id: io-kinesis-source
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The Kinesis source connector pulls data from Amazon Kinesis and persists data into Pulsar.
+
+This connector uses the [Kinesis Consumer Library](https://github.com/awslabs/amazon-kinesis-client) (KCL) to do the actual consuming of messages. The KCL uses DynamoDB to track state for consumers.
+
+> Note: currently, the Kinesis source connector only supports raw messages. If you use KMS encrypted messages, the encrypted messages are sent to downstream. This connector will support decrypting messages in the future release.
+
+
+## Configuration
+
+The configuration of the Kinesis source connector has the following properties.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+`initialPositionInStream`|InitialPositionInStream|false|LATEST|The position where the connector starts from.
Below are the available options:
`AT_TIMESTAMP`: start from the record at or after the specified timestamp.
`LATEST`: start after the most recent data record.
`TRIM_HORIZON`: start from the oldest available data record.
+`startAtTime`|Date|false|" " (empty string)|If set to `AT_TIMESTAMP`, it specifies the point in time to start consumption.
+`applicationName`|String|false|Pulsar IO connector|The name of the Amazon Kinesis application.
By default, the application name is included in the user agent string used to make AWS requests. This can assist with troubleshooting, for example, distinguish requests made by separate connector instances.
+`checkpointInterval`|long|false|60000|The frequency of the Kinesis stream checkpoint in milliseconds.
+`backoffTime`|long|false|3000|The amount of time to delay between requests when the connector encounters a throttling exception from AWS Kinesis in milliseconds.
+`numRetries`|int|false|3|The number of re-attempts when the connector encounters an exception while trying to set a checkpoint.
+`receiveQueueSize`|int|false|1000|The maximum number of AWS records that can be buffered inside the connector.
Once the `receiveQueueSize` is reached, the connector does not consume any messages from Kinesis until some messages in the queue are successfully consumed.
+`dynamoEndpoint`|String|false|" " (empty string)|The Dynamo end-point URL, which can be found at [here](https://docs.aws.amazon.com/general/latest/gr/rande.html).
+`cloudwatchEndpoint`|String|false|" " (empty string)|The Cloudwatch end-point URL, which can be found at [here](https://docs.aws.amazon.com/general/latest/gr/rande.html).
+`useEnhancedFanOut`|boolean|false|true|If set to true, it uses Kinesis enhanced fan-out.
If set to false, it uses polling.
+`awsEndpoint`|String|false|" " (empty string)|The Kinesis end-point URL, which can be found at [here](https://docs.aws.amazon.com/general/latest/gr/rande.html).
+`awsRegion`|String|false|" " (empty string)|The AWS region.
**Example**
us-west-1, us-west-2
+`awsKinesisStreamName`|String|true|" " (empty string)|The Kinesis stream name.
+`awsCredentialPluginName`|String|false|" " (empty string)|The fully-qualified class name of implementation of {@inject: github:AwsCredentialProviderPlugin:/pulsar-io/aws/src/main/java/org/apache/pulsar/io/aws/AwsCredentialProviderPlugin.java}.
`awsCredentialProviderPlugin` has the following built-in plugs:
`org.apache.pulsar.io.kinesis.AwsDefaultProviderChainPlugin`:
this plugin uses the default AWS provider chain.
For more information, see [using the default credential provider chain](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default).
`org.apache.pulsar.io.kinesis.STSAssumeRoleProviderPlugin`:
this plugin takes a configuration via the `awsCredentialPluginParam` that describes a role to assume when running the KCL.
**JSON configuration example**
`{"roleArn": "arn...", "roleSessionName": "name"}`
`awsCredentialPluginName` is a factory class which creates an AWSCredentialsProvider that is used by Kinesis sink.
If `awsCredentialPluginName` set to empty, the Kinesis sink creates a default AWSCredentialsProvider which accepts json-map of credentials in `awsCredentialPluginParam`.
+`awsCredentialPluginParam`|String |false|" " (empty string)|The JSON parameter to initialize `awsCredentialsProviderPlugin`.
+
+### Example
+
+Before using the Kinesis source connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "awsEndpoint": "https://some.endpoint.aws",
+ "awsRegion": "us-east-1",
+ "awsKinesisStreamName": "my-stream",
+ "awsCredentialPluginParam": "{\"accessKey\":\"myKey\",\"secretKey\":\"my-Secret\"}",
+ "applicationName": "My test application",
+ "checkpointInterval": "30000",
+ "backoffTime": "4000",
+ "numRetries": "3",
+ "receiveQueueSize": 2000,
+ "initialPositionInStream": "TRIM_HORIZON",
+ "startAtTime": "2019-03-05T19:28:58.000Z"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ awsEndpoint: "https://some.endpoint.aws"
+ awsRegion: "us-east-1"
+ awsKinesisStreamName: "my-stream"
+ awsCredentialPluginParam: "{\"accessKey\":\"myKey\",\"secretKey\":\"my-Secret\"}"
+ applicationName: "My test application"
+ checkpointInterval: 30000
+ backoffTime: 4000
+ numRetries: 3
+ receiveQueueSize: 2000
+ initialPositionInStream: "TRIM_HORIZON"
+ startAtTime: "2019-03-05T19:28:58.000Z"
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-mongo-sink.md b/site2/website-next/versioned_docs/version-2.7.2/io-mongo-sink.md
new file mode 100644
index 0000000000000..b370464c18f4b
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-mongo-sink.md
@@ -0,0 +1,61 @@
+---
+id: io-mongo-sink
+title: MongoDB sink connector
+sidebar_label: "MongoDB sink connector"
+original_id: io-mongo-sink
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The MongoDB sink connector pulls messages from Pulsar topics
+and persists the messages to collections.
+
+## Configuration
+
+The configuration of the MongoDB sink connector has the following properties.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `mongoUri` | String| true| " " (empty string) | The MongoDB URI to which the connector connects.
For more information, see [connection string URI format](https://docs.mongodb.com/manual/reference/connection-string/). |
+| `database` | String| true| " " (empty string)| The database name to which the collection belongs. |
+| `collection` | String| true| " " (empty string)| The collection name to which the connector writes messages. |
+| `batchSize` | int|false|100 | The batch size of writing messages to collections. |
+| `batchTimeMs` |long|false|1000| The batch operation interval in milliseconds. |
+
+
+### Example
+
+Before using the Mongo sink connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "mongoUri": "mongodb://localhost:27017",
+ "database": "pulsar",
+ "collection": "messages",
+ "batchSize": "2",
+ "batchTimeMs": "500"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ {
+ mongoUri: "mongodb://localhost:27017"
+ database: "pulsar"
+ collection: "messages"
+ batchSize: 2
+ batchTimeMs: 500
+ }
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-netty-source.md b/site2/website-next/versioned_docs/version-2.7.2/io-netty-source.md
new file mode 100644
index 0000000000000..d41265fa4fa28
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-netty-source.md
@@ -0,0 +1,245 @@
+---
+id: io-netty-source
+title: Netty source connector
+sidebar_label: "Netty source connector"
+original_id: io-netty-source
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The Netty source connector opens a port that accepts incoming data via the configured network protocol
+and publish it to user-defined Pulsar topics.
+
+This connector can be used in a containerized (for example, k8s) deployment. Otherwise, if the connector is running in process or thread mode, the instance may be conflicting on listening to ports.
+
+## Configuration
+
+The configuration of the Netty source connector has the following properties.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `type` |String| true |tcp | The network protocol over which data is transmitted to netty.
Below are the available options:
tcphttpudp |
+| `host` | String|true | 127.0.0.1 | The host name or address on which the source instance listen. |
+| `port` | int|true | 10999 | The port on which the source instance listen. |
+| `numberOfThreads` |int| true |1 | The number of threads of Netty TCP server to accept incoming connections and handle the traffic of accepted connections. |
+
+
+### Example
+
+Before using the Netty source connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "type": "tcp",
+ "host": "127.0.0.1",
+ "port": "10911",
+ "numberOfThreads": "1"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ type: "tcp"
+ host: "127.0.0.1"
+ port: 10999
+ numberOfThreads: 1
+
+ ```
+
+## Usage
+
+The following examples show how to use the Netty source connector with TCP and HTTP.
+
+### TCP
+
+1. Start Pulsar standalone.
+
+ ```bash
+
+ $ docker pull apachepulsar/pulsar:{version}
+
+ $ docker run -d -it -p 6650:6650 -p 8080:8080 -v $PWD/data:/pulsar/data --name pulsar-netty-standalone apachepulsar/pulsar:{version} bin/pulsar standalone
+
+ ```
+
+2. Create a configuration file _netty-source-config.yaml_.
+
+ ```yaml
+
+ configs:
+ type: "tcp"
+ host: "127.0.0.1"
+ port: 10999
+ numberOfThreads: 1
+
+ ```
+
+3. Copy the configuration file _netty-source-config.yaml_ to Pulsar server.
+
+ ```bash
+
+ $ docker cp netty-source-config.yaml pulsar-netty-standalone:/pulsar/conf/
+
+ ```
+
+4. Download the Netty source connector.
+
+ ```bash
+
+ $ docker exec -it pulsar-netty-standalone /bin/bash
+ curl -O http://mirror-hk.koddos.net/apache/pulsar/pulsar-{version}/connectors/pulsar-io-netty-{version}.nar
+
+ ```
+
+5. Start the Netty source connector.
+
+ ```bash
+
+ $ ./bin/pulsar-admin sources localrun \
+ --archive pulsar-io-@pulsar:version@.nar \
+ --tenant public \
+ --namespace default \
+ --name netty \
+ --destination-topic-name netty-topic \
+ --source-config-file netty-source-config.yaml \
+ --parallelism 1
+
+ ```
+
+6. Consume data.
+
+ ```bash
+
+ $ docker exec -it pulsar-netty-standalone /bin/bash
+
+ $ ./bin/pulsar-client consume -t Exclusive -s netty-sub netty-topic -n 0
+
+ ```
+
+7. Open another terminal window to send data to the Netty source.
+
+ ```bash
+
+ $ docker exec -it pulsar-netty-standalone /bin/bash
+
+ $ apt-get update
+
+ $ apt-get -y install telnet
+
+ $ root@1d19327b2c67:/pulsar# telnet 127.0.0.1 10999
+ Trying 127.0.0.1...
+ Connected to 127.0.0.1.
+ Escape character is '^]'.
+ hello
+ world
+
+ ```
+
+8. The following information appears on the consumer terminal window.
+
+ ```bash
+
+ ----- got message -----
+ hello
+
+ ----- got message -----
+ world
+
+ ```
+
+### HTTP
+
+1. Start Pulsar standalone.
+
+ ```bash
+
+ $ docker pull apachepulsar/pulsar:{version}
+
+ $ docker run -d -it -p 6650:6650 -p 8080:8080 -v $PWD/data:/pulsar/data --name pulsar-netty-standalone apachepulsar/pulsar:{version} bin/pulsar standalone
+
+ ```
+
+2. Create a configuration file _netty-source-config.yaml_.
+
+ ```yaml
+
+ configs:
+ type: "http"
+ host: "127.0.0.1"
+ port: 10999
+ numberOfThreads: 1
+
+ ```
+
+3. Copy the configuration file _netty-source-config.yaml_ to Pulsar server.
+
+ ```bash
+
+ $ docker cp netty-source-config.yaml pulsar-netty-standalone:/pulsar/conf/
+
+ ```
+
+4. Download the Netty source connector.
+
+ ```bash
+
+ $ docker exec -it pulsar-netty-standalone /bin/bash
+ curl -O http://mirror-hk.koddos.net/apache/pulsar/pulsar-{version}/connectors/pulsar-io-netty-{version}.nar
+
+ ```
+
+5. Start the Netty source connector.
+
+ ```bash
+
+ $ ./bin/pulsar-admin sources localrun \
+ --archive pulsar-io-@pulsar:version@.nar \
+ --tenant public \
+ --namespace default \
+ --name netty \
+ --destination-topic-name netty-topic \
+ --source-config-file netty-source-config.yaml \
+ --parallelism 1
+
+ ```
+
+6. Consume data.
+
+ ```bash
+
+ $ docker exec -it pulsar-netty-standalone /bin/bash
+
+ $ ./bin/pulsar-client consume -t Exclusive -s netty-sub netty-topic -n 0
+
+ ```
+
+7. Open another terminal window to send data to the Netty source.
+
+ ```bash
+
+ $ docker exec -it pulsar-netty-standalone /bin/bash
+
+ $ curl -X POST --data 'hello, world!' http://127.0.0.1:10999/
+
+ ```
+
+8. The following information appears on the consumer terminal window.
+
+ ```bash
+
+ ----- got message -----
+ hello, world!
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-nsq-source.md b/site2/website-next/versioned_docs/version-2.7.2/io-nsq-source.md
new file mode 100644
index 0000000000000..0bf16463b160b
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-nsq-source.md
@@ -0,0 +1,25 @@
+---
+id: io-nsq-source
+title: NSQ source connector
+sidebar_label: "NSQ source connector"
+original_id: io-nsq-source
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The NSQ source connector receives messages from NSQ topics
+and writes messages to Pulsar topics.
+
+## Configuration
+
+The configuration of the NSQ source connector has the following properties.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `lookupds` |String| true | " " (empty string) | A comma-separated list of nsqlookupds to connect to. |
+| `topic` | String|true | " " (empty string) | The NSQ topic to transport. |
+| `channel` | String |false | pulsar-transport-{$topic} | The channel to consume from on the provided NSQ topic. |
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-overview.md b/site2/website-next/versioned_docs/version-2.7.2/io-overview.md
new file mode 100644
index 0000000000000..3a55ff2aef2cc
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-overview.md
@@ -0,0 +1,176 @@
+---
+id: io-overview
+title: Pulsar connector overview
+sidebar_label: "Overview"
+original_id: io-overview
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+Messaging systems are most powerful when you can easily use them with external systems like databases and other messaging systems.
+
+**Pulsar IO connectors** enable you to easily create, deploy, and manage connectors that interact with external systems, such as [Apache Cassandra](https://cassandra.apache.org), [Aerospike](https://www.aerospike.com), and many others.
+
+
+## Concept
+
+Pulsar IO connectors come in two types: **source** and **sink**.
+
+This diagram illustrates the relationship between source, Pulsar, and sink:
+
+")
+
+
+### Source
+
+> Sources **feed data from external systems into Pulsar**.
+
+Common sources include other messaging systems and firehose-style data pipeline APIs.
+
+For the complete list of Pulsar built-in source connectors, see [source connector](io-connectors.md#source-connector).
+
+### Sink
+
+> Sinks **feed data from Pulsar into external systems**.
+
+Common sinks include other messaging systems and SQL and NoSQL databases.
+
+For the complete list of Pulsar built-in sink connectors, see [sink connector](io-connectors.md#sink-connector).
+
+## Processing guarantee
+
+Processing guarantees are used to handle errors when writing messages to Pulsar topics.
+
+> Pulsar connectors and Functions use the **same** processing guarantees as below.
+
+Delivery semantic | Description
+:------------------|:-------
+`at-most-once` | Each message sent to a connector is to be **processed once** or **not to be processed**.
+`at-least-once` | Each message sent to a connector is to be **processed once** or **more than once**.
+`effectively-once` | Each message sent to a connector has **one output associated** with it.
+
+> Processing guarantees for connectors not just rely on Pulsar guarantee but also **relate to external systems**, that is, **the implementation of source and sink**.
+
+* Source: Pulsar ensures that writing messages to Pulsar topics respects to the processing guarantees. It is within Pulsar's control.
+
+* Sink: the processing guarantees rely on the sink implementation. If the sink implementation does not handle retries in an idempotent way, the sink does not respect to the processing guarantees.
+
+### Set
+
+When creating a connector, you can set the processing guarantee with the following semantics:
+
+* ATLEAST_ONCE
+
+* ATMOST_ONCE
+
+* EFFECTIVELY_ONCE
+
+> If `--processing-guarantees` is not specified when creating a connector, the default semantic is `ATLEAST_ONCE`.
+
+Here takes **Admin CLI** as an example. For more information about **REST API** or **JAVA Admin API**, see [here](io-use.md#create).
+
+
+
+
+
+```bash
+
+$ bin/pulsar-admin sources create \
+ --processing-guarantees ATMOST_ONCE \
+ # Other source configs
+
+```
+
+For more information about the options of `pulsar-admin sources create`, see [here](reference-connector-admin.md#create).
+
+
+
+
+```bash
+
+$ bin/pulsar-admin sinks create \
+ --processing-guarantees EFFECTIVELY_ONCE \
+ # Other sink configs
+
+```
+
+For more information about the options of `pulsar-admin sinks create`, see [here](reference-connector-admin.md#create-1).
+
+
+
+
+
+### Update
+
+After creating a connector, you can update the processing guarantee with the following semantics:
+
+* ATLEAST_ONCE
+
+* ATMOST_ONCE
+
+* EFFECTIVELY_ONCE
+
+Here takes **Admin CLI** as an example. For more information about **REST API** or **JAVA Admin API**, see [here](io-use.md#create).
+
+
+
+
+
+```bash
+
+$ bin/pulsar-admin sources update \
+ --processing-guarantees EFFECTIVELY_ONCE \
+ # Other source configs
+
+```
+
+For more information about the options of `pulsar-admin sources update`, see [here](reference-connector-admin.md#update).
+
+
+
+
+```bash
+
+$ bin/pulsar-admin sinks update \
+ --processing-guarantees ATMOST_ONCE \
+ # Other sink configs
+
+```
+
+For more information about the options of `pulsar-admin sinks update`, see [here](reference-connector-admin.md#update-1).
+
+
+
+
+
+
+## Work with connector
+
+You can manage Pulsar connectors (for example, create, update, start, stop, restart, reload, delete and perform other operations on connectors) via the [Connector Admin CLI](reference-connector-admin) with [sources](reference-connector-admin.md#sources) and [sinks](reference-connector-admin.md#sinks) subcommands.
+
+Connectors (sources and sinks) and Functions are components of instances, and they all run on Functions workers. When managing a source, sink or function via [Connector Admin CLI](reference-connector-admin.md) or [Functions Admin CLI](functions-cli), an instance is started on a worker. For more information, see [Functions worker](functions-worker.md#run-functions-worker-separately).
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-quickstart.md b/site2/website-next/versioned_docs/version-2.7.2/io-quickstart.md
new file mode 100644
index 0000000000000..84421a5a57970
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-quickstart.md
@@ -0,0 +1,967 @@
+---
+id: io-quickstart
+title: How to connect Pulsar to database
+sidebar_label: "Get started"
+original_id: io-quickstart
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+This tutorial provides a hands-on look at how you can move data out of Pulsar without writing a single line of code.
+
+It is helpful to review the [concepts](io-overview) for Pulsar I/O with running the steps in this guide to gain a deeper understanding.
+
+At the end of this tutorial, you are able to:
+
+- [Connect Pulsar to Cassandra](#Connect-Pulsar-to-Cassandra)
+
+- [Connect Pulsar to PostgreSQL](#Connect-Pulsar-to-PostgreSQL)
+
+:::tip
+
+* These instructions assume you are running Pulsar in [standalone mode](getting-started-standalone). However, all
+the commands used in this tutorial can be used in a multi-nodes Pulsar cluster without any changes.
+* All the instructions are assumed to run at the root directory of a Pulsar binary distribution.
+
+:::
+
+## Install Pulsar and built-in connector
+
+Before connecting Pulsar to a database, you need to install Pulsar and the desired built-in connector.
+
+For more information about **how to install a standalone Pulsar and built-in connectors**, see [here](getting-started-standalone.md/#installing-pulsar).
+
+## Start Pulsar standalone
+
+1. Start Pulsar locally.
+
+ ```bash
+
+ bin/pulsar standalone
+
+ ```
+
+ All the components of a Pulsar service are start in order.
+
+ You can curl those pulsar service endpoints to make sure Pulsar service is up running correctly.
+
+2. Check Pulsar binary protocol port.
+
+ ```bash
+
+ telnet localhost 6650
+
+ ```
+
+3. Check Pulsar Function cluster.
+
+ ```bash
+
+ curl -s http://localhost:8080/admin/v2/worker/cluster
+
+ ```
+
+ **Example output**
+
+ ```json
+
+ [{"workerId":"c-standalone-fw-localhost-6750","workerHostname":"localhost","port":6750}]
+
+ ```
+
+4. Make sure a public tenant and a default namespace exist.
+
+ ```bash
+
+ curl -s http://localhost:8080/admin/v2/namespaces/public
+
+ ```
+
+ **Example output**
+
+ ```json
+
+ ["public/default","public/functions"]
+
+ ```
+
+5. All built-in connectors should be listed as available.
+
+ ```bash
+
+ curl -s http://localhost:8080/admin/v2/functions/connectors
+
+ ```
+
+ **Example output**
+
+ ```json
+
+ [{"name":"aerospike","description":"Aerospike database sink","sinkClass":"org.apache.pulsar.io.aerospike.AerospikeStringSink"},{"name":"cassandra","description":"Writes data into Cassandra","sinkClass":"org.apache.pulsar.io.cassandra.CassandraStringSink"},{"name":"kafka","description":"Kafka source and sink connector","sourceClass":"org.apache.pulsar.io.kafka.KafkaStringSource","sinkClass":"org.apache.pulsar.io.kafka.KafkaBytesSink"},{"name":"kinesis","description":"Kinesis sink connector","sinkClass":"org.apache.pulsar.io.kinesis.KinesisSink"},{"name":"rabbitmq","description":"RabbitMQ source connector","sourceClass":"org.apache.pulsar.io.rabbitmq.RabbitMQSource"},{"name":"twitter","description":"Ingest data from Twitter firehose","sourceClass":"org.apache.pulsar.io.twitter.TwitterFireHose"}]
+
+ ```
+
+ If an error occurs when starting Pulsar service, you may see an exception at the terminal running `pulsar/standalone`,
+ or you can navigate to the `logs` directory under the Pulsar directory to view the logs.
+
+## Connect Pulsar to Cassandra
+
+This section demonstrates how to connect Pulsar to Cassandra.
+
+:::tip
+
+* Make sure you have Docker installed. If you do not have one, see [install Docker](https://docs.docker.com/docker-for-mac/install/).
+* The Cassandra sink connector reads messages from Pulsar topics and writes the messages into Cassandra tables. For more information, see [Cassandra sink connector](io-cassandra-sink).
+
+:::
+
+### Setup a Cassandra cluster
+
+This example uses `cassandra` Docker image to start a single-node Cassandra cluster in Docker.
+
+1. Start a Cassandra cluster.
+
+ ```bash
+
+ docker run -d --rm --name=cassandra -p 9042:9042 cassandra
+
+ ```
+
+ :::note
+
+ Before moving to the next steps, make sure the Cassandra cluster is running.
+
+ :::
+
+2. Make sure the Docker process is running.
+
+ ```bash
+
+ docker ps
+
+ ```
+
+3. Check the Cassandra logs to make sure the Cassandra process is running as expected.
+
+ ```bash
+
+ docker logs cassandra
+
+ ```
+
+4. Check the status of the Cassandra cluster.
+
+ ```bash
+
+ docker exec cassandra nodetool status
+
+ ```
+
+ **Example output**
+
+ ```
+
+ Datacenter: datacenter1
+ =======================
+ Status=Up/Down
+ |/ State=Normal/Leaving/Joining/Moving
+ -- Address Load Tokens Owns (effective) Host ID Rack
+ UN 172.17.0.2 103.67 KiB 256 100.0% af0e4b2f-84e0-4f0b-bb14-bd5f9070ff26 rack1
+
+ ```
+
+5. Use `cqlsh` to connect to the Cassandra cluster.
+
+ ```bash
+
+ $ docker exec -ti cassandra cqlsh localhost
+ Connected to Test Cluster at localhost:9042.
+ [cqlsh 5.0.1 | Cassandra 3.11.2 | CQL spec 3.4.4 | Native protocol v4]
+ Use HELP for help.
+ cqlsh>
+
+ ```
+
+6. Create a keyspace `pulsar_test_keyspace`.
+
+ ```bash
+
+ cqlsh> CREATE KEYSPACE pulsar_test_keyspace WITH replication = {'class':'SimpleStrategy', 'replication_factor':1};
+
+ ```
+
+7. Create a table `pulsar_test_table`.
+
+ ```bash
+
+ cqlsh> USE pulsar_test_keyspace;
+ cqlsh:pulsar_test_keyspace> CREATE TABLE pulsar_test_table (key text PRIMARY KEY, col text);
+
+ ```
+
+### Configure a Cassandra sink
+
+Now that we have a Cassandra cluster running locally.
+
+In this section, you need to configure a Cassandra sink connector.
+
+To run a Cassandra sink connector, you need to prepare a configuration file including the information that Pulsar connector runtime needs to know.
+
+For example, how Pulsar connector can find the Cassandra cluster, what is the keyspace and the table that Pulsar connector uses for writing Pulsar messages to, and so on.
+
+You can create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "roots": "localhost:9042",
+ "keyspace": "pulsar_test_keyspace",
+ "columnFamily": "pulsar_test_table",
+ "keyname": "key",
+ "columnName": "col"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ roots: "localhost:9042"
+ keyspace: "pulsar_test_keyspace"
+ columnFamily: "pulsar_test_table"
+ keyname: "key"
+ columnName: "col"
+
+ ```
+
+For more information, see [Cassandra sink connector](io-cassandra-sink).
+
+### Create a Cassandra sink
+
+You can use the [Connector Admin CLI](io-cli)
+to create a sink connector and perform other operations on them.
+
+Run the following command to create a Cassandra sink connector with sink type _cassandra_ and the config file _examples/cassandra-sink.yml_ created previously.
+
+#### Note
+> The `sink-type` parameter of the currently built-in connectors is determined by the setting of the `name` parameter specified in the pulsar-io.yaml file.
+
+```bash
+
+bin/pulsar-admin sinks create \
+ --tenant public \
+ --namespace default \
+ --name cassandra-test-sink \
+ --sink-type cassandra \
+ --sink-config-file examples/cassandra-sink.yml \
+ --inputs test_cassandra
+
+```
+
+Once the command is executed, Pulsar creates the sink connector _cassandra-test-sink_.
+
+This sink connector runs
+as a Pulsar Function and writes the messages produced in the topic _test_cassandra_ to the Cassandra table _pulsar_test_table_.
+
+### Inspect a Cassandra sink
+
+You can use the [Connector Admin CLI](io-cli)
+to monitor a connector and perform other operations on it.
+
+* Get the information of a Cassandra sink.
+
+ ```bash
+
+ bin/pulsar-admin sinks get \
+ --tenant public \
+ --namespace default \
+ --name cassandra-test-sink
+
+ ```
+
+ **Example output**
+
+ ```json
+
+ {
+ "tenant": "public",
+ "namespace": "default",
+ "name": "cassandra-test-sink",
+ "className": "org.apache.pulsar.io.cassandra.CassandraStringSink",
+ "inputSpecs": {
+ "test_cassandra": {
+ "isRegexPattern": false
+ }
+ },
+ "configs": {
+ "roots": "localhost:9042",
+ "keyspace": "pulsar_test_keyspace",
+ "columnFamily": "pulsar_test_table",
+ "keyname": "key",
+ "columnName": "col"
+ },
+ "parallelism": 1,
+ "processingGuarantees": "ATLEAST_ONCE",
+ "retainOrdering": false,
+ "autoAck": true,
+ "archive": "builtin://cassandra"
+ }
+
+ ```
+
+* Check the status of a Cassandra sink.
+
+ ```bash
+
+ bin/pulsar-admin sinks status \
+ --tenant public \
+ --namespace default \
+ --name cassandra-test-sink
+
+ ```
+
+ **Example output**
+
+ ```json
+
+ {
+ "numInstances" : 1,
+ "numRunning" : 1,
+ "instances" : [ {
+ "instanceId" : 0,
+ "status" : {
+ "running" : true,
+ "error" : "",
+ "numRestarts" : 0,
+ "numReadFromPulsar" : 0,
+ "numSystemExceptions" : 0,
+ "latestSystemExceptions" : [ ],
+ "numSinkExceptions" : 0,
+ "latestSinkExceptions" : [ ],
+ "numWrittenToSink" : 0,
+ "lastReceivedTime" : 0,
+ "workerId" : "c-standalone-fw-localhost-8080"
+ }
+ } ]
+ }
+
+ ```
+
+### Verify a Cassandra sink
+
+1. Produce some messages to the input topic of the Cassandra sink _test_cassandra_.
+
+ ```bash
+
+ for i in {0..9}; do bin/pulsar-client produce -m "key-$i" -n 1 test_cassandra; done
+
+ ```
+
+2. Inspect the status of the Cassandra sink _test_cassandra_.
+
+ ```bash
+
+ bin/pulsar-admin sinks status \
+ --tenant public \
+ --namespace default \
+ --name cassandra-test-sink
+
+ ```
+
+ You can see 10 messages are processed by the Cassandra sink _test_cassandra_.
+
+ **Example output**
+
+ ```json
+
+ {
+ "numInstances" : 1,
+ "numRunning" : 1,
+ "instances" : [ {
+ "instanceId" : 0,
+ "status" : {
+ "running" : true,
+ "error" : "",
+ "numRestarts" : 0,
+ "numReadFromPulsar" : 10,
+ "numSystemExceptions" : 0,
+ "latestSystemExceptions" : [ ],
+ "numSinkExceptions" : 0,
+ "latestSinkExceptions" : [ ],
+ "numWrittenToSink" : 10,
+ "lastReceivedTime" : 1551685489136,
+ "workerId" : "c-standalone-fw-localhost-8080"
+ }
+ } ]
+ }
+
+ ```
+
+3. Use `cqlsh` to connect to the Cassandra cluster.
+
+ ```bash
+
+ docker exec -ti cassandra cqlsh localhost
+
+ ```
+
+4. Check the data of the Cassandra table _pulsar_test_table_.
+
+ ```bash
+
+ cqlsh> use pulsar_test_keyspace;
+ cqlsh:pulsar_test_keyspace> select * from pulsar_test_table;
+
+ key | col
+ --------+--------
+ key-5 | key-5
+ key-0 | key-0
+ key-9 | key-9
+ key-2 | key-2
+ key-1 | key-1
+ key-3 | key-3
+ key-6 | key-6
+ key-7 | key-7
+ key-4 | key-4
+ key-8 | key-8
+
+ ```
+
+### Delete a Cassandra Sink
+
+You can use the [Connector Admin CLI](io-cli)
+to delete a connector and perform other operations on it.
+
+```bash
+
+bin/pulsar-admin sinks delete \
+ --tenant public \
+ --namespace default \
+ --name cassandra-test-sink
+
+```
+
+## Connect Pulsar to PostgreSQL
+
+This section demonstrates how to connect Pulsar to PostgreSQL.
+
+:::tip
+
+* Make sure you have Docker installed. If you do not have one, see [install Docker](https://docs.docker.com/docker-for-mac/install/).
+* The JDBC sink connector pulls messages from Pulsar topics and persists the messages to ClickHouse, MariaDB, PostgreSQL, or SQlite. For more information, see [JDBC sink connector](io-jdbc-sink).
+
+:::
+
+
+
+
+### Setup a PostgreSQL cluster
+
+This example uses the PostgreSQL 12 docker image to start a single-node PostgreSQL cluster in Docker.
+
+1. Pull the PostgreSQL 12 image from Docker.
+
+ ```bash
+
+ $ docker pull postgres:12
+
+ ```
+
+2. Start PostgreSQL.
+
+ ```bash
+
+ $ docker run -d -it --rm \
+ --name pulsar-postgres \
+ -p 5432:5432 \
+ -e POSTGRES_PASSWORD=password \
+ -e POSTGRES_USER=postgres \
+ postgres:12
+
+ ```
+
+ #### Tip
+
+ Flag | Description | This example
+ ---|---|---|
+ `-d` | To start a container in detached mode. | /
+ `-it` | Keep STDIN open even if not attached and allocate a terminal. | /
+ `--rm` | Remove the container automatically when it exits. | /
+ `-name` | Assign a name to the container. | This example specifies _pulsar-postgres_ for the container.
+ `-p` | Publish the port of the container to the host. | This example publishes the port _5432_ of the container to the host.
+ `-e` | Set environment variables. | This example sets the following variables:
- The password for the user is _password_.
- The name for the user is _postgres_.
+
+ :::tip
+
+ For more information about Docker commands, see [Docker CLI](https://docs.docker.com/engine/reference/commandline/run/).
+
+ :::
+
+3. Check if PostgreSQL has been started successfully.
+
+ ```bash
+
+ $ docker logs -f pulsar-postgres
+
+ ```
+
+ PostgreSQL has been started successfully if the following message appears.
+
+ ```text
+
+ 2020-05-11 20:09:24.492 UTC [1] LOG: starting PostgreSQL 12.2 (Debian 12.2-2.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
+ 2020-05-11 20:09:24.492 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
+ 2020-05-11 20:09:24.492 UTC [1] LOG: listening on IPv6 address "::", port 5432
+ 2020-05-11 20:09:24.499 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
+ 2020-05-11 20:09:24.523 UTC [55] LOG: database system was shut down at 2020-05-11 20:09:24 UTC
+ 2020-05-11 20:09:24.533 UTC [1] LOG: database system is ready to accept connections
+
+ ```
+
+4. Access to PostgreSQL.
+
+ ```bash
+
+ $ docker exec -it pulsar-postgres /bin/bash
+
+ ```
+
+5. Create a PostgreSQL table _pulsar_postgres_jdbc_sink_.
+
+ ```bash
+
+ $ psql -U postgres postgres
+
+ postgres=# create table if not exists pulsar_postgres_jdbc_sink
+ (
+ id serial PRIMARY KEY,
+ name VARCHAR(255) NOT NULL
+ );
+
+ ```
+
+### Configure a JDBC sink
+
+Now we have a PostgreSQL running locally.
+
+In this section, you need to configure a JDBC sink connector.
+
+1. Add a configuration file.
+
+ To run a JDBC sink connector, you need to prepare a YAML configuration file including the information that Pulsar connector runtime needs to know.
+
+ For example, how Pulsar connector can find the PostgreSQL cluster, what is the JDBC URL and the table that Pulsar connector uses for writing messages to.
+
+ Create a _pulsar-postgres-jdbc-sink.yaml_ file, copy the following contents to this file, and place the file in the `pulsar/connectors` folder.
+
+ ```yaml
+
+ configs:
+ userName: "postgres"
+ password: "password"
+ jdbcUrl: "jdbc:postgresql://localhost:5432/pulsar_postgres_jdbc_sink"
+ tableName: "pulsar_postgres_jdbc_sink"
+
+ ```
+
+2. Create a schema.
+
+ Create a _avro-schema_ file, copy the following contents to this file, and place the file in the `pulsar/connectors` folder.
+
+ ```json
+
+ {
+ "type": "AVRO",
+ "schema": "{\"type\":\"record\",\"name\":\"Test\",\"fields\":[{\"name\":\"id\",\"type\":[\"null\",\"int\"]},{\"name\":\"name\",\"type\":[\"null\",\"string\"]}]}",
+ "properties": {}
+ }
+
+ ```
+
+ :::tip
+
+ For more information about AVRO, see [Apache Avro](https://avro.apache.org/docs/1.9.1/).
+
+ :::
+
+3. Upload a schema to a topic.
+
+ This example uploads the _avro-schema_ schema to the _pulsar-postgres-jdbc-sink-topic_ topic.
+
+ ```bash
+
+ $ bin/pulsar-admin schemas upload pulsar-postgres-jdbc-sink-topic -f ./connectors/avro-schema
+
+ ```
+
+4. Check if the schema has been uploaded successfully.
+
+ ```bash
+
+ $ bin/pulsar-admin schemas get pulsar-postgres-jdbc-sink-topic
+
+ ```
+
+ The schema has been uploaded successfully if the following message appears.
+
+ ```json
+
+ {"name":"pulsar-postgres-jdbc-sink-topic","schema":"{\"type\":\"record\",\"name\":\"Test\",\"fields\":[{\"name\":\"id\",\"type\":[\"null\",\"int\"]},{\"name\":\"name\",\"type\":[\"null\",\"string\"]}]}","type":"AVRO","properties":{}}
+
+ ```
+
+### Create a JDBC sink
+
+You can use the [Connector Admin CLI](io-cli)
+to create a sink connector and perform other operations on it.
+
+This example creates a sink connector and specifies the desired information.
+
+```bash
+
+$ bin/pulsar-admin sinks create \
+--archive ./connectors/pulsar-io-jdbc-postgres-@pulsar:version@.nar \
+--inputs pulsar-postgres-jdbc-sink-topic \
+--name pulsar-postgres-jdbc-sink \
+--sink-config-file ./connectors/pulsar-postgres-jdbc-sink.yaml \
+--parallelism 1
+
+```
+
+Once the command is executed, Pulsar creates a sink connector _pulsar-postgres-jdbc-sink_.
+
+This sink connector runs as a Pulsar Function and writes the messages produced in the topic _pulsar-postgres-jdbc-sink-topic_ to the PostgreSQL table _pulsar_postgres_jdbc_sink_.
+
+ #### Tip
+
+ Flag | Description | This example
+ ---|---|---|
+ `--archive` | The path to the archive file for the sink. | _pulsar-io-jdbc-postgres-@pulsar:version@.nar_ |
+ `--inputs` | The input topic(s) of the sink.
Multiple topics can be specified as a comma-separated list.||
+ `--name` | The name of the sink. | _pulsar-postgres-jdbc-sink_ |
+ `--sink-config-file` | The path to a YAML config file specifying the configuration of the sink. | _pulsar-postgres-jdbc-sink.yaml_ |
+ `--parallelism` | The parallelism factor of the sink.
For example, the number of sink instances to run. | _1_ |
+
+:::tip
+
+For more information about `pulsar-admin sinks create options`, see [here](io-cli.md#sinks).
+
+:::
+
+The sink has been created successfully if the following message appears.
+
+```bash
+
+"Created successfully"
+
+```
+
+### Inspect a JDBC sink
+
+You can use the [Connector Admin CLI](io-cli)
+to monitor a connector and perform other operations on it.
+
+* List all running JDBC sink(s).
+
+ ```bash
+
+ $ bin/pulsar-admin sinks list \
+ --tenant public \
+ --namespace default
+
+ ```
+
+ :::tip
+
+ For more information about `pulsar-admin sinks list options`, see [here](io-cli.md/#list-1).
+
+ :::
+
+ The result shows that only the _postgres-jdbc-sink_ sink is running.
+
+ ```json
+
+ [
+ "pulsar-postgres-jdbc-sink"
+ ]
+
+ ```
+
+* Get the information of a JDBC sink.
+
+ ```bash
+
+ $ bin/pulsar-admin sinks get \
+ --tenant public \
+ --namespace default \
+ --name pulsar-postgres-jdbc-sink
+
+ ```
+
+ :::tip
+
+ For more information about `pulsar-admin sinks get options`, see [here](io-cli.md/#get-1).
+
+ :::
+
+ The result shows the information of the sink connector, including tenant, namespace, topic and so on.
+
+ ```json
+
+ {
+ "tenant": "public",
+ "namespace": "default",
+ "name": "pulsar-postgres-jdbc-sink",
+ "className": "org.apache.pulsar.io.jdbc.PostgresJdbcAutoSchemaSink",
+ "inputSpecs": {
+ "pulsar-postgres-jdbc-sink-topic": {
+ "isRegexPattern": false
+ }
+ },
+ "configs": {
+ "password": "password",
+ "jdbcUrl": "jdbc:postgresql://localhost:5432/pulsar_postgres_jdbc_sink",
+ "userName": "postgres",
+ "tableName": "pulsar_postgres_jdbc_sink"
+ },
+ "parallelism": 1,
+ "processingGuarantees": "ATLEAST_ONCE",
+ "retainOrdering": false,
+ "autoAck": true
+ }
+
+ ```
+
+* Get the status of a JDBC sink
+
+ ```bash
+
+ $ bin/pulsar-admin sinks status \
+ --tenant public \
+ --namespace default \
+ --name pulsar-postgres-jdbc-sink
+
+ ```
+
+ :::tip
+
+ For more information about `pulsar-admin sinks status options`, see [here](io-cli.md/#status-1).
+
+ :::
+
+ The result shows the current status of sink connector, including the number of instance, running status, worker ID and so on.
+
+ ```json
+
+ {
+ "numInstances" : 1,
+ "numRunning" : 1,
+ "instances" : [ {
+ "instanceId" : 0,
+ "status" : {
+ "running" : true,
+ "error" : "",
+ "numRestarts" : 0,
+ "numReadFromPulsar" : 0,
+ "numSystemExceptions" : 0,
+ "latestSystemExceptions" : [ ],
+ "numSinkExceptions" : 0,
+ "latestSinkExceptions" : [ ],
+ "numWrittenToSink" : 0,
+ "lastReceivedTime" : 0,
+ "workerId" : "c-standalone-fw-192.168.2.52-8080"
+ }
+ } ]
+ }
+
+ ```
+
+### Stop a JDBC sink
+
+You can use the [Connector Admin CLI](io-cli)
+to stop a connector and perform other operations on it.
+
+```bash
+
+$ bin/pulsar-admin sinks stop \
+--tenant public \
+--namespace default \
+--name pulsar-postgres-jdbc-sink
+
+```
+
+:::tip
+
+For more information about `pulsar-admin sinks stop options`, see [here](io-cli.md/#stop-1).
+
+:::
+
+The sink instance has been stopped successfully if the following message disappears.
+
+```bash
+
+"Stopped successfully"
+
+```
+
+### Restart a JDBC sink
+
+You can use the [Connector Admin CLI](io-cli)
+to restart a connector and perform other operations on it.
+
+```bash
+
+$ bin/pulsar-admin sinks restart \
+--tenant public \
+--namespace default \
+--name pulsar-postgres-jdbc-sink
+
+```
+
+:::tip
+
+For more information about `pulsar-admin sinks restart options`, see [here](io-cli.md/#restart-1).
+
+:::
+
+The sink instance has been started successfully if the following message disappears.
+
+```bash
+
+"Started successfully"
+
+```
+
+:::tip
+
+* Optionally, you can run a standalone sink connector using `pulsar-admin sinks localrun options`.
+Note that `pulsar-admin sinks localrun options` **runs a sink connector locally**, while `pulsar-admin sinks start options` **starts a sink connector in a cluster**.
+* For more information about `pulsar-admin sinks localrun options`, see [here](io-cli.md#localrun-1).
+
+:::
+
+### Update a JDBC sink
+
+You can use the [Connector Admin CLI](io-cli)
+to update a connector and perform other operations on it.
+
+This example updates the parallelism of the _pulsar-postgres-jdbc-sink_ sink connector to 2.
+
+```bash
+
+$ bin/pulsar-admin sinks update \
+--name pulsar-postgres-jdbc-sink \
+--parallelism 2
+
+```
+
+:::tip
+
+For more information about `pulsar-admin sinks update options`, see [here](io-cli.md/#update-1).
+
+:::
+
+The sink connector has been updated successfully if the following message disappears.
+
+```bash
+
+"Updated successfully"
+
+```
+
+This example double-checks the information.
+
+```bash
+
+$ bin/pulsar-admin sinks get \
+--tenant public \
+--namespace default \
+--name pulsar-postgres-jdbc-sink
+
+```
+
+The result shows that the parallelism is 2.
+
+```json
+
+{
+ "tenant": "public",
+ "namespace": "default",
+ "name": "pulsar-postgres-jdbc-sink",
+ "className": "org.apache.pulsar.io.jdbc.PostgresJdbcAutoSchemaSink",
+ "inputSpecs": {
+ "pulsar-postgres-jdbc-sink-topic": {
+ "isRegexPattern": false
+ }
+ },
+ "configs": {
+ "password": "password",
+ "jdbcUrl": "jdbc:postgresql://localhost:5432/pulsar_postgres_jdbc_sink",
+ "userName": "postgres",
+ "tableName": "pulsar_postgres_jdbc_sink"
+ },
+ "parallelism": 2,
+ "processingGuarantees": "ATLEAST_ONCE",
+ "retainOrdering": false,
+ "autoAck": true
+}
+
+```
+
+### Delete a JDBC sink
+
+You can use the [Connector Admin CLI](io-cli)
+to delete a connector and perform other operations on it.
+
+This example deletes the _pulsar-postgres-jdbc-sink_ sink connector.
+
+```bash
+
+$ bin/pulsar-admin sinks delete \
+--tenant public \
+--namespace default \
+--name pulsar-postgres-jdbc-sink
+
+```
+
+:::tip
+
+For more information about `pulsar-admin sinks delete options`, see [here](io-cli.md/#delete-1).
+
+:::
+
+The sink connector has been deleted successfully if the following message appears.
+
+```text
+
+"Deleted successfully"
+
+```
+
+This example double-checks the status of the sink connector.
+
+```bash
+
+$ bin/pulsar-admin sinks get \
+--tenant public \
+--namespace default \
+--name pulsar-postgres-jdbc-sink
+
+```
+
+The result shows that the sink connector does not exist.
+
+```text
+
+HTTP 404 Not Found
+
+Reason: Sink pulsar-postgres-jdbc-sink doesn't exist
+
+```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-rabbitmq-sink.md b/site2/website-next/versioned_docs/version-2.7.2/io-rabbitmq-sink.md
new file mode 100644
index 0000000000000..48f1c75678559
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-rabbitmq-sink.md
@@ -0,0 +1,89 @@
+---
+id: io-rabbitmq-sink
+title: RabbitMQ sink connector
+sidebar_label: "RabbitMQ sink connector"
+original_id: io-rabbitmq-sink
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The RabbitMQ sink connector pulls messages from Pulsar topics
+and persist the messages to RabbitMQ queues.
+
+
+## Configuration
+
+The configuration of the RabbitMQ sink connector has the following properties.
+
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `connectionName` |String| true | " " (empty string) | The connection name. |
+| `host` | String| true | " " (empty string) | The RabbitMQ host. |
+| `port` | int |true | 5672 | The RabbitMQ port. |
+| `virtualHost` |String|true | / | The virtual host used to connect to RabbitMQ. |
+| `username` | String|false | guest | The username used to authenticate to RabbitMQ. |
+| `password` | String|false | guest | The password used to authenticate to RabbitMQ. |
+| `queueName` | String|true | " " (empty string) | The RabbitMQ queue name that messages should be read from or written to. |
+| `requestedChannelMax` | int|false | 0 | The initially requested maximum channel number.
0 means unlimited. |
+| `requestedFrameMax` | int|false |0 | The initially requested maximum frame size in octets.
0 means unlimited. |
+| `connectionTimeout` | int|false | 60000 | The timeout of TCP connection establishment in milliseconds.
0 means infinite. |
+| `handshakeTimeout` | int|false | 10000 | The timeout of AMQP0-9-1 protocol handshake in milliseconds. |
+| `requestedHeartbeat` | int|false | 60 | The exchange to publish messages. |
+| `exchangeName` | String|true | " " (empty string) | The maximum number of messages that the server delivers.
0 means unlimited. |
+| `prefetchGlobal` |String|true | " " (empty string) |The routing key used to publish messages. |
+
+
+### Example
+
+Before using the RabbitMQ sink connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "host": "localhost",
+ "port": "5672",
+ "virtualHost": "/",
+ "username": "guest",
+ "password": "guest",
+ "queueName": "test-queue",
+ "connectionName": "test-connection",
+ "requestedChannelMax": "0",
+ "requestedFrameMax": "0",
+ "connectionTimeout": "60000",
+ "handshakeTimeout": "10000",
+ "requestedHeartbeat": "60",
+ "exchangeName": "test-exchange",
+ "routingKey": "test-key"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ host: "localhost"
+ port: 5672
+ virtualHost: "/",
+ username: "guest"
+ password: "guest"
+ queueName: "test-queue"
+ connectionName: "test-connection"
+ requestedChannelMax: 0
+ requestedFrameMax: 0
+ connectionTimeout: 60000
+ handshakeTimeout: 10000
+ requestedHeartbeat: 60
+ exchangeName: "test-exchange"
+ routingKey: "test-key"
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-rabbitmq-source.md b/site2/website-next/versioned_docs/version-2.7.2/io-rabbitmq-source.md
new file mode 100644
index 0000000000000..0a10cfaab1b1a
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-rabbitmq-source.md
@@ -0,0 +1,89 @@
+---
+id: io-rabbitmq-source
+title: RabbitMQ source connector
+sidebar_label: "RabbitMQ source connector"
+original_id: io-rabbitmq-source
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The RabbitMQ source connector receives messages from RabbitMQ clusters
+and writes messages to Pulsar topics.
+
+## Configuration
+
+The configuration of the RabbitMQ source connector has the following properties.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `connectionName` |String| true | " " (empty string) | The connection name. |
+| `host` | String| true | " " (empty string) | The RabbitMQ host. |
+| `port` | int |true | 5672 | The RabbitMQ port. |
+| `virtualHost` |String|true | / | The virtual host used to connect to RabbitMQ. |
+| `username` | String|false | guest | The username used to authenticate to RabbitMQ. |
+| `password` | String|false | guest | The password used to authenticate to RabbitMQ. |
+| `queueName` | String|true | " " (empty string) | The RabbitMQ queue name that messages should be read from or written to. |
+| `requestedChannelMax` | int|false | 0 | The initially requested maximum channel number.
0 means unlimited. |
+| `requestedFrameMax` | int|false |0 | The initially requested maximum frame size in octets.
0 means unlimited. |
+| `connectionTimeout` | int|false | 60000 | The timeout of TCP connection establishment in milliseconds.
0 means infinite. |
+| `handshakeTimeout` | int|false | 10000 | The timeout of AMQP0-9-1 protocol handshake in milliseconds. |
+| `requestedHeartbeat` | int|false | 60 | The requested heartbeat timeout in seconds. |
+| `prefetchCount` | int|false | 0 | The maximum number of messages that the server delivers.
0 means unlimited. |
+| `prefetchGlobal` | boolean|false | false |Whether the setting should be applied to the entire channel rather than each consumer. |
+| `passive` | boolean|false | false | Whether the rabbitmq consumer should create its own queue or bind to an existing one. |
+
+### Example
+
+Before using the RabbitMQ source connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "host": "localhost",
+ "port": "5672",
+ "virtualHost": "/",
+ "username": "guest",
+ "password": "guest",
+ "queueName": "test-queue",
+ "connectionName": "test-connection",
+ "requestedChannelMax": "0",
+ "requestedFrameMax": "0",
+ "connectionTimeout": "60000",
+ "handshakeTimeout": "10000",
+ "requestedHeartbeat": "60",
+ "prefetchCount": "0",
+ "prefetchGlobal": "false",
+ "passive": "false"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ configs:
+ host: "localhost"
+ port: 5672
+ virtualHost: "/"
+ username: "guest"
+ password: "guest"
+ queueName: "test-queue"
+ connectionName: "test-connection"
+ requestedChannelMax: 0
+ requestedFrameMax: 0
+ connectionTimeout: 60000
+ handshakeTimeout: 10000
+ requestedHeartbeat: 60
+ prefetchCount: 0
+ prefetchGlobal: "false"
+ passive: "false"
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-redis-sink.md b/site2/website-next/versioned_docs/version-2.7.2/io-redis-sink.md
new file mode 100644
index 0000000000000..49eb119802736
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-redis-sink.md
@@ -0,0 +1,78 @@
+---
+id: io-redis-sink
+title: Redis sink connector
+sidebar_label: "Redis sink connector"
+original_id: io-redis-sink
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The Redis sink connector pulls messages from Pulsar topics
+and persists the messages to a Redis database.
+
+
+
+## Configuration
+
+The configuration of the Redis sink connector has the following properties.
+
+
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `redisHosts` |String|true|" " (empty string) | A comma-separated list of Redis hosts to connect to. |
+| `redisPassword` |String|false|" " (empty string) | The password used to connect to Redis. |
+| `redisDatabase` | int|true|0 | The Redis database to connect to. |
+| `clientMode` |String| false|Standalone | The client mode when interacting with Redis cluster.
Below are the available options:
Standalone
Cluster |
+| `autoReconnect` | boolean|false|true | Whether the Redis client automatically reconnect or not. |
+| `requestQueue` | int|false|2147483647 | The maximum number of queued requests to Redis. |
+| `tcpNoDelay` |boolean| false| false | Whether to enable TCP with no delay or not. |
+| `keepAlive` | boolean|false | false |Whether to enable a keepalive to Redis or not. |
+| `connectTimeout` |long| false|10000 | The time to wait before timing out when connecting in milliseconds. |
+| `operationTimeout` | long|false|10000 | The time before an operation is marked as timed out in milliseconds . |
+| `batchTimeMs` | int|false|1000 | The Redis operation time in milliseconds. |
+| `batchSize` | int|false|200 | The batch size of writing to Redis database. |
+
+
+### Example
+
+Before using the Redis sink connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "redisHosts": "localhost:6379",
+ "redisPassword": "fake@123",
+ "redisDatabase": "1",
+ "clientMode": "Standalone",
+ "operationTimeout": "2000",
+ "batchSize": "100",
+ "batchTimeMs": "1000",
+ "connectTimeout": "3000"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ {
+ redisHosts: "localhost:6379"
+ redisPassword: "fake@123"
+ redisDatabase: 1
+ clientMode: "Standalone"
+ operationTimeout: 2000
+ batchSize: 100
+ batchTimeMs: 1000
+ connectTimeout: 3000
+ }
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-solr-sink.md b/site2/website-next/versioned_docs/version-2.7.2/io-solr-sink.md
new file mode 100644
index 0000000000000..d7b31ad97cde8
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-solr-sink.md
@@ -0,0 +1,69 @@
+---
+id: io-solr-sink
+title: Solr sink connector
+sidebar_label: "Solr sink connector"
+original_id: io-solr-sink
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The Solr sink connector pulls messages from Pulsar topics
+and persists the messages to Solr collections.
+
+
+
+## Configuration
+
+The configuration of the Solr sink connector has the following properties.
+
+
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `solrUrl` | String|true|" " (empty string) | Comma-separated zookeeper hosts with chroot used in the SolrCloud mode.
**Example**
`localhost:2181,localhost:2182/chroot`
URL to connect to Solr used in standalone mode.
**Example**
`localhost:8983/solr` |
+| `solrMode` | String|true|SolrCloud| The client mode when interacting with the Solr cluster.
Below are the available options:
Standalone
SolrCloud|
+| `solrCollection` |String|true| " " (empty string) | Solr collection name to which records need to be written. |
+| `solrCommitWithinMs` |int| false|10 | The time within million seconds for Solr updating commits.|
+| `username` |String|false| " " (empty string) | The username for basic authentication.
**Note: `usename` is case-sensitive.** |
+| `password` | String|false| " " (empty string) | The password for basic authentication.
**Note: `password` is case-sensitive.** |
+
+
+
+### Example
+
+Before using the Solr sink connector, you need to create a configuration file through one of the following methods.
+
+* JSON
+
+ ```json
+
+ {
+ "solrUrl": "localhost:2181,localhost:2182/chroot",
+ "solrMode": "SolrCloud",
+ "solrCollection": "techproducts",
+ "solrCommitWithinMs": 100,
+ "username": "fakeuser",
+ "password": "fake@123"
+ }
+
+ ```
+
+* YAML
+
+ ```yaml
+
+ {
+ solrUrl: "localhost:2181,localhost:2182/chroot"
+ solrMode: "SolrCloud"
+ solrCollection: "techproducts"
+ solrCommitWithinMs: 100
+ username: "fakeuser"
+ password: "fake@123"
+ }
+
+ ```
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-twitter-source.md b/site2/website-next/versioned_docs/version-2.7.2/io-twitter-source.md
new file mode 100644
index 0000000000000..101602e246fb8
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-twitter-source.md
@@ -0,0 +1,32 @@
+---
+id: io-twitter-source
+title: Twitter Firehose source connector
+sidebar_label: "Twitter Firehose source connector"
+original_id: io-twitter-source
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+The Twitter Firehose source connector receives tweets from Twitter Firehose and
+writes the tweets to Pulsar topics.
+
+## Configuration
+
+The configuration of the Twitter Firehose source connector has the following properties.
+
+### Property
+
+| Name | Type|Required | Default | Description
+|------|----------|----------|---------|-------------|
+| `consumerKey` | String|true | " " (empty string) | The twitter OAuth consumer key.
For more information, see [Access tokens](https://developer.twitter.com/en/docs/basics/authentication/guides/access-tokens). |
+| `consumerSecret` | String |true | " " (empty string) | The twitter OAuth consumer secret. |
+| `token` | String|true | " " (empty string) | The twitter OAuth token. |
+| `tokenSecret` | String|true | " " (empty string) | The twitter OAuth secret. |
+| `guestimateTweetTime`|Boolean|false|false|Most firehose events have null createdAt time.
If `guestimateTweetTime` set to true, the connector estimates the createdTime of each firehose event to be current time.
+| `clientName` | String |false | openconnector-twitter-source| The twitter firehose client name. |
+| `clientHosts` |String| false | Constants.STREAM_HOST | The twitter firehose hosts to which client connects. |
+| `clientBufferSize` | int|false | 50000 | The buffer size for buffering tweets fetched from twitter firehose. |
+
+> For more information about OAuth credentials, see [Twitter developers portal](https://developer.twitter.com/en.html).
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-twitter.md b/site2/website-next/versioned_docs/version-2.7.2/io-twitter.md
new file mode 100644
index 0000000000000..53f949863702d
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-twitter.md
@@ -0,0 +1,11 @@
+---
+id: io-twitter
+title: Twitter Firehose Connector
+sidebar_label: "Twitter Firehose Connector"
+original_id: io-twitter
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/io-use.md b/site2/website-next/versioned_docs/version-2.7.2/io-use.md
new file mode 100644
index 0000000000000..43b7a30cadc33
--- /dev/null
+++ b/site2/website-next/versioned_docs/version-2.7.2/io-use.md
@@ -0,0 +1,1981 @@
+---
+id: io-use
+title: How to use Pulsar connectors
+sidebar_label: "Use"
+original_id: io-use
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+This guide describes how to use Pulsar connectors.
+
+## Install a connector
+
+Pulsar bundles several [builtin connectors](io-connectors) used to move data in and out of commonly used systems (such as database and messaging system). Optionally, you can create and use your desired non-builtin connectors.
+
+:::note
+
+When using a non-builtin connector, you need to specify the path of a archive file for the connector.
+
+:::
+
+To set up a builtin connector, follow
+the instructions [here](getting-started-standalone.md#installing-builtin-connectors).
+
+After the setup, the builtin connector is automatically discovered by Pulsar brokers (or function-workers), so no additional installation steps are required.
+
+## Configure a connector
+
+You can configure the following information:
+
+* [Configure a default storage location for a connector](#configure-a-default-storage-location-for-a-connector)
+
+* [Configure a connector with a YAML file](#configure-a-connector-with-yaml-file)
+
+### Configure a default storage location for a connector
+
+To configure a default folder for builtin connectors, set the `connectorsDirectory` parameter in the `./conf/functions_worker.yml` configuration file.
+
+**Example**
+
+Set the `./connectors` folder as the default storage location for builtin connectors.
+
+```
+
+########################
+# Connectors
+########################
+
+connectorsDirectory: ./connectors
+
+```
+
+### Configure a connector with a YAML file
+
+To configure a connector, you need to provide a YAML configuration file when creating a connector.
+
+The YAML configuration file tells Pulsar where to locate connectors and how to connect connectors with Pulsar topics.
+
+**Example 1**
+
+Below is a YAML configuration file of a Cassandra sink, which tells Pulsar:
+
+* Which Cassandra cluster to connect
+
+* What is the `keyspace` and `columnFamily` to be used in Cassandra for collecting data
+
+* How to map Pulsar messages into Cassandra table key and columns
+
+```shell
+
+tenant: public
+namespace: default
+name: cassandra-test-sink
+...
+# cassandra specific config
+configs:
+ roots: "localhost:9042"
+ keyspace: "pulsar_test_keyspace"
+ columnFamily: "pulsar_test_table"
+ keyname: "key"
+ columnName: "col"
+
+```
+
+**Example 2**
+
+Below is a YAML configuration file of a Kafka source.
+
+```shell
+
+configs:
+ bootstrapServers: "pulsar-kafka:9092"
+ groupId: "test-pulsar-io"
+ topic: "my-topic"
+ sessionTimeoutMs: "10000"
+ autoCommitEnabled: "false"
+
+```
+
+**Example 3**
+
+Below is a YAML configuration file of a PostgreSQL JDBC sink.
+
+```shell
+
+configs:
+ userName: "postgres"
+ password: "password"
+ jdbcUrl: "jdbc:postgresql://localhost:5432/test_jdbc"
+ tableName: "test_jdbc"
+
+```
+
+## Get available connectors
+
+Before starting using connectors, you can perform the following operations:
+
+* [Reload connectors](#reload)
+
+* [Get a list of available connectors](#get-available-connectors)
+
+### `reload`
+
+If you add or delete a nar file in a connector folder, reload the available builtin connector before using it.
+
+#### Source
+
+Use the `reload` subcommand.
+
+```shell
+
+$ pulsar-admin sources reload
+
+```
+
+For more information, see [`here`](io-cli.md#reload).
+
+#### Sink
+
+Use the `reload` subcommand.
+
+```shell
+
+$ pulsar-admin sinks reload
+
+```
+
+For more information, see [`here`](io-cli.md#reload-1).
+
+### `available`
+
+After reloading connectors (optional), you can get a list of available connectors.
+
+#### Source
+
+Use the `available-sources` subcommand.
+
+```shell
+
+$ pulsar-admin sources available-sources
+
+```
+
+#### Sink
+
+Use the `available-sinks` subcommand.
+
+```shell
+
+$ pulsar-admin sinks available-sinks
+
+```
+
+## Run a connector
+
+To run a connector, you can perform the following operations:
+
+* [Create a connector](#create)
+
+* [Start a connector](#start)
+
+* [Run a connector locally](#localrun)
+
+### `create`
+
+You can create a connector using **Admin CLI**, **REST API** or **JAVA admin API**.f
+
+#### Source
+
+Create a source connector.
+
+
+
+
+
+Use the `create` subcommand.
+
+```
+
+$ pulsar-admin sources create options
+
+```
+
+For more information, see [here](io-cli.md#create).
+
+
+
+
+Send a `POST` request to this endpoint: {@inject: endpoint|POST|/admin/v3/sources/:tenant/:namespace/:sourceName|operation/registerSource?version=@pulsar:version_number@}
+
+
+
+
+* Create a source connector with a **local file**.
+
+ ```java
+
+ void createSource(SourceConfig sourceConfig,
+ String fileName)
+ throws PulsarAdminException
+
+ ```
+
+ **Parameter**
+
+ |Name|Description
+ |---|---
+ `sourceConfig` | The source configuration object
+
+ **Exception**
+
+ |Name|Description|
+ |---|---
+ | `PulsarAdminException` | Unexpected error
+
+ For more information, see [`createSource`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Source.html#createSource-SourceConfig-java.lang.String-).
+
+* Create a source connector using a **remote file** with a URL from which fun-pkg can be downloaded.
+
+ ```java
+
+ void createSourceWithUrl(SourceConfig sourceConfig,
+ String pkgUrl)
+ throws PulsarAdminException
+
+ ```
+
+ Supported URLs are `http` and `file`.
+
+ **Example**
+
+ * HTTP: http://www.repo.com/fileName.jar
+
+ * File: file:///dir/fileName.jar
+
+ **Parameter**
+
+ Parameter| Description
+ |---|---
+ `sourceConfig` | The source configuration object
+ `pkgUrl` | URL from which pkg can be downloaded
+
+ **Exception**
+
+ |Name|Description|
+ |---|---
+ | `PulsarAdminException` | Unexpected error
+
+ For more information, see [`createSourceWithUrl`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Source.html#createSourceWithUrl-SourceConfig-java.lang.String-).
+
+
+
+
+
+#### Sink
+
+Create a sink connector.
+
+
+
+
+
+Use the `create` subcommand.
+
+```
+
+$ pulsar-admin sinks create options
+
+```
+
+For more information, see [here](io-cli.md#create-1).
+
+
+
+
+Send a `POST` request to this endpoint: {@inject: endpoint|POST|/admin/v3/sinks/:tenant/:namespace/:sinkName|operation/registerSink?version=@pulsar:version_number@}
+
+
+
+
+* Create a sink connector with a **local file**.
+
+ ```java
+
+ void createSink(SinkConfig sinkConfig,
+ String fileName)
+ throws PulsarAdminException
+
+ ```
+
+ **Parameter**
+
+ |Name|Description
+ |---|---
+ `sinkConfig` | The sink configuration object
+
+ **Exception**
+
+ |Name|Description|
+ |---|---
+ | `PulsarAdminException` | Unexpected error
+
+ For more information, see [`createSink`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Sink.html#createSink-SinkConfig-java.lang.String-).
+
+* Create a sink connector using a **remote file** with a URL from which fun-pkg can be downloaded.
+
+ ```java
+
+ void createSinkWithUrl(SinkConfig sinkConfig,
+ String pkgUrl)
+ throws PulsarAdminException
+
+ ```
+
+ Supported URLs are `http` and `file`.
+
+ **Example**
+
+ * HTTP: http://www.repo.com/fileName.jar
+
+ * File: file:///dir/fileName.jar
+
+ **Parameter**
+
+ Parameter| Description
+ |---|---
+ `sinkConfig` | The sink configuration object
+ `pkgUrl` | URL from which pkg can be downloaded
+
+ **Exception**
+
+ |Name|Description|
+ |---|---
+ | `PulsarAdminException` | Unexpected error
+
+ For more information, see [`createSinkWithUrl`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Sink.html#createSinkWithUrl-SinkConfig-java.lang.String-).
+
+
+
+
+
+### `start`
+
+You can start a connector using **Admin CLI** or **REST API**.
+
+#### Source
+
+Start a source connector.
+
+
+
+
+
+Use the `start` subcommand.
+
+```
+
+$ pulsar-admin sources start options
+
+```
+
+For more information, see [here](io-cli.md#start).
+
+
+
+
+* Start **all** source connectors.
+
+ Send a `POST` request to this endpoint: {@inject: endpoint|POST|/admin/v3/sources/:tenant/:namespace/:sourceName/start|operation/startSource?version=@pulsar:version_number@}
+
+* Start a **specified** source connector.
+
+ Send a `POST` request to this endpoint: {@inject: endpoint|POST|/admin/v3/sources/:tenant/:namespace/:sourceName/:instanceId/start|operation/startSource?version=@pulsar:version_number@}
+
+
+
+
+
+#### Sink
+
+Start a sink connector.
+
+
+
+
+
+Use the `start` subcommand.
+
+```
+
+$ pulsar-admin sinks start options
+
+```
+
+For more information, see [here](io-cli.md#start-1).
+
+
+
+
+* Start **all** sink connectors.
+
+ Send a `POST` request to this endpoint: {@inject: endpoint|POST|/admin/v3/sources/:tenant/:namespace/:sinkName/start|operation/startSink?version=@pulsar:version_number@}
+
+* Start a **specified** sink connector.
+
+ Send a `POST` request to this endpoint: {@inject: endpoint|POST|/admin/v3/sinks/:tenant/:namespace/:sourceName/:instanceId/start|operation/startSink?version=@pulsar:version_number@}
+
+
+
+
+
+### `localrun`
+
+You can run a connector locally rather than deploying it on a Pulsar cluster using **Admin CLI**.
+
+#### Source
+
+Run a source connector locally.
+
+
+
+
+
+Use the `localrun` subcommand.
+
+```
+
+$ pulsar-admin sources localrun options
+
+```
+
+For more information, see [here](io-cli.md#localrun).
+
+
+
+
+
+#### Sink
+
+Run a sink connector locally.
+
+
+
+
+
+Use the `localrun` subcommand.
+
+```
+
+$ pulsar-admin sinks localrun options
+
+```
+
+For more information, see [here](io-cli.md#localrun-1).
+
+
+
+
+
+## Monitor a connector
+
+To monitor a connector, you can perform the following operations:
+
+* [Get the information of a connector](#get)
+
+* [Get the list of all running connectors](#list)
+
+* [Get the current status of a connector](#status)
+
+### `get`
+
+You can get the information of a connector using **Admin CLI**, **REST API** or **JAVA admin API**.
+
+#### Source
+
+Get the information of a source connector.
+
+
+
+
+
+Use the `get` subcommand.
+
+```
+
+$ pulsar-admin sources get options
+
+```
+
+For more information, see [here](io-cli.md#get).
+
+
+
+
+Send a `GET` request to this endpoint: {@inject: endpoint|GET|/admin/v3/sources/:tenant/:namespace/:sourceName|operation/getSourceInfo?version=@pulsar:version_number@}
+
+
+
+
+```java
+
+SourceConfig getSource(String tenant,
+ String namespace,
+ String source)
+ throws PulsarAdminException
+
+```
+
+**Example**
+
+This is a sourceConfig.
+
+```java
+
+{
+ "tenant": "tenantName",
+ "namespace": "namespaceName",
+ "name": "sourceName",
+ "className": "className",
+ "topicName": "topicName",
+ "configs": {},
+ "parallelism": 1,
+ "processingGuarantees": "ATLEAST_ONCE",
+ "resources": {
+ "cpu": 1.0,
+ "ram": 1073741824,
+ "disk": 10737418240
+ }
+}
+
+```
+
+This is a sourceConfig example.
+
+```
+
+{
+ "tenant": "public",
+ "namespace": "default",
+ "name": "debezium-mysql-source",
+ "className": "org.apache.pulsar.io.debezium.mysql.DebeziumMysqlSource",
+ "topicName": "debezium-mysql-topic",
+ "configs": {
+ "database.user": "debezium",
+ "database.server.id": "184054",
+ "database.server.name": "dbserver1",
+ "database.port": "3306",
+ "database.hostname": "localhost",
+ "database.password": "dbz",
+ "database.history.pulsar.service.url": "pulsar://127.0.0.1:6650",
+ "value.converter": "org.apache.kafka.connect.json.JsonConverter",
+ "database.whitelist": "inventory",
+ "key.converter": "org.apache.kafka.connect.json.JsonConverter",
+ "database.history": "org.apache.pulsar.io.debezium.PulsarDatabaseHistory",
+ "pulsar.service.url": "pulsar://127.0.0.1:6650",
+ "database.history.pulsar.topic": "history-topic2"
+ },
+ "parallelism": 1,
+ "processingGuarantees": "ATLEAST_ONCE",
+ "resources": {
+ "cpu": 1.0,
+ "ram": 1073741824,
+ "disk": 10737418240
+ }
+}
+
+```
+
+**Exception**
+
+Exception name | Description
+|---|---
+`PulsarAdminException.NotAuthorizedException` | You don't have the admin permission
+`PulsarAdminException.NotFoundException` | Cluster doesn't exist
+`PulsarAdminException` | Unexpected error
+
+For more information, see [`getSource`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Source.html#getSource-java.lang.String-java.lang.String-java.lang.String-).
+
+
+
+
+
+#### Sink
+
+Get the information of a sink connector.
+
+
+
+
+
+Use the `get` subcommand.
+
+```
+
+$ pulsar-admin sinks get options
+
+```
+
+For more information, see [here](io-cli.md#get-1).
+
+
+
+
+Send a `GET` request to this endpoint: {@inject: endpoint|GET|/admin/v3/sinks/:tenant/:namespace/:sinkName|operation/getSinkInfo?version=@pulsar:version_number@}
+
+
+
+
+```java
+
+SinkConfig getSink(String tenant,
+ String namespace,
+ String sink)
+ throws PulsarAdminException
+
+```
+
+**Example**
+
+This is a sinkConfig.
+
+```json
+
+{
+"tenant": "tenantName",
+"namespace": "namespaceName",
+"name": "sinkName",
+"className": "className",
+"inputSpecs": {
+"topicName": {
+ "isRegexPattern": false
+}
+},
+"configs": {},
+"parallelism": 1,
+"processingGuarantees": "ATLEAST_ONCE",
+"retainOrdering": false,
+"autoAck": true
+}
+
+```
+
+This is a sinkConfig example.
+
+```json
+
+{
+ "tenant": "public",
+ "namespace": "default",
+ "name": "pulsar-postgres-jdbc-sink",
+ "className": "org.apache.pulsar.io.jdbc.PostgresJdbcAutoSchemaSink",
+ "inputSpecs": {
+ "pulsar-postgres-jdbc-sink-topic": {
+ "isRegexPattern": false
+ }
+ },
+ "configs": {
+ "password": "password",
+ "jdbcUrl": "jdbc:postgresql://localhost:5432/pulsar_postgres_jdbc_sink",
+ "userName": "postgres",
+ "tableName": "pulsar_postgres_jdbc_sink"
+ },
+ "parallelism": 1,
+ "processingGuarantees": "ATLEAST_ONCE",
+ "retainOrdering": false,
+ "autoAck": true
+}
+
+```
+
+**Parameter description**
+
+Name| Description
+|---|---
+`tenant` | Tenant name
+`namespace` | Namespace name
+`sink` | Sink name
+
+For more information, see [`getSink`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Sink.html#getSink-java.lang.String-java.lang.String-java.lang.String-).
+
+
+
+
+
+### `list`
+
+You can get the list of all running connectors using **Admin CLI**, **REST API** or **JAVA admin API**.
+
+#### Source
+
+Get the list of all running source connectors.
+
+
+
+
+
+Use the `list` subcommand.
+
+```
+
+$ pulsar-admin sources list options
+
+```
+
+For more information, see [here](io-cli.md#list).
+
+
+
+
+Send a `GET` request to this endpoint: {@inject: endpoint|GET|/admin/v3/sources/:tenant/:namespace/|operation/listSources?version=@pulsar:version_number@}
+
+
+
+
+```java
+
+List listSources(String tenant,
+ String namespace)
+ throws PulsarAdminException
+
+```
+
+**Response example**
+
+```java
+
+["f1", "f2", "f3"]
+
+```
+
+**Exception**
+
+Exception name | Description
+|---|---
+`PulsarAdminException.NotAuthorizedException` | You don't have the admin permission
+`PulsarAdminException` | Unexpected error
+
+For more information, see [`listSource`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Source.html#listSources-java.lang.String-java.lang.String-).
+
+
+
+
+
+#### Sink
+
+Get the list of all running sink connectors.
+
+
+
+
+
+Use the `list` subcommand.
+
+```
+
+$ pulsar-admin sinks list options
+
+```
+
+For more information, see [here](io-cli.md#list-1).
+
+
+
+
+Send a `GET` request to this endpoint: {@inject: endpoint|GET|/admin/v3/sinks/:tenant/:namespace/|operation/listSinks?version=@pulsar:version_number@}
+
+
+
+
+```java
+
+List listSinks(String tenant,
+ String namespace)
+ throws PulsarAdminException
+
+```
+
+**Response example**
+
+```java
+
+["f1", "f2", "f3"]
+
+```
+
+**Exception**
+
+Exception name | Description
+|---|---
+`PulsarAdminException.NotAuthorizedException` | You don't have the admin permission
+`PulsarAdminException` | Unexpected error
+
+For more information, see [`listSource`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Sink.html#listSinks-java.lang.String-java.lang.String-).
+
+
+
+
+
+### `status`
+
+You can get the current status of a connector using **Admin CLI**, **REST API** or **JAVA admin API**.
+
+#### Source
+
+Get the current status of a source connector.
+
+
+
+
+
+Use the `status` subcommand.
+
+```
+
+$ pulsar-admin sources status options
+
+```
+
+For more information, see [here](io-cli.md#status).
+
+
+
+
+* Get the current status of **all** source connectors.
+
+ Send a `GET` request to this endpoint: {@inject: endpoint|GET|/admin/v3/sources/:tenant/:namespace/:sourceName/status|operation/getSourceStatus?version=@pulsar:version_number@}
+
+* Gets the current status of a **specified** source connector.
+
+ Send a `GET` request to this endpoint: {@inject: endpoint|GET|/admin/v3/sources/:tenant/:namespace/:sourceName/:instanceId/status|operation/getSourceStatus?version=@pulsar:version_number@}
+
+
+
+
+* Get the current status of **all** source connectors.
+
+ ```java
+
+ SourceStatus getSourceStatus(String tenant,
+ String namespace,
+ String source)
+ throws PulsarAdminException
+
+ ```
+
+ **Parameter**
+
+ Parameter| Description
+ |---|---
+ `tenant` | Tenant name
+ `namespace` | Namespace name
+ `sink` | Source name
+
+ **Exception**
+
+ Name | Description
+ |---|---
+ `PulsarAdminException` | Unexpected error
+
+ For more information, see [`getSourceStatus`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Source.html#getSource-java.lang.String-java.lang.String-java.lang.String-).
+
+* Gets the current status of a **specified** source connector.
+
+ ```java
+
+ SourceStatus.SourceInstanceStatus.SourceInstanceStatusData getSourceStatus(String tenant,
+ String namespace,
+ String source,
+ int id)
+ throws PulsarAdminException
+
+ ```
+
+ **Parameter**
+
+ Parameter| Description
+ |---|---
+ `tenant` | Tenant name
+ `namespace` | Namespace name
+ `sink` | Source name
+ `id` | Source instanceID
+
+ **Exception**
+
+ Exception name | Description
+ |---|---
+ `PulsarAdminException` | Unexpected error
+
+ For more information, see [`getSourceStatus`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Source.html#getSourceStatus-java.lang.String-java.lang.String-java.lang.String-int-).
+
+
+
+
+
+#### Sink
+
+Get the current status of a Pulsar sink connector.
+
+
+
+
+
+Use the `status` subcommand.
+
+```
+
+$ pulsar-admin sinks status options
+
+```
+
+For more information, see [here](io-cli.md#status-1).
+
+
+
+
+* Get the current status of **all** sink connectors.
+
+ Send a `GET` request to this endpoint: {@inject: endpoint|GET|/admin/v3/sinks/:tenant/:namespace/:sinkName/status|operation/getSinkStatus?version=@pulsar:version_number@}
+
+* Gets the current status of a **specified** sink connector.
+
+ Send a `GET` request to this endpoint: {@inject: endpoint|GET|/admin/v3/sinks/:tenant/:namespace/:sourceName/:instanceId/status|operation/getSinkInstanceStatus?version=@pulsar:version_number@}
+
+
+
+
+* Get the current status of **all** sink connectors.
+
+ ```java
+
+ SinkStatus getSinkStatus(String tenant,
+ String namespace,
+ String sink)
+ throws PulsarAdminException
+
+ ```
+
+ **Parameter**
+
+ Parameter| Description
+ |---|---
+ `tenant` | Tenant name
+ `namespace` | Namespace name
+ `sink` | Source name
+
+ **Exception**
+
+ Exception name | Description
+ |---|---
+ `PulsarAdminException` | Unexpected error
+
+ For more information, see [`getSinkStatus`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Sink.html#getSinkStatus-java.lang.String-java.lang.String-java.lang.String-).
+
+* Gets the current status of a **specified** source connector.
+
+ ```java
+
+ SinkStatus.SinkInstanceStatus.SinkInstanceStatusData getSinkStatus(String tenant,
+ String namespace,
+ String sink,
+ int id)
+ throws PulsarAdminException
+
+ ```
+
+ **Parameter**
+
+ Parameter| Description
+ |---|---
+ `tenant` | Tenant name
+ `namespace` | Namespace name
+ `sink` | Source name
+ `id` | Sink instanceID
+
+ **Exception**
+
+ Exception name | Description
+ |---|---
+ `PulsarAdminException` | Unexpected error
+
+ For more information, see [`getSinkStatusWithInstanceID`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Sink.html#getSinkStatus-java.lang.String-java.lang.String-java.lang.String-int-).
+
+
+
+
+
+## Update a connector
+
+### `update`
+
+You can update a running connector using **Admin CLI**, **REST API** or **JAVA admin API**.
+
+#### Source
+
+Update a running Pulsar source connector.
+
+
+
+
+
+Use the `update` subcommand.
+
+```
+
+$ pulsar-admin sources update options
+
+```
+
+For more information, see [here](io-cli.md#update).
+
+
+
+
+Send a `PUT` request to this endpoint: {@inject: endpoint|PUT|/admin/v3/sources/:tenant/:namespace/:sourceName|operation/updateSource?version=@pulsar:version_number@}
+
+
+
+
+* Update a running source connector with a **local file**.
+
+ ```java
+
+ void updateSource(SourceConfig sourceConfig,
+ String fileName)
+ throws PulsarAdminException
+
+ ```
+
+ **Parameter**
+
+ | Name | Description
+ |---|---
+ |`sourceConfig` | The source configuration object
+
+ **Exception**
+
+ |Name|Description|
+ |---|---
+ |`PulsarAdminException.NotAuthorizedException`| You don't have the admin permission
+ | `PulsarAdminException.NotFoundException` | Cluster doesn't exist
+ | `PulsarAdminException` | Unexpected error
+
+ For more information, see [`updateSource`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Source.html#updateSource-SourceConfig-java.lang.String-).
+
+* Update a source connector using a **remote file** with a URL from which fun-pkg can be downloaded.
+
+ ```java
+
+ void updateSourceWithUrl(SourceConfig sourceConfig,
+ String pkgUrl)
+ throws PulsarAdminException
+
+ ```
+
+ Supported URLs are `http` and `file`.
+
+ **Example**
+
+ * HTTP: http://www.repo.com/fileName.jar
+
+ * File: file:///dir/fileName.jar
+
+ **Parameter**
+
+ | Name | Description
+ |---|---
+ | `sourceConfig` | The source configuration object
+ | `pkgUrl` | URL from which pkg can be downloaded
+
+ **Exception**
+
+ |Name|Description|
+ |---|---
+ |`PulsarAdminException.NotAuthorizedException`| You don't have the admin permission
+ | `PulsarAdminException.NotFoundException` | Cluster doesn't exist
+ | `PulsarAdminException` | Unexpected error
+
+For more information, see [`createSourceWithUrl`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Source.html#updateSourceWithUrl-SourceConfig-java.lang.String-).
+
+
+
+
+
+#### Sink
+
+Update a running Pulsar sink connector.
+
+
+
+
+
+Use the `update` subcommand.
+
+```
+
+$ pulsar-admin sinks update options
+
+```
+
+For more information, see [here](io-cli.md#update-1).
+
+
+
+
+Send a `PUT` request to this endpoint: {@inject: endpoint|PUT|/admin/v3/sinks/:tenant/:namespace/:sinkName|operation/updateSink?version=@pulsar:version_number@}
+
+
+
+
+* Update a running sink connector with a **local file**.
+
+ ```java
+
+ void updateSink(SinkConfig sinkConfig,
+ String fileName)
+ throws PulsarAdminException
+
+ ```
+
+ **Parameter**
+
+ | Name | Description
+ |---|---
+ |`sinkConfig` | The sink configuration object
+
+ **Exception**
+
+ |Name|Description|
+ |---|---
+ |`PulsarAdminException.NotAuthorizedException`| You don't have the admin permission
+ | `PulsarAdminException.NotFoundException` | Cluster doesn't exist
+ | `PulsarAdminException` | Unexpected error
+
+ For more information, see [`updateSink`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Sink.html#updateSink-SinkConfig-java.lang.String-).
+
+* Update a sink connector using a **remote file** with a URL from which fun-pkg can be downloaded.
+
+ ```java
+
+ void updateSinkWithUrl(SinkConfig sinkConfig,
+ String pkgUrl)
+ throws PulsarAdminException
+
+ ```
+
+ Supported URLs are `http` and `file`.
+
+ **Example**
+
+ * HTTP: http://www.repo.com/fileName.jar
+
+ * File: file:///dir/fileName.jar
+
+ **Parameter**
+
+ | Name | Description
+ |---|---
+ | `sinkConfig` | The sink configuration object
+ | `pkgUrl` | URL from which pkg can be downloaded
+
+ **Exception**
+
+ |Name|Description|
+ |---|---
+ |`PulsarAdminException.NotAuthorizedException`| You don't have the admin permission
+ |`PulsarAdminException.NotFoundException` | Cluster doesn't exist
+ |`PulsarAdminException` | Unexpected error
+
+For more information, see [`updateSinkWithUrl`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Sink.html#updateSinkWithUrl-SinkConfig-java.lang.String-).
+
+
+
+
+
+## Stop a connector
+
+### `stop`
+
+You can stop a connector using **Admin CLI**, **REST API** or **JAVA admin API**.
+
+#### Source
+
+Stop a source connector.
+
+
+
+
+
+Use the `stop` subcommand.
+
+```
+
+$ pulsar-admin sources stop options
+
+```
+
+For more information, see [here](io-cli.md#stop).
+
+
+
+
+* Stop **all** source connectors.
+
+ Send a `POST` request to this endpoint: {@inject: endpoint|POST|/admin/v3/sources/:tenant/:namespace/:sourceName|operation/stopSource?version=@pulsar:version_number@}
+
+* Stop a **specified** source connector.
+
+ Send a `POST` request to this endpoint: {@inject: endpoint|POST|/admin/v3/sources/:tenant/:namespace/:sourceName/:instanceId|operation/stopSource?version=@pulsar:version_number@}
+
+
+
+
+* Stop **all** source connectors.
+
+ ```java
+
+ void stopSource(String tenant,
+ String namespace,
+ String source)
+ throws PulsarAdminException
+
+ ```
+
+ **Parameter**
+
+ | Name | Description
+ |---|---
+ `tenant` | Tenant name
+ `namespace` | Namespace name
+ `source` | Source name
+
+ **Exception**
+
+ |Name|Description|
+ |---|---
+ | `PulsarAdminException` | Unexpected error
+
+ For more information, see [`stopSource`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Source.html#stopSource-java.lang.String-java.lang.String-java.lang.String-).
+
+* Stop a **specified** source connector.
+
+ ```java
+
+ void stopSource(String tenant,
+ String namespace,
+ String source,
+ int instanceId)
+ throws PulsarAdminException
+
+ ```
+
+ **Parameter**
+
+ | Name | Description
+ |---|---
+ `tenant` | Tenant name
+ `namespace` | Namespace name
+ `source` | Source name
+ `instanceId` | Source instanceID
+
+ **Exception**
+
+ |Name|Description|
+ |---|---
+ | `PulsarAdminException` | Unexpected error
+
+ For more information, see [`stopSource`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Source.html#stopSource-java.lang.String-java.lang.String-java.lang.String-int-).
+
+
+
+
+
+#### Sink
+
+Stop a sink connector.
+
+
+
+
+
+Use the `stop` subcommand.
+
+```
+
+$ pulsar-admin sinks stop options
+
+```
+
+For more information, see [here](io-cli.md#stop-1).
+
+
+
+
+* Stop **all** sink connectors.
+
+ Send a `POST` request to this endpoint: {@inject: endpoint|POST|/admin/v3/sinks/:tenant/:namespace/:sinkName/stop|operation/stopSink?version=@pulsar:version_number@}
+
+* Stop a **specified** sink connector.
+
+ Send a `POST` request to this endpoint: {@inject: endpoint|POST|/admin/v3/sources/:tenant/:namespace/:sinkeName/:instanceId/stop|operation/stopSink?version=@pulsar:version_number@}
+
+
+
+
+* Stop **all** sink connectors.
+
+ ```java
+
+ void stopSink(String tenant,
+ String namespace,
+ String sink)
+ throws PulsarAdminException
+
+ ```
+
+ **Parameter**
+
+ | Name | Description
+ |---|---
+ `tenant` | Tenant name
+ `namespace` | Namespace name
+ `source` | Source name
+
+ **Exception**
+
+ |Name|Description|
+ |---|---
+ | `PulsarAdminException` | Unexpected error
+
+ For more information, see [`stopSink`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Sink.html#stopSink-java.lang.String-java.lang.String-java.lang.String-).
+
+* Stop a **specified** sink connector.
+
+ ```java
+
+ void stopSink(String tenant,
+ String namespace,
+ String sink,
+ int instanceId)
+ throws PulsarAdminException
+
+ ```
+
+ **Parameter**
+
+ | Name | Description
+ |---|---
+ `tenant` | Tenant name
+ `namespace` | Namespace name
+ `source` | Source name
+ `instanceId` | Source instanceID
+
+ **Exception**
+
+ |Name|Description|
+ |---|---
+ | `PulsarAdminException` | Unexpected error
+
+ For more information, see [`stopSink`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Sink.html#stopSink-java.lang.String-java.lang.String-java.lang.String-int-).
+
+
+
+
+
+## Restart a connector
+
+### `restart`
+
+You can restart a connector using **Admin CLI**, **REST API** or **JAVA admin API**.
+
+#### Source
+
+Restart a source connector.
+
+
+
+
+
+Use the `restart` subcommand.
+
+```
+
+$ pulsar-admin sources restart options
+
+```
+
+For more information, see [here](io-cli.md#restart).
+
+
+
+
+* Restart **all** source connectors.
+
+ Send a `POST` request to this endpoint: {@inject: endpoint|POST|/admin/v3/sources/:tenant/:namespace/:sourceName/restart|operation/restartSource?version=@pulsar:version_number@}
+
+* Restart a **specified** source connector.
+
+ Send a `POST` request to this endpoint: {@inject: endpoint|POST|/admin/v3/sources/:tenant/:namespace/:sourceName/:instanceId/restart|operation/restartSource?version=@pulsar:version_number@}
+
+
+
+
+* Restart **all** source connectors.
+
+ ```java
+
+ void restartSource(String tenant,
+ String namespace,
+ String source)
+ throws PulsarAdminException
+
+ ```
+
+ **Parameter**
+
+ | Name | Description
+ |---|---
+ `tenant` | Tenant name
+ `namespace` | Namespace name
+ `source` | Source name
+
+ **Exception**
+
+ |Name|Description|
+ |---|---
+ | `PulsarAdminException` | Unexpected error
+
+ For more information, see [`restartSource`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Source.html#restartSource-java.lang.String-java.lang.String-java.lang.String-).
+
+* Restart a **specified** source connector.
+
+ ```java
+
+ void restartSource(String tenant,
+ String namespace,
+ String source,
+ int instanceId)
+ throws PulsarAdminException
+
+ ```
+
+ **Parameter**
+
+ | Name | Description
+ |---|---
+ `tenant` | Tenant name
+ `namespace` | Namespace name
+ `source` | Source name
+ `instanceId` | Source instanceID
+
+ **Exception**
+
+ |Name|Description|
+ |---|---
+ | `PulsarAdminException` | Unexpected error
+
+ For more information, see [`restartSource`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Source.html#restartSource-java.lang.String-java.lang.String-java.lang.String-int-).
+
+
+
+
+
+#### Sink
+
+Restart a sink connector.
+
+
+
+
+
+Use the `restart` subcommand.
+
+```
+
+$ pulsar-admin sinks restart options
+
+```
+
+For more information, see [here](io-cli.md#restart-1).
+
+
+
+
+* Restart **all** sink connectors.
+
+ Send a `POST` request to this endpoint: {@inject: endpoint|POST|/admin/v3/sources/:tenant/:namespace/:sinkName/restart|operation/restartSource?version=@pulsar:version_number@}
+
+* Restart a **specified** sink connector.
+
+ Send a `POST` request to this endpoint: {@inject: endpoint|POST|/admin/v3/sources/:tenant/:namespace/:sinkName/:instanceId/restart|operation/restartSource?version=@pulsar:version_number@}
+
+
+
+
+* Restart all Pulsar sink connectors.
+
+ ```java
+
+ void restartSink(String tenant,
+ String namespace,
+ String sink)
+ throws PulsarAdminException
+
+ ```
+
+ **Parameter**
+
+ | Name | Description
+ |---|---
+ `tenant` | Tenant name
+ `namespace` | Namespace name
+ `sink` | Sink name
+
+ **Exception**
+
+ |Name|Description|
+ |---|---
+ | `PulsarAdminException` | Unexpected error
+
+ For more information, see [`restartSink`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Sink.html#restartSink-java.lang.String-java.lang.String-java.lang.String-).
+
+* Restart a **specified** sink connector.
+
+ ```java
+
+ void restartSink(String tenant,
+ String namespace,
+ String sink,
+ int instanceId)
+ throws PulsarAdminException
+
+ ```
+
+ **Parameter**
+
+ | Name | Description
+ |---|---
+ `tenant` | Tenant name
+ `namespace` | Namespace name
+ `source` | Source name
+ `instanceId` | Sink instanceID
+
+ **Exception**
+
+ |Name|Description|
+ |---|---
+ | `PulsarAdminException` | Unexpected error
+
+ For more information, see [`restartSink`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Sink.html#restartSink-java.lang.String-java.lang.String-java.lang.String-int-).
+
+
+
+
+
+## Delete a connector
+
+### `delete`
+
+You can delete a connector using **Admin CLI**, **REST API** or **JAVA admin API**.
+
+#### Source
+
+Delete a source connector.
+
+
+
+
+
+Use the `delete` subcommand.
+
+```
+
+$ pulsar-admin sources delete options
+
+```
+
+For more information, see [here](io-cli.md#delete).
+
+
+
+
+Delete al Pulsar source connector.
+
+Send a `DELETE` request to this endpoint: {@inject: endpoint|DELETE|/admin/v3/sources/:tenant/:namespace/:sourceName|operation/deregisterSource?version=@pulsar:version_number@}
+
+
+
+
+Delete a source connector.
+
+```java
+
+void deleteSource(String tenant,
+ String namespace,
+ String source)
+ throws PulsarAdminException
+
+```
+
+**Parameter**
+
+| Name | Description
+|---|---
+`tenant` | Tenant name
+`namespace` | Namespace name
+`source` | Source name
+
+**Exception**
+
+|Name|Description|
+|---|---
+|`PulsarAdminException.NotAuthorizedException`| You don't have the admin permission
+| `PulsarAdminException.NotFoundException` | Cluster doesn't exist
+| `PulsarAdminException.PreconditionFailedException` | Cluster is not empty
+| `PulsarAdminException` | Unexpected error
+
+For more information, see [`deleteSource`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Source.html#deleteSource-java.lang.String-java.lang.String-java.lang.String-).
+
+
+
+
+
+#### Sink
+
+Delete a sink connector.
+
+
+
+
+
+Use the `delete` subcommand.
+
+```
+
+$ pulsar-admin sinks delete options
+
+```
+
+For more information, see [here](io-cli.md#delete-1).
+
+
+
+
+Delete a sink connector.
+
+Send a `DELETE` request to this endpoint: {@inject: endpoint|DELETE|/admin/v3/sinks/:tenant/:namespace/:sinkName|operation/deregisterSink?version=@pulsar:version_number@}
+
+
+
+
+Delete a Pulsar sink connector.
+
+```java
+
+void deleteSink(String tenant,
+ String namespace,
+ String source)
+ throws PulsarAdminException
+
+```
+
+**Parameter**
+
+| Name | Description
+|---|---
+`tenant` | Tenant name
+`namespace` | Namespace name
+`sink` | Sink name
+
+**Exception**
+
+|Name|Description|
+|---|---
+|`PulsarAdminException.NotAuthorizedException`| You don't have the admin permission
+| `PulsarAdminException.NotFoundException` | Cluster doesn't exist
+| `PulsarAdminException.PreconditionFailedException` | Cluster is not empty
+| `PulsarAdminException` | Unexpected error
+
+For more information, see [`deleteSource`](https://pulsar.apache.org/api/admin/org/apache/pulsar/client/admin/Sink.html#deleteSink-java.lang.String-java.lang.String-java.lang.String-).
+
+
+
+
diff --git a/site2/website-next/versioned_docs/version-2.7.2/schema-get-started.md b/site2/website-next/versioned_docs/version-2.7.2/schema-get-started.md
index 97529fbb125ca..c8193ab572c69 100644
--- a/site2/website-next/versioned_docs/version-2.7.2/schema-get-started.md
+++ b/site2/website-next/versioned_docs/version-2.7.2/schema-get-started.md
@@ -56,7 +56,6 @@ Pulsar schema enables you to use language-specific types of data when constructi
You can use the _User_ class to define the messages sent to Pulsar topics.
```
-
public class User {
String name;
int age;
@@ -73,7 +72,6 @@ If you construct a producer without specifying a schema, then the producer can o
**Example**
```
-
Producer producer = client.newProducer()
.topic(topic)
.create();
@@ -82,7 +80,6 @@ byte[] message = … // serialize the `user` by yourself;
producer.send(message);
```
-
### With schema
If you construct a producer with specifying a schema, then you can send a class to a topic directly without worrying about how to serialize POJOs into bytes.
@@ -92,7 +89,6 @@ If you construct a producer with specifying a schema, then you can send a class
This example constructs a producer with the _JSONSchema_, and you can send the _User_ class to topics directly without worrying about how to serialize it into bytes.
```
-
Producer producer = client.newProducer(JSONSchema.of(User.class))
.topic(topic)
.create();
diff --git a/site2/website-next/versioned_docs/version-2.7.3/io-develop.md b/site2/website-next/versioned_docs/version-2.7.3/io-develop.md
index d7531a0d30d67..cbcb555b9b9cc 100644
--- a/site2/website-next/versioned_docs/version-2.7.3/io-develop.md
+++ b/site2/website-next/versioned_docs/version-2.7.3/io-develop.md
@@ -94,11 +94,11 @@ interface, which means you need to implement the {@inject: github:open:/pulsar-i
`ack` |Acknowledge that the record is fully processed.
`fail`|Indicate that the record fails to be processed.
-:::tip
+ :::tip
-For more information about **how to create a source connector**, see {@inject: github:KafkaSource:/pulsar-io/kafka/src/main/java/org/apache/pulsar/io/kafka/KafkaAbstractSource.java}.
+ For more information about **how to create a source connector**, see {@inject: github:KafkaSource:/pulsar-io/kafka/src/main/java/org/apache/pulsar/io/kafka/KafkaAbstractSource.java}.
-:::
+ :::
### Sink
diff --git a/site2/website-next/versioned_sidebars/version-2.7.2-sidebars.json b/site2/website-next/versioned_sidebars/version-2.7.2-sidebars.json
index e8c9dbbc07207..5e86333ebca86 100644
--- a/site2/website-next/versioned_sidebars/version-2.7.2-sidebars.json
+++ b/site2/website-next/versioned_sidebars/version-2.7.2-sidebars.json
@@ -85,6 +85,44 @@
"id": "version-2.7.2/schema-manage"
}
]
+ },
+ {
+ "type": "category",
+ "label": "Pulsar IO",
+ "items": [
+ {
+ "type": "doc",
+ "id": "version-2.7.2/io-overview"
+ },
+ {
+ "type": "doc",
+ "id": "version-2.7.2/io-quickstart"
+ },
+ {
+ "type": "doc",
+ "id": "version-2.7.2/io-use"
+ },
+ {
+ "type": "doc",
+ "id": "version-2.7.2/io-debug"
+ },
+ {
+ "type": "doc",
+ "id": "version-2.7.2/io-connectors"
+ },
+ {
+ "type": "doc",
+ "id": "version-2.7.2/io-cdc"
+ },
+ {
+ "type": "doc",
+ "id": "version-2.7.2/io-develop"
+ },
+ {
+ "type": "doc",
+ "id": "version-2.7.2/io-cli"
+ }
+ ]
}
]
}
\ No newline at end of file