当使用Tablestore(OTS)Reader同步全量数据过程中出现同步速度较慢问题时的现象、原因和解决方案。

现象

使用Tablestore(OTS)Reader同步全量数据过程中出现同步速度较慢问题。同步脚本的配置如下:
"reader": {
  "plugin": "ots",
  "parameter": {
    "datasource": "",
    "table": "",
    "column": [],
    "range": {
      "begin": [
        {
          "type": "INF_MIN"
        }
      ],
      "end": [
        {
          "type": "INF_MAX"
        }
      ]
    }
  }
}

原因

全量数据非常大且未在同步脚本中配置Split,此时同步任务为单并发拉取数据,会影响数据的同步速度。

解决方案

当全量数据非常大时,请在同步脚本中配置Split。具体操作如下:
  1. 通过如下任意方式获取Split位点,请根据实际选择。
    • 使用SDK调用ComputeSplitPointsBySize接口。具体操作,请参见指定大小计算分片

      返回示例如下:

      LowerBound:pkname1:INF_MIN, pkname2:INF_MIN
      UpperBound:pkname1:cbcf23c8cdf831261f5b3c052db3479e, pkname2:INF_MIN
      LowerBound:pkname1:cbcf23c8cdf831261f5b3c052db3479e, pkname2:INF_MIN
      UpperBound:pkname1:INF_MAX, pkname2:INF_MAX
    • 下载Tablestore CLI工具后,使用points -s splitSize -t tablename命令获取。具体操作,请参见命令行工具
      说明 splitSize以100 MB为单位。当数据量较少时,无需配置Split位点;当数据量较多时,建议根据同步环境所能支持的最大并发度合理配置splitSize。

      返回示例如下:

      [
      
          {
      
              "LowerBound": {
      
                  "PrimaryKeys": [
      
                      {
      
                          "ColumnName": "pkname1",
      
                          "Value": null,
      
                          "PrimaryKeyOption": 2
      
                      },
      
                      {
      
                          "ColumnName": "pkname2",
      
                          "Value": null,
      
                          "PrimaryKeyOption": 2
      
                      }
      
                  ]
      
              },
      
              "UpperBound": {
      
                  "PrimaryKeys": [
      
                      {
      
                          "ColumnName": "pkname1",
      
                          "Value": "cbcf23c8cdf831261f5b3c052db3479e\u0000",
      
                          "PrimaryKeyOption": 0
      
                      },
      
                      {
      
                          "ColumnName": "pkname2",
      
                          "Value": null,
      
                          "PrimaryKeyOption": 2
      
                      }
      
                  ]
      
              },
      
              "Location": "80310717938EDF503FB1E26F70710391"
      
          },
      
          {
      
              "LowerBound": {
      
                  "PrimaryKeys": [
      
                      {
      
                          "ColumnName": "pkname1",
      
                          "Value": "cbcf23c8cdf831261f5b3c052db3479e\u0000",
      
                          "PrimaryKeyOption": 0
      
                      },
      
                      {
      
                          "ColumnName": "pkname2",
      
                          "Value": null,
      
                          "PrimaryKeyOption": 2
      
                      }
      
                  ]
      
              },
      
              "UpperBound": {
      
                  "PrimaryKeys": [
      
                      {
      
                          "ColumnName": "pkname1",
      
                          "Value": null,
      
                          "PrimaryKeyOption": 3
      
                      },
      
                      {
      
                          "ColumnName": "pkname2",
      
                          "Value": null,
      
                          "PrimaryKeyOption": 3
      
                      }
      
                  ]
      
              },
      
              "Location": "80310717938EDF503FB1E26F70710391"
      
          }
      
      ]
      找到返回示例中第一列主键(即分区键)的Value,例如第一个LowerBound的pkname1 = null,第一个UpperBound的pkname1 = "cbcf23c8cdf831261f5b3c052db3479e\u0000",第二个LowerBound的pkname1 = "cbcf23c8cdf831261f5b3c052db3479e\u0000",第二个UpperBound的pkname1 = null,则全量同步脚本中的split配置如下:
      "split" : [
      
         {
      
             "type":"STRING",
      
             "value":"cbcf23c8cdf831261f5b3c052db3479e\u0000"
      
         }
      
      ]

      使用上述配置时,表格存储会将全量数据分为(INF_MIN,cbcf23c8cdf831261f5b3c052db3479e\u0000)和[cbcf23c8cdf831261f5b3c052db3479e\u0000,INF_MAX)两个区间进行数据并发拉取,提高同步速度。

  2. 在同步脚本中配置Split位点。同步脚本示例如下:
    "range": {
          "begin": [
            {
              "type": "INF_MIN"
            }
          ],
          "end": [
            {
              "type": "INF_MAX"
            }
          ],
          "split": [
            {
              "type": "STRING",
              "value": "splitPoint1"
            },
            {
              "type": "STRING",
              "value": "splitPoint2"
            },
            {
              "type": "STRING",
              "value": "splitPoint3"
            }
          ]
    }

配置Split位点后,如果同步速度仍未提升,请提交工单联系表格存储技术支持进行处理。