閱讀882 返回首頁    go 微信


OTSReader__Reader插件_使用手冊_數據集成-阿裏雲

1 快速介紹

OTSReader插件實現了從OTS讀取數據,並可以通過用戶指定抽取數據範圍可方便的實現數據增量抽取的需求。目前支持三種抽取方式:

  • 全表抽取
  • 範圍抽取
  • 指定分片抽取

OTS是構建在阿裏雲飛天分布式係統之上的 NoSQL數據庫服務,提供海量結構化數據的存儲和實時訪問。OTS 以實例和表的形式組織數據,通過數據分片和負載均衡技術,實現規模上的無縫擴展。

2 實現原理

簡而言之,OTSReader通過OTS官方Java SDK連接到OTS服務端,獲取並按照DataX官方協議標準轉為DataX字段信息傳遞給下遊Writer端。

OTSReader會根據OTS的表範圍,按照Datax並發的數目N,將範圍等分為N份Task。每個Task都會有一個OTSReader線程來執行。

3 功能說明

3.1 配置樣例
  • 配置一個從OTS全表同步抽取數據到本地的作業:
{
    "type": "job",
    "traceId": "您可以在這裏填寫您作業的追蹤ID,建議使用業務名+您的作業ID",
    "version": "1.0",
    "configuration": {
        "reader": {
            "plugin": "ots",
            "parameter": {
                "endpoint": "",
                "accessId": "",
                "accessKey": "",
                "instanceName": "",
                "table": "",
                "column": [
                    {
                        "name": "col1"
                    },
                    {
                        "name": "col2"
                    },
                    {
                        "name": "col3"
                    },
                    {
                        "type": "STRING",
                        "value": "bazhen"
                    },
                    {
                        "type": "INT",
                        "value": ""
                    },
                    {
                        "type": "DOUBLE",
                        "value": ""
                    },
                    {
                        "type": "BOOL",
                        "value": ""
                    },
                    {
                        "type": "BINARY",
                        "value": "Base64(bin)"
                    }
                ],
                "range": {
                    "begin": [
                        {
                            "type": "INF_MIN"
                        }
                    ],
                    "end": [
                        {
                            "type": "INF_MAX"
                        }
                    ]
                }
            }
        }
    },
    "writer": {}
}
  • 配置一個定義抽取範圍的OTSReader:
{
    "type": "job",
    "traceId": "您可以在這裏填寫您作業的追蹤ID,建議使用業務名+您的作業ID",
    "version": "1.0",
    "configuration": {
        "reader": {
            "plugin": "ots",
            "parameter": {
                        "endpoint":"",            
                        "accessId":"",            
                        "accessKey":"",           
                        "instanceName":"",

                        // 導出數據表的表名   
                        "table":"",

                        // 需要導出的列名,支持重複類和常量列,區分大小寫
                        // 常量列:類型支持STRING,INT,DOUBLE,BOOL和BINARY
                        // 備注:BINARY需要通過Base64轉換為對應的字符串傳入插件
                        "column":[
                            {"name":"col1"},                          // 普通列
                            {"name":"col2"},                          // 普通列
                            {"name":"col3"},                          // 普通列
                            {"type":"STRING","value" : ""},           // 常量列(字符串)
                            {"type":"INT","value" : ""},              // 常量列(整形)
                            {"type":"DOUBLE","value" : ""},           // 常量列(浮點)
                            {"type":"BOOL","value" : ""},             // 常量列(布爾)
                            {"type":"BINARY","value" : "Base64(bin)"} // 常量列(二進製)
                        ], 
                        "range":{
                            // 導出數據的起始範圍
                            // 支持INF_MIN, INF_MAX, STRING, INT
                            "begin":[
                                {"type":"INF_MIN"},
                                {"type":"INF_MAX"},
                                {"type":"STRING", "value":"hello"},
                                {"type":"INT", "value":"2999"},
                            ],
                            // 導出數據的結束範圍
                            // 支持INF_MIN, INF_MAX, STRING, INT
                            "end":[
                                {"type":"INF_MAX"},
                                {"type":"INF_MIN"},
                                {"type":"STRING", "value":"hello"},
                                {"type":"INT", "value":"2999"},
                            ]
                        }
                    }
            }
        },
        "writer": {

        }
    }
}
3.2 參數說明
  • endpoint
  • accessId
    • 描述:OTS的accessId
    • 必選:是
    • 默認值:無
  • accessKey
    • 描述:OTS的accessKey
    • 必選:是
    • 默認值:無
  • instanceName
    • 描述:OTS的實例名稱,實例是用戶使用和管理 OTS 服務的實體,用戶在開通 OTS 服務之後,需要通過管理控製台來創建實例,然後在實例內進行表的創建和管理。實例是 OTS 資源管理的基礎單元,OTS 對應用程序的訪問控製和資源計量都在實例級別完成。
    • 必選:是
    • 默認值:無
  • table

    • 描述:所選取的需要抽取的表名稱,這裏有且隻能填寫一張表。在OTS不存在多表同步的需求。
    • 必選:是
    • 默認值:無
  • column

    • 描述:所配置的表中需要同步的列名集合,使用JSON的數組描述字段信息。由於OTS本身是NoSQL係統,在OTSReader抽取數據過程中,必須指定相應地字段名稱。

      支持普通的列讀取,例如: {"name":"col1"}

      支持部分列讀取,如用戶不配置該列,則OTSReader不予讀取。

      支持常量列讀取,例如: {"type":"STRING", "value" : "DataX"}。使用type描述常量類型,目前支持STRING、INT、DOUBLE、BOOL、BINARY(用戶使用Base64編碼填寫)、INF_MIN(OTS的係統限定最小值,使用該值用戶不能填寫value屬性,否則報錯)、INF_MAX(OTS的係統限定最大值,使用該值用戶不能填寫value屬性,否則報錯)。

      不支持函數或者自定義表達式,由於OTS本身不提供類似SQL的函數或者表達式功能,OTSReader也不能提供函數或表達式列功能。

    • 必選:是

    • 默認值:無

  • begin/end

    • 描述:該配置項必須配對使用,用於支持OTS表範圍抽取。begin/end中描述的是OTS PrimaryKey的區間分布狀態,而且必須保證區間覆蓋到所有的PrimaryKey,需要指定該表下所有的PrimaryKey範圍,對於無限大小的區間,可以使用{"type":"INF_MIN"},{"type":"INF_MAX"}指代。例如對一張主鍵為 [DeviceID, SellerID]的OTS進行抽取任務,begin/end可以配置為:
      "range": {
        "begin": [
          {"type":"INF_MIN"},  //指定deviceID最小值
          {"type":"INT", "value":"0"}  //指定SellerID最小值
        ], 
        "end": [
          {"type":"INF_MAX"}, //指定deviceID抽取最大值
          {"type":"INT", "value":"9999"} //指定SellerID抽取最大值
        ]
      }
    

    如果要對上述表抽取全表,可以使用如下配置:

        "range": {
          "begin": [
            {"type":"INF_MIN"},  //指定deviceID最小值
            {"type":"INF_MIN"} //指定SellerID最小值
          ], 
          "end": [
            {"type":"INF_MAX"}, //指定deviceID抽取最大值
              {"type":"INF_MAX"} //指定SellerID抽取最大值
          ]
        }
    
    • 必選:是
    • 默認值:空
  • split

    • 描述:該配置項屬於高級配置項,是用戶自己定義切分配置信息,普通情況下不建議用戶使用。適用場景通常在OTS數據存儲發生熱點,使用OTSReader自動切分的策略不能生效情況下,使用用戶自定義的切分規則。split指定是的在Begin、End區間內的切分點,且隻能是partitionKey的切分點信息,即在split僅配置partitionKey,而不需要指定全部的PrimaryKey。

      例如對一張主鍵為 [DeviceID, SellerID]的OTS進行抽取任務,可以配置為:

      "range": {
        "begin": {
          {"type":"INF_MIN"},  //指定deviceID最小值
          {"type":"INF_MIN"}  //指定deviceID最小值
        }, 
        "end": {
          {"type":"INF_MAX"}, //指定deviceID抽取最大值
          {"type":"INF_MAX"} //指定deviceID抽取最大值
        },
         // 用戶指定的切分點,如果指定了切分點,Job將按照begin、end和split進行Task的切分,
              // 切分的列隻能是Partition Key(ParimaryKey的第一列)
              // 支持INF_MIN, INF_MAX, STRING, INT
              "split":[
                                  {"type":"STRING", "value":"1"},
                                  {"type":"STRING", "value":"2"},
                                  {"type":"STRING", "value":"3"},
                                  {"type":"STRING", "value":"4"},
                                  {"type":"STRING", "value":"5"}
                      ]
      }
    
    • 必選:否
    • 默認值:無
3.3 類型轉換

目前OTSReader支持所有OTS類型,下麵列出OTSReader針對OTS類型轉換列表:

CDP 內部類型 OTS 數據類型
Long Integer
Double Double
String String
Boolean Boolean
Bytes Binary
  • 注意,OTS本身不支持日期型類型。應用層一般使用Long報錯時間的Unix TimeStamp。

4 性能報告

4.1 環境準備
4.1.1數據特征

15列String(10 Byte), 2兩列Integer(8 Byte),總計168Byte/r。

4.1.2 機器參數

OTS端:3台前端機,5台後端機

CDP運行端: 24核CPU, 98GB內存

4.2 測試報告
並發數 CDP CPU OTS 流量 CDP流量 前端QPS 前端延時
2 36% 6.3M/s 12739 rec/s 4.7 308ms
11 155% 32M/s 60732 rec/s 23.9 412ms
50 377% 73M/s 145139 rec/s 54 874ms
100 448% 82M/s 156262 rec/s 60 1570ms

5 約束限製

5.1 一致性約束

OTS是類BigTable的存儲係統,OTS本身能夠保證單行寫事務性,無法提供跨行級別的事務。對於OTSReader而言也無法提供全表的一致性視圖。例如對於OTSReader在0點啟動的數據同步任務,在整個表數據同步過程中,OTSReader同樣會抽取到後續更新的數據,無法提供準確的0點時刻該表一致性視圖。

5.2 增量數據同步

OTS本質上KV存儲,目前隻能針對PK進行範圍查詢,暫不支持按照字段範圍抽取數據。因此隻能對於增量查詢,如果PK能夠表示範圍信息,例如自增ID,或者時間戳。

自增ID,OTSReader可以通過記錄上次最大的ID信息,通過指定Range範圍進行增量抽取。這樣使用的前提是OTS中的PrimaryKey必須包含主鍵自增列(自增主鍵需要使用OTS應用方生成。)

時間戳, OTSReader可以通過PK過濾時間戳,通過製定Range範圍進行增量抽取。這樣使用的前提是OTS中的PrimaryKey必須包含主鍵時間列(時間主鍵需要使用OTS應用方生成。)

最後更新:2016-11-23 16:03:59

  上一篇:go ODPSReader__Reader插件_使用手冊_數據集成-阿裏雲
  下一篇:go DRDSReader__Reader插件_使用手冊_數據集成-阿裏雲