You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by ji...@apache.org on 2022/04/15 08:37:34 UTC

[incubator-doris] branch master updated: [Refactor][doc]Edit the ecological extension part of the document (#8926)

This is an automated email from the ASF dual-hosted git repository.

jiafengzheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git


The following commit(s) were added to refs/heads/master by this push:
     new b6a6310559 [Refactor][doc]Edit the ecological extension part of the document (#8926)
b6a6310559 is described below

commit b6a631055985da2310d866ee60f6150b3f422992
Author: caoliang-web <71...@users.noreply.github.com>
AuthorDate: Fri Apr 15 16:37:28 2022 +0800

    [Refactor][doc]Edit the ecological extension part of the document (#8926)
    
    * Edit the ecological extension part of the document
---
 docs/en/extending-doris/flink-doris-connector.md   |  46 ++
 docs/en/extending-doris/spark-doris-connector.md   |  46 ++
 .../zh-CN/extending-doris/flink-doris-connector.md |  50 +-
 .../zh-CN/extending-doris/spark-doris-connector.md |  45 ++
 new-docs/en/ecosystem/datax.md                     |  91 ++++
 .../en/ecosystem/external-table/doris-on-es.md     |   2 +
 .../en/ecosystem/external-table/hive-bitmap-udf.md |  97 ----
 .../en/ecosystem/external-table/hive-of-doris.md   |   2 +
 .../ecosystem/external-table/iceberg-of-doris.md   |   6 +-
 .../en/ecosystem/external-table/odbc-of-doris.md   |   8 +
 new-docs/en/ecosystem/flink-doris-connector.md     |  76 +++
 new-docs/en/ecosystem/logstash.md                  |   4 +-
 new-docs/en/ecosystem/seatunnel/flink-sink.md      |   4 +-
 new-docs/en/ecosystem/seatunnel/spark-sink.md      |   2 +-
 new-docs/en/ecosystem/spark-doris-connector.md     |  46 ++
 new-docs/en/ecosystem/udf/contribute-udf.md        |   2 +-
 .../ecosystem/udf/native-user-defined-function.md  |   2 +-
 new-docs/zh-CN/ecosystem/audit-plugin.md           |  75 ++-
 new-docs/zh-CN/ecosystem/datax.md                  | 170 ++++++-
 .../zh-CN/ecosystem/external-table/doris-on-es.md  | 564 ++++++++++++++++++++-
 .../ecosystem/external-table/hive-bitmap-udf.md    |  27 -
 .../ecosystem/external-table/hive-of-doris.md      |  97 +++-
 .../ecosystem/external-table/iceberg-of-doris.md   | 185 ++++++-
 .../ecosystem/external-table/odbc-of-doris.md      | 344 ++++++++++++-
 new-docs/zh-CN/ecosystem/flink-doris-connector.md  | 499 +++++++++++++++++-
 new-docs/zh-CN/ecosystem/logstash.md               | 173 ++++++-
 .../zh-CN/ecosystem/plugin-development-manual.md   | 287 ++++++++++-
 new-docs/zh-CN/ecosystem/seatunnel/flink-sink.md   |  91 +++-
 new-docs/zh-CN/ecosystem/seatunnel/spark-sink.md   |  99 +++-
 new-docs/zh-CN/ecosystem/spark-doris-connector.md  | 270 +++++++++-
 new-docs/zh-CN/ecosystem/udf/contribute-udf.md     |  99 +++-
 .../ecosystem/udf/native-user-defined-function.md  | 244 ++++++++-
 .../ecosystem/udf/remote-user-defined-function.md  |  85 +++-
 33 files changed, 3687 insertions(+), 151 deletions(-)

diff --git a/docs/en/extending-doris/flink-doris-connector.md b/docs/en/extending-doris/flink-doris-connector.md
index c941b2b379..7d323e27a4 100644
--- a/docs/en/extending-doris/flink-doris-connector.md
+++ b/docs/en/extending-doris/flink-doris-connector.md
@@ -48,6 +48,52 @@ Github: https://github.com/apache/incubator-doris-flink-connector
 
 ## Build and Install
 
+Ready to work
+
+1.Modify the `custom_env.sh.tpl` file and rename it to `custom_env.sh`
+
+2.Specify the thrift installation directory
+
+```bash
+##source file content
+#export THRIFT_BIN=
+#export MVN_BIN=
+#export JAVA_HOME=
+
+##amend as below
+export THRIFT_BIN=./thirdparty/installed/bin(thrift installation directory)
+#export MVN_BIN=
+#export JAVA_HOME=
+
+Install `thrift` 0.13.0 (Note: `Doris` 0.15 and the latest builds are based on `thrift` 0.13.0, previous versions are still built with `thrift` 0.9.3)
+Windows:
+  1. Download: `http://archive.apache.org/dist/thrift/0.13.0/thrift-0.13.0.exe`
+  2. Copy: Copy the file to `./thirdparty/installed/bin` 
+  
+ 
+MacOS:
+  1. Download: `brew install thrift@0.13.0`
+  2. Create a soft link:
+       `mkdir -p ./thirdparty/installed/bin`
+       `ln -s /opt/homebrew/Cellar/thrift@0.13.0/0.13.0/bin/thrift ./thirdparty/installed/bin/thrift`
+
+Note: Executing `brew install thrift@0.13.0` on MacOS may report an error that the version cannot be found. The solution is as follows, execute it in the terminal:
+    1. `brew tap-new $USER/local-tap`
+    2. `brew extract --version='0.13.0' thrift $USER/local-tap`
+    3. `brew install thrift@0.13.0`
+ Reference link: `https://gist.github.com/tonydeng/02e571f273d6cce4230dc8d5f394493c`
+ 
+Linux:
+    1.Download source package:`wget https://archive.apache.org/dist/thrift/0.13.0/thrift-0.13.0.tar.gz`
+    2.Install dependencies:`yum install -y autoconf automake libtool cmake ncurses-devel openssl-devel lzo-devel zlib-devel gcc gcc-c++`
+    3.`tar zxvf thrift-0.13.0.tar.gz`
+    4.`cd thrift-0.13.0`
+    5.`./configure --without-tests`
+    6.`make`
+    7.`make install`
+   Check the version after installation is complete:thrift --version
+```
+
 Execute following command in source dir:
 
 ```bash
diff --git a/docs/en/extending-doris/spark-doris-connector.md b/docs/en/extending-doris/spark-doris-connector.md
index db37a00764..18c55d419b 100644
--- a/docs/en/extending-doris/spark-doris-connector.md
+++ b/docs/en/extending-doris/spark-doris-connector.md
@@ -44,6 +44,52 @@ Github: https://github.com/apache/incubator-doris-spark-connector
 
 ## Build and Install
 
+Ready to work
+
+1.Modify the `custom_env.sh.tpl` file and rename it to `custom_env.sh`
+
+2.Specify the thrift installation directory
+
+```bash
+##source file content
+#export THRIFT_BIN=
+#export MVN_BIN=
+#export JAVA_HOME=
+
+##amend as below
+export THRIFT_BIN=./thirdparty/installed/bin(thrift installation directory)
+#export MVN_BIN=
+#export JAVA_HOME=
+
+Install `thrift` 0.13.0 (Note: `Doris` 0.15 and the latest builds are based on `thrift` 0.13.0, previous versions are still built with `thrift` 0.9.3)
+Windows:
+  1. Download: `http://archive.apache.org/dist/thrift/0.13.0/thrift-0.13.0.exe`
+  2. Copy: Copy the file to `./thirdparty/installed/bin` 
+  
+ 
+MacOS:
+  1. Download: `brew install thrift@0.13.0`
+  2. Create a soft link:
+       `mkdir -p ./thirdparty/installed/bin`
+       `ln -s /opt/homebrew/Cellar/thrift@0.13.0/0.13.0/bin/thrift ./thirdparty/installed/bin/thrift`
+
+Note: Executing `brew install thrift@0.13.0` on MacOS may report an error that the version cannot be found. The solution is as follows, execute it in the terminal:
+    1. `brew tap-new $USER/local-tap`
+    2. `brew extract --version='0.13.0' thrift $USER/local-tap`
+    3. `brew install thrift@0.13.0`
+ Reference link: `https://gist.github.com/tonydeng/02e571f273d6cce4230dc8d5f394493c`
+ 
+Linux:
+    1.Download source package:`wget https://archive.apache.org/dist/thrift/0.13.0/thrift-0.13.0.tar.gz`
+    2.Install dependencies:`yum install -y autoconf automake libtool cmake ncurses-devel openssl-devel lzo-devel zlib-devel gcc gcc-c++`
+    3.`tar zxvf thrift-0.13.0.tar.gz`
+    4.`cd thrift-0.13.0`
+    5.`./configure --without-tests`
+    6.`make`
+    7.`make install`
+   Check the version after installation is complete:thrift --version
+```
+
 Execute following command in source dir
 
 ```bash
diff --git a/docs/zh-CN/extending-doris/flink-doris-connector.md b/docs/zh-CN/extending-doris/flink-doris-connector.md
index 01cdd61cc8..d85f7dcc6f 100644
--- a/docs/zh-CN/extending-doris/flink-doris-connector.md
+++ b/docs/zh-CN/extending-doris/flink-doris-connector.md
@@ -50,6 +50,52 @@ Flink Doris Connector 可以支持通过 Flink 操作(读取、插入、修改
 
 ## 编译与安装
 
+准备工作
+
+1.修改`custom_env.sh.tpl`文件,重命名为`custom_env.sh`
+
+2.指定thrift安装目录
+
+```bash
+##源文件内容
+#export THRIFT_BIN=
+#export MVN_BIN=
+#export JAVA_HOME=
+
+##修改如下
+export THRIFT_BIN=./thirdparty/installed/bin
+#export MVN_BIN=
+#export JAVA_HOME=
+
+安装 `thrift` 0.13.0 版本(注意:`Doris` 0.15 和最新的版本基于 `thrift` 0.13.0 构建, 之前的版本依然使用`thrift` 0.9.3 构建)
+ Windows: 
+    1. 下载:`http://archive.apache.org/dist/thrift/0.13.0/thrift-0.13.0.exe`
+    2. 拷贝:将文件拷贝至 `./thirdparty/installed/bin`
+ 
+ MacOS: 
+    1. 下载:`brew install thrift@0.13.0`
+    2. 建立软链接: 
+       `mkdir -p ./thirdparty/installed/bin`
+       `ln -s /opt/homebrew/Cellar/thrift@0.13.0/0.13.0/bin/thrift ./thirdparty/installed/bin/thrift`
+ 
+ 注:MacOS执行 `brew install thrift@0.13.0` 可能会报找不到版本的错误,解决方法如下,在终端执行:
+    1. `brew tap-new $USER/local-tap`
+    2. `brew extract --version='0.13.0' thrift $USER/local-tap`
+    3. `brew install thrift@0.13.0`
+ 参考链接: `https://gist.github.com/tonydeng/02e571f273d6cce4230dc8d5f394493c`
+ 
+ Linux:
+    1.下载源码包:`wget https://archive.apache.org/dist/thrift/0.13.0/thrift-0.13.0.tar.gz`
+    2.安装依赖:`yum install -y autoconf automake libtool cmake ncurses-devel openssl-devel lzo-devel zlib-devel gcc gcc-c++`
+    3.`tar zxvf thrift-0.13.0.tar.gz`
+    4.`cd thrift-0.13.0`
+    5.`./configure --without-tests`
+    6.`make`
+    7.`make install`
+   安装完成后查看版本:thrift --version  
+ 
+```
+
 在源码目录下执行:
 
 ```bash
@@ -132,7 +178,7 @@ Flink 1.13.* 及以前的版本
   <!--artifactId>flink-doris-connector-1.11_2.12</artifactId-->
   <version>1.0.3</version>
 </dependency>    
-``` 
+```
 Flink 1.14.* 版本
 ```
 <dependency>
@@ -166,7 +212,7 @@ Flink 1.14.* 版本
   <artifactId>flink-doris-connector-1.14_2.12</artifactId>
   <version>1.0.3</version>
 </dependency>  
-``` 
+```
 
 **备注**
 
diff --git a/docs/zh-CN/extending-doris/spark-doris-connector.md b/docs/zh-CN/extending-doris/spark-doris-connector.md
index fddb3fe8a4..e4fed7a7cd 100644
--- a/docs/zh-CN/extending-doris/spark-doris-connector.md
+++ b/docs/zh-CN/extending-doris/spark-doris-connector.md
@@ -44,6 +44,51 @@ Spark Doris Connector 可以支持通过 Spark 读取 Doris 中存储的数据
 
 ## 编译与安装
 
+准备工作
+
+1.修改`custom_env.sh.tpl`文件,重命名为`custom_env.sh`
+
+2.指定thrift安装目录
+
+```bash
+##源文件内容
+#export THRIFT_BIN=
+#export MVN_BIN=
+#export JAVA_HOME=
+
+##修改如下
+export THRIFT_BIN=./thirdparty/installed/bin
+#export MVN_BIN=
+#export JAVA_HOME=
+
+安装 `thrift` 0.13.0 版本(注意:`Doris` 0.15 和最新的版本基于 `thrift` 0.13.0 构建, 之前的版本依然使用`thrift` 0.9.3 构建)
+ Windows: 
+    1. 下载:`http://archive.apache.org/dist/thrift/0.13.0/thrift-0.13.0.exe`
+    2. 拷贝:将文件拷贝至 `./thirdparty/installed/bin`
+ 
+ MacOS: 
+    1. 下载:`brew install thrift@0.13.0`
+    2. 建立软链接: 
+       `mkdir -p ./thirdparty/installed/bin`
+       `ln -s /opt/homebrew/Cellar/thrift@0.13.0/0.13.0/bin/thrift ./thirdparty/installed/bin/thrift`
+ 
+ 注:MacOS执行 `brew install thrift@0.13.0` 可能会报找不到版本的错误,解决方法如下,在终端执行:
+    1. `brew tap-new $USER/local-tap`
+    2. `brew extract --version='0.13.0' thrift $USER/local-tap`
+    3. `brew install thrift@0.13.0`
+ 参考链接: `https://gist.github.com/tonydeng/02e571f273d6cce4230dc8d5f394493c`
+ 
+ Linux:
+    1.下载源码包:`wget https://archive.apache.org/dist/thrift/0.13.0/thrift-0.13.0.tar.gz`
+    2.安装依赖:`yum install -y autoconf automake libtool cmake ncurses-devel openssl-devel lzo-devel zlib-devel gcc gcc-c++`
+    3.`tar zxvf thrift-0.13.0.tar.gz`
+    4.`cd thrift-0.13.0`
+    5.`./configure --without-tests`
+    6.`make`
+    7.`make install`
+   安装完成后查看版本:thrift --version   
+```
+
 在源码目录下执行:
 
 ```bash
diff --git a/new-docs/en/ecosystem/datax.md b/new-docs/en/ecosystem/datax.md
index c8762d68a4..1c19e9f815 100644
--- a/new-docs/en/ecosystem/datax.md
+++ b/new-docs/en/ecosystem/datax.md
@@ -101,4 +101,95 @@ Because the doriswriter plug-in depends on some modules in the DataX code base,
 
 ### Example
 
+#### 1. Stream reads the data and imports it to Doris
+
 For instructions on using the doriswriter plug-in, please refer to [here](https://github.com/apache/incubator-doris/blob/master/extension/DataX/doriswriter/doc/doriswriter.md).
+
+#### 2.Mysql reads the data and imports it to Doris
+
+1.Mysql table structure
+
+```sql
+CREATE TABLE `t_test`(
+ `id`bigint(30) NOT NULL,
+ `order_code` varchar(30) DEFAULT NULL COMMENT '',
+ `line_code` varchar(30) DEFAULT NULL COMMENT '',
+ `remark` varchar(30) DEFAULT NULL COMMENT '',
+ `unit_no` varchar(30) DEFAULT NULL COMMENT '',
+ `unit_name` varchar(30) DEFAULT NULL COMMENT '',
+ `price` decimal(12,2) DEFAULT NULL COMMENT '',
+ PRIMARY KEY(`id`) USING BTREE
+)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='';
+```
+
+2.Doris table structure
+
+```sql
+CREATE TABLE `ods_t_test` (
+ `id`bigint(30) NOT NULL,
+ `order_code` varchar(30) DEFAULT NULL COMMENT '',
+ `line_code` varchar(30) DEFAULT NULL COMMENT '',
+ `remark` varchar(30) DEFAULT NULL COMMENT '',
+ `unit_no` varchar(30) DEFAULT NULL COMMENT '',
+ `unit_name` varchar(30) DEFAULT NULL COMMENT '',
+ `price` decimal(12,2) DEFAULT NULL COMMENT ''
+)ENGINE=OLAP
+UNIQUE KEY(id`, `order_code`)
+DISTRIBUTED BY HASH(`order_code`) BUCKETS 1
+PROPERTIES (
+"replication_allocation" = "tag.location.default: 3",
+"in_memory" = "false",
+"storage_format" = "V2"
+);
+```
+
+3.Create datax script
+
+```
+{
+    "job": {
+        "setting": {
+            "speed": {
+                "channel": 1
+            },
+            "errorLimit": {
+                "record": 0,
+                "percentage": 0
+            }
+        },
+        "content": [
+            {
+                "reader": {
+                    "name": "mysqlreader",
+                    "parameter": {
+                        "username": "xxx",
+                        "password": "xxx",
+                        "column": ["id","order_code","line_code","remark","unit_no","unit_name","price"],
+                        "connection": [ { "table": [ "t_test" ], "jdbcUrl": [ "jdbc:mysql://10.10.10.1:33306/demo" ] } ] }
+                },
+                "writer": {
+                    "name": "doriswriter",
+                    "parameter": {
+                        "feLoadUrl": ["127.0.0.1:8030","127.0.0.2:8030"],
+                        "beLoadUrl": ["127.0.0.3:8040","127.0.0.4:8040","127.0.0.5:8040"],
+                        "jdbcUrl": "jdbc:mysql://127.0.0.1:9030/",
+                        "database": "demo",
+                        "table": "ods_t_test",
+                        "column": ["id","order_code","line_code","remark","unit_no","unit_name","price"],
+                        "username": "xxx",
+                        "password": "xxx",
+                        "postSql": [],
+                        "preSql": [],
+                        "loadProps": {
+                        },
+                        "maxBatchRows" : 300000,
+                        "maxBatchByteSize" : 20971520
+                    }
+                }
+            }
+        ]
+    }
+}
+```
+
+4.Execute the datax task, refer to the specific [datax official website](https://github.com/alibaba/DataX/blob/master/userGuid.md)
diff --git a/new-docs/en/ecosystem/external-table/doris-on-es.md b/new-docs/en/ecosystem/external-table/doris-on-es.md
index a653986c35..537b514d10 100644
--- a/new-docs/en/ecosystem/external-table/doris-on-es.md
+++ b/new-docs/en/ecosystem/external-table/doris-on-es.md
@@ -107,6 +107,8 @@ POST /_bulk
 
 ### Create external ES table
 
+Refer to the specific table syntax:[CREATE TABLE](../../sql-manual/sql-reference-v2/Data-Definition-Statements/Create/CREATE-TABLE.html)
+
 ```
 CREATE EXTERNAL TABLE `test` (
   `k1` bigint(20) COMMENT "",
diff --git a/new-docs/en/ecosystem/external-table/hive-bitmap-udf.md b/new-docs/en/ecosystem/external-table/hive-bitmap-udf.md
deleted file mode 100644
index 76c5fd2b85..0000000000
--- a/new-docs/en/ecosystem/external-table/hive-bitmap-udf.md
+++ /dev/null
@@ -1,97 +0,0 @@
----
-{
-    "title": "Hive Bitmap UDF",
-    "language": "en"
-}
----
-
-<!-- 
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-# Hive UDF
-
- Hive Bitmap UDF provides UDFs for generating bitmap and bitmap operations in hive tables. The bitmap in Hive is exactly the same as the Doris bitmap. The bitmap in Hive can be imported into doris through (spark bitmap load).
-
- the main purpose:
-  1. Reduce the time of importing data into doris, and remove processes such as dictionary building and bitmap pre-aggregation;
-  2. Save hive storage, use bitmap to compress data, reduce storage cost;
-  3. Provide flexible bitmap operations in hive, such as: intersection, union, and difference operations, and the calculated bitmap can also be directly imported into doris; imported into doris;
-
-## How To Use
-
-### Create Bitmap type table in Hive
-
-```sql
-
--- Example: Create Hive Bitmap Table
-CREATE TABLE IF NOT EXISTS `hive_bitmap_table`(
-  `k1`   int       COMMENT '',
-  `k2`   String    COMMENT '',
-  `k3`   String    COMMENT '',
-  `uuid` binary    COMMENT 'bitmap'
-) comment  'comment'
-
-```
-
-### Hive Bitmap UDF Usage:
-
-   Hive Bitmap UDF used in Hive/Spark
-
-```sql
-
--- Load the Hive Bitmap Udf jar package (Upload the compiled hive-udf jar package to HDFS)
-add jar hdfs://node:9001/hive-udf-jar-with-dependencies.jar;
-
--- Create Hive Bitmap UDAF function
-create temporary function to_bitmap as 'org.apache.doris.udf.ToBitmapUDAF';
-create temporary function bitmap_union as 'org.apache.doris.udf.BitmapUnionUDAF';
-
--- Create Hive Bitmap UDF function
-create temporary function bitmap_count as 'org.apache.doris.udf.BitmapCountUDF';
-create temporary function bitmap_and as 'org.apache.doris.udf.BitmapAndUDF';
-create temporary function bitmap_or as 'org.apache.doris.udf.BitmapOrUDF';
-create temporary function bitmap_xor as 'org.apache.doris.udf.BitmapXorUDF';
-
--- Example: Generate bitmap by to_bitmap function and write to Hive Bitmap table
-insert into hive_bitmap_table
-select 
-    k1,
-    k2,
-    k3,
-    to_bitmap(uuid) as uuid
-from 
-    hive_table
-group by 
-    k1,
-    k2,
-    k3
-
--- Example: The bitmap_count function calculate the number of elements in the bitmap
-select k1,k2,k3,bitmap_count(uuid) from hive_bitmap_table
-
--- Example: The bitmap_union function calculate the grouped bitmap union
-select k1,bitmap_union(uuid) from hive_bitmap_table group by k1
-
-```
-
-###  Hive Bitmap UDF  Description
-
-## Hive Bitmap import into Doris
-
- see details: Load Data -> Spark Load -> Basic operation -> Create load(Example 3: when the upstream data source is hive binary type table)
diff --git a/new-docs/en/ecosystem/external-table/hive-of-doris.md b/new-docs/en/ecosystem/external-table/hive-of-doris.md
index cfa98ab0f4..360e8009fd 100644
--- a/new-docs/en/ecosystem/external-table/hive-of-doris.md
+++ b/new-docs/en/ecosystem/external-table/hive-of-doris.md
@@ -44,6 +44,8 @@ This document introduces how to use this feature and the considerations.
 
 ### Create Hive External Table 
 
+Refer to the specific table syntax:[CREATE TABLE](../../sql-manual/sql-reference-v2/Data-Definition-Statements/Create/CREATE-TABLE.html)
+
 ```sql
 -- Syntax
 CREATE [EXTERNAL] TABLE table_name (
diff --git a/new-docs/en/ecosystem/external-table/iceberg-of-doris.md b/new-docs/en/ecosystem/external-table/iceberg-of-doris.md
index aa83042feb..f6efc6c511 100644
--- a/new-docs/en/ecosystem/external-table/iceberg-of-doris.md
+++ b/new-docs/en/ecosystem/external-table/iceberg-of-doris.md
@@ -47,7 +47,7 @@ This document introduces how to use this feature and the considerations.
 Iceberg tables can be created in Doris in two ways. You do not need to declare the column definitions of the table when creating an external table, Doris can automatically convert them based on the column definitions of the table in Iceberg.
 
 1. Create a separate external table to mount the Iceberg table.  
-   The syntax can be viewed in `HELP CREATE TABLE`.
+   The syntax can be viewed in [CREATE TABLE](../../sql-manual/sql-reference-v2/Data-Definition-Statements/Create/CREATE-TABLE.html).
 
     ```sql
     -- Syntax
@@ -74,7 +74,7 @@ Iceberg tables can be created in Doris in two ways. You do not need to declare t
     ```
 
 2. Create an Iceberg database to mount the corresponding Iceberg database on the remote side, and mount all the tables under the database.  
-   You can check the syntax with `HELP CREATE DATABASE`.
+   You can check the syntax with [CREATE DATABASE](../../sql-manual/sql-reference-v2/Data-Definition-Statements/Create/CREATE-DATABASE.html).
 
     ```sql
     -- Syntax
@@ -142,7 +142,7 @@ You can also create an Iceberg table by explicitly specifying the column definit
 
 ### Show table structure
 
-Show table structure can be viewed by `HELP SHOW CREATE TABLE`.
+Show table structure can be viewed by [SHOW CREATE TABLE](../../sql-manual/sql-reference-v2/Show-Statements/SHOW-CREATE-TABLE.html).
     
 ### Synchronized mounts
 
diff --git a/new-docs/en/ecosystem/external-table/odbc-of-doris.md b/new-docs/en/ecosystem/external-table/odbc-of-doris.md
index fe8915c47d..3ed7769292 100644
--- a/new-docs/en/ecosystem/external-table/odbc-of-doris.md
+++ b/new-docs/en/ecosystem/external-table/odbc-of-doris.md
@@ -47,6 +47,8 @@ This document mainly introduces the implementation principle and usage of this O
 
 ### Create ODBC External Table 
 
+Refer to the specific table syntax:[CREATE TABLE](../../sql-manual/sql-reference-v2/Data-Definition-Statements/Create/CREATE-TABLE.html)
+
 #### 1. Creating ODBC external table without resource
 
 ```
@@ -323,6 +325,12 @@ There are different data types among different databases. Here, the types in eac
 |   DATETIME/DATETIME2  | DATETIME |  |
 |   DECIMAL/NUMERIC | DECIMAL |  |
 
+## Best Practices
+
+Sync for small amounts of data
+
+For example, a table in Mysql has 1 million data. If you want to synchronize to doris, you can use ODBC to map the data. When using[insert into](http://localhost:8080/zh-CN/data-operate/import/import-way/insert-into-manual.html)way to synchronize data to Doris, if you want to synchronize large batches of data,Can be used in batches[insert into](http://localhost:8080/zh-CN/data-operate/import/import-way/insert-into-manual.html)Sync (deprecated)
+
 ## Q&A
 
 1. Relationship with the original external table of MySQL?
diff --git a/new-docs/en/ecosystem/flink-doris-connector.md b/new-docs/en/ecosystem/flink-doris-connector.md
index 406481c049..b24036406b 100644
--- a/new-docs/en/ecosystem/flink-doris-connector.md
+++ b/new-docs/en/ecosystem/flink-doris-connector.md
@@ -48,6 +48,52 @@ Github: https://github.com/apache/incubator-doris-flink-connector
 
 ## Build and Install
 
+Ready to work
+
+1.Modify the `custom_env.sh.tpl` file and rename it to `custom_env.sh`
+
+2.Specify the thrift installation directory
+
+```bash
+##source file content
+#export THRIFT_BIN=
+#export MVN_BIN=
+#export JAVA_HOME=
+
+##amend as below
+export THRIFT_BIN=./thirdparty/installed/bin(thrift installation directory)
+#export MVN_BIN=
+#export JAVA_HOME=
+
+Install `thrift` 0.13.0 (Note: `Doris` 0.15 and the latest builds are based on `thrift` 0.13.0, previous versions are still built with `thrift` 0.9.3)
+Windows:
+  1. Download: `http://archive.apache.org/dist/thrift/0.13.0/thrift-0.13.0.exe`
+  2. Copy: Copy the file to `./thirdparty/installed/bin` 
+  
+ 
+MacOS:
+  1. Download: `brew install thrift@0.13.0`
+  2. Create a soft link:
+       `mkdir -p ./thirdparty/installed/bin`
+       `ln -s /opt/homebrew/Cellar/thrift@0.13.0/0.13.0/bin/thrift ./thirdparty/installed/bin/thrift`
+
+Note: Executing `brew install thrift@0.13.0` on MacOS may report an error that the version cannot be found. The solution is as follows, execute it in the terminal:
+    1. `brew tap-new $USER/local-tap`
+    2. `brew extract --version='0.13.0' thrift $USER/local-tap`
+    3. `brew install thrift@0.13.0`
+ Reference link: `https://gist.github.com/tonydeng/02e571f273d6cce4230dc8d5f394493c`
+ 
+Linux:
+    1.Download source package:`wget https://archive.apache.org/dist/thrift/0.13.0/thrift-0.13.0.tar.gz`
+    2.Install dependencies:`yum install -y autoconf automake libtool cmake ncurses-devel openssl-devel lzo-devel zlib-devel gcc gcc-c++`
+    3.`tar zxvf thrift-0.13.0.tar.gz`
+    4.`cd thrift-0.13.0`
+    5.`./configure --without-tests`
+    6.`make`
+    7.`make install`
+   Check the version after installation is complete:thrift --version  
+```
+
 Execute following command in source dir:
 
 ```bash
@@ -371,3 +417,33 @@ WITH (
 
 insert into doris_sink select id,name from cdc_mysql_source;
 ```
+
+## Java example
+
+`samples/doris-demo/fink-demo/`  An example of the Java version is provided below for reference, see [here](https://github.com/apache/incubator-doris/tree/master/samples/doris-demo/flink-demo)
+
+## Best Practices
+
+### Application scenarios
+
+The most suitable scenario for using Flink Doris Connector is to synchronize source data to Doris (Mysql, Oracle, PostgreSQL) in real time/batch, etc., and use Flink to perform joint analysis on data in Doris and other data sources. You can also use Flink Doris Connector
+
+### The amount of data
+
+The writing frequency of Flink Doris Connector is mainly controlled by sink.batch.size, sink.batch.interval and sink.batch.bytes
+
+These three parameters are used to control the execution time of a single task. When any one of the thresholds is reached, the task ends. where `sink.batch.size` is used to record the number of lines of data written by the word. `sink.batch.interval` indicates the interval to start writing data, `sink.batch.bytes`, the amount of data to be written at a time, in bytes. The current consumption rate of a task is about 5-10MB/s.
+
+Then suppose a row of data is 500B, and the user wants every 100MB or 10 seconds to be a task. The expected processing time for 100MB is 10-20 seconds, which corresponds to about 200,000 rows. Then a reasonable configuration is:
+
+```
+"sink.batch.interval" = "10",
+"sink.batch.size" = "200000",
+"sink.batch.bytes" = "104857600"
+```
+
+### common problem
+
+1.Could not execute SQL statement. Reason:java.lang.IllegalAraumenException: Row parity: 32,but serializer rarity:31
+
+Because Doris has a hidden column, you need to manually add a column `__DORIS_DELETE_SIGN__` Type: TINYINT
diff --git a/new-docs/en/ecosystem/logstash.md b/new-docs/en/ecosystem/logstash.md
index 96dbfdb73d..742aa102c2 100644
--- a/new-docs/en/ecosystem/logstash.md
+++ b/new-docs/en/ecosystem/logstash.md
@@ -28,9 +28,9 @@ under the License.
 
 This plugin is used to output data to Doris for logstash, use the HTTP protocol to interact with the Doris FE Http interface, and import data through Doris's stream load.
 
-[Learn more about Doris Stream Load ](http://doris.apache.org/administrator-guide/load-data/stream-load-manual.html)
+[Learn more about Doris Stream Load ](../data-operate/import/import-way/stream-load-manual.html)
 
-[Learn more about Doris](http://doris.apache.org)
+[Learn more about Doris](../)
 
 
 ## Install and compile
diff --git a/new-docs/en/ecosystem/seatunnel/flink-sink.md b/new-docs/en/ecosystem/seatunnel/flink-sink.md
index e8d09329d9..4617cdd1d0 100644
--- a/new-docs/en/ecosystem/seatunnel/flink-sink.md
+++ b/new-docs/en/ecosystem/seatunnel/flink-sink.md
@@ -27,7 +27,7 @@ under the License.
 # Seatunnel
 The newest [Apache SeaTunnel (formerly waterdrop )](https://seatunnel.apache.org) already supports Doris's connector, SeaTunnel can use Spark engine and Flink engine to synchronize data to Doris.
 ## Flink Sink Doris(2.x)
-Seatunnel Flink Sink Doris [plugin code](https://github.com/apache/incubator-seatunnel/tree/dev/seatunnel-connectors/seatunnel-connector-flink-doris)
+Seatunnel Flink Sink Doris [plugin code](https://github.com/apache/incubator-seatunnel/tree/dev/seatunnel-connectors/seatunnel-connectors-flink/seatunnel-connector-flink-doris)
 
 ### Options
 | name | type | required | default value | engine |
@@ -78,7 +78,7 @@ Number of retries after writing to Doris fails
 
 Import parameters for Stream load. For example: 'doris.column_separator' = ', ' etc.
 
-[More Stream Load parameter configuration](https://doris.apache.org/administrator-guide/load-data/stream-load-manual.html)
+[More Stream Load parameter configuration](../../data-operate/import/import-way/stream-load-manual.html)
 
 ### Examples
 Socket To Doris
diff --git a/new-docs/en/ecosystem/seatunnel/spark-sink.md b/new-docs/en/ecosystem/seatunnel/spark-sink.md
index 5ef316e1dd..d3e516c7e4 100644
--- a/new-docs/en/ecosystem/seatunnel/spark-sink.md
+++ b/new-docs/en/ecosystem/seatunnel/spark-sink.md
@@ -73,7 +73,7 @@ Doris number of submissions per batch
 `doris. [string]`
 Doris stream_load properties,you can use 'doris.' prefix + stream_load properties
 
-[More Doris stream_load Configurations](https://doris.apache.org/master/zh-CN/administrator-guide/load-data/stream-load-manual.html)
+[More Doris stream_load Configurations](../../data-operate/import/import-way/stream-load-manual.html)
 
 ### Examples
 Hive to Doris
diff --git a/new-docs/en/ecosystem/spark-doris-connector.md b/new-docs/en/ecosystem/spark-doris-connector.md
index db37a00764..18c55d419b 100644
--- a/new-docs/en/ecosystem/spark-doris-connector.md
+++ b/new-docs/en/ecosystem/spark-doris-connector.md
@@ -44,6 +44,52 @@ Github: https://github.com/apache/incubator-doris-spark-connector
 
 ## Build and Install
 
+Ready to work
+
+1.Modify the `custom_env.sh.tpl` file and rename it to `custom_env.sh`
+
+2.Specify the thrift installation directory
+
+```bash
+##source file content
+#export THRIFT_BIN=
+#export MVN_BIN=
+#export JAVA_HOME=
+
+##amend as below
+export THRIFT_BIN=./thirdparty/installed/bin(thrift installation directory)
+#export MVN_BIN=
+#export JAVA_HOME=
+
+Install `thrift` 0.13.0 (Note: `Doris` 0.15 and the latest builds are based on `thrift` 0.13.0, previous versions are still built with `thrift` 0.9.3)
+Windows:
+  1. Download: `http://archive.apache.org/dist/thrift/0.13.0/thrift-0.13.0.exe`
+  2. Copy: Copy the file to `./thirdparty/installed/bin` 
+  
+ 
+MacOS:
+  1. Download: `brew install thrift@0.13.0`
+  2. Create a soft link:
+       `mkdir -p ./thirdparty/installed/bin`
+       `ln -s /opt/homebrew/Cellar/thrift@0.13.0/0.13.0/bin/thrift ./thirdparty/installed/bin/thrift`
+
+Note: Executing `brew install thrift@0.13.0` on MacOS may report an error that the version cannot be found. The solution is as follows, execute it in the terminal:
+    1. `brew tap-new $USER/local-tap`
+    2. `brew extract --version='0.13.0' thrift $USER/local-tap`
+    3. `brew install thrift@0.13.0`
+ Reference link: `https://gist.github.com/tonydeng/02e571f273d6cce4230dc8d5f394493c`
+ 
+Linux:
+    1.Download source package:`wget https://archive.apache.org/dist/thrift/0.13.0/thrift-0.13.0.tar.gz`
+    2.Install dependencies:`yum install -y autoconf automake libtool cmake ncurses-devel openssl-devel lzo-devel zlib-devel gcc gcc-c++`
+    3.`tar zxvf thrift-0.13.0.tar.gz`
+    4.`cd thrift-0.13.0`
+    5.`./configure --without-tests`
+    6.`make`
+    7.`make install`
+   Check the version after installation is complete:thrift --version
+```
+
 Execute following command in source dir
 
 ```bash
diff --git a/new-docs/en/ecosystem/udf/contribute-udf.md b/new-docs/en/ecosystem/udf/contribute-udf.md
index 16356a7f65..075bd41a5f 100644
--- a/new-docs/en/ecosystem/udf/contribute-udf.md
+++ b/new-docs/en/ecosystem/udf/contribute-udf.md
@@ -121,4 +121,4 @@ The user manual needs to include: UDF function definition description, applicabl
 
 When you meet the conditions and prepare the code, you can contribute UDF to the Doris community after the document. Simply submit the request (PR) on [Github](https://github.com/apache/incubator-doris). See the specific submission method: [Pull Request (PR)](https://help.github.com/articles/about-pull-requests/).
 
-Finally, when the PR assessment is passed and merged. Congratulations, your UDF becomes a third-party UDF supported by Doris. You can check it out in the extended functions section of [Doris official website](http://doris.apache.org/master/zh-CN/)~.
+Finally, when the PR assessment is passed and merged. Congratulations, your UDF becomes a third-party UDF supported by Doris. You can check it out in the ecological expansion section of [Doris official website](/en)~.
diff --git a/new-docs/en/ecosystem/udf/native-user-defined-function.md b/new-docs/en/ecosystem/udf/native-user-defined-function.md
index 32311bf57a..1ccacd3047 100644
--- a/new-docs/en/ecosystem/udf/native-user-defined-function.md
+++ b/new-docs/en/ecosystem/udf/native-user-defined-function.md
@@ -34,7 +34,7 @@ There are two types of analysis requirements that UDF can meet: UDF and UDAF. UD
 
 This document mainly describes how to write a custom UDF function and how to use it in Doris.
 
-If users use the UDF function and extend Doris' function analysis, and want to contribute their own UDF functions back to the Doris community for other users, please see the document [Contribute UDF](./contribute_udf.md).
+If users use the UDF function and extend Doris' function analysis, and want to contribute their own UDF functions back to the Doris community for other users, please see the document [Contribute UDF](./contribute-udf.md).
 
 ## Writing UDF functions
 
diff --git a/new-docs/zh-CN/ecosystem/audit-plugin.md b/new-docs/zh-CN/ecosystem/audit-plugin.md
index 926cab5f02..5a561e3ece 100644
--- a/new-docs/zh-CN/ecosystem/audit-plugin.md
+++ b/new-docs/zh-CN/ecosystem/audit-plugin.md
@@ -24,4 +24,77 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# 审计日志插件
\ No newline at end of file
+# 审计日志插件
+
+Doris 的审计日志插件是在 FE 的插件框架基础上开发的。是一个可选插件。用户可以在运行时安装或卸载这个插件。
+
+该插件可以将 FE 的审计日志定期的导入到指定 Doris 集群中,以方便用户通过 SQL 对审计日志进行查看和分析。
+
+## 编译、配置和部署
+
+### FE 配置
+
+FE的插件框架当前是实验性功能,Doris中默认关闭,在FE的配置文件中,增加`plugin_enable = true`启用plugin框架
+
+### AuditLoader 配置
+
+auditloader plugin的配置位于`${DORIS}/fe_plugins/auditloader/src/main/assembly/`.
+
+打开 `plugin.conf` 进行配置。配置项说明参见注释。
+
+### 编译
+
+在 Doris 代码目录下执行 `sh build_plugin.sh` 后,会在 `fe_plugins/output` 目录下得到 `auditloader.zip` 文件。
+
+### 部署
+
+您可以将这个文件放置在一个 http 服务器上,或者拷贝`auditloader.zip`(或者解压`auditloader.zip`)到所有 FE 的指定目录下。这里我们使用后者。
+
+### 安装
+
+部署完成后,安装插件前,需要创建之前在 `plugin.conf` 中指定的审计数据库和表。其中建表语句如下:
+
+```
+create table doris_audit_tbl__
+(
+    query_id varchar(48) comment "Unique query id",
+    time datetime not null comment "Query start time",
+    client_ip varchar(32) comment "Client IP",
+    user varchar(64) comment "User name",
+    db varchar(96) comment "Database of this query",
+    state varchar(8) comment "Query result state. EOF, ERR, OK",
+    query_time bigint comment "Query execution time in millisecond",
+    scan_bytes bigint comment "Total scan bytes of this query",
+    scan_rows bigint comment "Total scan rows of this query",
+    return_rows bigint comment "Returned rows of this query",
+    stmt_id int comment "An incremental id of statement",
+    is_query tinyint comment "Is this statemt a query. 1 or 0",
+    frontend_ip varchar(32) comment "Frontend ip of executing this statement",
+    cpu_time_ms bigint comment "Total scan cpu time in millisecond of this query",
+    sql_hash varchar(48) comment "Hash value for this query",
+    peak_memory_bytes bigint comment "Peak memory bytes used on all backends of this query",
+    stmt string comment "The original statement, trimed if longer than 2G "
+) engine=OLAP
+duplicate key(query_id, time, client_ip)
+partition by range(time) ()
+distributed by hash(query_id) buckets 1
+properties(
+    "dynamic_partition.time_unit" = "DAY",
+    "dynamic_partition.start" = "-30",
+    "dynamic_partition.end" = "3",
+    "dynamic_partition.prefix" = "p",
+    "dynamic_partition.buckets" = "1",
+    "dynamic_partition.enable" = "true",
+    "replication_num" = "3"
+);
+```
+
+>**注意**
+>
+> 上面表结构中:stmt string ,这个只能在0.15及之后版本中使用,之前版本,字段类型使用varchar
+
+其中 `dynamic_partition` 属性根据自己的需要,选择审计日志安保留的天数。
+
+之后,连接到 Doris 后使用 `INSTALL PLUGIN` 命令完成安装。安装成功后,可以通过 `SHOW PLUGINS` 看到已经安装的插件,并且状态为 `INSTALLED`。
+
+完成后,插件会不断的以指定的时间间隔将审计日志插入到这个表中。
\ No newline at end of file
diff --git a/new-docs/zh-CN/ecosystem/datax.md b/new-docs/zh-CN/ecosystem/datax.md
index 205a5165ca..1497038c3c 100644
--- a/new-docs/zh-CN/ecosystem/datax.md
+++ b/new-docs/zh-CN/ecosystem/datax.md
@@ -24,4 +24,172 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# DataX doriswriter
\ No newline at end of file
+# DataX doriswriter
+
+[DataX](https://github.com/alibaba/DataX) doriswriter 插件,用于通过 DataX 同步其他数据源的数据到 Doris 中。
+
+这个插件是利用Doris的Stream Load 功能进行数据导入的。需要配合 DataX 服务一起使用。
+
+## 关于 DataX
+
+DataX 是阿里云 DataWorks数据集成 的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS 等各种异构数据源之间高效的数据同步功能。
+
+更多信息请参阅: `https://github.com/alibaba/DataX/`
+
+## 使用手册
+
+DataX doriswriter 插件代码 [这里](https://github.com/apache/incubator-doris/tree/master/extension/DataX)。
+
+这个目录包含插件代码以及 DataX 项目的开发环境。
+
+doriswriter 插件依赖的 DataX 代码中的一些模块。而这些模块并没有在 Maven 官方仓库中。所以我们在开发 doriswriter 插件时,需要下载完整的 DataX 代码库,才能进行插件的编译和开发。
+
+### 目录结构
+
+1. `doriswriter/`
+
+   这个目录是 doriswriter 插件的代码目录。这个目录中的所有代码,都托管在 Apache Doris 的代码库中。
+
+   doriswriter 插件帮助文档在这里:`doriswriter/doc`
+
+2. `init-env.sh`
+
+   这个脚本主要用于构建 DataX 开发环境,他主要进行了以下操作:
+
+    1. 将 DataX 代码库 clone 到本地。
+    2. 将 `doriswriter/` 目录软链到 `DataX/doriswriter` 目录。
+    3. 在 `DataX/pom.xml` 文件中添加 `<module>doriswriter</module>` 模块。
+    4. 将 `DataX/core/pom.xml` 文件中的 httpclient 版本从 4.5 改为 4.5.13.
+
+       > httpclient v4.5 在处理 307 转发时有bug。
+
+   这个脚本执行后,开发者就可以进入 `DataX/` 目录开始开发或编译了。因为做了软链,所以任何对 `DataX/doriswriter` 目录中文件的修改,都会反映到 `doriswriter/` 目录中,方便开发者提交代码。
+
+### 编译
+
+1. 运行 `init-env.sh`
+2. 按需修改 `DataX/doriswriter` 中的代码。
+3. 编译 doriswriter:
+
+    1. 单独编译 doriswriter 插件:
+
+       `mvn clean install -pl plugin-rdbms-util,doriswriter -DskipTests`
+
+    2. 编译整个 DataX 项目:
+
+       `mvn package assembly:assembly -Dmaven.test.skip=true`
+
+       产出在 `target/datax/datax/`.
+
+       > hdfsreader, hdfswriter and oscarwriter 这三个插件需要额外的jar包。如果你并不需要这些插件,可以在 `DataX/pom.xml` 中删除这些插件的模块。
+
+    3. 编译错误
+
+       如遇到如下编译错误:
+
+       ```
+       Could not find artifact com.alibaba.datax:datax-all:pom:0.0.1-SNAPSHOT ...
+       ```
+
+       可尝试以下方式解决:
+
+        1. 下载 [alibaba-datax-maven-m2-20210928.tar.gz](https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/alibaba-datax-maven-m2-20210928.tar.gz)
+        2. 解压后,将得到的 `alibaba/datax/` 目录,拷贝到所使用的 maven 对应的 `.m2/repository/com/alibaba/` 下。
+        3. 再次尝试编译。
+
+4. 按需提交修改。
+
+### 示例
+
+#### 1.Stream读取数据后导入至Doris
+
+该示例插件的使用说明请参阅 [这里](https://github.com/apache/incubator-doris/blob/master/extension/DataX/doriswriter/doc/doriswriter.md)
+
+#### 2.Mysql读取数据后导入至Doris
+
+1.Mysql表结构
+
+```sql
+CREATE TABLE `t_test`(
+ `id`bigint(30) NOT NULL,
+ `order_code` varchar(30) DEFAULT NULL COMMENT '',
+ `line_code` varchar(30) DEFAULT NULL COMMENT '',
+ `remark` varchar(30) DEFAULT NULL COMMENT '',
+ `unit_no` varchar(30) DEFAULT NULL COMMENT '',
+ `unit_name` varchar(30) DEFAULT NULL COMMENT '',
+ `price` decimal(12,2) DEFAULT NULL COMMENT '',
+ PRIMARY KEY(`id`) USING BTREE
+)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='';
+```
+
+2.Doris表结构
+
+```sql
+CREATE TABLE `ods_t_test` (
+ `id`bigint(30) NOT NULL,
+ `order_code` varchar(30) DEFAULT NULL COMMENT '',
+ `line_code` varchar(30) DEFAULT NULL COMMENT '',
+ `remark` varchar(30) DEFAULT NULL COMMENT '',
+ `unit_no` varchar(30) DEFAULT NULL COMMENT '',
+ `unit_name` varchar(30) DEFAULT NULL COMMENT '',
+ `price` decimal(12,2) DEFAULT NULL COMMENT ''
+)ENGINE=OLAP
+UNIQUE KEY(id`, `order_code`)
+DISTRIBUTED BY HASH(`order_code`) BUCKETS 1
+PROPERTIES (
+"replication_allocation" = "tag.location.default: 3",
+"in_memory" = "false",
+"storage_format" = "V2"
+);
+```
+
+3.创建datax脚本
+
+```
+{
+    "job": {
+        "setting": {
+            "speed": {
+                "channel": 1
+            },
+            "errorLimit": {
+                "record": 0,
+                "percentage": 0
+            }
+        },
+        "content": [
+            {
+                "reader": {
+                    "name": "mysqlreader",
+                    "parameter": {
+                        "username": "xxx",
+                        "password": "xxx",
+                        "column": ["id","order_code","line_code","remark","unit_no","unit_name","price"],
+                        "connection": [ { "table": [ "t_test" ], "jdbcUrl": [ "jdbc:mysql://10.10.10.1:33306/demo" ] } ] }
+                },
+                "writer": {
+                    "name": "doriswriter",
+                    "parameter": {
+                        "feLoadUrl": ["127.0.0.1:8030","127.0.0.2:8030"],
+                        "beLoadUrl": ["127.0.0.3:8040","127.0.0.4:8040","127.0.0.5:8040"],
+                        "jdbcUrl": "jdbc:mysql://127.0.0.1:9030/",
+                        "database": "demo",
+                        "table": "ods_t_test",
+                        "column": ["id","order_code","line_code","remark","unit_no","unit_name","price"],
+                        "username": "xxx",
+                        "password": "xxx",
+                        "postSql": [],
+                        "preSql": [],
+                        "loadProps": {
+                        },
+                        "maxBatchRows" : 300000,
+                        "maxBatchByteSize" : 20971520
+                    }
+                }
+            }
+        ]
+    }
+}
+```
+
+4.执行datax任务,具体参考 [datax官网](https://github.com/alibaba/DataX/blob/master/userGuid.md)
diff --git a/new-docs/zh-CN/ecosystem/external-table/doris-on-es.md b/new-docs/zh-CN/ecosystem/external-table/doris-on-es.md
index adc5bc9242..d93f416c9c 100644
--- a/new-docs/zh-CN/ecosystem/external-table/doris-on-es.md
+++ b/new-docs/zh-CN/ecosystem/external-table/doris-on-es.md
@@ -24,4 +24,566 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# Doris On ES
\ No newline at end of file
+# Doris On ES
+
+Doris-On-ES将Doris的分布式查询规划能力和ES(Elasticsearch)的全文检索能力相结合,提供更完善的OLAP分析场景解决方案:
+
+1. ES中的多index分布式Join查询
+2. Doris和ES中的表联合查询,更复杂的全文检索过滤
+
+本文档主要介绍该功能的实现原理、使用方式等。
+
+## 名词解释
+
+### Doris相关
+* FE:Frontend,Doris 的前端节点,负责元数据管理和请求接入
+* BE:Backend,Doris 的后端节点,负责查询执行和数据存储
+
+### ES相关
+* DataNode:ES的数据存储与计算节点
+* MasterNode:ES的Master节点,管理元数据、节点、数据分布等
+* scroll:ES内置的数据集游标特性,用来对数据进行流式扫描和过滤
+* _source: 导入时传入的原始JSON格式文档内容
+* doc_values: ES/Lucene 中字段的列式存储定义
+* keyword: 字符串类型字段,ES/Lucene不会对文本内容进行分词处理
+* text: 字符串类型字段,ES/Lucene会对文本内容进行分词处理,分词器需要用户指定,默认为standard英文分词器
+
+
+## 使用方法
+
+### 创建ES索引
+
+```
+PUT test
+{
+   "settings": {
+      "index": {
+         "number_of_shards": "1",
+         "number_of_replicas": "0"
+      }
+   },
+   "mappings": {
+      "doc": { // ES 7.x版本之后创建索引时不需要指定type,会有一个默认且唯一的`_doc` type
+         "properties": {
+            "k1": {
+               "type": "long"
+            },
+            "k2": {
+               "type": "date"
+            },
+            "k3": {
+               "type": "keyword"
+            },
+            "k4": {
+               "type": "text",
+               "analyzer": "standard"
+            },
+            "k5": {
+               "type": "float"
+            }
+         }
+      }
+   }
+}
+```
+
+### ES索引导入数据
+
+```
+POST /_bulk
+{"index":{"_index":"test","_type":"doc"}}
+{ "k1" : 100, "k2": "2020-01-01", "k3": "Trying out Elasticsearch", "k4": "Trying out Elasticsearch", "k5": 10.0}
+{"index":{"_index":"test","_type":"doc"}}
+{ "k1" : 100, "k2": "2020-01-01", "k3": "Trying out Doris", "k4": "Trying out Doris", "k5": 10.0}
+{"index":{"_index":"test","_type":"doc"}}
+{ "k1" : 100, "k2": "2020-01-01", "k3": "Doris On ES", "k4": "Doris On ES", "k5": 10.0}
+{"index":{"_index":"test","_type":"doc"}}
+{ "k1" : 100, "k2": "2020-01-01", "k3": "Doris", "k4": "Doris", "k5": 10.0}
+{"index":{"_index":"test","_type":"doc"}}
+{ "k1" : 100, "k2": "2020-01-01", "k3": "ES", "k4": "ES", "k5": 10.0}
+```
+
+### Doris中创建ES外表
+
+具体建表语法参照:[CREATE TABLE](../../sql-manual/sql-reference-v2/Data-Definition-Statements/Create/CREATE-TABLE.html)
+
+```
+CREATE EXTERNAL TABLE `test` (
+  `k1` bigint(20) COMMENT "",
+  `k2` datetime COMMENT "",
+  `k3` varchar(20) COMMENT "",
+  `k4` varchar(100) COMMENT "",
+  `k5` float COMMENT ""
+) ENGINE=ELASTICSEARCH // ENGINE必须是Elasticsearch
+PROPERTIES (
+"hosts" = "http://192.168.0.1:8200,http://192.168.0.2:8200",
+"index" = "test",
+"type" = "doc",
+
+"user" = "root",
+"password" = "root"
+);
+```
+
+参数说明:
+
+参数 | 说明
+---|---
+**hosts** | ES集群地址,可以是一个或多个,也可以是ES前端的负载均衡地址
+**index** | 对应的ES的index名字,支持alias,如果使用doc_value,需要使用真实的名称
+**type** | index的type,不指定的情况会使用_doc
+**user** | ES集群用户名
+**password** | 对应用户的密码信息
+
+* ES 7.x之前的集群请注意在建表的时候选择正确的**索引类型type**
+* 认证方式目前仅支持Http Basic认证,并且需要确保该用户有访问: /\_cluster/state/、\_nodes/http等路径和index的读权限; 集群未开启安全认证,用户名和密码不需要设置
+* Doris表中的列名需要和ES中的字段名完全匹配,字段类型应该保持一致
+*  **ENGINE**必须是 **Elasticsearch**
+
+##### 过滤条件下推
+`Doris On ES`一个重要的功能就是过滤条件的下推: 过滤条件下推给ES,这样只有真正满足条件的数据才会被返回,能够显著的提高查询性能和降低Doris和Elasticsearch的CPU、memory、IO使用量
+
+下面的操作符(Operators)会被优化成如下ES Query:
+
+| SQL syntax  | ES 5.x+ syntax | 
+|-------|:---:|
+| =   | term query|
+| in  | terms query   |
+| > , < , >= , ⇐  | range query |
+| and  | bool.filter   |
+| or  | bool.should   |
+| not  | bool.must_not   |
+| not in  | bool.must_not + terms query |
+| is\_not\_null  | exists query |
+| is\_null  | bool.must_not + exists query |
+| esquery  | ES原生json形式的QueryDSL   |
+
+##### 数据类型映射
+
+Doris\ES  |  byte | short | integer | long | float | double| keyword | text | date
+------------- | ------------- | ------  | ---- | ----- | ----  | ------ | ----| --- | --- |
+tinyint  | &radic; |  |  |  |   |   |   |   |
+smallint | &radic; | &radic; |  | |   |   |   |   |
+int | &radic; |  &radic; | &radic; | |   |   |   |   |
+bigint | &radic;  | &radic;  | &radic;  | &radic; |   |   |   |   |
+float |   |   |   |   | &radic; |   |   |   |
+double |   |   |   |   |   | &radic; |   |   |
+char |   |   |   |   |   |   | &radic; | &radic; |
+varchar |  |   |   |   |   |   | &radic; | &radic; |
+date |   |   |   |   |   |   |   |   | &radic;|  
+datetime |   |   |   |   |   |   |   |   | &radic;|  
+
+
+### 启用列式扫描优化查询速度(enable\_docvalue\_scan=true)
+
+```
+CREATE EXTERNAL TABLE `test` (
+  `k1` bigint(20) COMMENT "",
+  `k2` datetime COMMENT "",
+  `k3` varchar(20) COMMENT "",
+  `k4` varchar(100) COMMENT "",
+  `k5` float COMMENT ""
+) ENGINE=ELASTICSEARCH
+PROPERTIES (
+"hosts" = "http://192.168.0.1:8200,http://192.168.0.2:8200",
+"index" = "test",
+"type" = "doc",
+"user" = "root",
+"password" = "root",
+
+"enable_docvalue_scan" = "true"
+);
+```
+
+参数说明:
+
+参数 | 说明
+---|---
+**enable\_docvalue\_scan** | 是否开启通过ES/Lucene列式存储获取查询字段的值,默认为false
+
+开启后Doris从ES中获取数据会遵循以下两个原则:
+
+* **尽力而为**: 自动探测要读取的字段是否开启列式存储(doc_value: true),如果获取的字段全部有列存,Doris会从列式存储中获取所有字段的值
+* **自动降级**: 如果要获取的字段只要有一个字段没有列存,所有字段的值都会从行存`_source`中解析获取
+
+##### 优势:
+
+默认情况下,Doris On ES会从行存也就是`_source`中获取所需的所有列,`_source`的存储采用的行式+json的形式存储,在批量读取性能上要劣于列式存储,尤其在只需要少数列的情况下尤为明显,只获取少数列的情况下,docvalue的性能大约是_source性能的十几倍
+
+##### 注意
+1. `text`类型的字段在ES中是没有列式存储,因此如果要获取的字段值有`text`类型字段会自动降级为从`_source`中获取
+2. 在获取的字段数量过多的情况下(`>= 25`),从`docvalue`中获取字段值的性能会和从`_source`中获取字段值基本一样
+
+
+### 探测keyword类型字段(enable\_keyword\_sniff=true)
+
+```
+CREATE EXTERNAL TABLE `test` (
+  `k1` bigint(20) COMMENT "",
+  `k2` datetime COMMENT "",
+  `k3` varchar(20) COMMENT "",
+  `k4` varchar(100) COMMENT "",
+  `k5` float COMMENT ""
+) ENGINE=ELASTICSEARCH
+PROPERTIES (
+"hosts" = "http://192.168.0.1:8200,http://192.168.0.2:8200",
+"index" = "test",
+"type" = "doc",
+"user" = "root",
+"password" = "root",
+
+"enable_keyword_sniff" = "true"
+);
+```
+
+参数说明:
+
+参数 | 说明
+---|---
+**enable\_keyword\_sniff** | 是否对ES中字符串类型分词类型(**text**) `fields` 进行探测,获取额外的未分词(**keyword**)字段名(multi-fields机制)
+
+在ES中可以不建立index直接进行数据导入,这时候ES会自动创建一个新的索引,针对字符串类型的字段ES会创建一个既有`text`类型的字段又有`keyword`类型的字段,这就是ES的multi fields特性,mapping如下:
+
+```
+"k4": {
+   "type": "text",
+   "fields": {
+      "keyword": {   
+         "type": "keyword",
+         "ignore_above": 256
+      }
+   }
+}
+```
+对k4进行条件过滤时比如=,Doris On ES会将查询转换为ES的TermQuery
+
+SQL过滤条件:
+
+```
+k4 = "Doris On ES"
+```
+
+转换成ES的query DSL为:
+
+```
+"term" : {
+    "k4": "Doris On ES"
+
+}
+```
+
+因为k4的第一字段类型为`text`,在数据导入的时候就会根据k4设置的分词器(如果没有设置,就是standard分词器)进行分词处理得到doris、on、es三个Term,如下ES analyze API分析:
+
+```
+POST /_analyze
+{
+  "analyzer": "standard",
+  "text": "Doris On ES"
+}
+```
+分词的结果是:
+
+```
+{
+   "tokens": [
+      {
+         "token": "doris",
+         "start_offset": 0,
+         "end_offset": 5,
+         "type": "<ALPHANUM>",
+         "position": 0
+      },
+      {
+         "token": "on",
+         "start_offset": 6,
+         "end_offset": 8,
+         "type": "<ALPHANUM>",
+         "position": 1
+      },
+      {
+         "token": "es",
+         "start_offset": 9,
+         "end_offset": 11,
+         "type": "<ALPHANUM>",
+         "position": 2
+      }
+   ]
+}
+```
+查询时使用的是:
+
+```
+"term" : {
+    "k4": "Doris On ES"
+}
+```
+`Doris On ES`这个term匹配不到词典中的任何term,不会返回任何结果,而启用`enable_keyword_sniff: true`会自动将`k4 = "Doris On ES"`转换成`k4.keyword = "Doris On ES"`来完全匹配SQL语义,转换后的ES query DSL为:
+
+```
+"term" : {
+    "k4.keyword": "Doris On ES"
+}
+```
+
+`k4.keyword` 的类型是`keyword`,数据写入ES中是一个完整的term,所以可以匹配
+
+### 开启节点自动发现, 默认为true(es\_nodes\_discovery=true)
+
+```
+CREATE EXTERNAL TABLE `test` (
+  `k1` bigint(20) COMMENT "",
+  `k2` datetime COMMENT "",
+  `k3` varchar(20) COMMENT "",
+  `k4` varchar(100) COMMENT "",
+  `k5` float COMMENT ""
+) ENGINE=ELASTICSEARCH
+PROPERTIES (
+"hosts" = "http://192.168.0.1:8200,http://192.168.0.2:8200",
+"index" = "test",
+"type" = "doc",
+"user" = "root",
+"password" = "root",
+
+"nodes_discovery" = "true"
+);
+```
+
+参数说明:
+
+参数 | 说明
+---|---
+**es\_nodes\_discovery** | 是否开启es节点发现,默认为true
+
+当配置为true时,Doris将从ES找到所有可用的相关数据节点(在上面分配的分片)。如果ES数据节点的地址没有被Doris BE访问,则设置为false。ES集群部署在与公共Internet隔离的内网,用户通过代理访问
+
+### ES集群是否开启https访问模式,如果开启应设置为`true`,默认为false(http\_ssl\_enabled=true)
+
+```
+CREATE EXTERNAL TABLE `test` (
+  `k1` bigint(20) COMMENT "",
+  `k2` datetime COMMENT "",
+  `k3` varchar(20) COMMENT "",
+  `k4` varchar(100) COMMENT "",
+  `k5` float COMMENT ""
+) ENGINE=ELASTICSEARCH
+PROPERTIES (
+"hosts" = "http://192.168.0.1:8200,http://192.168.0.2:8200",
+"index" = "test",
+"type" = "doc",
+"user" = "root",
+"password" = "root",
+
+"http_ssl_enabled" = "true"
+);
+```
+
+参数说明:
+
+参数 | 说明
+---|---
+**http\_ssl\_enabled** | ES集群是否开启https访问模式
+
+目前会fe/be实现方式为信任所有,这是临时解决方案,后续会使用真实的用户配置证书
+
+### 查询用法
+
+完成在Doris中建立ES外表后,除了无法使用Doris中的数据模型(rollup、预聚合、物化视图等)外并无区别
+
+#### 基本查询
+
+```
+select * from es_table where k1 > 1000 and k3 ='term' or k4 like 'fu*z_'
+```
+
+#### 扩展的esquery(field, QueryDSL)
+通过`esquery(field, QueryDSL)`函数将一些无法用sql表述的query如match_phrase、geoshape等下推给ES进行过滤处理,`esquery`的第一个列名参数用于关联`index`,第二个参数是ES的基本`Query DSL`的json表述,使用花括号`{}`包含,json的`root key`有且只能有一个,如match_phrase、geo_shape、bool等
+
+match_phrase查询:
+
+```
+select * from es_table where esquery(k4, '{
+        "match_phrase": {
+           "k4": "doris on es"
+        }
+    }');
+```
+geo相关查询:
+
+```
+select * from es_table where esquery(k4, '{
+      "geo_shape": {
+         "location": {
+            "shape": {
+               "type": "envelope",
+               "coordinates": [
+                  [
+                     13,
+                     53
+                  ],
+                  [
+                     14,
+                     52
+                  ]
+               ]
+            },
+            "relation": "within"
+         }
+      }
+   }');
+```
+
+bool查询:
+
+```
+select * from es_table where esquery(k4, ' {
+         "bool": {
+            "must": [
+               {
+                  "terms": {
+                     "k1": [
+                        11,
+                        12
+                     ]
+                  }
+               },
+               {
+                  "terms": {
+                     "k2": [
+                        100
+                     ]
+                  }
+               }
+            ]
+         }
+      }');
+```
+
+
+
+## 原理
+
+```              
++----------------------------------------------+
+|                                              |
+| Doris      +------------------+              |
+|            |       FE         +--------------+-------+
+|            |                  |  Request Shard Location
+|            +--+-------------+-+              |       |
+|               ^             ^                |       |
+|               |             |                |       |
+|  +-------------------+ +------------------+  |       |
+|  |            |      | |    |             |  |       |
+|  | +----------+----+ | | +--+-----------+ |  |       |
+|  | |      BE       | | | |      BE      | |  |       |
+|  | +---------------+ | | +--------------+ |  |       |
++----------------------------------------------+       |
+   |        |          | |        |         |          |
+   |        |          | |        |         |          |
+   |    HTTP SCROLL    | |    HTTP SCROLL   |          |
++-----------+---------------------+------------+       |
+|  |        v          | |        v         |  |       |
+|  | +------+--------+ | | +------+-------+ |  |       |
+|  | |               | | | |              | |  |       |
+|  | |   DataNode    | | | |   DataNode   +<-----------+
+|  | |               | | | |              | |  |       |
+|  | |               +<--------------------------------+
+|  | +---------------+ | | |--------------| |  |       |
+|  +-------------------+ +------------------+  |       |
+|   Same Physical Node                         |       |
+|                                              |       |
+|           +-----------------------+          |       |
+|           |                       |          |       |
+|           |      MasterNode       +<-----------------+
+| ES        |                       |          |
+|           +-----------------------+          |
++----------------------------------------------+
+
+
+```
+
+1. 创建ES外表后,FE会请求建表指定的主机,获取所有节点的HTTP端口信息以及index的shard分布信息等,如果请求失败会顺序遍历host列表直至成功或完全失败
+
+2. 查询时会根据FE得到的一些节点信息和index的元数据信息,生成查询计划并发给对应的BE节点
+
+3. BE节点会根据`就近原则`即优先请求本地部署的ES节点,BE通过`HTTP Scroll`方式流式的从ES index的每个分片中并发的从`_source`或`docvalue`中获取数据
+
+4. Doris计算完结果后,返回给用户
+
+## 最佳实践
+
+### 时间类型字段使用建议
+
+在ES中,时间类型的字段使用十分灵活,但是在Doris On ES中如果对时间类型字段的类型设置不当,则会造成过滤条件无法下推
+
+创建索引时对时间类型格式的设置做最大程度的格式兼容:
+
+```
+ "dt": {
+     "type": "date",
+     "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
+ }
+```
+
+在Doris中建立该字段时建议设置为`date`或`datetime`,也可以设置为`varchar`类型, 使用如下SQL语句都可以直接将过滤条件下推至ES:
+
+```
+select * from doe where k2 > '2020-06-21';
+
+select * from doe where k2 < '2020-06-21 12:00:00'; 
+
+select * from doe where k2 < 1593497011; 
+
+select * from doe where k2 < now();
+
+select * from doe where k2 < date_format(now(), '%Y-%m-%d');
+```
+
+注意:
+
+* 在ES中如果不对时间类型的字段设置`format`, 默认的时间类型字段格式为
+
+```
+strict_date_optional_time||epoch_millis
+```
+
+* 导入到ES的日期字段如果是时间戳需要转换成`ms`, ES内部处理时间戳都是按照`ms`进行处理的, 否则Doris On ES会出现显示错误
+
+### 获取ES元数据字段`_id`
+
+导入文档在不指定`_id`的情况下ES会给每个文档分配一个全局唯一的`_id`即主键, 用户也可以在导入时为文档指定一个含有特殊业务意义的`_id`; 如果需要在Doris On ES中获取该字段值,建表时可以增加类型为`varchar`的`_id`字段:
+
+```
+CREATE EXTERNAL TABLE `doe` (
+  `_id` varchar COMMENT "",
+  `city`  varchar COMMENT ""
+) ENGINE=ELASTICSEARCH
+PROPERTIES (
+"hosts" = "http://127.0.0.1:8200",
+"user" = "root",
+"password" = "root",
+"index" = "doe",
+"type" = "doc"
+}
+```
+
+注意:
+
+1. `_id`字段的过滤条件仅支持`=`和`in`两种
+2. `_id`字段只能是`varchar`类型
+
+## Q&A
+
+1. Doris On ES对ES的版本要求
+
+   ES主版本大于5,ES在2.x之前和5.x之后数据的扫描方式不同,目前支持仅5.x之后的
+
+2. 是否支持X-Pack认证的ES集群
+
+   支持所有使用HTTP Basic认证方式的ES集群
+3. 一些查询比请求ES慢很多
+
+   是,比如_count相关的query等,ES内部会直接读取满足条件的文档个数相关的元数据,不需要对真实的数据进行过滤
+
+4. 聚合操作是否可以下推
+
+   目前Doris On ES不支持聚合操作如sum, avg, min/max 等下推,计算方式是批量流式的从ES获取所有满足条件的文档,然后在Doris中进行计算
\ No newline at end of file
diff --git a/new-docs/zh-CN/ecosystem/external-table/hive-bitmap-udf.md b/new-docs/zh-CN/ecosystem/external-table/hive-bitmap-udf.md
deleted file mode 100644
index dc38533b32..0000000000
--- a/new-docs/zh-CN/ecosystem/external-table/hive-bitmap-udf.md
+++ /dev/null
@@ -1,27 +0,0 @@
----
-{
-    "title": "Hive Bitmap UDF",
-    "language": "zh-CN"
-}
----
-
-<!-- 
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-# Hive UDF
\ No newline at end of file
diff --git a/new-docs/zh-CN/ecosystem/external-table/hive-of-doris.md b/new-docs/zh-CN/ecosystem/external-table/hive-of-doris.md
index 3a8b45ffe4..9ee2f62539 100644
--- a/new-docs/zh-CN/ecosystem/external-table/hive-of-doris.md
+++ b/new-docs/zh-CN/ecosystem/external-table/hive-of-doris.md
@@ -24,4 +24,99 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# Hive External Table of Doris
\ No newline at end of file
+# Hive External Table of Doris
+
+Hive External Table of Doris 提供了 Doris 直接访问 Hive 外部表的能力,外部表省去了繁琐的数据导入工作,并借助 Doris 本身的 OLAP 的能力来解决 Hive 表的数据分析问题:
+
+1. 支持 Hive 数据源接入Doris
+2. 支持 Doris 与 Hive 数据源中的表联合查询,进行更加复杂的分析操作
+
+本文档主要介绍该功能的使用方式和注意事项等。
+
+## 名词解释
+
+### Doris 相关
+
+* FE:Frontend,Doris 的前端节点,负责元数据管理和请求接入
+* BE:Backend,Doris 的后端节点,负责查询执行和数据存储
+
+## 使用方法
+
+### Doris 中创建 Hive 的外表
+
+具体建表语法参照:[CREATE TABLE](../../sql-manual/sql-reference-v2/Data-Definition-Statements/Create/CREATE-TABLE.html)
+
+```sql
+-- 语法
+CREATE [EXTERNAL] TABLE table_name (
+  col_name col_type [NULL | NOT NULL] [COMMENT "comment"]
+) ENGINE=HIVE
+[COMMENT "comment"]
+PROPERTIES (
+  'property_name'='property_value',
+  ...
+);
+
+-- 例子:创建 Hive 集群中 hive_db 下的 hive_table 表
+CREATE TABLE `t_hive` (
+  `k1` int NOT NULL COMMENT "",
+  `k2` char(10) NOT NULL COMMENT "",
+  `k3` datetime NOT NULL COMMENT "",
+  `k5` varchar(20) NOT NULL COMMENT "",
+  `k6` double NOT NULL COMMENT ""
+) ENGINE=HIVE
+COMMENT "HIVE"
+PROPERTIES (
+'hive.metastore.uris' = 'thrift://192.168.0.1:9083',
+'database' = 'hive_db',
+'table' = 'hive_table'
+);
+```
+
+#### 参数说明:
+
+- 外表列
+    - 列名要于 Hive 表一一对应
+    - 列的顺序需要与 Hive 表一致
+    - 必须包含 Hive 表中的全部列
+    - Hive 表分区列无需指定,与普通列一样定义即可。
+- ENGINE 需要指定为 HIVE
+- PROPERTIES 属性:
+    - `hive.metastore.uris`:Hive Metastore 服务地址
+    - `database`:挂载 Hive 对应的数据库名
+    - `table`:挂载 Hive 对应的表名
+
+## 类型匹配
+
+支持的 Hive 列类型与 Doris 对应关系如下表:
+
+|  Hive  | Doris  |             描述              |
+| :------: | :----: | :-------------------------------: |
+|   BOOLEAN  | BOOLEAN  |                         |
+|   CHAR   |  CHAR  |            当前仅支持UTF8编码            |
+|   VARCHAR | VARCHAR |       当前仅支持UTF8编码       |
+|   TINYINT   | TINYINT |  |
+|   SMALLINT  | SMALLINT |  |
+|   INT  | INT |  |
+|   BIGINT  | BIGINT |  |
+|   FLOAT   |  FLOAT  |                                   |
+|   DOUBLE  | DOUBLE |  |
+|   DECIMAL  | DECIMAL |  |
+|   DATE   |  DATE  |                                   |
+|   TIMESTAMP  | DATETIME | Timestamp 转成 Datetime 会损失精度 |
+
+**注意:**
+- Hive 表 Schema 变更**不会自动同步**,需要在 Doris 中重建 Hive 外表。
+- 当前 Hive 的存储格式仅支持 Text,Parquet 和 ORC 类型
+- 当前默认支持的 Hive 版本为 `2.3.7、3.1.2`,未在其他版本进行测试。后续后支持更多版本。
+
+### 查询用法
+
+完成在 Doris 中建立 Hive 外表后,除了无法使用 Doris 中的数据模型(rollup、预聚合、物化视图等)外,与普通的 Doris OLAP 表并无区别
+
+```sql
+select * from t_hive where k1 > 1000 and k3 ='term' or k4 like '%doris';
+```
+
+
+
diff --git a/new-docs/zh-CN/ecosystem/external-table/iceberg-of-doris.md b/new-docs/zh-CN/ecosystem/external-table/iceberg-of-doris.md
index 8291d58891..ba4872762f 100644
--- a/new-docs/zh-CN/ecosystem/external-table/iceberg-of-doris.md
+++ b/new-docs/zh-CN/ecosystem/external-table/iceberg-of-doris.md
@@ -24,4 +24,187 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# Iceberg External Table of Doris
\ No newline at end of file
+# Iceberg External Table of Doris
+
+Iceberg External Table of Doris 提供了 Doris 直接访问 Iceberg 外部表的能力,外部表省去了繁琐的数据导入工作,并借助 Doris 本身的 OLAP 的能力来解决 Iceberg 表的数据分析问题:
+
+1. 支持 Iceberg 数据源接入Doris
+2. 支持 Doris 与 Iceberg 数据源中的表联合查询,进行更加复杂的分析操作
+
+本文档主要介绍该功能的使用方式和注意事项等。
+
+## 名词解释
+
+### Doris 相关
+
+* FE:Frontend,Doris 的前端节点,负责元数据管理和请求接入
+* BE:Backend,Doris 的后端节点,负责查询执行和数据存储
+
+## 使用方法
+
+### Doris 中创建 Iceberg 的外表
+
+可以通过以下两种方式在 Doris 中创建 Iceberg 外表。建外表时无需声明表的列定义,Doris 可以根据 Iceberg 中表的列定义自动转换。
+
+1. 创建一个单独的外表,用于挂载 Iceberg 表。  
+   具体相关语法,可以通过 [CREATE TABLE](../../sql-manual/sql-reference-v2/Data-Definition-Statements/Create/CREATE-TABLE.html) 查看。
+
+    ```sql
+    -- 语法
+    CREATE [EXTERNAL] TABLE table_name 
+    ENGINE = ICEBERG
+    [COMMENT "comment"]
+    PROPERTIES (
+    "iceberg.database" = "iceberg_db_name",
+    "iceberg.table" = "icberg_table_name",
+    "iceberg.hive.metastore.uris"  =  "thrift://192.168.0.1:9083",
+    "iceberg.catalog.type"  =  "HIVE_CATALOG"
+    );
+
+
+    -- 例子:挂载 Iceberg 中 iceberg_db 下的 iceberg_table 
+    CREATE TABLE `t_iceberg` 
+    ENGINE = ICEBERG
+    PROPERTIES (
+    "iceberg.database" = "iceberg_db",
+    "iceberg.table" = "iceberg_table",
+    "iceberg.hive.metastore.uris"  =  "thrift://192.168.0.1:9083",
+    "iceberg.catalog.type"  =  "HIVE_CATALOG"
+    );
+    ```
+
+2. 创建一个 Iceberg 数据库,用于挂载远端对应 Iceberg 数据库,同时挂载该 database 下的所有 table。  
+   具体相关语法,可以通过 [CREATE DATABASE](../../sql-manual/sql-reference-v2/Data-Definition-Statements/Create/CREATE-DATABASE.html) 查看。
+
+    ```sql
+    -- 语法
+    CREATE DATABASE db_name 
+    [COMMENT "comment"]
+    PROPERTIES (
+    "iceberg.database" = "iceberg_db_name",
+    "iceberg.hive.metastore.uris" = "thrift://192.168.0.1:9083",
+    "iceberg.catalog.type" = "HIVE_CATALOG"
+    );
+
+    -- 例子:挂载 Iceberg 中的 iceberg_db,同时挂载该 db 下的所有 table
+    CREATE DATABASE `iceberg_test_db`
+    PROPERTIES (
+    "iceberg.database" = "iceberg_db",
+    "iceberg.hive.metastore.uris" = "thrift://192.168.0.1:9083",
+    "iceberg.catalog.type" = "HIVE_CATALOG"
+    );
+    ```
+
+   `iceberg_test_db` 中的建表进度可以通过 `HELP SHOW TABLE CREATION` 查看。
+
+也可以根据自己的需求明确指定列定义来创建 Iceberg 外表。
+
+1. 创一个 Iceberg 外表
+
+    ```sql
+    -- 语法
+    CREATE [EXTERNAL] TABLE table_name (
+        col_name col_type [NULL | NOT NULL] [COMMENT "comment"]
+    ) ENGINE = ICEBERG
+    [COMMENT "comment"]
+    PROPERTIES (
+    "iceberg.database" = "iceberg_db_name",
+    "iceberg.table" = "icberg_table_name",
+    "iceberg.hive.metastore.uris"  =  "thrift://192.168.0.1:9083",
+    "iceberg.catalog.type"  =  "HIVE_CATALOG"
+    );
+
+    -- 例子:挂载 Iceberg 中 iceberg_db 下的 iceberg_table 
+    CREATE TABLE `t_iceberg` (
+        `id` int NOT NULL COMMENT "id number",
+        `name` varchar(10) NOT NULL COMMENT "user name"
+    ) ENGINE = ICEBERG
+    PROPERTIES (
+    "iceberg.database" = "iceberg_db",
+    "iceberg.table" = "iceberg_table",
+    "iceberg.hive.metastore.uris"  =  "thrift://192.168.0.1:9083",
+    "iceberg.catalog.type"  =  "HIVE_CATALOG"
+    );
+    ```
+
+#### 参数说明:
+
+- 外表列
+    - 列名要于 Iceberg 表一一对应
+    - 列的顺序需要与 Iceberg 表一致
+- ENGINE 需要指定为 ICEBERG
+- PROPERTIES 属性:
+    - `iceberg.hive.metastore.uris`:Hive Metastore 服务地址
+    - `iceberg.database`:挂载 Iceberg 对应的数据库名
+    - `iceberg.table`:挂载 Iceberg 对应的表名,挂载 Iceberg database 时无需指定。
+    - `iceberg.catalog.type`:Iceberg 中使用的 catalog 方式,默认为 `HIVE_CATALOG`,当前仅支持该方式,后续会支持更多的 Iceberg catalog 接入方式。
+
+### 展示表结构
+
+展示表结构可以通过 [SHOW CREATE TABLE](../../sql-manual/sql-reference-v2/Show-Statements/SHOW-CREATE-TABLE.html) 查看。
+
+### 同步挂载
+
+当 Iceberg 表 Schema 发生变更时,可以通过 `REFRESH` 命令手动同步,该命令会将 Doris 中的 Iceberg 外表删除重建,具体帮助可以通过 `HELP REFRESH` 查看。
+
+```sql
+-- 同步 Iceberg 表
+REFRESH TABLE t_iceberg;
+
+-- 同步 Iceberg 数据库
+REFRESH DATABASE iceberg_test_db;
+```
+
+## 类型匹配
+
+支持的 Iceberg 列类型与 Doris 对应关系如下表:
+
+|  Iceberg  | Doris  |             描述              |
+| :------: | :----: | :-------------------------------: |
+|   BOOLEAN  | BOOLEAN  |                         |
+|   INTEGER   |  INT  |                       |
+|   LONG | BIGINT |              |
+|   FLOAT   | FLOAT |  |
+|   DOUBLE  | DOUBLE |  |
+|   DATE  | DATE |  |
+|   TIMESTAMP   |  DATETIME  | Timestamp 转成 Datetime 会损失精度 |
+|   STRING   |  STRING  |                                   |
+|   UUID  | VARCHAR | 使用 VARCHAR 来代替 | 
+|   DECIMAL  | DECIMAL |  |
+|   TIME  | - | 不支持 |
+|   FIXED  | - | 不支持 |
+|   BINARY  | - | 不支持 |
+|   STRUCT  | - | 不支持 |
+|   LIST  | - | 不支持 |
+|   MAP  | - | 不支持 |
+
+**注意:**
+- Iceberg 表 Schema 变更**不会自动同步**,需要在 Doris 中通过 `REFRESH` 命令同步 Iceberg 外表或数据库。
+- 当前默认支持的 Iceberg 版本为 0.12.0,未在其他版本进行测试。后续后支持更多版本。
+
+### 查询用法
+
+完成在 Doris 中建立 Iceberg 外表后,除了无法使用 Doris 中的数据模型(rollup、预聚合、物化视图等)外,与普通的 Doris OLAP 表并无区别
+
+```sql
+select * from t_iceberg where k1 > 1000 and k3 ='term' or k4 like '%doris';
+```
+
+## 相关系统配置
+
+### FE配置
+
+下面几个配置属于 Iceberg 外表系统级别的配置,可以通过修改 `fe.conf` 来配置,也可以通过 `ADMIN SET CONFIG` 来配置。
+
+- `iceberg_table_creation_strict_mode`
+
+  创建 Iceberg 表默认开启 strict mode。  
+  strict mode 是指对 Iceberg 表的列类型进行严格过滤,如果有 Doris 目前不支持的数据类型,则创建外表失败。
+
+- `iceberg_table_creation_interval_second`
+
+  自动创建 Iceberg 表的后台任务执行间隔,默认为 10s。
+
+- `max_iceberg_table_creation_record_size`
+
+  Iceberg 表创建记录保留的最大值,默认为 2000. 仅针对创建 Iceberg 数据库记录。
diff --git a/new-docs/zh-CN/ecosystem/external-table/odbc-of-doris.md b/new-docs/zh-CN/ecosystem/external-table/odbc-of-doris.md
index 53ea3f3add..c06086d5a9 100644
--- a/new-docs/zh-CN/ecosystem/external-table/odbc-of-doris.md
+++ b/new-docs/zh-CN/ecosystem/external-table/odbc-of-doris.md
@@ -24,4 +24,346 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# ODBC External Table Of Doris
\ No newline at end of file
+# ODBC External Table Of Doris
+
+ODBC External Table Of Doris 提供了Doris通过数据库访问的标准接口(ODBC)来访问外部表,外部表省去了繁琐的数据导入工作,让Doris可以具有了访问各式数据库的能力,并借助Doris本身的OLAP的能力来解决外部表的数据分析问题:
+
+1. 支持各种数据源接入Doris
+2. 支持Doris与各种数据源中的表联合查询,进行更加复杂的分析操作
+3. 通过insert into将Doris执行的查询结果写入外部的数据源
+
+本文档主要介绍该功能的实现原理、使用方式等。
+
+## 名词解释
+
+### Doris相关
+* FE:Frontend,Doris 的前端节点,负责元数据管理和请求接入
+* BE:Backend,Doris 的后端节点,负责查询执行和数据存储
+
+## 使用方法
+
+### Doris中创建ODBC的外表
+
+具体建表语法参照:[CREATE TABLE](../../sql-manual/sql-reference-v2/Data-Definition-Statements/Create/CREATE-TABLE.html)
+
+#### 1. 不使用Resource创建ODBC的外表
+
+```
+CREATE EXTERNAL TABLE `baseall_oracle` (
+  `k1` decimal(9, 3) NOT NULL COMMENT "",
+  `k2` char(10) NOT NULL COMMENT "",
+  `k3` datetime NOT NULL COMMENT "",
+  `k5` varchar(20) NOT NULL COMMENT "",
+  `k6` double NOT NULL COMMENT ""
+) ENGINE=ODBC
+COMMENT "ODBC"
+PROPERTIES (
+"host" = "192.168.0.1",
+"port" = "8086",
+"user" = "test",
+"password" = "test",
+"database" = "test",
+"table" = "baseall",
+"driver" = "Oracle 19 ODBC driver",
+"odbc_type" = "oracle"
+);
+```
+
+#### 2. 通过ODBC_Resource来创建ODBC外表 (推荐使用的方式)
+```
+CREATE EXTERNAL RESOURCE `oracle_odbc`
+PROPERTIES (
+"type" = "odbc_catalog",
+"host" = "192.168.0.1",
+"port" = "8086",
+"user" = "test",
+"password" = "test",
+"database" = "test",
+"odbc_type" = "oracle",
+"driver" = "Oracle 19 ODBC driver"
+);
+     
+CREATE EXTERNAL TABLE `baseall_oracle` (
+  `k1` decimal(9, 3) NOT NULL COMMENT "",
+  `k2` char(10) NOT NULL COMMENT "",
+  `k3` datetime NOT NULL COMMENT "",
+  `k5` varchar(20) NOT NULL COMMENT "",
+  `k6` double NOT NULL COMMENT ""
+) ENGINE=ODBC
+COMMENT "ODBC"
+PROPERTIES (
+"odbc_catalog_resource" = "oracle_odbc",
+"database" = "test",
+"table" = "baseall"
+);
+```
+参数说明:
+
+参数 | 说明
+---|---
+**hosts** | 外表数据库的IP地址
+**driver** | ODBC外表的Driver名,该名字需要和be/conf/odbcinst.ini中的Driver名一致。
+**odbc_type** | 外表数据库的类型,当前支持oracle, mysql, postgresql
+**user** | 外表数据库的用户名
+**password** | 对应用户的密码信息
+
+
+
+##### ODBC Driver的安装和配置
+
+各大主流数据库都会提供ODBC的访问Driver,用户可以执行参照参照各数据库官方推荐的方式安装对应的ODBC Driver LiB库。
+
+
+安装完成之后,查找对应的数据库的Driver Lib库的路径,并且修改be/conf/odbcinst.ini的配置:
+```
+[MySQL Driver]
+Description     = ODBC for MySQL
+Driver          = /usr/lib64/libmyodbc8w.so
+FileUsage       = 1 
+```
+* 上述配置`[]`里的对应的是Driver名,在建立外部表时需要保持外部表的Driver名和配置文件之中的一致。
+* `Driver=`  这个要根据实际BE安装Driver的路径来填写,本质上就是一个动态库的路径,这里需要保证该动态库的前置依赖都被满足。
+
+**切记,这里要求所有的BE节点都安装上相同的Driver,并且安装路径相同,同时有相同的be/conf/odbcinst.ini的配置。**
+
+
+### 查询用法
+
+完成在Doris中建立ODBC外表后,除了无法使用Doris中的数据模型(rollup、预聚合、物化视图等)外,与普通的Doris表并无区别
+
+
+```
+select * from oracle_table where k1 > 1000 and k3 ='term' or k4 like '%doris';
+```
+
+### 数据写入
+
+在Doris中建立ODBC外表后,可以通过insert into语句直接写入数据,也可以将Doris执行完查询之后的结果写入ODBC外表,或者是从一个ODBC外表将数据导入另一个ODBC外表。
+
+
+```
+insert into oracle_table values(1, "doris");
+insert into oracle_table select * from postgre_table;
+```
+#### 事务
+
+Doris的数据是由一组batch的方式写入外部表的,如果中途导入中断,之前写入数据可能需要回滚。所以ODBC外表支持数据写入时的事务,事务的支持需要通过session variable:`enable_odbc_transcation `设置。
+
+```
+set enable_odbc_transcation = true; 
+```
+
+事务保证了ODBC外表数据写入的原子性,但是一定程度上会降低数据写入的性能,可以考虑酌情开启该功能。
+
+## 数据库ODBC版本对应关系
+
+### Centos操作系统
+
+使用的unixODBC版本是:2.3.1,Doris 0.15,centos 7.9,全部使用yum方式安装。
+
+#### 1.mysql
+
+| Mysql版本 | Mysql ODBC版本 |
+| --------- | -------------- |
+| 8.0.27    | 8.0.27,8.026   |
+| 5.7.36    | 5.3.11,5.3.13  |
+| 5.6.51    | 5.3.11,5.3.13  |
+| 5.5.62    | 5.3.11,5.3.13  |
+
+#### 2.PostgreSQL
+
+PostgreSQL的yum 源 rpm包地址:
+
+```
+https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
+```
+
+这里面包含PostgreSQL从9.x 到 14.x的全部版本,包括对应的ODBC版本,可以根据需要选择安装。
+
+| PostgreSQL版本 | PostgreSQL ODBC版本          |
+| -------------- | ---------------------------- |
+| 12.9           | postgresql12-odbc-13.02.0000 |
+| 13.5           | postgresql13-odbc-13.02.0000 |
+| 14.1           | postgresql14-odbc-13.02.0000 |
+| 9.6.24         | postgresql96-odbc-13.02.0000 |
+| 10.6           | postgresql10-odbc-13.02.0000 |
+| 11.6           | postgresql11-odbc-13.02.0000 |
+
+#### 3.Oracle
+
+| Oracle版本                                                   | Oracle ODBC版本                            |
+| ------------------------------------------------------------ | ------------------------------------------ |
+| Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production | oracle-instantclient19.13-odbc-19.13.0.0.0 |
+| Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production | oracle-instantclient19.13-odbc-19.13.0.0.0 |
+| Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production | oracle-instantclient19.13-odbc-19.13.0.0.0 |
+| Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production | oracle-instantclient19.13-odbc-19.13.0.0.0 |
+| Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production | oracle-instantclient19.13-odbc-19.13.0.0.0 |
+
+Oracle ODBC驱动版本下载地址:
+
+```
+https://download.oracle.com/otn_software/linux/instantclient/1913000/oracle-instantclient19.13-sqlplus-19.13.0.0.0-2.x86_64.rpm
+https://download.oracle.com/otn_software/linux/instantclient/1913000/oracle-instantclient19.13-devel-19.13.0.0.0-2.x86_64.rpm
+https://download.oracle.com/otn_software/linux/instantclient/1913000/oracle-instantclient19.13-odbc-19.13.0.0.0-2.x86_64.rpm
+https://download.oracle.com/otn_software/linux/instantclient/1913000/oracle-instantclient19.13-basic-19.13.0.0.0-2.x86_64.rpm
+```
+
+### Ubuntu操作系统
+
+使用的unixODBC版本是:2.3.4,Doris 0.15,Ubuntu 20.04
+
+#### 1.Mysql
+
+| Mysql版本 | Mysql ODBC版本 |
+| --------- | -------------- |
+| 8.0.27    | 8.0.11,5.3.13  |
+
+目前只测试了这一个版本其他版本测试后补充
+
+#### 2.PostgreSQL
+
+| PostgreSQL版本 | PostgreSQL ODBC版本 |
+| -------------- | ------------------- |
+| 12.9           | psqlodbc-12.02.0000 |
+
+其他版本只要下载和数据库大版本相符合的ODBC驱动版本,问题不大,这块后续会持续补充其他版本在Ubuntu系统下的测试结果。
+
+#### 3.Oracle
+
+同上Centos操作系统的Oracle数据库及ODBC对应关系,在ubuntu下安装rpm软件包使用下面方式。
+
+为了在ubuntu下可以进行安装rpm包,我们还需要安装一个alien,这是一个可以将rpm包转换成deb安装包的工具
+
+```
+sudo apt-get install alien
+```
+
+然后执行安装上面四个包
+
+```
+sudo alien -i  oracle-instantclient19.13-basic-19.13.0.0.0-2.x86_64.rpm
+sudo alien -i  oracle-instantclient19.13-devel-19.13.0.0.0-2.x86_64.rpm
+sudo alien -i  oracle-instantclient19.13-odbc-19.13.0.0.0-2.x86_64.rpm
+sudo alien -i  oracle-instantclient19.13-sqlplus-19.13.0.0.0-2.x86_64.rpm
+```
+
+
+## 类型匹配
+
+各个数据库之间数据类型存在不同,这里列出了各个数据库中的类型和Doris之中数据类型匹配的情况。
+
+### MySQL
+
+|  MySQL  | Doris  |             替换方案              |
+| :------: | :----: | :-------------------------------: |
+|  BOOLEAN  | BOOLEAN  |                         |
+|   CHAR   |  CHAR  |            当前仅支持UTF8编码            |
+| VARCHAR | VARCHAR |       当前仅支持UTF8编码       |
+|   DATE   |  DATE  |                                   |
+|  FLOAT   |  FLOAT  |                                   |
+|   TINYINT   | TINYINT |  |
+|   SMALLINT  | SMALLINT |  |
+|   INT  | INT |  |
+|   BIGINT  | BIGINT |  |
+|   DOUBLE  | DOUBLE |  |
+|   DATETIME  | DATETIME |  |
+|   DECIMAL  | DECIMAL |  |
+
+### PostgreSQL
+
+|  PostgreSQL  | Doris  |             替换方案              |
+| :------: | :----: | :-------------------------------: |
+|  BOOLEAN  | BOOLEAN  |                         |
+|   CHAR   |  CHAR  |            当前仅支持UTF8编码            |
+| VARCHAR | VARCHAR |       当前仅支持UTF8编码       |
+|   DATE   |  DATE  |                                   |
+|  REAL   |  FLOAT  |                                   |
+|   SMALLINT  | SMALLINT |  |
+|   INT  | INT |  |
+|   BIGINT  | BIGINT |  |
+|   DOUBLE  | DOUBLE |  |
+|   TIMESTAMP  | DATETIME |  |
+|   DECIMAL  | DECIMAL |  |
+
+### Oracle
+
+|  Oracle  | Doris  |             替换方案              |
+| :------: | :----: | :-------------------------------: |
+|  不支持 | BOOLEAN  |          Oracle可用number(1) 替换boolean               |
+|   CHAR   |  CHAR  |                       |
+| VARCHAR | VARCHAR |              |
+|   DATE   |  DATE  |                                   |
+|  FLOAT   |  FLOAT  |                                   |
+|  无   | TINYINT | Oracle可由NUMMBER替换 |
+|   SMALLINT  | SMALLINT |  |
+|   INT  | INT |  |
+|   无  | BIGINT |  Oracle可由NUMMBER替换 |
+|   无  | DOUBLE | Oracle可由NUMMBER替换 |
+|   DATETIME  | DATETIME |  |
+|   NUMBER  | DECIMAL |  |
+
+### SQLServer
+
+| SQLServer  | Doris  |             替换方案              |
+| :------: | :----: | :-------------------------------: |
+|  BOOLEAN  | BOOLEAN  |                         |
+|   CHAR   |  CHAR  |            当前仅支持UTF8编码            |
+| VARCHAR | VARCHAR |       当前仅支持UTF8编码       |
+|   DATE   |  DATE  |                                   |
+|  REAL   |  FLOAT  |                                   |
+|   TINYINT   | TINYINT |  |
+|   SMALLINT  | SMALLINT |  |
+|   INT  | INT |  |
+|   BIGINT  | BIGINT |  |
+|   FLOAT  | DOUBLE |  |
+|   DATETIME/DATETIME2  | DATETIME |  |
+|   DECIMAL/NUMERIC | DECIMAL |  |
+
+## 最佳实践
+
+适用于少数据量的同步
+
+例如Mysql中一张表有100万数据,想同步到doris,就可以采用ODBC的方式将数据映射过来,在使用[insert into](http://localhost:8080/zh-CN/data-operate/import/import-way/insert-into-manual.html) 方式将数据同步到Doris中,如果想同步大批量数据,可以分批次使用[insert into](http://localhost:8080/zh-CN/data-operate/import/import-way/insert-into-manual.html)同步(不建议使用)
+
+## Q&A
+
+1. 与原先的MySQL外表的关系
+
+   在接入ODBC外表之后,原先的访问MySQL外表的方式将被逐渐弃用。如果之前没有使用过MySQL外表,建议新接入的MySQL表直接使用ODBC的MySQL外表。
+
+2. 除了MySQL,Oracle,PostgreSQL,SQLServer是否能够支持更多的数据库
+
+   目前Doris只适配了MySQL,Oracle,PostgreSQL,SQLServer,关于其他的数据库的适配工作正在规划之中,原则上来说任何支持ODBC访问的数据库都能通过ODBC外表来访问。如果您有访问其他外表的需求,欢迎修改代码并贡献给Doris。
+
+3. 什么场合适合通过外表访问
+
+   通常在外表数据量较小,少于100W条时,可以通过外部表的方式访问。由于外表无法发挥Doris在存储引擎部分的能力和会带来额外的网络开销,所以建议根据实际对查询的访问时延要求来确定是否通过外部表访问还是将数据导入Doris之中。
+
+4. 通过Oracle访问出现乱码
+
+   尝试在BE启动脚本之中添加如下参数:`export NLS_LANG=AMERICAN_AMERICA.AL32UTF8`, 并重新启动所有BE
+
+5. ANSI Driver or Unicode Driver ?
+
+   当前ODBC支持ANSI 与 Unicode 两种Driver形式,当前Doris只支持Unicode Driver。如果强行使用ANSI Driver可能会导致查询结果出错。
+
+6. 报错 `driver connect Err: 01000 [unixODBC][Driver Manager]Can't open lib 'Xxx' : file not found (0)`
+
+   没有在每一个BE上安装好对应数据的Driver,或者是没有在be/conf/odbcinst.ini配置正确的路径,亦或是建表是Driver名与be/conf/odbcinst.ini不同
+
+7. 报错 `Fail to convert odbc value 'PALO ' TO INT on column:'A'`
+
+   ODBC外表的A列类型转换出错,说明外表的实际列与ODBC的映射列的数据类型不同,需要修改列的类型映射
+
+8. 同时使用旧的MySQL表与ODBC外表的Driver时出现程序Crash
+
+   这个是MySQL数据库的Driver与现有Doris依赖MySQL外表的兼容问题。推荐解决的方式如下:
+    * 方式1:通过ODBC外表替换旧的MySQL外表,并重新编译BE,关闭WITH_MYSQL的选项
+    * 方式2:不使用最新8.X的MySQL的ODBC Driver,而是使用5.X的MySQL的ODBC Driver
+
+9. 过滤条件下推
+   当前ODBC外表支持过滤条件下推,目前MySQL的外表是能够支持所有条件下推的。其他的数据库的函数与Doris不同会导致下推查询失败。目前除MySQL外表之外,其他的数据库不支持函数调用的条件下推。Doris是否将所需过滤条件下推,可以通过`explain` 查询语句进行确认。
+
+10. 报错`driver connect Err: xxx`
+
+    通常是连接数据库失败,Err部分代表了不同的数据库连接失败的报错。这种情况通常是配置存在问题。可以检查是否错配了ip地址,端口或账号密码。
diff --git a/new-docs/zh-CN/ecosystem/flink-doris-connector.md b/new-docs/zh-CN/ecosystem/flink-doris-connector.md
index 9004af3062..735db286cf 100644
--- a/new-docs/zh-CN/ecosystem/flink-doris-connector.md
+++ b/new-docs/zh-CN/ecosystem/flink-doris-connector.md
@@ -26,4 +26,501 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# Flink Doris Connector
\ No newline at end of file
+# Flink Doris Connector
+
+Flink Doris Connector 可以支持通过 Flink 操作(读取、插入、修改、删除) Doris 中存储的数据。
+
+代码库地址:https://github.com/apache/incubator-doris-flink-connector
+
+* 可以将 `Doris` 表映射为 `DataStream` 或者 `Table`。
+
+>**注意:**
+>
+>1. 修改和删除只支持在 Unique Key 模型上
+>2. 目前的删除是支持 Flink CDC 的方式接入数据实现自动删除,如果是其他数据接入的方式删除需要自己实现。Flink CDC 的数据删除使用方式参照本文档最后一节
+
+## 版本兼容
+
+| Connector | Flink | Doris  | Java | Scala |
+| --------- | ----- | ------ | ---- | ----- |
+| 1.11.6-2.12-xx | 1.11.x | 0.13+  | 8    | 2.12  |
+| 1.12.7-2.12-xx | 1.12.x | 0.13.+ | 8 | 2.12 |
+| 1.13.5-2.12-xx | 1.13.x | 0.13.+ | 8 | 2.12 |
+| 1.14.4-2.12-xx | 1.14.x | 0.13.+ | 8 | 2.12 |
+
+## 编译与安装
+
+准备工作
+
+1.修改`custom_env.sh.tpl`文件,重命名为`custom_env.sh`
+
+2.指定thrift安装目录
+
+```bash
+##源文件内容
+#export THRIFT_BIN=
+#export MVN_BIN=
+#export JAVA_HOME=
+
+##修改如下
+export THRIFT_BIN=./thirdparty/installed/bin
+#export MVN_BIN=
+#export JAVA_HOME=
+
+安装 `thrift` 0.13.0 版本(注意:`Doris` 0.15 和最新的版本基于 `thrift` 0.13.0 构建, 之前的版本依然使用`thrift` 0.9.3 构建)
+ Windows: 
+    1. 下载:`http://archive.apache.org/dist/thrift/0.13.0/thrift-0.13.0.exe`
+    2. 拷贝:将文件拷贝至 `./thirdparty/installed/bin`
+ 
+ MacOS: 
+    1. 下载:`brew install thrift@0.13.0`
+    2. 建立软链接: 
+       `mkdir -p ./thirdparty/installed/bin`
+       `ln -s /opt/homebrew/Cellar/thrift@0.13.0/0.13.0/bin/thrift ./thirdparty/installed/bin/thrift`
+ 
+ 注:MacOS执行 `brew install thrift@0.13.0` 可能会报找不到版本的错误,解决方法如下,在终端执行:
+    1. `brew tap-new $USER/local-tap`
+    2. `brew extract --version='0.13.0' thrift $USER/local-tap`
+    3. `brew install thrift@0.13.0`
+ 参考链接: `https://gist.github.com/tonydeng/02e571f273d6cce4230dc8d5f394493c`
+ 
+ Linux:
+    1.下载源码包:`wget https://archive.apache.org/dist/thrift/0.13.0/thrift-0.13.0.tar.gz`
+    2.安装依赖:`yum install -y autoconf automake libtool cmake ncurses-devel openssl-devel lzo-devel zlib-devel gcc gcc-c++`
+    3.`tar zxvf thrift-0.13.0.tar.gz`
+    4.`cd thrift-0.13.0`
+    5.`./configure --without-tests`
+    6.`make`
+    7.`make install`
+   安装完成后查看版本:thrift --version    
+```
+
+在源码目录下执行:
+
+```bash
+sh build.sh
+
+  Usage:
+    build.sh --flink version --scala version # specify flink and scala version
+    build.sh --tag                           # this is a build from tag
+  e.g.:
+    build.sh --flink 1.14.3 --scala 2.12
+    build.sh --tag
+
+然后按照你需要版本执行命令编译即可,例如:
+sh build.sh --flink 1.14.3 --scala 2.12
+```
+
+> 注:如果你是从 tag 检出的源码,则可以直接执行 `sh build.sh --tag`,而无需指定 flink 和 scala 的版本。因为 tag 源码中的版本是固定的。比如 `1.13.5-2.12-1.0.1` 表示 flink 版本 1.13.5,scala 版本 2.12,connector 版本 1.0.1。
+
+编译成功后,会在 `target/` 目录下生成文件,如:`flink-doris-connector-1.14_2.12-1.0.0-SNAPSHOT.jar` 。将此文件复制到 `Flink` 的 `ClassPath` 中即可使用 `Flink-Doris-Connector` 。例如, `Local` 模式运行的 `Flink` ,将此文件放入 `jars/` 文件夹下。 `Yarn` 集群模式运行的 `Flink` ,则将此文件放入预部署包中。
+
+**备注**
+
+1. Doris FE 要在配置中配置启用 http v2
+2. Scala 版本目前只支持 2.12.x 版本
+
+conf/fe.conf
+
+```
+enable_http_server_v2 = true
+```
+
+## 使用 Maven 管理
+
+添加 flink-doris-connector 和必要的 Flink Maven 依赖
+
+Flink 1.13.* 及以前的版本
+```
+<dependency>
+    <groupId>org.apache.flink</groupId>
+    <artifactId>flink-java</artifactId>
+    <version>${flink.version}</version>
+    <scope>provided</scope>
+</dependency>
+<dependency>
+    <groupId>org.apache.flink</groupId>
+    <artifactId>flink-streaming-java_${scala.version}</artifactId>
+    <version>${flink.version}</version>
+    <scope>provided</scope>
+</dependency>
+<dependency>
+    <groupId>org.apache.flink</groupId>
+    <artifactId>flink-clients_${scala.version}</artifactId>
+    <version>${flink.version}</version>
+    <scope>provided</scope>
+</dependency>
+<!-- flink table -->
+<dependency>
+    <groupId>org.apache.flink</groupId>
+    <artifactId>flink-table-common</artifactId>
+    <version>${flink.version}</version>
+    <scope>provided</scope>
+</dependency>
+<dependency>
+    <groupId>org.apache.flink</groupId>
+    <artifactId>flink-table-api-java-bridge_${scala.version}</artifactId>
+    <version>${flink.version}</version>
+    <scope>provided</scope>
+</dependency>
+<dependency>
+    <groupId>org.apache.flink</groupId>
+    <artifactId>flink-table-planner-blink_${scala.version}</artifactId>
+    <version>${flink.version}</version>
+    <scope>provided</scope>
+</dependency>
+<!-- flink-doris-connector -->
+<dependency>
+  <groupId>org.apache.doris</groupId>
+  <artifactId>flink-doris-connector-1.13_2.12</artifactId>
+  <!--artifactId>flink-doris-connector-1.12_2.12</artifactId-->
+  <!--artifactId>flink-doris-connector-1.11_2.12</artifactId-->
+  <version>1.0.3</version>
+</dependency>    
+```
+Flink 1.14.* 版本
+```
+<dependency>
+    <groupId>org.apache.flink</groupId>
+    <artifactId>flink-java</artifactId>
+    <version>${flink.version}</version>
+    <scope>provided</scope>
+</dependency>
+<dependency>
+    <groupId>org.apache.flink</groupId>
+    <artifactId>flink-streaming-java_${scala.version}</artifactId>
+    <version>${flink.version}</version>
+    <scope>provided</scope>
+</dependency>
+<dependency>
+    <groupId>org.apache.flink</groupId>
+    <artifactId>flink-clients_${scala.version}</artifactId>
+    <version>${flink.version}</version>
+    <scope>provided</scope>
+</dependency>
+<!-- flink table -->
+<dependency>
+    <groupId>org.apache.flink</groupId>
+    <artifactId>flink-table-planner_${scala.version}</artifactId>
+    <version>${flink.version}</version>
+    <scope>provided</scope>
+</dependency>
+<!-- flink-doris-connector -->
+<dependency>
+  <groupId>org.apache.doris</groupId>
+  <artifactId>flink-doris-connector-1.14_2.12</artifactId>
+  <version>1.0.3</version>
+</dependency>  
+```
+
+**备注**
+
+请根据不同的 Flink 和 Scala 版本替换对应的 Connector 和 Flink 依赖版本。
+
+## 使用方法
+
+Flink 读写 Doris 数据主要有三种方式
+
+* SQL
+* DataStream
+* DataSet
+
+### 参数配置
+
+Flink Doris Connector Sink 的内部实现是通过 `Stream Load` 服务向 Doris 写入数据, 同时也支持 `Stream Load` 请求参数的配置设定
+
+参数配置方法
+* SQL 使用 `WITH` 参数 `sink.properties.` 配置
+* DataStream 使用方法`DorisExecutionOptions.builder().setStreamLoadProp(Properties)`配置
+
+### SQL
+
+* Source
+
+```sql
+CREATE TABLE flink_doris_source (
+    name STRING,
+    age INT,
+    price DECIMAL(5,2),
+    sale DOUBLE
+    ) 
+    WITH (
+      'connector' = 'doris',
+      'fenodes' = '$YOUR_DORIS_FE_HOSTNAME:$YOUR_DORIS_FE_RESFUL_PORT',
+      'table.identifier' = '$YOUR_DORIS_DATABASE_NAME.$YOUR_DORIS_TABLE_NAME',
+      'username' = '$YOUR_DORIS_USERNAME',
+      'password' = '$YOUR_DORIS_PASSWORD'
+);
+```
+
+* Sink
+
+```sql
+CREATE TABLE flink_doris_sink (
+    name STRING,
+    age INT,
+    price DECIMAL(5,2),
+    sale DOUBLE
+    ) 
+    WITH (
+      'connector' = 'doris',
+      'fenodes' = '$YOUR_DORIS_FE_HOSTNAME:$YOUR_DORIS_FE_RESFUL_PORT',
+      'table.identifier' = '$YOUR_DORIS_DATABASE_NAME.$YOUR_DORIS_TABLE_NAME',
+      'username' = '$YOUR_DORIS_USERNAME',
+      'password' = '$YOUR_DORIS_PASSWORD'
+);
+```
+
+* Insert
+
+```sql
+INSERT INTO flink_doris_sink select name,age,price,sale from flink_doris_source
+```
+
+### DataStream
+
+* Source
+
+```java
+ Properties properties = new Properties();
+ properties.put("fenodes","FE_IP:8030");
+ properties.put("username","root");
+ properties.put("password","");
+ properties.put("table.identifier","db.table");
+ env.addSource(new DorisSourceFunction(
+                        new DorisStreamOptions(properties), 
+                        new SimpleListDeserializationSchema()
+                )
+        ).print();
+```
+
+* Sink
+
+Json 数据流
+
+```java
+Properties pro = new Properties();
+pro.setProperty("format", "json");
+pro.setProperty("strip_outer_array", "true");
+env.fromElements( 
+    "{\"longitude\": \"116.405419\", \"city\": \"北京\", \"latitude\": \"39.916927\"}"
+    )
+     .addSink(
+     	DorisSink.sink(
+            DorisReadOptions.builder().build(),
+         	DorisExecutionOptions.builder()
+                    .setBatchSize(3)
+                    .setBatchIntervalMs(0l)
+                    .setMaxRetries(3)
+                    .setStreamLoadProp(pro).build(),
+         	DorisOptions.builder()
+                    .setFenodes("FE_IP:8030")
+                    .setTableIdentifier("db.table")
+                    .setUsername("root")
+                    .setPassword("").build()
+     	));
+
+```
+
+Json 数据流
+
+```java
+env.fromElements(
+    "{\"longitude\": \"116.405419\", \"city\": \"北京\", \"latitude\": \"39.916927\"}"
+    )
+    .addSink(
+    	DorisSink.sink(
+        	DorisOptions.builder()
+                    .setFenodes("FE_IP:8030")
+                    .setTableIdentifier("db.table")
+                    .setUsername("root")
+                    .setPassword("").build()
+    	));
+```
+
+RowData 数据流
+
+```java
+DataStream<RowData> source = env.fromElements("")
+    .map(new MapFunction<String, RowData>() {
+        @Override
+        public RowData map(String value) throws Exception {
+            GenericRowData genericRowData = new GenericRowData(3);
+            genericRowData.setField(0, StringData.fromString("北京"));
+            genericRowData.setField(1, 116.405419);
+            genericRowData.setField(2, 39.916927);
+            return genericRowData;
+        }
+    });
+
+String[] fields = {"city", "longitude", "latitude"};
+LogicalType[] types = {new VarCharType(), new DoubleType(), new DoubleType()};
+
+source.addSink(
+    DorisSink.sink(
+        fields,
+        types,
+        DorisReadOptions.builder().build(),
+        DorisExecutionOptions.builder()
+            .setBatchSize(3)
+            .setBatchIntervalMs(0L)
+            .setMaxRetries(3)
+            .build(),
+        DorisOptions.builder()
+            .setFenodes("FE_IP:8030")
+            .setTableIdentifier("db.table")
+            .setUsername("root")
+            .setPassword("").build()
+    ));
+```
+
+### DataSet
+
+* Sink
+
+```java
+MapOperator<String, RowData> data = env.fromElements("")
+    .map(new MapFunction<String, RowData>() {
+        @Override
+        public RowData map(String value) throws Exception {
+            GenericRowData genericRowData = new GenericRowData(3);
+            genericRowData.setField(0, StringData.fromString("北京"));
+            genericRowData.setField(1, 116.405419);
+            genericRowData.setField(2, 39.916927);
+            return genericRowData;
+        }
+    });
+
+DorisOptions dorisOptions = DorisOptions.builder()
+    .setFenodes("FE_IP:8030")
+    .setTableIdentifier("db.table")
+    .setUsername("root")
+    .setPassword("").build();
+DorisReadOptions readOptions = DorisReadOptions.defaults();
+DorisExecutionOptions executionOptions = DorisExecutionOptions.defaults();
+
+LogicalType[] types = {new VarCharType(), new DoubleType(), new DoubleType()};
+String[] fields = {"city", "longitude", "latitude"};
+
+DorisDynamicOutputFormat outputFormat = new DorisDynamicOutputFormat(
+    dorisOptions, readOptions, executionOptions, types, fields
+    );
+
+outputFormat.open(0, 1);
+data.output(outputFormat);
+outputFormat.close();
+```
+
+## 配置
+
+### 通用配置项
+
+| Key                              | Default Value     | Comment                                                      |
+| -------------------------------- | ----------------- | ------------------------------------------------------------ |
+| fenodes                    | --                | Doris FE http 地址             |
+| table.identifier    | --                | Doris 表名,如:db1.tbl1                                 |
+| username                            | --            | 访问 Doris 的用户名                                            |
+| password                        | --            | 访问 Doris 的密码                                              |
+| doris.request.retries            | 3                 | 向 Doris 发送请求的重试次数                                    |
+| doris.request.connect.timeout.ms | 30000             | 向 Doris 发送请求的连接超时时间                                |
+| doris.request.read.timeout.ms    | 30000             | 向 Doris 发送请求的读取超时时间                                |
+| doris.request.query.timeout.s    | 3600              | 查询 Doris 的超时时间,默认值为1小时,-1表示无超时限制             |
+| doris.request.tablet.size        | Integer. MAX_VALUE | 一个 Partition 对应的 Doris Tablet 个数。<br />此数值设置越小,则会生成越多的 Partition。从而提升 Flink 侧的并行度,但同时会对 Doris 造成更大的压力。 |
+| doris.batch.size                 | 1024              | 一次从 BE 读取数据的最大行数。增大此数值可减少 Flink 与 Doris 之间建立连接的次数。<br />从而减轻网络延迟所带来的的额外时间开销。 |
+| doris.exec.mem.limit             | 2147483648        | 单个查询的内存限制。默认为 2GB,单位为字节                      |
+| doris.deserialize.arrow.async    | false             | 是否支持异步转换 Arrow 格式到 flink-doris-connector 迭代所需的 RowBatch            |
+| doris.deserialize.queue.size     | 64                | 异步转换 Arrow 格式的内部处理队列,当 doris.deserialize.arrow.async 为 true 时生效        |
+| doris.read.field            | --            | 读取 Doris 表的列名列表,多列之间使用逗号分隔                  |
+| doris.filter.query          | --            | 过滤读取数据的表达式,此表达式透传给 Doris。Doris 使用此表达式完成源端数据过滤。 |
+| sink.batch.size     | 10000              | 单次写 BE 的最大行数        |
+| sink.max-retries     | 1              | 写 BE 失败之后的重试次数       |
+| sink.batch.interval     | 10s               | flush 间隔时间,超过该时间后异步线程将 缓存中数据写入 BE。 默认值为10秒,支持时间单位 ms、 s、 min、 h 和 d。设置为 0 表示关闭定期写入。 |
+| sink.properties.*     | --               | Stream Load 的导入参数<br /><br />例如:<br />'sink.properties.column_separator' = ', '<br />定义列分隔符<br /><br />'sink.properties.escape_delimiters' = 'true'<br />特殊字符作为分隔符,'\\x01'会被转换为二进制的0x01<br /><br /> 'sink.properties.format' = 'json'<br />'sink.properties.strip_outer_array' = 'true' <br /> JSON格式导入|
+| sink.enable-delete     | true               | 是否启用删除。此选项需要 Doris 表开启批量删除功能(0.15+版本默认开启),只支持 Unique 模型。|
+| sink.batch.bytes  | 10485760              | 单次写 BE 的最大数据量,当每个 batch 中记录的数据量超过该阈值时,会将缓存数据写入 BE。默认值为 10MB        |
+## Doris 和 Flink 列类型映射关系
+
+| Doris Type | Flink Type                       |
+| ---------- | -------------------------------- |
+| NULL_TYPE  | NULL              |
+| BOOLEAN    | BOOLEAN       |
+| TINYINT    | TINYINT              |
+| SMALLINT   | SMALLINT              |
+| INT        | INT            |
+| BIGINT     | BIGINT               |
+| FLOAT      | FLOAT              |
+| DOUBLE     | DOUBLE            |
+| DATE       | STRING |
+| DATETIME   | STRING |
+| DECIMAL    | DECIMAL                      |
+| CHAR       | STRING             |
+| LARGEINT   | STRING             |
+| VARCHAR    | STRING            |
+| DECIMALV2  | DECIMAL                      |
+| TIME       | DOUBLE             |
+| HLL        | Unsupported datatype             |
+
+## 使用 Flink CDC 接入 Doris 示例(支持 Insert / Update / Delete 事件)
+```sql
+CREATE TABLE cdc_mysql_source (
+  id int
+  ,name VARCHAR
+  ,PRIMARY KEY (id) NOT ENFORCED
+) WITH (
+ 'connector' = 'mysql-cdc',
+ 'hostname' = '127.0.0.1',
+ 'port' = '3306',
+ 'username' = 'root',
+ 'password' = 'password',
+ 'database-name' = 'database',
+ 'table-name' = 'table'
+);
+
+-- 支持删除事件同步(sink.enable-delete='true'),需要 Doris 表开启批量删除功能
+CREATE TABLE doris_sink (
+id INT,
+name STRING
+) 
+WITH (
+  'connector' = 'doris',
+  'fenodes' = '127.0.0.1:8030',
+  'table.identifier' = 'database.table',
+  'username' = 'root',
+  'password' = '',
+  'sink.properties.format' = 'json',
+  'sink.properties.strip_outer_array' = 'true',
+  'sink.enable-delete' = 'true'
+);
+
+insert into doris_sink select id,name from cdc_mysql_source;
+```
+
+## Java示例
+
+`samples/doris-demo/fink-demo/` 下提供了 Java 版本的示例,可供参考,查看点击[这里](https://github.com/apache/incubator-doris/tree/master/samples/doris-demo/flink-demo)
+
+## 最佳实践
+
+### 应用场景
+
+使用 Flink Doris Connector最适合的场景就是实时/批次同步源数据到Doris(Mysql,Oracle,PostgreSQL)等,使用Flink对Doris中的数据和其他数据源进行联合分析,也可以使用Flink Doris Connector
+
+### 数据量
+
+Flink Doris Connector写入频率主要是通过sink.batch.size,sink.batch.interval和sink.batch.bytes控制
+
+这三个参数用于控制单个任务的执行时间。其中任意一个阈值达到,则任务结束。其中 `sink.batch.size` 用于记录单词写入的数据行数。`sink.batch.interval` 表示间隔多长时间开始写数据,`sink.batch.bytes`,单次写入数据的数据量,单位是字节。目前一个任务的消费速率大约为 5-10MB/s。
+
+那么假设一行数据 500B,用户希望每 100MB 或 10 秒为一个 task。100MB 的预期处理时间是 10-20 秒,对应的行数约为 200000 行。则一个合理的配置为:
+
+```text
+"sink.batch.interval" = "10",
+"sink.batch.size" = "200000",
+"sink.batch.bytes" = "104857600"
+```
+
+### 常见问题
+
+1.Could not execute SQL statement. Reason:java.lang.IllegalAraumenException: Row parity: 32,but serializer rarity:31
+
+因为Doris有个隐藏列,需要手动添加一列`__DORIS_DELETE_SIGN__`  类型:TINYINT
diff --git a/new-docs/zh-CN/ecosystem/logstash.md b/new-docs/zh-CN/ecosystem/logstash.md
index 751900b132..0c595f47c9 100644
--- a/new-docs/zh-CN/ecosystem/logstash.md
+++ b/new-docs/zh-CN/ecosystem/logstash.md
@@ -24,4 +24,175 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# Doris output plugin
\ No newline at end of file
+# Doris output plugin
+
+该插件用于logstash输出数据到Doris,使用 HTTP 协议与 Doris FE Http接口交互,并通过 Doris 的 stream load 的方式进行数据导入.
+
+[了解Doris Stream Load ](../data-operate/import/import-way/stream-load-manual.html)
+
+[了解更多关于Doris](../)
+
+
+## 安装和编译
+### 1.下载插件源码
+
+### 2.编译 ##
+在extension/logstash/ 目录下执行
+
+`gem build logstash-output-doris.gemspec`
+
+你将在同目录下得到 logstash-output-doris-{version}.gem 文件
+
+### 3.插件安装
+copy logstash-output-doris-{version}.gem 到 logstash 安装目录下
+
+执行命令
+
+`./bin/logstash-plugin install logstash-output-doris-{version}.gem`
+
+安装 logstash-output-doris 插件
+
+## 配置
+### 示例:
+
+在config目录下新建一个配置配置文件,命名为 logstash-doris.conf
+
+具体配置如下:
+
+    output {
+        doris {
+            http_hosts => [ "http://fehost:8030" ]
+            user => user_name
+            password => password
+            db => "db_name"
+            table => "table_name"
+            label_prefix => "label_prefix"
+            column_separator => ","
+        }
+    }
+
+配置说明:
+
+连接相关配置:
+
+配置 | 说明
+--- | ---
+`http_hosts` | FE的HTTP交互地址 eg | ["http://fe1:8030", "http://fe2:8030"]
+`user` | 用户名,该用户需要有doris对应库表的导入权限
+`password` | 密码
+`db` | 数据库名
+`table` | 表名
+`label_prefix` | 导入标识前缀,最终生成的标识为 *{label\_prefix}\_{db}\_{table}\_{time_stamp}*
+
+
+导入相关配置:([参考文档](../data-operate/import/import-way/stream-load-manual.html))
+
+配置 | 说明
+--- | ---
+`column_separator` | 列分割符,默认为\t。
+`columns` | 用于指定导入文件中的列和 table 中的列的对应关系。
+`where` | 导入任务指定的过滤条件。
+`max_filter_ratio` | 导入任务的最大容忍率,默认零容忍。
+`partition` | 待导入表的 Partition 信息。
+`timeout` | 超时时间,默认为600s。
+`strict_mode` | 严格模式,默认为false。
+`timezone` | 指定本次导入所使用的时区,默认为东八区。
+`exec_mem_limit` | 导入内存限制,默认为 2GB,单位为字节。
+
+其他配置
+
+配置 | 说明
+--- | ---
+`save_on_failure` | 如果导入失败是否在本地保存,默认为true
+`save_dir` | 本地保存目录,默认为 /tmp
+`automatic_retries` | 失败时重试最大次数,默认为3
+`batch_size` | 每批次最多处理的event数量,默认为100000
+`idle_flush_time` | 最大间隔时间,默认为20(秒)
+
+
+## 启动
+执行命令启动doris output plugin:
+
+`{logstash-home}/bin/logstash -f {logstash-home}/config/logstash-doris.conf --config.reload.automatic`
+
+
+
+
+## 完整使用示例
+### 1.编译doris-output-plugin
+1> 下载ruby压缩包,自行到[ruby官网](https://www.ruby-lang.org/en/downloads/)下载,这里使用的2.7.1版本
+
+2> 编译安装,配置ruby的环境变量
+
+3> 到doris源码 extension/logstash/ 目录下,执行
+
+`gem build logstash-output-doris.gemspec`
+
+得到文件 logstash-output-doris-0.1.0.gem,至此编译完成
+
+### 2.安装配置filebeat(此处使用filebeat作为input)
+
+1> [es官网](https://www.elastic.co/)下载 filebeat tar压缩包并解压
+
+2> 进入filebeat目录下,修改配置文件 filebeat.yml 如下:
+
+	filebeat.inputs:
+	- type: log
+	  paths:
+	    - /tmp/doris.data
+	output.logstash:
+	  hosts: ["localhost:5044"]
+
+/tmp/doris.data 为doris数据路径
+
+3> 启动filebeat:
+
+`./filebeat -e -c filebeat.yml -d "publish"`
+
+
+### 3.安装logstash及doris-out-plugin
+1> [es官网](https://www.elastic.co/)下载 logstash tar压缩包并解压
+
+2> 将步骤1中得到的 logstash-output-doris-0.1.0.gem copy到logstash安装目录下
+
+3> 执行
+
+`./bin/logstash-plugin install logstash-output-doris-0.1.0.gem`
+
+安装插件
+
+4> 在config 目录下新建配置文件 logstash-doris.conf 内容如下:
+
+	input {
+	    beats {
+	        port => "5044"
+	    }
+	}
+	
+	output {
+	    doris {
+	        http_hosts => [ "http://127.0.0.1:8030" ]
+	        user => doris
+	        password => doris
+	        db => "logstash_output_test"
+	        table => "output"
+	        label_prefix => "doris"
+	        column_separator => ","
+	        columns => "a,b,c,d,e"
+	    }
+	}
+
+这里的配置需按照配置说明自行配置
+
+5> 启动logstash:
+
+./bin/logstash -f ./config/logstash-doris.conf --config.reload.automatic
+
+### 4.测试功能
+
+向/tmp/doris.data追加写入数据
+
+`echo a,b,c,d,e >> /tmp/doris.data`
+
+观察logstash日志,若返回response的Status为 Success,则导入成功,此时可在 logstash_output_test.output 表中查看已导入的数据
+
diff --git a/new-docs/zh-CN/ecosystem/plugin-development-manual.md b/new-docs/zh-CN/ecosystem/plugin-development-manual.md
index 6431eae7fe..24857ede56 100644
--- a/new-docs/zh-CN/ecosystem/plugin-development-manual.md
+++ b/new-docs/zh-CN/ecosystem/plugin-development-manual.md
@@ -24,4 +24,289 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# Doris 插件框架
\ No newline at end of file
+# Doris 插件框架
+
+## 介绍
+
+Doris 的插件框架支持在运行时添加/卸载自定义插件,而不需要重启服务,用户可以通过开发自己的插件来扩展Doris的功能。
+
+例如,审计插件作用于 Doris 请求执行后,可以获取到一次请求相关的信息(访问用户,请求IP,SQL等...),并将信息写入到指定的表中。
+
+与UDF的区别:
+* UDF是函数,用于在SQL执行时进行数据计算。插件是附加功能,用于为Doris扩展自定义的功能,例如:支持不同的存储引擎,支持不同的导入方式,插件并不会参与执行SQL时的数据计算。
+* UDF的执行周期仅限于一次SQL执行。插件的执行周期可能与Doris进程相同。
+* 使用场景不同。如果您需要执行SQL时支持特殊的数据算法,那么推荐使用UDF,如果您需要在Doris上运行自定义的功能,或者是启动一个后台线程执行任务,那么推荐使用插件。
+
+目前插件框架仅支持审计类插件。
+
+> 注意:
+> Doris的插件框架是实验性功能, 目前只支持FE插件,且默认是关闭的,可以通过FE配置`plugin_enable=true`打开
+
+## 插件
+
+一个FE的插件可以使一个**zip压缩包**或者是一个**目录**。其内容至少包含两个文件:`plugin.properties` 和 `.jar` 文件。`plugin.properties`用于描述插件信息。
+
+文件结构如下:
+
+```
+# plugin .zip
+auditodemo.zip:
+    -plugin.properties
+    -auditdemo.jar
+    -xxx.config
+    -data/
+    -test_data/
+
+# plugin local directory
+auditodemo/:
+    -plugin.properties
+    -auditdemo.jar
+    -xxx.config
+    -data/
+    -test_data/
+```
+
+`plugin.properties` 内容示例:
+
+```
+### required:
+#
+# the plugin name
+name = audit_plugin_demo
+#
+# the plugin type
+type = AUDIT
+#
+# simple summary of the plugin
+description = just for test
+#
+# Doris's version, like: 0.11.0
+version = 0.11.0
+
+### FE-Plugin optional:
+#
+# version of java the code is built against
+# use the command "java -version" value, like 1.8.0, 9.0.1, 13.0.4
+java.version = 1.8.31
+#
+# the name of the class to load, fully-qualified.
+classname = AuditPluginDemo
+
+### BE-Plugin optional:
+# the name of the so to load
+soName = example.so
+```
+
+## 编写插件
+
+插件的开发环境依赖Doris的开发编译环境。所以请先确保Doris的开发编译环境运行正常。
+
+`fe_plugins` 目录是 FE 插件的根模块。这个根模块统一管理插件所需的依赖。添加一个新的插件,相当于在这个根模块添加一个子模块。
+
+### 创建插件模块
+
+我们可以通过以下命令在 `fe_plugins` 目录创建一个子模块用户实现创建和创建工程。其中 `doris-fe-test` 为插件名称。
+
+```
+mvn archetype: generate -DarchetypeCatalog = internal -DgroupId = org.apache -DartifactId = doris-fe-test -DinteractiveMode = false
+```
+
+这个命令会创建一个新的 maven 工程,并且自动向 `fe_plugins/pom.xml` 中添加一个子模块:
+
+```
+    .....
+    <groupId>org.apache</groupId>
+    <artifactId>doris-fe-plugins</artifactId>
+    <packaging>pom</packaging>
+    <version>1.0-SNAPSHOT</version>
+    <modules>
+        <module>auditdemo</module>
+        # new plugin module
+        <module>doris-fe-test</module>
+    </modules>
+    .....
+```
+
+新的工程目录结构如下:
+
+```
+-doris-fe-test/
+-pom.xml
+-src/
+    ---- main/java/org/apache/
+    ------- App.java # mvn auto generate, ignore
+    ---- test/java/org/apache
+```
+
+接下来我们在 `main` 目录下添加一个 `assembly` 目录来存放 `plugin.properties` 和 `zip.xml`。最终的工程目录结构如下:
+
+```
+-doris-fe-test/
+-pom.xml
+-src/
+---- main/
+------ assembly/
+-------- plugin.properties
+-------- zip.xml
+------ java/org/apache/
+--------App.java # mvn auto generate, ignore
+---- test/java/org/apache
+```
+
+### 添加 zip.xml
+
+`zip.xml` 用于描述最终生成的 zip 压缩包中的文件内容。(如 .jar file, plugin.properties 等等)
+
+```
+<assembly>
+    <id>plugin</id>
+    <formats>
+        <format>zip</format>
+    </formats>
+    <!-IMPORTANT: must be false->
+    <includeBaseDirectory>false</includeBaseDirectory>
+    <fileSets>
+        <fileSet>
+            <directory>target</directory>
+            <includes>
+                <include>*.jar</include>
+            </ ncludes>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
+
+        <fileSet>
+            <directory>src/main/assembly</directory>
+            <includes>
+                <include>plugin.properties</include>
+            </includes>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
+    </fileSets>
+</assembly>
+```
+
+### 更新 pom.xml
+
+接下来我们需要更新子模块的 `pom.xml` 文件,添加 doris-fe 依赖:
+
+```
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>doris-fe-plugins</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>auditloader</artifactId>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <!-- doris-fe dependencies -->
+        <dependency>
+            <groupId>org.apache</groupId>
+            <artifactId>doris-fe</artifactId>
+        </dependency>
+
+        <!-- other dependencies -->
+        <dependency>
+            ...
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>auditloader</finalName>
+        <plugins>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <version>2.4.1</version>
+                <configuration>
+                    <appendAssemblyId>false</appendAssemblyId>
+                    <descriptors>
+                        <descriptor>src/main/assembly/zip.xml</descriptor>
+                    </descriptors>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
+```
+
+### 实现插件
+
+之后我们就可以开始进行插件功能的开发了。插件需要实现 `Plugin` 接口。具体可以参阅 Doris 自带的 `auditdemo` 插件示例代码。
+
+### 编译
+
+在编译插件之前,需要先执行 `sh build.sh --fe` 进行 Doris FE 代码的编译,并确保编译成功。
+
+之后,执行 `sh build_plugin.sh` 编译所有插件。最终的产出会存放在 `fe_plugins/output` 目录中。
+
+或者也可以执行 `sh build_plugin.sh --plugin your_plugin_name` 来仅编译指定的插件。
+
+### 另一种开发方式
+
+您可以直接通过修改自带的 `auditdemo` 插件示例代码进行开发。
+
+## 部署
+
+插件可以通过以下三种方式部署。
+
+* 将 `.zip` 文件放在 Http 或 Https 服务器上。如:`http://xxx.xxx.com/data/my_plugin.zip`, Doris 会下载这个文件。同时需要在properties中设置md5sum的值,或者放置一个和 `.zip` 文件同名的 md5 文件,如 `http://xxx.xxxxxx.com/data/my_plugin.zip.md5`。其中内容为 .zip 文件的 MD5 值。
+* 本地 `.zip` 文件。 如:`/home/work/data/plugin.zip`。如果该插件仅用于 FE,则需部署在所有 FE 节点相同的目录下。否则,需要在所有 FE 和 BE 节点部署。
+* 本地目录。如:`/home/work/data/plugin/`。相当于 `.zip` 文件解压后的目录。如果该插件仅用于 FE,则需部署在所有 FE 节点相同的目录下。否则,需要在所有 FE 和 BE 节点部署。
+
+注意:需保证部署路径在整个插件生命周期内有效。
+
+## 安装和卸载插件
+
+通过如下命令安装和卸载插件。更多帮助请参阅 `HELP INSTALL PLUGIN;` `HELP IUNNSTALL PLUGIN;` `HELP SHOW PLUGINS;`
+
+```
+mysql> install plugin from "/home/users/doris/auditloader.zip";
+Query OK, 0 rows affected (0.09 sec)
+
+mysql> show plugins\G
+*************************** 1. row ***************************
+       Name: auditloader
+       Type: AUDIT
+Description: load audit log to olap load, and user can view the statistic of queries
+    Version: 0.12.0
+JavaVersion: 1.8.31
+  ClassName: AuditLoaderPlugin
+     SoName: NULL
+    Sources: /home/users/doris/auditloader.zip
+     Status: INSTALLED
+ Properties: {}
+*************************** 2. row ***************************
+       Name: AuditLogBuilder
+       Type: AUDIT
+Description: builtin audit logger
+    Version: 0.12.0
+JavaVersion: 1.8.31
+  ClassName: org.apache.doris.qe.AuditLogBuilder
+     SoName: NULL
+    Sources: Builtin
+     Status: INSTALLED
+ Properties: {}   
+2 rows in set (0.00 sec)
+
+mysql> uninstall plugin auditloader;
+Query OK, 0 rows affected (0.05 sec)
+
+mysql> show plugins;
+Empty set (0.00 sec)
+```
diff --git a/new-docs/zh-CN/ecosystem/seatunnel/flink-sink.md b/new-docs/zh-CN/ecosystem/seatunnel/flink-sink.md
index 0b3615d165..c53ff5feb6 100644
--- a/new-docs/zh-CN/ecosystem/seatunnel/flink-sink.md
+++ b/new-docs/zh-CN/ecosystem/seatunnel/flink-sink.md
@@ -24,4 +24,93 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# Seatunnel
\ No newline at end of file
+# Seatunnel
+最新版本的 [Apache SeaTunnel (原 waterdrop )](https://seatunnel.apache.org/zh-CN/) 已经支持 Doris 的连接器, SeaTunnel 可以用过 Spark 引擎和 Flink 引擎同步数据至 Doris 中.
+
+## Flink Sink Doris(2.x)
+Seatunnel Flink Sink Doris [插件代码](https://github.com/apache/incubator-seatunnel/tree/dev/seatunnel-connectors/seatunnel-connectors-flink/seatunnel-connector-flink-doris)
+### 参数列表
+| 配置项 | 类型 | 必填 | 默认值 | 支持引擎 |
+| --- | --- | --- | --- | --- |
+| fenodes | string | yes | - | Flink |
+| database | string | yes | - | Flink  |
+| table | string | yes | - | Flink  |
+| user	 | string | yes | - | Flink  |
+| password	 | string | yes | - | Flink  |
+| batch_size	 | int | no |  100 | Flink  |
+| interval	 | int | no |1000 | Flink |
+| max_retries	 | int | no | 1 | Flink|
+| doris.*	 | - | no | - | Flink  |
+
+`fenodes [string]`
+
+Doris Fe Http访问地址, eg: 127.0.01:8030
+
+`database [string]`
+
+写入 Doris 的库名
+
+`table [string]`
+
+写入 Doris 的表名
+
+`user [string]`
+
+Doris 访问用户
+
+`password [string]`
+
+Doris 访问用户密码
+
+`batch_size [int]`
+
+单次写Doris的最大行数,默认值100
+
+`interval [int]`
+
+flush 间隔时间(毫秒),超过该时间后异步线程将 缓存中数据写入Doris。设置为0表示关闭定期写入。
+
+`max_retries [int]`
+
+写Doris失败之后的重试次数
+
+`doris.* [string]`
+
+Stream load 的导入参数。例如:'doris.column_separator' = ', '等
+
+[更多 Stream Load 参数配置](../../data-operate/import/import-way/stream-load-manual.html)
+
+### Examples
+Socket 数据写入 Doris
+```
+env {
+  execution.parallelism = 1
+}
+source {
+    SocketStream {
+      host = 127.0.0.1
+      port = 9999
+      result_table_name = "socket"
+      field_name = "info"
+    }
+}
+transform {
+}
+sink {
+  DorisSink {
+      fenodes = "127.0.0.1:8030"
+      user = root
+      password = 123456
+      database = test
+      table = test_tbl
+      batch_size = 5
+      max_retries = 1
+      interval = 5000
+    }
+}
+
+```
+### 启动命令
+```
+sh bin/start-seatunnel-flink.sh --config config/flink.streaming.conf
+```
\ No newline at end of file
diff --git a/new-docs/zh-CN/ecosystem/seatunnel/spark-sink.md b/new-docs/zh-CN/ecosystem/seatunnel/spark-sink.md
index 467eafedf9..cae2ff61ba 100644
--- a/new-docs/zh-CN/ecosystem/seatunnel/spark-sink.md
+++ b/new-docs/zh-CN/ecosystem/seatunnel/spark-sink.md
@@ -24,4 +24,101 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# SeaTunnel
\ No newline at end of file
+# SeaTunnel
+最新版本的 [Apache SeaTunnel (原 waterdrop )](https://seatunnel.apache.org/zh-CN/) 已经支持 Doris 的连接器, SeaTunnel 可以用过 Spark 引擎和 Flink 引擎同步数据至 Doris 中.
+
+事实上, SeaTunnel 通过 Stream Load 方式同步数据,性能强劲,欢迎大家使用
+
+#安装 SeaTunnel
+[SeaTunnel 安装链接](https://interestinglab.github.io/seatunnel-docs/#/zh-cn/v2/flink/installation)
+
+## Spark Sink Doris
+
+### 插件代码
+Spark Sink Doris 的插件代码在[这里](https://github.com/apache/incubator-seatunnel/tree/dev/seatunnel-connectors/seatunnel-connectors-spark/seatunnel-connector-spark-doris)
+### 参数列表
+| 参数名 | 参数类型 | 是否必要 | 默认值 | 引擎类型 |
+| --- | --- | --- | --- | --- |
+| fenodes | string | yes | - | Spark |
+| database | string | yes | - | Spark |
+| table	 | string | yes | - | Spark |
+| user	 | string | yes | - | Spark |
+| password	 | string | yes | - | Spark |
+| batch_size	 | int | yes | 100 | Spark |
+| doris.*	 | string | no | - | Spark |
+
+`fenodes [string]`
+
+Doris Fe节点地址:8030
+
+
+`database [string]`
+
+写入 Doris 的库名
+
+`table [string]`
+
+写入 Doris 的表名
+
+`user [string]`
+
+Doris 访问用户
+
+`password [string]`
+
+Doris 访问用户密码
+
+`batch_size [string]`
+
+Spark 通过 Stream Load 方式写入,每个批次提交条数
+
+`doris. [string]`
+
+Stream Load 方式写入的 Http 参数优化,在官网参数前加上'Doris.'前缀
+
+[更多 Stream Load 参数配置](../../data-operate/import/import-way/stream-load-manual.html)
+
+### Examples
+Hive 迁移数据至 Doris
+```
+env{
+  spark.app.name = "hive2doris-template"
+}
+
+spark {
+  spark.sql.catalogImplementation = "hive"
+}
+
+source {
+  hive {
+    preSql = "select * from tmp.test"
+    result_table_name = "test"
+  }
+}
+
+transform {
+}
+
+
+sink {
+
+Console {
+
+  }
+
+Doris {
+   fenodes="xxxx:8030"
+   database="tmp"
+   table="test"
+   user="root"
+   password="root"
+   batch_size=1000
+   doris.column_separator="\t"
+   doris.columns="date_key,date_value,day_in_year,day_in_month"
+   }
+}
+```
+启动命令
+```
+sh bin/start-waterdrop-spark.sh --master local[4] --deploy-mode client --config ./config/spark.conf
+```
\ No newline at end of file
diff --git a/new-docs/zh-CN/ecosystem/spark-doris-connector.md b/new-docs/zh-CN/ecosystem/spark-doris-connector.md
index 6772fea9c4..ed0bc24cd0 100644
--- a/new-docs/zh-CN/ecosystem/spark-doris-connector.md
+++ b/new-docs/zh-CN/ecosystem/spark-doris-connector.md
@@ -24,4 +24,272 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# Spark Doris Connector
\ No newline at end of file
+# Spark Doris Connector
+
+Spark Doris Connector 可以支持通过 Spark 读取 Doris 中存储的数据,也支持通过Spark写入数据到Doris。
+
+代码库地址:https://github.com/apache/incubator-doris-spark-connector
+
+- 支持从`Doris`中读取数据
+- 支持`Spark DataFrame`批量/流式 写入`Doris`
+- 可以将`Doris`表映射为`DataFrame`或者`RDD`,推荐使用`DataFrame`。
+- 支持在`Doris`端完成数据过滤,减少数据传输量。
+
+## 版本兼容
+
+| Connector     | Spark | Doris  | Java | Scala |
+|---------------| ----- | ------ | ---- | ----- |
+| 2.3.4-2.11.xx | 2.x   | 0.12+  | 8    | 2.11  |
+| 3.1.2-2.12.xx | 3.x   | 0.12.+ | 8    | 2.12  |
+
+## 编译与安装
+
+准备工作
+
+1.修改`custom_env.sh.tpl`文件,重命名为`custom_env.sh`
+
+2.指定thrift安装目录
+
+```bash
+##源文件内容
+#export THRIFT_BIN=
+#export MVN_BIN=
+#export JAVA_HOME=
+
+##修改如下
+export THRIFT_BIN=./thirdparty/installed/bin(thrift的安装目录)
+#export MVN_BIN=
+#export JAVA_HOME=
+
+安装 `thrift` 0.13.0 版本(注意:`Doris` 0.15 和最新的版本基于 `thrift` 0.13.0 构建, 之前的版本依然使用`thrift` 0.9.3 构建)
+ Windows: 
+    1. 下载:`http://archive.apache.org/dist/thrift/0.13.0/thrift-0.13.0.exe`
+    2. 拷贝:将文件拷贝至 `./thirdparty/installed/bin`
+ 
+ MacOS: 
+    1. 下载:`brew install thrift@0.13.0`
+    2. 建立软链接: 
+       `mkdir -p ./thirdparty/installed/bin`
+       `ln -s /opt/homebrew/Cellar/thrift@0.13.0/0.13.0/bin/thrift ./thirdparty/installed/bin/thrift`
+ 
+ 注:MacOS执行 `brew install thrift@0.13.0` 可能会报找不到版本的错误,解决方法如下,在终端执行:
+    1. `brew tap-new $USER/local-tap`
+    2. `brew extract --version='0.13.0' thrift $USER/local-tap`
+    3. `brew install thrift@0.13.0`
+ 参考链接: `https://gist.github.com/tonydeng/02e571f273d6cce4230dc8d5f394493c`
+ 
+ Linux:
+    1.下载源码包:`wget https://archive.apache.org/dist/thrift/0.13.0/thrift-0.13.0.tar.gz`
+    2.安装依赖:`yum install -y autoconf automake libtool cmake ncurses-devel openssl-devel lzo-devel zlib-devel gcc gcc-c++`
+    3.`tar zxvf thrift-0.13.0.tar.gz`
+    4.`cd thrift-0.13.0`
+    5.`./configure --without-tests`
+    6.`make`
+    7.`make install`
+   安装完成后查看版本:thrift --version     
+
+```
+
+在源码目录下执行:
+
+```bash
+sh build.sh 2.3.4 2.11 ## spark 2.3.4, scala 2.11
+sh build.sh 3.1.2 2.12 ## spark 3.1.2, scala 2.12
+
+```
+> 注:如果你是从 tag 检出的源码,则可以直接执行 `sh build.sh --tag`,而无需指定 spark 和 scala 的版本。因为 tag 源码中的版本是固定的。
+
+编译成功后,会在 `output/` 目录下生成文件 `doris-spark-2.3.4-2.11-1.0.0-SNAPSHOT.jar`。将此文件复制到 `Spark` 的 `ClassPath` 中即可使用 `Spark-Doris-Connector`。例如,`Local` 模式运行的 `Spark`,将此文件放入 `jars/` 文件夹下。`Yarn`集群模式运行的`Spark`,则将此文件放入预部署包中。
+
+## 使用Maven管理
+
+```
+<dependency>
+  <groupId>org.apache.doris</groupId>
+  <artifactId>spark-doris-connector-3.1_2.12</artifactId>
+  <!--artifactId>spark-doris-connector-2.3_2.11</artifactId-->
+  <version>1.0.1</version>
+</dependency>
+```
+
+**注意**
+
+请根据不同的 Spark 和 Scala 版本替换相应的 Connector 版本。
+
+## 使用示例
+### 读取
+
+#### SQL
+
+```sql
+CREATE TEMPORARY VIEW spark_doris
+USING doris
+OPTIONS(
+  "table.identifier"="$YOUR_DORIS_DATABASE_NAME.$YOUR_DORIS_TABLE_NAME",
+  "fenodes"="$YOUR_DORIS_FE_HOSTNAME:$YOUR_DORIS_FE_RESFUL_PORT",
+  "user"="$YOUR_DORIS_USERNAME",
+  "password"="$YOUR_DORIS_PASSWORD"
+);
+
+SELECT * FROM spark_doris;
+```
+
+#### DataFrame
+
+```scala
+val dorisSparkDF = spark.read.format("doris")
+  .option("doris.table.identifier", "$YOUR_DORIS_DATABASE_NAME.$YOUR_DORIS_TABLE_NAME")
+	.option("doris.fenodes", "$YOUR_DORIS_FE_HOSTNAME:$YOUR_DORIS_FE_RESFUL_PORT")
+  .option("user", "$YOUR_DORIS_USERNAME")
+  .option("password", "$YOUR_DORIS_PASSWORD")
+  .load()
+
+dorisSparkDF.show(5)
+```
+
+#### RDD
+
+```scala
+import org.apache.doris.spark._
+val dorisSparkRDD = sc.dorisRDD(
+  tableIdentifier = Some("$YOUR_DORIS_DATABASE_NAME.$YOUR_DORIS_TABLE_NAME"),
+  cfg = Some(Map(
+    "doris.fenodes" -> "$YOUR_DORIS_FE_HOSTNAME:$YOUR_DORIS_FE_RESFUL_PORT",
+    "doris.request.auth.user" -> "$YOUR_DORIS_USERNAME",
+    "doris.request.auth.password" -> "$YOUR_DORIS_PASSWORD"
+  ))
+)
+
+dorisSparkRDD.collect()
+```
+
+### 写入
+
+#### SQL
+
+```sql
+CREATE TEMPORARY VIEW spark_doris
+USING doris
+OPTIONS(
+  "table.identifier"="$YOUR_DORIS_DATABASE_NAME.$YOUR_DORIS_TABLE_NAME",
+  "fenodes"="$YOUR_DORIS_FE_HOSTNAME:$YOUR_DORIS_FE_RESFUL_PORT",
+  "user"="$YOUR_DORIS_USERNAME",
+  "password"="$YOUR_DORIS_PASSWORD"
+);
+
+INSERT INTO spark_doris VALUES ("VALUE1","VALUE2",...);
+# or
+INSERT INTO spark_doris SELECT * FROM YOUR_TABLE
+```
+
+#### DataFrame(batch/stream)
+
+```scala
+## batch sink
+val mockDataDF = List(
+  (3, "440403001005", "21.cn"),
+  (1, "4404030013005", "22.cn"),
+  (33, null, "23.cn")
+).toDF("id", "mi_code", "mi_name")
+mockDataDF.show(5)
+
+mockDataDF.write.format("doris")
+  .option("doris.table.identifier", "$YOUR_DORIS_DATABASE_NAME.$YOUR_DORIS_TABLE_NAME")
+	.option("doris.fenodes", "$YOUR_DORIS_FE_HOSTNAME:$YOUR_DORIS_FE_RESFUL_PORT")
+  .option("user", "$YOUR_DORIS_USERNAME")
+  .option("password", "$YOUR_DORIS_PASSWORD")
+  //其它选项
+  //指定你要写入的字段
+  .option("doris.write.fields","$YOUR_FIELDS_TO_WRITE")
+  .save()
+
+## stream sink(StructuredStreaming)
+val kafkaSource = spark.readStream
+  .option("kafka.bootstrap.servers", "$YOUR_KAFKA_SERVERS")
+  .option("startingOffsets", "latest")
+  .option("subscribe", "$YOUR_KAFKA_TOPICS")
+  .format("kafka")
+  .load()
+kafkaSource.selectExpr("CAST(key AS STRING)", "CAST(value as STRING)")
+  .writeStream
+  .format("doris")
+  .option("checkpointLocation", "$YOUR_CHECKPOINT_LOCATION")
+  .option("doris.table.identifier", "$YOUR_DORIS_DATABASE_NAME.$YOUR_DORIS_TABLE_NAME")
+	.option("doris.fenodes", "$YOUR_DORIS_FE_HOSTNAME:$YOUR_DORIS_FE_RESFUL_PORT")
+  .option("user", "$YOUR_DORIS_USERNAME")
+  .option("password", "$YOUR_DORIS_PASSWORD")
+  //其它选项
+  //指定你要写入的字段
+  .option("doris.write.fields","$YOUR_FIELDS_TO_WRITE")
+  .start()
+  .awaitTermination()
+```
+
+### java示例
+
+`samples/doris-demo/spark-demo/` 下提供了 Java 版本的示例,可供参考,[这里](https://github.com/apache/incubator-doris/tree/master/samples/doris-demo/spark-demo)
+
+## 配置
+
+### 通用配置项
+
+| Key                              | Default Value     | Comment                                                      |
+| -------------------------------- | ----------------- | ------------------------------------------------------------ |
+| doris.fenodes                    | --                | Doris FE http 地址,支持多个地址,使用逗号分隔            |
+| doris.table.identifier           | --                | Doris 表名,如:db1.tbl1                                 |
+| doris.request.retries            | 3                 | 向Doris发送请求的重试次数                                    |
+| doris.request.connect.timeout.ms | 30000             | 向Doris发送请求的连接超时时间                                |
+| doris.request.read.timeout.ms    | 30000             | 向Doris发送请求的读取超时时间                                |
+| doris.request.query.timeout.s    | 3600              | 查询doris的超时时间,默认值为1小时,-1表示无超时限制             |
+| doris.request.tablet.size        | Integer.MAX_VALUE | 一个RDD Partition对应的Doris Tablet个数。<br />此数值设置越小,则会生成越多的Partition。从而提升Spark侧的并行度,但同时会对Doris造成更大的压力。 |
+| doris.batch.size                 | 1024              | 一次从BE读取数据的最大行数。增大此数值可减少Spark与Doris之间建立连接的次数。<br />从而减轻网络延迟所带来的的额外时间开销。 |
+| doris.exec.mem.limit             | 2147483648        | 单个查询的内存限制。默认为 2GB,单位为字节                      |
+| doris.deserialize.arrow.async    | false             | 是否支持异步转换Arrow格式到spark-doris-connector迭代所需的RowBatch                 |
+| doris.deserialize.queue.size     | 64                | 异步转换Arrow格式的内部处理队列,当doris.deserialize.arrow.async为true时生效        |
+| doris.write.fields               | --                 | 指定写入Doris表的字段或者字段顺序,多列之间使用逗号分隔。<br />默认写入时要按照Doris表字段顺序写入全部字段。 |
+| sink.batch.size | 10000 | 单次写BE的最大行数 |
+| sink.max-retries | 1 | 写BE失败之后的重试次数 |
+
+### SQL 和 Dataframe 专有配置
+
+| Key                             | Default Value | Comment                                                      |
+| ------------------------------- | ------------- | ------------------------------------------------------------ |
+| user                            | --            | 访问Doris的用户名                                            |
+| password                        | --            | 访问Doris的密码                                              |
+| doris.filter.query.in.max.count | 100           | 谓词下推中,in表达式value列表元素最大数量。超过此数量,则in表达式条件过滤在Spark侧处理。 |
+
+### RDD 专有配置
+
+| Key                         | Default Value | Comment                                                      |
+| --------------------------- | ------------- | ------------------------------------------------------------ |
+| doris.request.auth.user     | --            | 访问Doris的用户名                                            |
+| doris.request.auth.password | --            | 访问Doris的密码                                              |
+| doris.read.field            | --            | 读取Doris表的列名列表,多列之间使用逗号分隔                  |
+| doris.filter.query          | --            | 过滤读取数据的表达式,此表达式透传给Doris。Doris使用此表达式完成源端数据过滤。 |
+
+
+## Doris 和 Spark 列类型映射关系
+
+| Doris Type | Spark Type                       |
+| ---------- | -------------------------------- |
+| NULL_TYPE  | DataTypes.NullType               |
+| BOOLEAN    | DataTypes.BooleanType            |
+| TINYINT    | DataTypes.ByteType               |
+| SMALLINT   | DataTypes.ShortType              |
+| INT        | DataTypes.IntegerType            |
+| BIGINT     | DataTypes.LongType               |
+| FLOAT      | DataTypes.FloatType              |
+| DOUBLE     | DataTypes.DoubleType             |
+| DATE       | DataTypes.StringType<sup>1</sup> |
+| DATETIME   | DataTypes.StringType<sup>1</sup> |
+| BINARY     | DataTypes.BinaryType             |
+| DECIMAL    | DecimalType                      |
+| CHAR       | DataTypes.StringType             |
+| LARGEINT   | DataTypes.StringType             |
+| VARCHAR    | DataTypes.StringType             |
+| DECIMALV2  | DecimalType                      |
+| TIME       | DataTypes.DoubleType             |
+| HLL        | Unsupported datatype             |
+
+* 注:Connector中,将`DATE`和`DATETIME`映射为`String`。由于`Doris`底层存储引擎处理逻辑,直接使用时间类型时,覆盖的时间范围无法满足需求。所以使用 `String` 类型直接返回对应的时间可读文本。
+
diff --git a/new-docs/zh-CN/ecosystem/udf/contribute-udf.md b/new-docs/zh-CN/ecosystem/udf/contribute-udf.md
index 3c6f446489..ce83e7a5ac 100644
--- a/new-docs/zh-CN/ecosystem/udf/contribute-udf.md
+++ b/new-docs/zh-CN/ecosystem/udf/contribute-udf.md
@@ -24,4 +24,101 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# 贡献 UDF
\ No newline at end of file
+# 贡献 UDF
+
+该手册主要讲述了外部用户如何将自己编写的 UDF 函数贡献给 Doris 社区。
+
+## 前提条件
+
+1. UDF 函数具有通用性
+
+   这里的通用性主要指的是:UDF 函数在某些业务场景下,被广泛使用。也就是说 UDF 函数具有复用价值,可被社区内其他用户直接使用。
+
+   如果你不确定自己写的 UDF 函数是否具有通用性,可以发邮件到 `dev@doris.apache.org` 或直接创建 ISSUE 发起讨论。
+
+2. UDF 已经完成测试,并正常运行在用户的生产环境中
+
+## 准备工作
+
+1. UDF 的 source code
+2. UDF 的使用手册
+
+### 源代码
+
+在 `contrib/udf/src/` 下创建一个存放 UDF 函数的文件夹,并将源码和 CMAKE 文件存放在此处。待贡献的源代码应该包含: `.h` , `.cpp`, `CMakeFile.txt`。这里以 udf_samples 为例,首先在 `contrib/udf/src/` 路径下创建一个新的文件夹,并存放源码。
+
+```
+   ├──contrib
+   │  └── udf
+   │    ├── CMakeLists.txt
+   │    └── src
+   │       └── udf_samples
+   │           ├── CMakeLists.txt
+   │           ├── uda_sample.cpp
+   │           ├── uda_sample.h
+   │           ├── udf_sample.cpp
+   │           └── udf_sample.h
+
+```
+
+1. CMakeLists.txt
+
+   用户的 `CMakeLists.txt` 放在此处后,需要进行少量更改。去掉 `include udf` 和 `udf lib` 即可。去掉的原因是,在 `contrib/udf` 层级的 CMake 文件中,已经声明了。
+
+### 使用手册
+
+使用手册需要包含:UDF 函数含义说明,适用的场景,函数的语法,如何编译 UDF ,如何在 Doris 集群中使用 UDF, 以及使用示例。
+
+1. 使用手册需包含中英文两个版本,并分别存放在 `docs/zh-CN/extending-doris/udf/contrib` 和 `docs/en/extending-doris/udf/contrib` 下。
+
+    ```
+    ├── docs
+    │   └── zh-CN
+    │       └──extending-doris
+    │          └──udf
+    │            └──contrib
+    │              ├── udf-simple-manual.md
+ 
+    ``` 
+
+    ```
+    ├── docs
+    │   └── en
+    │       └──extending-doris
+    │          └──udf
+    │            └──contrib
+    │              ├── udf-simple-manual.md
+    ```
+
+2. 将两个使用手册的文件,加入中文和英文的 sidebar 中。
+
+    ```
+    vi docs/.vuepress/sidebar/zh-CN.js
+    {
+        title: "用户贡献的 UDF",
+        directoryPath: "contrib/",
+        children:
+        [
+            "udf-simple-manual",
+        ],
+    },
+    ```
+
+    ```
+    vi docs/.vuepress/sidebar/en.js
+    {
+        title: "Users contribute UDF",
+        directoryPath: "contrib/",
+        children:
+        [
+            "udf-simple-manual",
+        ],
+    },
+
+    ```
+
+## 贡献 UDF 到社区
+
+当你符合前提条件并准备好代码,文档后就可以将 UDF 贡献到 Doris 社区了。在  [Github](https://github.com/apache/incubator-doris) 上面提交 Pull Request (PR) 即可。具体提交方式见:[Pull Request (PR)](https://help.github.com/articles/about-pull-requests/)。
+
+最后,当 PR 评审通过并 Merge 后。恭喜你,你的 UDF 已经贡献给 Doris 社区,你可以在 [Doris 官网](/zh-CN) 的生态扩展部分查看到啦~。
diff --git a/new-docs/zh-CN/ecosystem/udf/native-user-defined-function.md b/new-docs/zh-CN/ecosystem/udf/native-user-defined-function.md
index 405dec8dc1..4e6650dd0e 100644
--- a/new-docs/zh-CN/ecosystem/udf/native-user-defined-function.md
+++ b/new-docs/zh-CN/ecosystem/udf/native-user-defined-function.md
@@ -24,4 +24,246 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# UDF
\ No newline at end of file
+# UDF
+
+UDF 主要适用于,用户需要的分析能力 Doris 并不具备的场景。用户可以自行根据自己的需求,实现自定义的函数,并且通过 UDF 框架注册到 Doris 中,来扩展 Doris 的能力,并解决用户分析需求。
+
+UDF 能满足的分析需求分为两种:UDF 和 UDAF。本文中的 UDF 指的是二者的统称。
+
+1. UDF: 用户自定义函数,这种函数会对单行进行操作,并且输出单行结果。当用户在查询时使用 UDF ,每行数据最终都会出现在结果集中。典型的 UDF 比如字符串操作 concat() 等。
+2. UDAF: 用户自定义的聚合函数,这种函数对多行进行操作,并且输出单行结果。当用户在查询时使用 UDAF,分组后的每组数据最后会计算出一个值并展结果集中。典型的 UDAF 比如集合操作 sum() 等。一般来说 UDAF 都会结合 group by 一起使用。
+
+这篇文档主要讲述了,如何编写自定义的 UDF 函数,以及如何在 Doris 中使用它。
+
+如果用户使用 UDF 功能并扩展了 Doris 的函数分析,并且希望将自己实现的 UDF 函数贡献回 Doris 社区给其他用户使用,这时候请看文档 [Contribute UDF](./contribute-udf.md)。
+
+## 编写 UDF 函数
+
+在使用UDF之前,用户需要先在 Doris 的 UDF 框架下,编写自己的UDF函数。在`contrib/udf/src/udf_samples/udf_sample.h|cpp`文件中是一个简单的 UDF Demo。
+
+编写一个 UDF 函数需要以下几个步骤。
+
+### 编写函数
+
+创建对应的头文件、CPP文件,在CPP文件中实现你需要的逻辑。CPP文件中的实现函数格式与UDF的对应关系。
+
+用户可以把自己的 source code 统一放在一个文件夹下。这里以 udf_sample 为例,目录结构如下:
+
+```
+└── udf_samples
+  ├── uda_sample.cpp
+  ├── uda_sample.h
+  ├── udf_sample.cpp
+  └── udf_sample.h
+```
+
+#### 非可变参数
+
+对于非可变参数的UDF,那么两者之间的对应关系很直接。
+比如`INT MyADD(INT, INT)`的UDF就会对应`IntVal AddUdf(FunctionContext* context, const IntVal& arg1, const IntVal& arg2)`。
+
+1. `AddUdf`可以为任意的名字,只要创建UDF的时候指定即可。
+2. 实现函数中的第一个参数永远是`FunctionContext*`。实现者可以通过这个结构体获得一些查询相关的内容,以及申请一些需要使用的内存。具体使用的接口可以参考`udf/udf.h`中的定义。
+3. 实现函数中从第二个参数开始需要与UDF的参数一一对应,比如`IntVal`对应`INT`类型。这部分的类型都要使用`const`引用。
+4. 返回参数与UDF的参数的类型要相对应。
+
+#### 可变参数
+
+对于可变参数,可以参见以下例子,UDF`String md5sum(String, ...)`对应的
+实现函数是`StringVal md5sumUdf(FunctionContext* ctx, int num_args, const StringVal* args)`
+
+1. `md5sumUdf`这个也是可以任意改变的,创建的时候指定即可。
+2. 第一个参数与非可变参数函数一样,传入的是一个`FunctionContext*`。
+3. 可变参数部分由两部分组成,首先会传入一个整数,说明后面还有几个参数。后面传入的是一个可变参数部分的数组。
+
+#### 类型对应关系
+
+|UDF Type|Argument Type|
+|----|---------|
+|TinyInt|TinyIntVal|
+|SmallInt|SmallIntVal|
+|Int|IntVal|
+|BigInt|BigIntVal|
+|LargeInt|LargeIntVal|
+|Float|FloatVal|
+|Double|DoubleVal|
+|Date|DateTimeVal|
+|Datetime|DateTimeVal|
+|Char|StringVal|
+|Varchar|StringVal|
+|Decimal|DecimalVal|
+
+
+## 编译 UDF 函数
+
+由于 UDF 实现中依赖了 Doris 的 UDF 框架 , 所以在编译 UDF 函数的时候首先要对 Doris 进行编译,也就是对 UDF 框架进行编译。
+
+编译完成后会生成,UDF 框架的静态库文件。之后引入 UDF 框架依赖,并编译 UDF 即可。
+
+### 编译Doris
+
+在 Doris 根目录下执行 `sh build.sh` 就会在 `output/udf/` 生成 UDF 框架的静态库文件 `headers|libs`
+
+```
+├── output
+│   └── udf
+│       ├── include
+│       │   ├── uda_test_harness.h
+│       │   └── udf.h
+│       └── lib
+│           └── libDorisUdf.a
+
+```
+
+### 编写 UDF 编译文件
+
+1. 准备 thirdparty
+
+   `thirdparty` 文件夹主要用于存放用户 UDF 函数依赖的第三方库,包括头文件及静态库。其中必须包含依赖的 Doris UDF 框架中 `udf.h` 和 `libDorisUdf.a` 这两个文件。
+
+   这里以 `udf_sample` 为例, 在 用户自己 `udf_samples` 目录用于存放 source code。在同级目录下再创建一个 `thirdparty` 文件夹用于存放静态库。目录结构如下:
+
+    ```
+    ├── thirdparty
+    │ │── include
+    │ │ └── udf.h
+    │ └── lib
+    │   └── libDorisUdf.a
+    └── udf_samples
+
+    ```
+
+   `udf.h` 是 UDF 框架头文件。存放路径为 `doris/output/udf/include/udf.h`。 用户需要将 Doris 编译产出中的这个头文件拷贝到自己的 `thirdparty` 的 include 文件夹下。
+
+   `libDorisUdf.a`  是 UDF 框架的静态库。Doris 编译完成后该文件存放在 `doris/output/udf/lib/libDorisUdf.a`。用户需要将该文件拷贝到自己的 `thirdparty` 的 lib 文件夹下。
+
+   *注意:UDF 框架的静态库只有完成 Doris 编译后才会生成。
+
+2. 准备编译 UDF 的 CMakeFiles.txt
+
+   CMakeFiles.txt 用于声明 UDF 函数如何进行编译。存放在源码文件夹下,与用户代码平级。这里以 `udf_samples` 为例目录结构如下:
+
+    ```
+    ├── thirdparty
+    └── udf_samples
+      ├── CMakeLists.txt
+      ├── uda_sample.cpp
+      ├── uda_sample.h
+      ├── udf_sample.cpp
+      └── udf_sample.h
+    ```
+
+    + 需要显示声明引用 `libDorisUdf.a`
+    + 声明 `udf.h` 头文件位置
+
+
+    以 udf_sample 为例    
+    
+    ```
+    # Include udf
+    include_directories(thirdparty/include)    
+
+    # Set all libraries
+    add_library(udf STATIC IMPORTED)
+    set_target_properties(udf PROPERTIES IMPORTED_LOCATION thirdparty/lib/libDorisUdf.a)
+
+    # where to put generated libraries
+    set(LIBRARY_OUTPUT_PATH "${BUILD_DIR}/src/udf_samples")
+
+    # where to put generated binaries
+    set(EXECUTABLE_OUTPUT_PATH "${BUILD_DIR}/src/udf_samples")
+
+    add_library(udfsample SHARED udf_sample.cpp)
+        target_link_libraries(udfsample
+        udf
+        -static-libstdc++
+        -static-libgcc
+    )
+
+    add_library(udasample SHARED uda_sample.cpp)
+        target_link_libraries(udasample
+        udf
+        -static-libstdc++
+        -static-libgcc
+    )
+    ```
+
+    如果用户的 UDF 函数还依赖了其他的三方库,则需要声明 include,lib,并在 `add_library` 中增加依赖。
+
+所有文件准备齐后完整的目录结构如下:
+
+```
+    ├── thirdparty
+    │ │── include
+    │ │ └── udf.h
+    │ └── lib
+    │   └── libDorisUdf.a
+    └── udf_samples
+      ├── CMakeLists.txt
+      ├── uda_sample.cpp
+      ├── uda_sample.h
+      ├── udf_sample.cpp
+      └── udf_sample.h
+```
+
+准备好上述文件就可以直接编译 UDF 了
+
+### 执行编译
+
+在 udf_samples 文件夹下创建一个 build 文件夹,用于存放编译产出。
+
+在 build 文件夹下运行命令 `cmake ../` 生成Makefile,并执行 make 就会生成对应动态库。
+
+```
+├── thirdparty
+├── udf_samples
+  └── build
+```
+
+### 编译结果
+
+编译完成后的 UDF 动态链接库就生成成功了。在 `build/src/` 下,以 udf_samples 为例,目录结构如下:
+
+```
+
+├── thirdparty
+├── udf_samples
+  └── build
+    └── src
+      └── udf_samples
+        ├── libudasample.so
+        └── libudfsample.so
+
+```
+
+## 创建 UDF 函数
+
+通过上述的步骤后,你可以得到 UDF 的动态库(也就是编译结果中的 `.so` 文件)。你需要将这个动态库放到一个能够通过 HTTP 协议访问到的位置。
+
+然后登录 Doris 系统,在 mysql-client 中通过 `CREATE FUNCTION` 语法创建 UDF 函数。你需要拥有ADMIN权限才能够完成这个操作。这时 Doris 系统内部就会存在刚才创建好的 UDF。
+
+```
+CREATE [AGGREGATE] FUNCTION 
+	name ([argtype][,...])
+	[RETURNS] rettype
+	PROPERTIES (["key"="value"][,...])
+```
+说明:
+
+1. PROPERTIES中`symbol`表示的是,执行入口函数的对应symbol,这个参数是必须设定。你可以通过`nm`命令来获得对应的symbol,比如`nm libudfsample.so | grep AddUdf`获得到的`_ZN9doris_udf6AddUdfEPNS_15FunctionContextERKNS_6IntValES4_`就是对应的symbol。
+2. PROPERTIES中`object_file`表示的是从哪里能够下载到对应的动态库,这个参数是必须设定的。
+3. name: 一个function是要归属于某个DB的,name的形式为`dbName`.`funcName`。当`dbName`没有明确指定的时候,就是使用当前session所在的db作为`dbName`。
+
+具体使用可以参见 `CREATE FUNCTION` 获取更详细信息。
+
+## 使用 UDF
+
+用户使用 UDF 必须拥有对应数据库的 `SELECT` 权限。
+
+UDF 的使用与普通的函数方式一致,唯一的区别在于,内置函数的作用域是全局的,而 UDF 的作用域是 DB内部。当链接 session 位于数据内部时,直接使用 UDF 名字会在当前DB内部查找对应的 UDF。否则用户需要显示的指定 UDF 的数据库名字,例如 `dbName`.`funcName`。
+
+
+## 删除 UDF函数
+
+当你不再需要 UDF 函数时,你可以通过下述命令来删除一个 UDF 函数, 可以参考 `DROP FUNCTION`。
+
diff --git a/new-docs/zh-CN/ecosystem/udf/remote-user-defined-function.md b/new-docs/zh-CN/ecosystem/udf/remote-user-defined-function.md
index fa1d48d453..709d6c9d37 100644
--- a/new-docs/zh-CN/ecosystem/udf/remote-user-defined-function.md
+++ b/new-docs/zh-CN/ecosystem/udf/remote-user-defined-function.md
@@ -24,4 +24,87 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# 远程UDF
\ No newline at end of file
+# 远程UDF
+
+Remote UDF Service 支持通过 RPC 的方式访问用户提供的 UDF Service,以实现用户自定义函数的执行。相比于 Native 的 UDF 实现,Remote UDF Service 有如下优势和限制:
+1. 优势
+* 跨语言:可以用 Protobuf 支持的各类语言编写 UDF Service。
+* 安全:UDF 执行失败或崩溃,仅会影响 UDF Service 自身,而不会导致 Doris 进程崩溃。
+* 灵活:UDF Service 中可以调用任意其他服务或程序库类,以满足更多样的业务需求。
+
+2. 使用限制
+* 性能:相比于 Native UDF,UDF Service 会带来额外的网络开销,因此性能会远低于 Native UDF。同时,UDF Service 自身的实现也会影响函数的执行效率,用户需要自行处理高并发、线程安全等问题。
+* 单行模式和批处理模式:Doris 原先的的基于行存的查询执行框架会对每一行数据执行一次 UDF RPC 调用,因此执行效率非常差,而在新的向量化执行框架下,会对每一批数据(默认2048行)执行一次 UDF RPC 调用,因此性能有明显提升。实际测试中,基于向量化和批处理方式的 Remote UDF 性能和基于行存的 Native UDF 性能相当,可供参考。
+
+## 编写 UDF 函数
+
+
+本小节主要介绍如何开发一个 Remote RPC service。在 `samples/doris-demo/udf-demo/` 下提供了 Java 版本的示例,可供参考。
+
+### 拷贝 proto 文件
+
+拷贝 gensrc/proto/function_service.proto 和 gensrc/proto/types.proto 到 Rpc 服务中
+
+- function_service.proto
+    - PFunctionCallRequest
+        - function_name:函数名称,对应创建函数时指定的symbol
+        - args:方法传递的参数
+        - context:查询上下文信息
+    - PFunctionCallResponse
+        - result:结果
+        - status:状态,0代表正常
+    - PCheckFunctionRequest
+        - function:函数相关信息
+        - match_type:匹配类型
+    - PCheckFunctionResponse
+        - status:状态,0代表正常
+
+### 生成接口
+
+通过 protoc 生成代码,具体参数通过 protoc -h 查看
+
+### 实现接口
+
+共需要实现以下三个方法
+- fnCall:用于编写计算逻辑
+- checkFn:用于创建 UDF 时校验,校验函数名/参数/返回值等是否合法
+- handShake:用于接口探活
+
+## 创建 UDF
+
+目前暂不支持 UDAF 和 UDTF
+
+```sql
+CREATE FUNCTION 
+name ([,...])
+[RETURNS] rettype
+PROPERTIES (["key"="value"][,...])	
+```
+说明:
+
+1. PROPERTIES中`symbol`表示的是 rpc 调用传递的方法名,这个参数是必须设定的。
+2. PROPERTIES中`object_file`表示的 rpc 服务地址,目前支持单个地址和 brpc 兼容格式的集群地址,集群连接方式 参考 [格式说明](https://github.com/apache/incubator-brpc/blob/master/docs/cn/client.md#%E8%BF%9E%E6%8E%A5%E6%9C%8D%E5%8A%A1%E9%9B%86%E7%BE%A4)。
+3. PROPERTIES中`type`表示的 UDF 调用类型,默认为 Native,使用 Rpc UDF时传 RPC。
+4. name: 一个function是要归属于某个DB的,name的形式为`dbName`.`funcName`。当`dbName`没有明确指定的时候,就是使用当前session所在的db作为`dbName`。
+
+示例:
+```sql
+CREATE FUNCTION rpc_add(INT, INT) RETURNS INT PROPERTIES (
+  "SYMBOL"="add_int",
+  "OBJECT_FILE"="127.0.0.1:9090",
+  "TYPE"="RPC"
+);
+```
+
+## 使用 UDF
+
+用户使用 UDF 必须拥有对应数据库的 `SELECT` 权限。
+
+UDF 的使用与普通的函数方式一致,唯一的区别在于,内置函数的作用域是全局的,而 UDF 的作用域是 DB内部。当链接 session 位于数据内部时,直接使用 UDF 名字会在当前DB内部查找对应的 UDF。否则用户需要显示的指定 UDF 的数据库名字,例如 `dbName`.`funcName`。
+
+## 删除 UDF
+
+当你不再需要 UDF 函数时,你可以通过下述命令来删除一个 UDF 函数, 可以参考 `DROP FUNCTION`。
+
+## 示例
+在`samples/doris-demo/` 目录中提供和 cpp/java/python 语言的rpc server 实现示例。具体使用方法见每个目录下的`README.md`


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org