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

[incubator-doris] branch master updated: [refactor][doc] Added doc for compilation, deployment and data export (#8776)

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

morningman 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 b88bf73ca7 [refactor][doc] Added doc for compilation, deployment and data export (#8776)
b88bf73ca7 is described below

commit b88bf73ca76c1320d57d2c914e31ec321ffba5cd
Author: wudi <67...@qq.com>
AuthorDate: Fri Apr 8 09:04:03 2022 +0800

    [refactor][doc] Added doc for compilation, deployment and data export (#8776)
---
 new-docs/.vuepress/sidebar/en.js                   |   4 +-
 new-docs/.vuepress/sidebar/zh-CN.js                |   4 +-
 new-docs/en/data-operate/export/export-manual.md   |  21 +-
 new-docs/en/data-operate/export/outfile.md         |  81 ++---
 .../Data-Manipulation-Statements/OUTFILE.md}       |   9 +-
 .../zh-CN/data-operate/export/export-manual.md     | 178 ++++++++++-
 .../data-operate/export/export_with_mysql_dump.md  |  20 +-
 new-docs/zh-CN/data-operate/export/outfile.md      | 135 ++++++++-
 new-docs/zh-CN/install/docker-install.md           |  27 --
 new-docs/zh-CN/install/install-deploy.md           | 336 ++++++++++++++++++++-
 .../install/source-install/compilation-arm.md      |  40 ++-
 .../compilation-with-ldb-toolchain.md              |  92 +++++-
 .../zh-CN/install/source-install/compilation.md    | 208 ++++++++++++-
 .../Data-Manipulation-Statements}/OUTFILE.md       |  26 +-
 14 files changed, 1064 insertions(+), 117 deletions(-)

diff --git a/new-docs/.vuepress/sidebar/en.js b/new-docs/.vuepress/sidebar/en.js
index 84384342e0..b197222c24 100644
--- a/new-docs/.vuepress/sidebar/en.js
+++ b/new-docs/.vuepress/sidebar/en.js
@@ -40,7 +40,6 @@ module.exports = [
     initialOpenGroupIndex: -1,
     children: [
       "install-deploy",
-      "docker-install",
       {
         title: "Compile",
         directoryPath: "source-install/",
@@ -624,7 +623,8 @@ module.exports = [
                   "INSERT",
                   "UPDATE",
                 ],
-              },             
+              },
+              "OUTFILE"             
             ],
           },
           {
diff --git a/new-docs/.vuepress/sidebar/zh-CN.js b/new-docs/.vuepress/sidebar/zh-CN.js
index d4500d3a6a..509442bca8 100644
--- a/new-docs/.vuepress/sidebar/zh-CN.js
+++ b/new-docs/.vuepress/sidebar/zh-CN.js
@@ -40,7 +40,6 @@ module.exports = [
     initialOpenGroupIndex: -1,
     children: [
       "install-deploy",
-      "docker-install",
       {
         title: "源码编译",
         directoryPath: "source-install/",
@@ -624,7 +623,8 @@ module.exports = [
                   "INSERT",
                   "UPDATE",
                 ],
-              },             
+              },
+              "OUTFILE"             
             ],
           },
           {
diff --git a/new-docs/en/data-operate/export/export-manual.md b/new-docs/en/data-operate/export/export-manual.md
index df2dbbb4df..0a90961300 100644
--- a/new-docs/en/data-operate/export/export-manual.md
+++ b/new-docs/en/data-operate/export/export-manual.md
@@ -95,11 +95,13 @@ Among them, `c69fcf2b6db5420f-a96b94c1ff8bccef` is the query ID of the query pla
 
 When all data is exported, Doris will rename these files to the user-specified path.
 
-## Use examples
+## Start Export
+
+For detailed usage of Export, please refer to [SHOW EXPORT](../../sql-manual/sql-reference-v2/Show-Statements/SHOW-EXPORT.html).
 
 Export's detailed commands can be passed through `HELP EXPORT;` Examples are as follows:
 
-```
+```sql
 EXPORT TABLE db1.tbl1 
 PARTITION (p1,p2)
 [WHERE [expr]]
@@ -127,11 +129,12 @@ WITH BROKER "hdfs"
 * `timeout`: homework timeout. Default 2 hours. Unit seconds.
 * `tablet_num_per_task`: The maximum number of fragments allocated per query plan. The default is 5.
 
-After submitting a job, the job status can be imported by querying the `SHOW EXPORT` command. The results are as follows:
+After submitting a job, the job status can be imported by querying the   [SHOW EXPORT](../../sql-manual/sql-reference-v2/Show-Statements/SHOW-EXPORT.html)  command. The results are as follows:
 
-```
+```sql
+mysql> show EXPORT\G;
+*************************** 1. row ***************************
      JobId: 14008
-     Label: mylabel
      State: FINISHED
   Progress: 100%
   TaskInfo: {"partitions":["*"],"exec mem limit":2147483648,"column separator":",","line delimiter":"\n","tablet num":1,"broker":"hdfs","coord num":1,"db":"default_cluster:db1","tbl":"tbl3"}
@@ -140,12 +143,12 @@ CreateTime: 2019-06-25 17:08:24
  StartTime: 2019-06-25 17:08:28
 FinishTime: 2019-06-25 17:08:34
    Timeout: 3600
-  ErrorMsg: N/A
+  ErrorMsg: NULL
+1 row in set (0.01 sec)
 ```
 
 
 * JobId: The unique ID of the job
-* Label: Job identifier
 * State: Job status:
 	* PENDING: Jobs to be Scheduled
 	* EXPORTING: Data Export
@@ -196,3 +199,7 @@ Usually, a query plan for an Export job has only two parts `scan`- `export`, and
 * `export_running_job_num_limit `: Limit on the number of Export jobs running. If exceeded, the job will wait and be in PENDING state. The default is 5, which can be adjusted at run time.
 * `Export_task_default_timeout_second`: Export job default timeout time. The default is 2 hours. It can be adjusted at run time.
 * `export_tablet_num_per_task`: The maximum number of fragments that a query plan is responsible for. The default is 5.
+
+## More Help
+
+For more detailed syntax and best practices used by Export, please refer to the [Export](../../sql-manual/sql-reference-v2/Show-Statements/SHOW-EXPORT.html) command manual, you can also You can enter `HELP EXPORT` at the command line of the MySql client for more help.
diff --git a/new-docs/en/data-operate/export/outfile.md b/new-docs/en/data-operate/export/outfile.md
index c6a8fc651d..e4ab296cd9 100644
--- a/new-docs/en/data-operate/export/outfile.md
+++ b/new-docs/en/data-operate/export/outfile.md
@@ -26,69 +26,36 @@ under the License.
 
 # Export Query Result
 
-This document describes how to use the `SELECT INTO OUTFILE` command to export query results.
+This document describes how to use the  [SELECT INTO OUTFILE](../../sql-manual/sql-reference-v2/Data-Manipulation-Statements/OUTFILE.html)  command to export query results.
 
-## Syntax
+## Example
 
-The `SELECT INTO OUTFILE` statement can export the query results to a file. Currently supports export to remote storage through Broker process, or directly through S3, HDFS  protocol such as HDFS, S3, BOS and COS(Tencent Cloud) through the Broker process. The syntax is as follows:
+### Export to HDFS
 
-```
-query_stmt
-INTO OUTFILE "file_path"
-[format_as]
-[properties]
-```
-
-* `file_path`
-
-    `file_path` specify the file path and file name prefix. Like: `hdfs://path/to/my_file_`.
-    
-    The final file name will be assembled as `my_file_`, file seq no and the format suffix. File seq no starts from 0, determined by the number of split.
-    
-    ```
-    my_file_abcdefg_0.csv
-    my_file_abcdefg_1.csv
-    my_file_abcdegf_2.csv
-    ```
-
-* `[format_as]`
-
-    ```
-    FORMAT AS CSV
-    ```
-    
-    Specify the export format. The default is CSV.
-
-* `[properties]`
+Export simple query results to the file `hdfs://path/to/result.txt`, specifying the export format as CSV.
 
-    Specify the relevant attributes. Currently it supports exporting through the Broker process, or through the S3, HDFS protocol.
-
-    + Broker related attributes need to be prefixed with `broker.`. For details, please refer to [Broker Document](./broker.html).
-    + HDFS protocal can directly execute HDFS protocal configuration. hdfs.fs.defaultFS is used to fill in the namenode address and port. It is required.
-    + S3 protocol can directly execute S3 protocol configuration.
-
-    ```
-    PROPERTIES
-    ("broker.prop_key" = "broker.prop_val", ...)
-    or 
-    ("hdfs.fs.defaultFS" = "xxx", "hdfs.user" = "xxx")
-    or
-    ("AWS_ENDPOINT" = "xxx", ...)
-    ```
+```sql
+SELECT * FROM tbl
+INTO OUTFILE "hdfs://path/to/result_"
+FORMAT AS CSV
+PROPERTIES
+(
+    "broker.name" = "my_broker",
+    "column_separator" = ",",
+    "line_delimiter" = "\n"
+);
+```
 
-    Other properties
+### Export to local file
 
-    ```
-    PROPERTIES
-    ("key1" = "val1", "key2" = "val2", ...)
-    ```
+When exporting to a local file, you need to configure `enable_outfile_to_local=true` in fe.conf first
 
-    currently supports the following properties:
+```sql
+select * from tbl1 limit 10 
+INTO OUTFILE "file:///home/work/path/result_";
+```
 
-    * `column_separator`: Column separator, only applicable to CSV format. The default is `\t`.
-    * `line_delimiter`: Line delimiter, only applicable to CSV format. The default is `\n`.
-    * `max_file_size`: The max size of a single file. Default is 1GB. Range from 5MB to 2GB. Files exceeding this size will be splitted.
-    * `schema`: schema infomation for PARQUET, only applicable to PARQUET format. If the exported file format is PARQUET, `schema` must be specified.
+For more usage, see [OUTFILE documentation](../../sql-manual/sql-reference-v2/Data-Manipulation-Statements/OUTFILE.html).
 
 ## Concurrent export
 
@@ -193,3 +160,7 @@ ERROR 1064 (HY000): errCode = 2, detailMessage = Open broker writer failed ...
 * File spliting will ensure that a row of data is stored in a single file. Therefore, the size of the file is not strictly equal to `max_file_size`.
 * For functions whose output is invisible characters, such as BITMAP and HLL types, the output is `\N`, which is NULL.
 * At present, the output type of some geo functions, such as `ST_Point` is VARCHAR, but the actual output value is an encoded binary character. Currently these functions will output garbled characters. For geo functions, use `ST_AsText` for output.
+
+## More Help
+
+For more detailed syntax and best practices for using OUTFILE, please refer to the [OUTFILE](../../sql-manual/sql-reference-v2/Data-Manipulation-Statements/OUTFILE.html) command manual, you can also More help information can be obtained by typing `HELP OUTFILE` at the command line of the MySql client.
diff --git a/new-docs/en/install/docker-install.md b/new-docs/en/sql-manual/sql-reference-v2/Data-Manipulation-Statements/OUTFILE.md
similarity index 91%
rename from new-docs/en/install/docker-install.md
rename to new-docs/en/sql-manual/sql-reference-v2/Data-Manipulation-Statements/OUTFILE.md
index 1722893fbe..91f7d915b1 100644
--- a/new-docs/en/install/docker-install.md
+++ b/new-docs/en/sql-manual/sql-reference-v2/Data-Manipulation-Statements/OUTFILE.md
@@ -1,6 +1,6 @@
 ---
 {
-    "title": "Docker Install",
+    "title": "OUTFILE",
     "language": "en"
 }
 ---
@@ -24,4 +24,9 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# Docker Install
\ No newline at end of file
+# OUTFILE
+## description
+
+## example
+
+## keyword
diff --git a/new-docs/zh-CN/data-operate/export/export-manual.md b/new-docs/zh-CN/data-operate/export/export-manual.md
index 789971c4ed..28740eecae 100644
--- a/new-docs/zh-CN/data-operate/export/export-manual.md
+++ b/new-docs/zh-CN/data-operate/export/export-manual.md
@@ -24,4 +24,180 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# 数据导出
\ No newline at end of file
+# 数据导出
+
+数据导出(Export)是 Doris 提供的一种将数据导出的功能。该功能可以将用户指定的表或分区的数据,以文本的格式,通过 Broker 进程导出到远端存储上,如 HDFS/BOS 等。
+
+本文档主要介绍 Export 的基本原理、使用方式、最佳实践以及注意事项。
+
+## 原理
+
+用户提交一个 Export 作业后。Doris 会统计这个作业涉及的所有 Tablet。然后对这些 Tablet 进行分组,每组生成一个特殊的查询计划。该查询计划会读取所包含的 Tablet 上的数据,然后通过 Broker 将数据写到远端存储指定的路径中,也可以通过S3协议直接导出到支持S3协议的远端存储上。
+
+总体的调度方式如下:
+
+```
++--------+
+| Client |
++---+----+
+    |  1. Submit Job
+    |
++---v--------------------+
+| FE                     |
+|                        |
+| +-------------------+  |
+| | ExportPendingTask |  |
+| +-------------------+  |
+|                        | 2. Generate Tasks
+| +--------------------+ |
+| | ExportExporingTask | |
+| +--------------------+ |
+|                        |
+| +-----------+          |     +----+   +------+   +---------+
+| | QueryPlan +----------------> BE +--->Broker+--->         |
+| +-----------+          |     +----+   +------+   | Remote  |
+| +-----------+          |     +----+   +------+   | Storage |
+| | QueryPlan +----------------> BE +--->Broker+--->         |
+| +-----------+          |     +----+   +------+   +---------+
++------------------------+         3. Execute Tasks
+
+```
+
+1. 用户提交一个 Export 作业到 FE。
+2. FE 的 Export 调度器会通过两阶段来执行一个 Export 作业:
+  1. PENDING:FE 生成 ExportPendingTask,向 BE 发送 snapshot 命令,对所有涉及到的 Tablet 做一个快照。并生成多个查询计划。
+  2. EXPORTING:FE 生成 ExportExportingTask,开始执行查询计划。
+
+### 查询计划拆分
+
+Export 作业会生成多个查询计划,每个查询计划负责扫描一部分 Tablet。每个查询计划扫描的 Tablet 个数由 FE 配置参数 `export_tablet_num_per_task` 指定,默认为 5。即假设一共 100 个 Tablet,则会生成 20 个查询计划。用户也可以在提交作业时,通过作业属性 `tablet_num_per_task` 指定这个数值。
+
+一个作业的多个查询计划顺序执行。
+
+### 查询计划执行
+
+一个查询计划扫描多个分片,将读取的数据以行的形式组织,每 1024 行为一个 batch,调用 Broker 写入到远端存储上。
+
+查询计划遇到错误会整体自动重试 3 次。如果一个查询计划重试 3 次依然失败,则整个作业失败。
+
+Doris 会首先在指定的远端存储的路径中,建立一个名为 `__doris_export_tmp_12345` 的临时目录(其中 `12345` 为作业 id)。导出的数据首先会写入这个临时目录。每个查询计划会生成一个文件,文件名示例:
+
+`export-data-c69fcf2b6db5420f-a96b94c1ff8bccef-1561453713822`
+
+其中 `c69fcf2b6db5420f-a96b94c1ff8bccef` 为查询计划的 query id。`1561453713822` 为文件生成的时间戳。
+
+当所有数据都导出后,Doris 会将这些文件 rename 到用户指定的路径中。
+
+### Broker 参数
+
+Export 需要借助 Broker 进程访问远端存储,不同的 Broker 需要提供不同的参数,具体请参阅 [Broker文档](./advanced/broker.html)
+
+## 开始导出
+
+Export 的详细用法可参考 [SHOW EXPORT](../../sql-manual/sql-reference-v2/Show-Statements/SHOW-EXPORT.html) 。
+
+### 导出到HDFS
+
+```sql
+EXPORT TABLE db1.tbl1 
+PARTITION (p1,p2)
+[WHERE [expr]]
+TO "hdfs://host/path/to/export/" 
+PROPERTIES
+(
+    "label" = "mylabel",
+    "column_separator"=",",
+    "columns" = "col1,col2",
+    "exec_mem_limit"="2147483648",
+    "timeout" = "3600"
+)
+WITH BROKER "hdfs"
+(
+    "username" = "user",
+    "password" = "passwd"
+);
+```
+
+* `label`:本次导出作业的标识。后续可以使用这个标识查看作业状态。
+* `column_separator`:列分隔符。默认为 `\t`。支持不可见字符,比如 '\x07'。
+* `columns`:要导出的列,使用英文状态逗号隔开,如果不填这个参数默认是导出表的所有列。
+* `line_delimiter`:行分隔符。默认为 `\n`。支持不可见字符,比如 '\x07'。
+* `exec_mem_limit`: 表示 Export 作业中,一个查询计划在单个 BE 上的内存使用限制。默认 2GB。单位字节。
+* `timeout`:作业超时时间。默认 2小时。单位秒。
+* `tablet_num_per_task`:每个查询计划分配的最大分片数。默认为 5。
+
+### 查看导出状态
+
+提交作业后,可以通过  [SHOW EXPORT](../../sql-manual/sql-reference-v2/Show-Statements/SHOW-EXPORT.html) 命令查询导入作业状态。结果举例如下:
+
+```sql
+mysql> show EXPORT\G;
+*************************** 1. row ***************************
+     JobId: 14008
+     State: FINISHED
+  Progress: 100%
+  TaskInfo: {"partitions":["*"],"exec mem limit":2147483648,"column separator":",","line delimiter":"\n","tablet num":1,"broker":"hdfs","coord num":1,"db":"default_cluster:db1","tbl":"tbl3"}
+      Path: bos://bj-test-cmy/export/
+CreateTime: 2019-06-25 17:08:24
+ StartTime: 2019-06-25 17:08:28
+FinishTime: 2019-06-25 17:08:34
+   Timeout: 3600
+  ErrorMsg: NULL
+1 row in set (0.01 sec)
+```
+
+* JobId:作业的唯一 ID
+* State:作业状态:
+  * PENDING:作业待调度
+  * EXPORTING:数据导出中
+  * FINISHED:作业成功
+  * CANCELLED:作业失败
+* Progress:作业进度。该进度以查询计划为单位。假设一共 10 个查询计划,当前已完成 3 个,则进度为 30%。
+* TaskInfo:以 Json 格式展示的作业信息:
+  * db:数据库名
+  * tbl:表名
+  * partitions:指定导出的分区。`*` 表示所有分区。
+  * exec mem limit:查询计划内存使用限制。单位字节。
+  * column separator:导出文件的列分隔符。
+  * line delimiter:导出文件的行分隔符。
+  * tablet num:涉及的总 Tablet 数量。
+  * broker:使用的 broker 的名称。
+  * coord num:查询计划的个数。
+* Path:远端存储上的导出路径。
+* CreateTime/StartTime/FinishTime:作业的创建时间、开始调度时间和结束时间。
+* Timeout:作业超时时间。单位是秒。该时间从 CreateTime 开始计算。
+* ErrorMsg:如果作业出现错误,这里会显示错误原因。
+
+## 最佳实践
+
+### 查询计划的拆分
+
+一个 Export 作业有多少查询计划需要执行,取决于总共有多少 Tablet,以及一个查询计划最多可以分配多少个 Tablet。因为多个查询计划是串行执行的,所以如果让一个查询计划处理更多的分片,则可以减少作业的执行时间。但如果查询计划出错(比如调用 Broker 的 RPC 失败,远端存储出现抖动等),过多的 Tablet 会导致一个查询计划的重试成本变高。所以需要合理安排查询计划的个数以及每个查询计划所需要扫描的分片数,在执行时间和执行成功率之间做出平衡。一般建议一个查询计划扫描的数据量在 3-5 GB内(一个表的 Tablet 的大小以及个数可以通过 `SHOW TABLET FROM tbl_name;` 语句查看。)。
+
+### exec\_mem\_limit
+
+通常一个 Export 作业的查询计划只有 `扫描`-`导出` 两部分,不涉及需要太多内存的计算逻辑。所以通常 2GB 的默认内存限制可以满足需求。但在某些场景下,比如一个查询计划,在同一个 BE 上需要扫描的 Tablet 过多,或者 Tablet 的数据版本过多时,可能会导致内存不足。此时需要通过这个参数设置更大的内存,比如 4GB、8GB 等。
+
+## 注意事项
+
+* 不建议一次性导出大量数据。一个 Export 作业建议的导出数据量最大在几十 GB。过大的导出会导致更多的垃圾文件和更高的重试成本。
+* 如果表数据量过大,建议按照分区导出。
+* 在 Export 作业运行过程中,如果 FE 发生重启或切主,则 Export 作业会失败,需要用户重新提交。
+* 如果 Export 作业运行失败,在远端存储中产生的 `__doris_export_tmp_xxx` 临时目录,以及已经生成的文件不会被删除,需要用户手动删除。
+* 如果 Export 作业运行成功,在远端存储中产生的 `__doris_export_tmp_xxx` 目录,根据远端存储的文件系统语义,可能会保留,也可能会被清除。比如在百度对象存储(BOS)中,通过 rename 操作将一个目录中的最后一个文件移走后,该目录也会被删除。如果该目录没有被清除,用户可以手动清除。
+* 当 Export 运行完成后(成功或失败),FE 发生重启或切主,则  [SHOW EXPORT](../../sql-manual/sql-reference-v2/Show-Statements/SHOW-EXPORT.html) 展示的作业的部分信息会丢失,无法查看。
+* Export 作业只会导出 Base 表的数据,不会导出 Rollup Index 的数据。
+* Export 作业会扫描数据,占用 IO 资源,可能会影响系统的查询延迟。
+
+## 相关配置
+
+### FE
+
+* `export_checker_interval_second`:Export 作业调度器的调度间隔,默认为 5 秒。设置该参数需重启 FE。
+* `export_running_job_num_limit`:正在运行的 Export 作业数量限制。如果超过,则作业将等待并处于 PENDING 状态。默认为 5,可以运行时调整。
+* `export_task_default_timeout_second`:Export 作业默认超时时间。默认为 2 小时。可以运行时调整。
+* `export_tablet_num_per_task`:一个查询计划负责的最大分片数。默认为 5。
+
+## 更多帮助
+
+关于 Export 使用的更多详细语法及最佳实践,请参阅 [Export](../../sql-manual/sql-reference-v2/Show-Statements/SHOW-EXPORT.html) 命令手册,你也可以在 MySql 客户端命令行下输入 `HELP EXPORT` 获取更多帮助信息。
diff --git a/new-docs/zh-CN/data-operate/export/export_with_mysql_dump.md b/new-docs/zh-CN/data-operate/export/export_with_mysql_dump.md
index 0abcec02dc..a98bdb1399 100644
--- a/new-docs/zh-CN/data-operate/export/export_with_mysql_dump.md
+++ b/new-docs/zh-CN/data-operate/export/export_with_mysql_dump.md
@@ -1,7 +1,7 @@
 ---
 {
-"title": "Mysqldump导出表结构或数据",
-"language": "zh-CN"
+    "title": "Mysqldump导出表结构或数据",
+    "language": "zh-CN"
 }
 ---
 
@@ -24,4 +24,18 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# 使用mysqldump数据导出表结构或者数据
\ No newline at end of file
+# 使用mysqldump数据导出表结构或者数据
+Doris 在0.15 之后的版本已经支持通过`mysqldump` 工具导出数据或者表结构
+
+## 使用示例
+### 导出
+1. 导出 test 数据库中的 table1 表:`mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases test --tables table1`
+2. 导出 test 数据库中的 table1 表结构:`mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases test --tables table1 --no-data`
+3. 导出 test1, test2 数据库中所有表:`mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases test1 test2`
+4. 导出所有数据库和表 `mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --all-databases`
+   更多的使用参数可以参考`mysqldump` 的使用手册
+### 导入
+`mysqldump` 导出的结果可以重定向到文件中,之后可以通过 source 命令导入到Doris 中 `source filename.sql`
+## 注意
+1. 由于Doris  中没有mysql 里的 tablespace 概念,因此在使用mysqldump 时要加上 `--no-tablespaces` 参数
+2. 使用mysqldump 导出数据和表结构仅用于开发测试或者数据量很小的情况,请勿用于大数据量的生产环境
diff --git a/new-docs/zh-CN/data-operate/export/outfile.md b/new-docs/zh-CN/data-operate/export/outfile.md
index a7cf083794..8b2afa8a21 100644
--- a/new-docs/zh-CN/data-operate/export/outfile.md
+++ b/new-docs/zh-CN/data-operate/export/outfile.md
@@ -24,4 +24,137 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# 导出查询结果集
\ No newline at end of file
+# 导出查询结果集
+
+本文档介绍如何使用 [SELECT INTO OUTFILE](../../sql-manual/sql-reference-v2/Data-Manipulation-Statements/OUTFILE.html) 命令进行查询结果的导出操作。
+
+## 示例
+
+### 导出到HDFS
+
+将简单查询结果导出到文件 `hdfs://path/to/result.txt`,指定导出格式为 CSV。
+
+```sql
+SELECT * FROM tbl
+INTO OUTFILE "hdfs://path/to/result_"
+FORMAT AS CSV
+PROPERTIES
+(
+    "broker.name" = "my_broker",
+    "column_separator" = ",",
+    "line_delimiter" = "\n"
+);
+```
+
+### 导出到本地文件 
+
+导出到本地文件时需要先在fe.conf中配置`enable_outfile_to_local=true`
+
+```sql
+select * from tbl1 limit 10 
+INTO OUTFILE "file:///home/work/path/result_";
+```
+
+更多用法可查看[OUTFILE文档](../../sql-manual/sql-reference-v2/Data-Manipulation-Statements/OUTFILE.html)。
+
+## 并发导出
+
+默认情况下,查询结果集的导出是非并发的,也就是单点导出。如果用户希望查询结果集可以并发导出,需要满足以下条件:
+
+1. session variable 'enable_parallel_outfile' 开启并发导出: ```set enable_parallel_outfile = true;```
+2. 导出方式为 S3 , 或者 HDFS, 而不是使用 broker
+3. 查询可以满足并发导出的需求,比如顶层不包含 sort 等单点节点。(后面会举例说明,哪种属于不可并发导出结果集的查询)
+
+满足以上三个条件,就能触发并发导出查询结果集了。并发度 = ```be_instacne_num * parallel_fragment_exec_instance_num```
+
+### 如何验证结果集被并发导出
+
+用户通过 session 变量设置开启并发导出后,如果想验证当前查询是否能进行并发导出,则可以通过下面这个方法。
+
+```sql
+explain select xxx from xxx where xxx  into outfile "s3://xxx" format as csv properties ("AWS_ENDPOINT" = "xxx", ...);
+```
+
+对查询进行 explain 后,Doris 会返回该查询的规划,如果你发现 ```RESULT FILE SINK``` 出现在 ```PLAN FRAGMENT 1``` 中,就说明导出并发开启成功了。
+如果 ```RESULT FILE SINK``` 出现在 ```PLAN FRAGMENT 0``` 中,则说明当前查询不能进行并发导出 (当前查询不同时满足并发导出的三个条件)。
+
+```
+并发导出的规划示例:
++-----------------------------------------------------------------------------+
+| Explain String                                                              |
++-----------------------------------------------------------------------------+
+| PLAN FRAGMENT 0                                                             |
+|  OUTPUT EXPRS:<slot 2> | <slot 3> | <slot 4> | <slot 5>                     |
+|   PARTITION: UNPARTITIONED                                                  |
+|                                                                             |
+|   RESULT SINK                                                               |
+|                                                                             |
+|   1:EXCHANGE                                                                |
+|                                                                             |
+| PLAN FRAGMENT 1                                                             |
+|  OUTPUT EXPRS:`k1` + `k2`                                                   |
+|   PARTITION: HASH_PARTITIONED: `default_cluster:test`.`multi_tablet`.`k1`   |
+|                                                                             |
+|   RESULT FILE SINK                                                          |
+|   FILE PATH: s3://ml-bd-repo/bpit_test/outfile_1951_                        |
+|   STORAGE TYPE: S3                                                          |
+|                                                                             |
+|   0:OlapScanNode                                                            |
+|      TABLE: multi_tablet                                                    |
++-----------------------------------------------------------------------------+
+```
+
+## 返回结果
+
+导出命令为同步命令。命令返回,即表示操作结束。同时会返回一行结果来展示导出的执行结果。
+
+如果正常导出并返回,则结果如下:
+
+```sql
+mysql> select * from tbl1 limit 10 into outfile "file:///home/work/path/result_";
++------------+-----------+----------+--------------------------------------------------------------------+
+| FileNumber | TotalRows | FileSize | URL                                                                |
++------------+-----------+----------+--------------------------------------------------------------------+
+|          1 |         2 |        8 | file:///192.168.1.10/home/work/path/result_{fragment_instance_id}_ |
++------------+-----------+----------+--------------------------------------------------------------------+
+1 row in set (0.05 sec)
+```
+
+* FileNumber:最终生成的文件个数。
+* TotalRows:结果集行数。
+* FileSize:导出文件总大小。单位字节。
+* URL:如果是导出到本地磁盘,则这里显示具体导出到哪个 Compute Node。
+
+如果进行了并发导出,则会返回多行数据。
+
+```sql
++------------+-----------+----------+--------------------------------------------------------------------+
+| FileNumber | TotalRows | FileSize | URL                                                                |
++------------+-----------+----------+--------------------------------------------------------------------+
+|          1 |         3 |        7 | file:///192.168.1.10/home/work/path/result_{fragment_instance_id}_ |
+|          1 |         2 |        4 | file:///192.168.1.11/home/work/path/result_{fragment_instance_id}_ |
++------------+-----------+----------+--------------------------------------------------------------------+
+2 rows in set (2.218 sec)
+```
+
+如果执行错误,则会返回错误信息,如:
+
+```sql
+mysql> SELECT * FROM tbl INTO OUTFILE ...
+ERROR 1064 (HY000): errCode = 2, detailMessage = Open broker writer failed ...
+```
+
+## 注意事项
+
+* 如果不开启并发导出,查询结果是由单个 BE 节点,单线程导出的。因此导出时间和导出结果集大小正相关。开启并发导出可以降低导出的时间。
+* 导出命令不会检查文件及文件路径是否存在。是否会自动创建路径、或是否会覆盖已存在文件,完全由远端存储系统的语义决定。
+* 如果在导出过程中出现错误,可能会有导出文件残留在远端存储系统上。Doris 不会清理这些文件。需要用户手动清理。
+* 导出命令的超时时间同查询的超时时间。可以通过 `SET query_timeout=xxx` 进行设置。
+* 对于结果集为空的查询,依然会产生一个大小为0的文件。
+* 文件切分会保证一行数据完整的存储在单一文件中。因此文件的大小并不严格等于 `max_file_size`。
+* 对于部分输出为非可见字符的函数,如 BITMAP、HLL 类型,输出为 `\N`,即 NULL。
+* 目前部分地理信息函数,如 `ST_Point` 的输出类型为 VARCHAR,但实际输出值为经过编码的二进制字符。当前这些函数会输出乱码。对于地理函数,请使用 `ST_AsText` 进行输出。
+
+## 更多帮助
+
+关于 OUTFILE 使用的更多详细语法及最佳实践,请参阅 [OUTFILE](../../sql-manual/sql-reference-v2/Data-Manipulation-Statements/OUTFILE.html) 命令手册,你也可以在 MySql 客户端命令行下输入 `HELP OUTFILE` 获取更多帮助信息。
diff --git a/new-docs/zh-CN/install/docker-install.md b/new-docs/zh-CN/install/docker-install.md
deleted file mode 100644
index 49b5263c1e..0000000000
--- a/new-docs/zh-CN/install/docker-install.md
+++ /dev/null
@@ -1,27 +0,0 @@
----
-{
-    "title": "Docker安装",
-    "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.
--->
-
-# Docker安装
\ No newline at end of file
diff --git a/new-docs/zh-CN/install/install-deploy.md b/new-docs/zh-CN/install/install-deploy.md
index 3d19af2775..e7fb97cb6d 100644
--- a/new-docs/zh-CN/install/install-deploy.md
+++ b/new-docs/zh-CN/install/install-deploy.md
@@ -24,4 +24,338 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# 安装与部署
\ No newline at end of file
+# 安装与部署
+
+该文档主要介绍了部署 Doris 所需软硬件环境、建议的部署方式、集群扩容缩容,以及集群搭建到运行过程中的常见问题。  
+在阅读本文档前,请先根据编译文档编译 Doris。
+
+## 软硬件需求
+
+### 概述
+
+Doris 作为一款开源的 MPP 架构 OLAP 数据库,能够运行在绝大多数主流的商用服务器上。为了能够充分运用 MPP 架构的并发优势,以及 Doris 的高可用特性,我们建议 Doris 的部署遵循以下需求:
+
+#### Linux 操作系统版本需求
+
+| Linux 系统 | 版本 |
+|---|---|
+| CentOS | 7.1 及以上 |
+| Ubuntu | 16.04 及以上 |
+
+#### 软件需求
+
+| 软件 | 版本 |
+|---|---|
+| Java | 1.8 及以上 |
+| GCC  | 4.8.2 及以上 |
+
+#### 操作系统安装要求
+
+##### 设置系统最大打开文件句柄数
+
+```
+vi /etc/security/limits.conf 
+* soft nofile 65536
+* hard nofile 65536
+```
+
+##### 时钟同步
+
+Doris 的元数据要求时间精度要小于5000ms,所以所有集群所有机器要进行时钟同步,避免因为时钟问题引发的元数据不一致导致服务出现异常。
+
+##### 关闭交换分区(swap)
+
+Linux交换分区会给Doris带来很严重的性能问题,需要在安装之前禁用交换分区
+
+##### Liunx文件系统
+
+这里我们推荐使用ext4文件系统,在安装操作系统的时候,请选择ext4文件系统。
+
+#### 开发测试环境
+
+| 模块 | CPU | 内存 | 磁盘 | 网络 | 实例数量 |
+|---|---|---|---|---|---|
+| Frontend | 8核+ | 8GB+ | SSD 或 SATA,10GB+ * | 千兆网卡 | 1 |
+| Backend | 8核+ | 16GB+ | SSD 或 SATA,50GB+ * | 千兆网卡 | 1-3 * |
+
+#### 生产环境
+
+| 模块 | CPU | 内存 | 磁盘 | 网络 | 实例数量(最低要求) |
+|---|---|---|---|---|---|
+| Frontend | 16核+ | 64GB+ | SSD 或 RAID 卡,100GB+ * | 万兆网卡 | 1-5 * |
+| Backend | 16核+ | 64GB+ | SSD 或 SATA,100G+ * | 万兆网卡 | 10-100 * |
+
+> 注1:
+> 1. FE 的磁盘空间主要用于存储元数据,包括日志和 image。通常从几百 MB 到几个 GB 不等。
+> 2. BE 的磁盘空间主要用于存放用户数据,总磁盘空间按用户总数据量 * 3(3副本)计算,然后再预留额外 40% 的空间用作后台 compaction 以及一些中间数据的存放。
+> 3. 一台机器上可以部署多个 BE 实例,但是**只能部署一个 FE**。如果需要 3 副本数据,那么至少需要 3 台机器各部署一个 BE 实例(而不是1台机器部署3个BE实例)。**多个FE所在服务器的时钟必须保持一致(允许最多5秒的时钟偏差)**
+> 4. 测试环境也可以仅适用一个 BE 进行测试。实际生产环境,BE 实例数量直接决定了整体查询延迟。
+> 5. 所有部署节点关闭 Swap。
+
+> 注2:FE 节点的数量
+> 1. FE 角色分为 Follower 和 Observer,(Leader 为 Follower 组中选举出来的一种角色,以下统称 Follower,具体含义见 [元数据设计文档]())。
+> 2. FE 节点数据至少为1(1 个 Follower)。当部署 1 个 Follower 和 1 个 Observer 时,可以实现读高可用。当部署 3 个 Follower 时,可以实现读写高可用(HA)。
+> 3. Follower 的数量**必须**为奇数,Observer 数量随意。
+> 4. 根据以往经验,当集群可用性要求很高时(比如提供在线业务),可以部署 3 个 Follower 和 1-3 个 Observer。如果是离线业务,建议部署 1 个 Follower 和 1-3 个 Observer。
+
+* **通常我们建议 10 ~ 100 台左右的机器,来充分发挥 Doris 的性能(其中 3 台部署 FE(HA),剩余的部署 BE)**
+* **当然,Doris的性能与节点数量及配置正相关。在最少4台机器(一台 FE,三台 BE,其中一台 BE 混部一个 Observer FE 提供元数据备份),以及较低配置的情况下,依然可以平稳的运行 Doris。**
+* **如果 FE 和 BE 混部,需注意资源竞争问题,并保证元数据目录和数据目录分属不同磁盘。**
+
+#### Broker 部署
+
+Broker 是用于访问外部数据源(如 hdfs)的进程。通常,在每台机器上部署一个 broker 实例即可。
+
+#### 网络需求
+
+Doris 各个实例直接通过网络进行通讯。以下表格展示了所有需要的端口
+
+| 实例名称 | 端口名称 | 默认端口 | 通讯方向 | 说明 |
+|---|---|---|---| ---|
+| BE | be_port | 9060 | FE --> BE | BE 上 thrift server 的端口,用于接收来自 FE 的请求 |
+| BE | webserver_port | 8040 | BE <--> BE | BE 上的 http server 的端口 |
+| BE | heartbeat\_service_port | 9050 | FE --> BE | BE 上心跳服务端口(thrift),用于接收来自 FE 的心跳 |
+| BE | brpc\_port | 8060 | FE <--> BE, BE <--> BE | BE 上的 brpc 端口,用于 BE 之间通讯 |
+| FE | http_port  | 8030 | FE <--> FE,用户 <--> FE |FE 上的 http server 端口 |
+| FE | rpc_port | 9020 | BE --> FE, FE <--> FE | FE 上的 thrift server 端口,每个fe的配置需要保持一致|
+| FE | query_port | 9030 | 用户 <--> FE | FE 上的 mysql server 端口 |
+| FE | edit\_log_port | 9010 | FE <--> FE | FE 上的 bdbje 之间通信用的端口 |
+| Broker | broker\_ipc_port | 8000 | FE --> Broker, BE --> Broker | Broker 上的 thrift server,用于接收请求 |
+
+> 注:
+> 1. 当部署多个 FE 实例时,要保证 FE 的 http\_port 配置相同。
+> 2. 部署前请确保各个端口在应有方向上的访问权限。
+
+#### IP 绑定
+
+因为有多网卡的存在,或因为安装过 docker 等环境导致的虚拟网卡的存在,同一个主机可能存在多个不同的 ip。当前 Doris 并不能自动识别可用 IP。所以当遇到部署主机上有多个 IP 时,必须通过 priority\_networks 配置项来强制指定正确的 IP。
+
+priority\_networks 是 FE 和 BE 都有的一个配置,配置项需写在 fe.conf 和 be.conf 中。该配置项用于在 FE 或 BE 启动时,告诉进程应该绑定哪个IP。示例如下:
+
+`priority_networks=10.1.3.0/24`
+
+这是一种 [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) 的表示方法。FE 或 BE 会根据这个配置项来寻找匹配的IP,作为自己的 localIP。
+
+**注意**:当配置完 priority\_networks 并启动 FE 或 BE 后,只是保证了 FE 或 BE 自身的 IP 进行了正确的绑定。而在使用 ADD BACKEND 或 ADD FRONTEND 语句中,也需要指定和 priority\_networks 配置匹配的 IP,否则集群无法建立。举例:
+
+BE 的配置为:`priority_networks=10.1.3.0/24`
+
+但是在 ADD BACKEND 时使用的是:`ALTER SYSTEM ADD BACKEND "192.168.0.1:9050";`
+
+则 FE 和 BE 将无法正常通信。
+
+这时,必须 DROP 掉这个添加错误的 BE,重新使用正确的 IP 执行 ADD BACKEND。
+
+FE 同理。
+
+BROKER 当前没有,也不需要 priority\_networks 这个选项。Broker 的服务默认绑定在 0.0.0.0 上。只需在 ADD BROKER 时,执行正确可访问的 BROKER IP 即可。
+
+#### 表名大小写敏感性设置
+
+doris默认为表名大小写敏感,如有表名大小写不敏感的需求需在集群初始化时进行设置。表名大小写敏感性在集群初始化完成后不可再修改。
+
+详细参见 [变量](../advanced/variables.md##支持的变量) 中关于`lower_case_table_names`变量的介绍。
+
+## 集群部署
+
+### 手动部署
+
+#### FE 部署
+
+* 拷贝 FE 部署文件到指定节点
+
+  将源码编译生成的 output 下的 fe 文件夹拷贝到 FE 的节点指定部署路径下并进入该目录。
+
+* 配置 FE
+
+    1. 配置文件为 conf/fe.conf。其中注意:`meta_dir`是元数据存放位置。默认值为 `${DORIS_HOME}/doris-meta`。需**手动创建**该目录。
+
+       **注意:生产环境强烈建议单独指定目录不要放在Doris安装目录下,最好是单独的磁盘(如果有SSD最好),测试开发环境可以使用默认配置**
+
+    2. fe.conf 中 JAVA_OPTS 默认 java 最大堆内存为 4GB,**建议生产环境调整至 8G 以上**。
+
+* 启动FE
+
+  `bin/start_fe.sh --daemon`
+
+  FE进程启动进入后台执行。日志默认存放在 log/ 目录下。如启动失败,可以通过查看 log/fe.log 或者 log/fe.out 查看错误信息。
+
+* 如需部署多 FE,请参见 "FE 扩容和缩容" 章节
+
+#### BE 部署
+
+* 拷贝 BE 部署文件到所有要部署 BE 的节点
+
+  将源码编译生成的 output 下的 be 文件夹拷贝到 BE 的节点的指定部署路径下。
+
+  > 注意:`output/be/lib/debug_info/` 目录下为调试信息文件,文件较大,但实际运行不需要这些文件,可以不部署。
+
+* 修改所有 BE 的配置
+
+  修改 be/conf/be.conf。主要是配置 `storage_root_path`:数据存放目录。默认在be/storage下,需要**手动创建**该目录。多个路径之间使用英文状态的分号 `;` 分隔(**最后一个目录后不要加 `;`**)。可以通过路径区别存储目录的介质,HDD或SSD。可以添加容量限制在每个路径的末尾,通过英文状态逗号`,`隔开。
+
+  示例1如下:
+
+  **注意:如果是SSD磁盘要在目录后面加上`.SSD`,HDD磁盘在目录后面加`.HDD`**
+
+  `storage_root_path=/home/disk1/doris.HDD,50;/home/disk2/doris.SSD,10;/home/disk2/doris`
+
+  **说明**
+
+    - /home/disk1/doris.HDD,50,表示存储限制为50GB,HDD;
+    - /home/disk2/doris.SSD,10,存储限制为10GB,SSD;
+    - /home/disk2/doris,存储限制为磁盘最大容量,默认为HDD
+
+  示例2如下:
+
+  **注意:不论HDD磁盘目录还是SSD磁盘目录,都无需添加后缀,storage_root_path参数里指定medium即可**
+
+  `storage_root_path=/home/disk1/doris,medium:hdd,capacity:50;/home/disk2/doris,medium:ssd,capacity:50`
+
+  **说明**
+
+    - /home/disk1/doris,medium:hdd,capacity:10,表示存储限制为10GB, HDD;
+    - /home/disk2/doris,medium:ssd,capacity:50,表示存储限制为50GB, SSD;
+
+* BE webserver_port端口配置
+
+  如果 be 部署在 hadoop 集群中,注意调整 be.conf 中的 `webserver_port = 8040` ,以免造成端口冲突
+
+* 在 FE 中添加所有 BE 节点
+
+  BE 节点需要先在 FE 中添加,才可加入集群。可以使用 mysql-client([下载MySQL 5.7](https://dev.mysql.com/downloads/mysql/5.7.html)) 连接到 FE:
+
+  `./mysql-client -h fe_host -P query_port -uroot`
+
+  其中 fe_host 为 FE 所在节点 ip;query_port 在 fe/conf/fe.conf 中的;默认使用 root 账户,无密码登录。
+
+  登录后,执行以下命令来添加每一个 BE:
+
+  `ALTER SYSTEM ADD BACKEND "be_host:heartbeat-service_port";`
+
+  其中 be_host 为 BE 所在节点 ip;heartbeat_service_port 在 be/conf/be.conf 中。
+
+* 启动 BE
+
+  `bin/start_be.sh --daemon`
+
+  BE 进程将启动并进入后台执行。日志默认存放在 be/log/ 目录下。如启动失败,可以通过查看 be/log/be.log 或者 be/log/be.out 查看错误信息。
+
+* 查看BE状态
+
+  使用 mysql-client 连接到 FE,并执行 `SHOW PROC '/backends';` 查看 BE 运行情况。如一切正常,`isAlive` 列应为 `true`。
+
+#### (可选)FS_Broker 部署
+
+Broker 以插件的形式,独立于 Doris 部署。如果需要从第三方存储系统导入数据,需要部署相应的 Broker,默认提供了读取 HDFS 、百度云 BOS 及 Amazon S3 的 fs_broker。fs_broker 是无状态的,建议每一个 FE 和 BE 节点都部署一个 Broker。
+
+* 拷贝源码 fs_broker 的 output 目录下的相应 Broker 目录到需要部署的所有节点上。建议和 BE 或者 FE 目录保持同级。
+
+* 修改相应 Broker 配置
+
+  在相应 broker/conf/ 目录下对应的配置文件中,可以修改相应配置。
+
+* 启动 Broker
+
+  `bin/start_broker.sh --daemon`
+
+* 添加 Broker
+
+  要让 Doris 的 FE 和 BE 知道 Broker 在哪些节点上,通过 sql 命令添加 Broker 节点列表。
+
+  使用 mysql-client 连接启动的 FE,执行以下命令:
+
+  `ALTER SYSTEM ADD BROKER broker_name "broker_host1:broker_ipc_port1","broker_host2:broker_ipc_port2",...;`
+
+  其中 broker_host 为 Broker 所在节点 ip;broker_ipc_port 在 Broker 配置文件中的conf/apache_hdfs_broker.conf。
+
+* 查看 Broker 状态
+
+  使用 mysql-client 连接任一已启动的 FE,执行以下命令查看 Broker 状态:`SHOW PROC "/brokers";`
+
+**注:在生产环境中,所有实例都应使用守护进程启动,以保证进程退出后,会被自动拉起,如 [Supervisor](http://supervisord.org/)。如需使用守护进程启动,在 0.9.0 及之前版本中,需要修改各个 start_xx.sh 脚本,去掉最后的 & 符号**。从 0.10.0 版本开始,直接调用 `sh start_xx.sh` 启动即可。也可参考 [这里](https://www.cnblogs.com/lenmom/p/9973401.html)
+
+
+## 常见问题
+
+### 进程相关
+
+1. 如何确定 FE 进程启动成功
+
+   FE 进程启动后,会首先加载元数据,根据 FE 角色的不同,在日志中会看到 ```transfer from UNKNOWN to MASTER/FOLLOWER/OBSERVER```。最终会看到 ```thrift server started``` 日志,并且可以通过 mysql 客户端连接到 FE,则表示 FE 启动成功。
+
+   也可以通过如下连接查看是否启动成功:  
+   `http://fe_host:fe_http_port/api/bootstrap`
+
+   如果返回:  
+   `{"status":"OK","msg":"Success"}`
+
+   则表示启动成功,其余情况,则可能存在问题。
+
+   > 注:如果在 fe.log 中查看不到启动失败的信息,也许在 fe.out 中可以看到。
+
+2. 如何确定 BE 进程启动成功
+
+   BE 进程启动后,如果之前有数据,则可能有数分钟不等的数据索引加载时间。
+
+   如果是 BE 的第一次启动,或者该 BE 尚未加入任何集群,则 BE 日志会定期滚动 ```waiting to receive first heartbeat from frontend``` 字样。表示 BE 还未通过 FE 的心跳收到 Master 的地址,正在被动等待。这种错误日志,在 FE 中 ADD BACKEND 并发送心跳后,就会消失。如果在接到心跳后,又重复出现 ``````master client, get client from cache failed.host: , port: 0, code: 7`````` 字样,说明 FE 成功连接了 BE,但 BE 无法主动连接 FE。可能需要检查 BE 到 FE 的 rpc_port 的连通性。
+
+   如果 BE 已经被加入集群,日志中应该每隔 5 秒滚动来自 FE 的心跳日志:```get heartbeat, host: xx.xx.xx.xx, port: 9020, cluster id: xxxxxx```,表示心跳正常。
+
+   其次,日志中应该每隔 10 秒滚动 ```finish report task success. return code: 0``` 的字样,表示 BE 向 FE 的通信正常。
+
+   同时,如果有数据查询,应该能看到不停滚动的日志,并且有 ```execute time is xxx``` 日志,表示 BE 启动成功,并且查询正常。
+
+   也可以通过如下连接查看是否启动成功:  
+   `http://be_host:be_http_port/api/health`
+
+   如果返回:  
+   `{"status": "OK","msg": "To Be Added"}`
+
+   则表示启动成功,其余情况,则可能存在问题。
+
+   > 注:如果在 be.INFO 中查看不到启动失败的信息,也许在 be.out 中可以看到。
+
+3. 搭建系统后,如何确定 FE、BE 连通性正常
+
+   首先确认 FE 和 BE 进程都已经单独正常启动,并确认已经通过 `ADD BACKEND` 或者 `ADD FOLLOWER/OBSERVER` 语句添加了所有节点。
+
+   如果心跳正常,BE 的日志中会显示 ```get heartbeat, host: xx.xx.xx.xx, port: 9020, cluster id: xxxxxx```。如果心跳失败,在 FE 的日志中会出现 ```backend[10001] got Exception: org.apache.thrift.transport.TTransportException``` 类似的字样,或者其他 thrift 通信异常日志,表示 FE 向 10001 这个 BE 的心跳失败。这里需要检查 FE 向 BE host 的心跳端口的连通性。
+
+   如果 BE 向 FE 的通信正常,则 BE 日志中会显示 ```finish report task success. return code: 0``` 的字样。否则会出现 ```master client, get client from cache failed``` 的字样。这种情况下,需要检查 BE 向 FE 的 rpc_port 的连通性。
+
+4. Doris 各节点认证机制
+
+   除了 Master FE 以外,其余角色节点(Follower FE,Observer FE,Backend),都需要通过 `ALTER SYSTEM ADD` 语句先注册到集群,然后才能加入集群。
+
+   Master FE 在第一次启动时,会在 doris-meta/image/VERSION 文件中生成一个 cluster_id。
+
+   FE 在第一次加入集群时,会首先从 Master FE 获取这个文件。之后每次 FE 之间的重新连接(FE 重启),都会校验自身 cluster id 是否与已存在的其它 FE 的 cluster id 相同。如果不同,则该 FE 会自动退出。
+
+   BE 在第一次接收到 Master FE 的心跳时,会从心跳中获取到 cluster id,并记录到数据目录的 `cluster_id` 文件中。之后的每次心跳都会比对 FE 发来的 cluster id。如果 cluster id 不相等,则 BE 会拒绝响应 FE 的心跳。
+
+   心跳中同时会包含 Master FE 的 ip。当 FE 切主时,新的 Master FE 会携带自身的 ip 发送心跳给 BE,BE 会更新自身保存的 Master FE 的 ip。
+
+   > **priority\_network**
+   >
+   > priority\_network 是 FE 和 BE 都有一个配置,其主要目的是在多网卡的情况下,协助 FE 或 BE 识别自身 ip 地址。priority\_network 采用 CIDR 表示法:[RFC 4632](https://tools.ietf.org/html/rfc4632)
+   >
+   > 当确认 FE 和 BE 连通性正常后,如果仍然出现建表 Timeout 的情况,并且 FE 的日志中有 `backend does not found. host: xxx.xxx.xxx.xxx` 字样的错误信息。则表示 Doris 自动识别的 IP 地址有问题,需要手动设置 priority\_network 参数。
+   >
+   > 出现这个问题的主要原因是:当用户通过 `ADD BACKEND` 语句添加 BE 后,FE 会识别该语句中指定的是 hostname 还是 IP。如果是 hostname,则 FE 会自动将其转换为 IP 地址并存储到元数据中。当 BE 在汇报任务完成信息时,会携带自己的 IP 地址。而如果 FE 发现 BE 汇报的 IP 地址和元数据中不一致时,就会出现如上错误。
+   >
+   > 这个错误的解决方法:1)分别在 FE 和 BE 设置 **priority\_network** 参数。通常 FE 和 BE 都处于一个网段,所以该参数设置为相同即可。2)在 `ADD BACKEND` 语句中直接填写 BE 正确的 IP 地址而不是 hostname,以避免 FE 获取到错误的 IP 地址。
+
+5. BE 进程文件句柄数
+
+   BE进程文件句柄数,受min_file_descriptor_number/max_file_descriptor_number两个参数控制。
+
+   如果不在[min_file_descriptor_number, max_file_descriptor_number]区间内,BE进程启动会出错,可以使用ulimit进行设置。
+
+   min_file_descriptor_number的默认值为65536。
+
+   max_file_descriptor_number的默认值为131072.
+
+   举例而言:ulimit -n 65536; 表示将文件句柄设成65536。
+
+   启动BE进程之后,可以通过 cat /proc/$pid/limits 查看进程实际生效的句柄数
diff --git a/new-docs/zh-CN/install/source-install/compilation-arm.md b/new-docs/zh-CN/install/source-install/compilation-arm.md
index 5d9f5b146e..c334af1d70 100644
--- a/new-docs/zh-CN/install/source-install/compilation-arm.md
+++ b/new-docs/zh-CN/install/source-install/compilation-arm.md
@@ -24,4 +24,42 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# ARM64 + KylinOS 编译运行 Doris
\ No newline at end of file
+# ARM64 + KylinOS 编译运行 Doris
+
+本文档介绍如何在 ARM64 平台上编译 Doris。
+
+注意,该文档仅作为指导性文档。在不同环境中编译可能出现其他错误。
+
+## 软硬件环境
+
+1. KylinOS 版本:
+
+    ```
+    $> cat /etc/.kyinfo
+    name=Kylin-Server
+    milestone=10-SP1-Release-Build04-20200711
+    arch=arm64
+    beta=False
+    time=2020-07-11 17:16:54
+    dist_id=Kylin-Server-10-SP1-Release-Build04-20200711-arm64-2020-07-11 17:16:54
+    ```
+
+2. CPU型号
+
+    ```
+    $> cat /proc/cpuinfo
+    model name  : Phytium,FT-2000+/64
+    ```
+
+## 使用 ldb-toolchain 编译
+
+该方法适用于 [commit 7f3564](https://github.com/apache/incubator-doris/commit/7f3564cca62de49c9f2ea67fcf735921dbebb4d1) 之后的 Doris 版本。
+
+下载 [ldb\_toolchain\_gen.aarch64.sh](https://github.com/amosbird/ldb_toolchain_gen/releases/download/v0.9.1/ldb_toolchain_gen.aarch64.sh)
+
+之后的编译方式参阅 [使用 LDB toolchain 编译](./compilation-with-ldb-toolchain.md)
+
+注意其中 jdk 和 nodejs 都需要下载对应的 aarch64 版本:
+
+1. [Java8-aarch64](https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/jdk-8u291-linux-aarch64.tar.gz)
+2. [Node v12.13.0-aarch64](https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/node-v16.3.0-linux-arm64.tar.xz)
diff --git a/new-docs/zh-CN/install/source-install/compilation-with-ldb-toolchain.md b/new-docs/zh-CN/install/source-install/compilation-with-ldb-toolchain.md
index 380864fa70..c835be1ba9 100644
--- a/new-docs/zh-CN/install/source-install/compilation-with-ldb-toolchain.md
+++ b/new-docs/zh-CN/install/source-install/compilation-with-ldb-toolchain.md
@@ -24,4 +24,94 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# 使用 LDB toolchain 编译
\ No newline at end of file
+# 使用 LDB toolchain 编译
+
+本文档主要介绍如何使用 LDB toolchain 编译 Doris。该方式目前作为 Docker 编译方式的补充,方便没有 Docker 环境的开发者和用户编译 Doris 源码。
+
+> 您依然可以使用 Docker 开发镜像编译最新代码:`apache/incubator-doris:build-env-ldb-toolchain-latest`
+
+> 感谢 [Amos Bird](https://github.com/amosbird) 的贡献。
+
+## 准备编译环境
+
+该方式适用于绝大多数 Linux 发行版(CentOS,Ubuntu 等)。
+
+1. 下载 `ldb_toolchain_gen.sh`
+
+   可以从 [这里](https://github.com/amosbird/ldb_toolchain_gen/releases) 下载最新的 `ldb_toolchain_gen.sh`。该脚本用于生成 ldb toolchain。
+
+   > 更多信息,可访问 [https://github.com/amosbird/ldb_toolchain_gen](https://github.com/amosbird/ldb_toolchain_gen)
+
+2. 执行以下命令生成 ldb toolchain
+
+    ```
+    sh ldb_toolchain_gen.sh /path/to/ldb_toolchain/
+    ```
+
+   其中 `/path/to/ldb_toolchain/` 为安装 toolchain 目录。
+
+   执行成功后,会在 `/path/to/ldb_toolchain/` 下生成如下目录结构:
+
+    ```
+    ├── bin
+    ├── include
+    ├── lib
+    ├── share
+    ├── test
+    └── usr
+    ```
+
+3. 下载并安装其他编译组件
+
+    1. [Java8](https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/jdk-8u131-linux-x64.tar.gz)
+    2. [Apache Maven 3.6.3](https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/apache-maven-3.6.3-bin.tar.gz)
+    3. [Node v12.13.0](https://doris-thirdparty-repo.bj.bcebos.com/thirdparty/node-v12.13.0-linux-x64.tar.gz)
+
+   对于不同的 Linux 发行版,可能默认包含的组件不同。因此可能需要安装一些额外的组件。下面以 centos6 为例,其他发行版类似:
+
+    ```
+    # install required system packages
+    sudo yum install -y byacc patch automake libtool make which file ncurses-devel gettext-devel unzip bzip2 zip util-linux wget git python2
+    
+    # install autoconf-2.69
+    wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz && \
+        tar zxf autoconf-2.69.tar.gz && \
+        cd autoconf-2.69 && \
+        ./configure && \
+        make && \
+        make install
+    
+    # install bison-3.0.4
+    wget http://ftp.gnu.org/gnu/bison/bison-3.0.4.tar.gz && \
+        tar xzf bison-3.0.4.tar.gz && \
+        cd bison-3.0.4 && \
+        ./configure && \
+        make && \
+        make install
+    ```
+
+4. 下载 Doris 源码
+
+    ```
+    git clone https://github.com/apache/incubator-doris.git
+    ```
+
+   下载完成后,进入到 doris 源码目录,创建 `custom_env.sh`,文件,并设置 PATH 环境变量,如:
+
+    ```
+    export JAVA_HOME=/path/to/java/
+    export PATH=$JAVA_HOME/bin:$PATH
+    export PATH=/path/to/maven/bin:$PATH
+    export PATH=/path/to/node/bin:$PATH
+    export PATH=/path/to/ldb_toolchain/bin:$PATH
+    ```
+
+## 编译 Doris
+
+进入 Doris 源码目录,执行:
+
+```
+sh build.sh
+```
+
+该脚本会先编译第三方库,之后再编译 Doris 组件(FE、BE)。编译产出在 `output/` 目录下。
diff --git a/new-docs/zh-CN/install/source-install/compilation.md b/new-docs/zh-CN/install/source-install/compilation.md
index e4681d94aa..180640c7f1 100644
--- a/new-docs/zh-CN/install/source-install/compilation.md
+++ b/new-docs/zh-CN/install/source-install/compilation.md
@@ -24,4 +24,210 @@ specific language governing permissions and limitations
 under the License.
 -->
 
-# 编译
\ No newline at end of file
+# 编译
+
+本文档主要介绍如何通过源码编译 Doris。
+
+## 使用 Docker 开发镜像编译(推荐)
+
+### 使用现成的镜像
+
+1. 下载 Docker 镜像
+
+   `$ docker pull apache/incubator-doris:build-env-ldb-toolchain-latest`
+
+   检查镜像下载完成:
+
+    ```
+    $ docker images
+    REPOSITORY              TAG                               IMAGE ID            CREATED             SIZE
+    apache/incubator-doris  build-env-ldb-toolchain-latest    49f68cecbc1a        4 days ago          3.76GB
+    ```
+
+> 注1:针对不同的 Doris 版本,需要下载对应的镜像版本。从 Apache Doris 0.15 版本起,后续镜像版本号将与 Doris 版本号统一。比如可以使用 `apache/incubator-doris:build-env-for-0.15.0 `  来编译 0.15.0 版本。
+>
+> 注2:`apache/incubator-doris:build-env-ldb-toolchain-latest` 用于编译最新主干版本代码,会随主干版本不断更新。可以查看 `docker/README.md` 中的更新时间。
+
+| 镜像版本 | commit id | doris 版本 |
+|---|---|---|
+| apache/incubator-doris:build-env | before [ff0dd0d](https://github.com/apache/incubator-doris/commit/ff0dd0d2daa588f18b6db56f947e813a56d8ec81) | 0.8.x, 0.9.x |
+| apache/incubator-doris:build-env-1.1 | [ff0dd0d](https://github.com/apache/incubator-doris/commit/ff0dd0d2daa588f18b6db56f947e813a56d8ec81) | 0.10.x, 0.11.x |
+| apache/incubator-doris:build-env-1.2 | [4ef5a8c](https://github.com/apache/incubator-doris/commit/4ef5a8c8560351d7fff7ff8fd51c4c7a75e006a8) | 0.12.x - 0.14.0 |
+| apache/incubator-doris:build-env-1.3.1 | [ad67dd3](https://github.com/apache/incubator-doris/commit/ad67dd34a04c1ca960cff38e5b335b30fc7d559f) | 0.14.x |
+| apache/incubator-doris:build-env-for-0.15.0 | [a81f4da](https://github.com/apache/incubator-doris/commit/a81f4da4e461a54782a96433b746d07be89e6b54) or later | 0.15.0 |
+| apache/incubator-doris:build-env-latest | before [0efef1b](https://github.com/apache/incubator-doris/commit/0efef1b332300887ee0473f9df9bdd9d7297d824) | |
+| apache/incubator-doris:build-env-ldb-toolchain-latest | trunk | |
+
+**注意**:
+
+> 1. 编译镜像 [ChangeLog](https://github.com/apache/incubator-doris/blob/master/thirdparty/CHANGELOG.md)。
+
+> 2. doris 0.14.0 版本仍然使用apache/incubator-doris:build-env-1.2 编译,0.14.x 版本的代码将使用apache/incubator-doris:build-env-1.3.1。
+
+> 3. 从 build-env-1.3.1 的docker镜像起,同时包含了 OpenJDK 8 和 OpenJDK 11,并且默认使用 OpenJDK 11 编译。请确保编译使用的 JDK 版本和运行时使用的 JDK 版本一致,否则会导致非预期的运行错误。你可以使用在进入编译镜像的容器后,使用以下命令切换默认 JDK 版本:
+     >
+     >   切换到 JDK 8:
+     >
+     >   ```
+>   $ alternatives --set java java-1.8.0-openjdk.x86_64
+>   $ alternatives --set javac java-1.8.0-openjdk.x86_64
+>   $ export JAVA_HOME=/usr/lib/jvm/java-1.8.0
+>   ```
+     >
+     >   切换到 JDK 11:
+     >
+     >   ```
+>   $ alternatives --set java java-11-openjdk.x86_64
+>   $ alternatives --set javac java-11-openjdk.x86_64
+>   $ export JAVA_HOME=/usr/lib/jvm/java-11
+>   ```
+
+2. 运行镜像
+
+   `$ docker run -it apache/incubator-doris:build-env-ldb-toolchain-latest`
+
+   建议以挂载本地 Doris 源码目录的方式运行镜像,这样编译的产出二进制文件会存储在宿主机中,不会因为镜像退出而消失。
+
+   同时,建议同时将镜像中 maven 的 `.m2` 目录挂载到宿主机目录,以防止每次启动镜像编译时,重复下载 maven 的依赖库。
+
+    ```
+    $ docker run -it -v /your/local/.m2:/root/.m2 -v /your/local/incubator-doris-DORIS-x.x.x-release/:/root/incubator-doris-DORIS-x.x.x-release/ apache/incubator-doris:build-env-ldb-toolchain-latest
+    ```
+
+3. 下载源码
+
+   启动镜像后,你应该已经处于容器内。可以通过以下命令下载 Doris 源码(已挂载本地源码目录则不用):
+
+    ```
+    $ wget https://dist.apache.org/repos/dist/dev/incubator/doris/xxx.tar.gz
+    or
+    $ git clone https://github.com/apache/incubator-doris.git
+    ```
+
+4. 编译 Doris
+
+    ```
+    $ sh build.sh
+    ```
+
+   >**注意:**
+   >
+   >如果你是第一次使用 `build-env-for-0.15.0` 或之后的版本,第一次编译的时候要使用如下命令:
+   >
+   > `sh build.sh --clean --be --fe --ui`
+   >
+   > 这是因为 build-env-for-0.15.0 版本镜像升级了 thrift(0.9 -> 0.13),需要通过 --clean 命令强制使用新版本的 thrift 生成代码文件,否则会出现不兼容的代码。
+
+   编译完成后,产出文件在 `output/` 目录中。
+
+### 自行编译开发环境镜像
+
+你也可以自己创建一个 Doris 开发环境镜像,具体可参阅 `docker/README.md` 文件。
+
+
+## 直接编译(CentOS/Ubuntu)
+
+你可以在自己的 linux 环境中直接尝试编译 Doris。
+
+1. 系统依赖
+   不同的版本依赖也不相同
+    * 在 [ad67dd3](https://github.com/apache/incubator-doris/commit/ad67dd34a04c1ca960cff38e5b335b30fc7d559f) 之前版本依赖如下:
+
+      `GCC 7.3+, Oracle JDK 1.8+, Python 2.7+, Apache Maven 3.5+, CMake 3.11+     Bison 3.0+`
+
+      如果使用Ubuntu 16.04 及以上系统 可以执行以下命令来安装依赖
+
+      `sudo apt-get install build-essential openjdk-8-jdk maven cmake byacc flex automake libtool-bin bison binutils-dev libiberty-dev zip unzip libncurses5-dev curl git ninja-build python autopoint pkg-config`
+
+      如果是CentOS 可以执行以下命令
+
+      `sudo yum groupinstall 'Development Tools' && sudo yum install maven cmake byacc flex automake libtool bison binutils-devel zip unzip ncurses-devel curl git wget python2 glibc-static libstdc++-static java-1.8.0-openjdk`
+
+    * 在 [ad67dd3](https://github.com/apache/incubator-doris/commit/ad67dd34a04c1ca960cff38e5b335b30fc7d559f) 之后版本依赖如下:
+
+      `GCC 10+, Oracle JDK 1.8+, Python 2.7+, Apache Maven 3.5+, CMake 3.19.2+ Bison 3.0+`
+
+      如果使用Ubuntu 16.04 及以上系统 可以执行以下命令来安装依赖
+       ```
+       sudo apt install build-essential openjdk-8-jdk maven cmake byacc flex automake libtool-bin bison binutils-dev libiberty-dev zip unzip libncurses5-dev curl git ninja-build python
+       sudo add-apt-repository ppa:ubuntu-toolchain-r/ppa
+       sudo apt update
+       sudo apt install gcc-10 g++-10 
+       sudo apt-get install autoconf automake libtool autopoint
+       ```
+
+      如果是CentOS 可以执行以下命令
+       ```
+       sudo yum groupinstall 'Development Tools' && sudo yum install maven cmake byacc flex automake libtool bison binutils-devel zip unzip ncurses-devel curl git wget python2 glibc-static libstdc++-static java-1.8.0-openjdk
+       sudo yum install centos-release-scl
+       sudo yum install devtoolset-10
+       scl enable devtoolset-10 bash
+       ```
+      如果当前仓库没有提供devtoolset-10 可以添加如下repo 使用oracle 提供 package
+       ```
+       [ol7_software_collections]
+       name=Software Collection packages for Oracle Linux 7 ($basearch)
+       baseurl=http://yum.oracle.com/repo/OracleLinux/OL7/SoftwareCollections/$basearch/
+       gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
+       gpgcheck=1
+       enabled=1
+       ```
+
+   安装完成后,自行设置环境变量 `PATH`, `JAVA_HOME` 等。(可以通过`alternatives --list`命令找到jdk的安装目录)
+   注意: Doris 0.14.0 的版本仍然使用gcc7 的依赖编译,之后的代码将使用gcc10 的依赖
+
+2. 编译 Doris
+
+    ```
+    $ sh build.sh
+    ```
+
+   编译完成后,产出文件在 `output/` 目录中。
+
+## 常见问题
+
+1. `Could not transfer artifact net.sourceforge.czt.dev:cup-maven-plugin:pom:1.6-cdh from/to xxx`
+
+   如遇到上述错误,请参照 [PR #4769](https://github.com/apache/incubator-doris/pull/4769/files) 修改 `fe/pom.xml` 中 cloudera 相关的仓库配置。
+
+2. 第三方依赖下载连接错误、失效等问题
+
+   Doris 所依赖的第三方库的下载连接都在 `thirdparty/vars.sh` 文件内。随着时间推移,一些下载连接可能会失效。如果遇到这种情况。可以使用如下两种方式解决:
+
+    1. 手动修改 `thirdparty/vars.sh` 文件
+
+       手动修改有问题的下载连接和对应的 MD5 值。
+
+    2. 使用第三方下载仓库:
+
+        ```
+        export REPOSITORY_URL=https://doris-thirdparty-repo.bj.bcebos.com/thirdparty
+        sh build-thirdparty.sh
+        ```
+
+       REPOSITORY_URL 中包含所有第三方库源码包和他们的历史版本。
+
+3. `fatal error: Killed signal terminated program ...`
+
+   使用 Docker 镜像编译时如遇到上述报错,可能是分配给镜像的内存不足(Docker 默认分配的内存大小为 2GB,编译过程中内存占用的峰值大于 2GB)。
+
+   尝试适当调大镜像的分配内存,推荐 4GB ~ 8GB。
+
+## 特别声明
+
+自 0.13 版本开始,默认的编译产出中将取消对 [1] 和 [2] 两个第三方库的依赖。这两个第三方库为 [GNU General Public License V3](https://www.gnu.org/licenses/gpl-3.0.en.html) 协议。该协议与 [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0) 协议不兼容,因此默认不出现在 Apache 发布版本中。
+
+移除依赖库 [1] 会导致无法访问 MySQL 外部表。访问 MySQL 外部表的功能会在后续版本中通过 UnixODBC 实现。
+
+移除依赖库 [2] 会导致在无法读取部分早期版本(0.8版本之前)写入的部分数据。因为早期版本中的数据是使用 LZO 算法压缩的,在之后的版本中,已经更改为 LZ4 压缩算法。后续我们会提供工具用于检测和转换这部分数据。
+
+如果有需求,用户可以继续使用这两个依赖库。如需使用,需要在编译时添加如下选项:
+
+```
+WITH_MYSQL=1 WITH_LZO=1 sh build.sh
+```
+
+注意,当用户依赖这两个第三方库时,则默认不在 Apache License 2.0 协议框架下使用 Doris。请注意 GPL 相关协议约束。
+
+* [1] mysql-5.7.18
+* [2] lzo-2.10
diff --git a/docs/zh-CN/sql-reference/sql-statements/Data Manipulation/OUTFILE.md b/new-docs/zh-CN/sql-manual/sql-reference-v2/Data-Manipulation-Statements/OUTFILE.md
similarity index 99%
rename from docs/zh-CN/sql-reference/sql-statements/Data Manipulation/OUTFILE.md
rename to new-docs/zh-CN/sql-manual/sql-reference-v2/Data-Manipulation-Statements/OUTFILE.md
index b3e5ed92e8..dd8af07b06 100644
--- a/docs/zh-CN/sql-reference/sql-statements/Data Manipulation/OUTFILE.md	
+++ b/new-docs/zh-CN/sql-manual/sql-reference-v2/Data-Manipulation-Statements/OUTFILE.md
@@ -28,20 +28,20 @@ under the License.
 ## description
 
     该语句用于使用 `SELECT INTO OUTFILE` 命令将查询结果的导出为文件。目前支持通过 Broker 进程, 通过 S3 协议, 或直接通过 HDFS 协议,导出到远端存储,如 HDFS,S3,BOS,COS(腾讯云)上。
-
+    
     语法:
         query_stmt
         INTO OUTFILE "file_path"
         [format_as]
         [properties]
-
+    
     1. file_path
         file_path 指向文件存储的路径以及文件前缀。如 `hdfs://path/to/my_file_`。
         最终的文件名将由 `my_file_`,文件序号以及文件格式后缀组成。其中文件序号由0开始,数量为文件被分割的数量。如:
             my_file_abcdefg_0.csv
             my_file_abcdefg_1.csv
             my_file_abcdegf_2.csv
-
+    
     2. format_as
         FORMAT AS CSV
         指定导出格式。默认为 CSV。
@@ -49,24 +49,24 @@ under the License.
 
     3. properties
         指定相关属性。目前支持通过 Broker 进程, 或通过 S3 协议进行导出。
-
+    
         语法:
         [PROPERTIES ("key"="value", ...)]
         支持如下属性:
         column_separator: 列分隔符
         line_delimiter: 行分隔符
         max_file_size: 单个文件大小限制,如果结果超过这个值,将切割成多个文件。
-
+    
         Broker 相关属性需加前缀 `broker.`:
         broker.name: broker名称
         broker.hadoop.security.authentication: 指定认证方式为 kerberos
         broker.kerberos_principal: 指定 kerberos 的 principal
         broker.kerberos_keytab: 指定 kerberos 的 keytab 文件路径。该文件必须为 Broker 进程所在服务器上的文件的绝对路径。并且可以被 Broker 进程访问
-
+    
         HDFS 相关属性需加前缀 `hdfs.`:
         hdfs.fs.defaultFS: namenode 地址和端口
         hdfs.hdfs_user: hdfs 用户名
-
+    
         S3 协议则直接执行 S3 协议配置即可:
         AWS_ENDPOINT
         AWS_ACCESS_KEY
@@ -91,7 +91,7 @@ under the License.
     );
     最终生成文件如如果不大于 100MB,则为:`result_0.csv`。
     如果大于 100MB,则可能为 `result_0.csv, result_1.csv, ...`。
-
+    
     2. 将简单查询结果导出到文件 `hdfs://path/to/result.parquet`。指定导出格式为 PARQUET。使用 `my_broker` 并设置 kerberos 认证信息。
     SELECT c1, c2, c3 FROM tbl
     INTO OUTFILE "hdfs://path/to/result_"
@@ -105,7 +105,7 @@ under the License.
         "schema"="required,int32,c1;required,byte_array,c2;required,byte_array,c2"
     );
     查询结果导出到parquet文件需要明确指定`schema`。
-
+    
     3. 将 CTE 语句的查询结果导出到文件 `hdfs://path/to/result.txt`。默认导出格式为 CSV。使用 `my_broker` 并设置 hdfs 高可用信息。使用默认的行列分隔符。
     WITH
     x1 AS
@@ -141,7 +141,7 @@ under the License.
         "broker.bos_secret_accesskey" = "yyyyyyyyyyyyyyyyyyyyyyyyyy",
         "schema"="required,int32,k1;required,byte_array,k2"
     );
-
+    
     5. 将 select 语句的查询结果导出到文件 `cos://${bucket_name}/path/result.txt`。指定导出格式为 csv。
     导出完成后,生成一个标识文件。
     select k1,k2,v1 from tbl1 limit 100000
@@ -163,7 +163,7 @@ under the License.
     在cos上验证
         1. 不存在的path会自动创建
         2. access.key/secret.key/endpoint需要和cos的同学确认。尤其是endpoint的值,不需要填写bucket_name。
-
+    
     6. 使用 s3 协议导出到 bos,并且并发导出开启。
     set enable_parallel_outfile = true;
     select k1 from tb1 limit 1000
@@ -177,7 +177,7 @@ under the License.
         "AWS_REGION" = "bd"
     )
     最终生成的文件前缀为 `my_file_{fragment_instance_id}_`。
-
+    
     7. 使用 s3 协议导出到 bos,并且并发导出 session 变量开启。
     注意:但由于查询语句带了一个顶层的排序节点,所以这个查询即使开启并发导出的 session 变量,也是无法并发导出的。
     set enable_parallel_outfile = true;
@@ -191,7 +191,7 @@ under the License.
         "AWS_SECRET_KEY" = "xxx",
         "AWS_REGION" = "bd"
     )
-
+    
     8. 使用 hdfs 方式导出,将简单查询结果导出到文件 `hdfs://path/to/result.txt`。指定导出格式为 CSV,用户名为work。指定列分隔符为 `,`,行分隔符为 `\n`。
     SELECT * FROM tbl
     INTO OUTFILE "hdfs://path/to/result_"


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