datax(二)datax on azkaban架构设计之datax as a service

 

一、背景

上篇文章说道,datax目前版本只支持单机模式,单机性能容易出现瓶颈,因此在线上使用datax做数据同步的时候,配合调度系统进行使用是个普遍的选择,这里我们选用的是azkaban作为调度系统进行设计,对datax进行封装提供服务。

 

二、功能说明

1、支持datax的服务调用,包括同步任务的执行、停止。

2、支持分数据源类型 / 输出数据源类型 / 租户名称 / 同步名称 / 运行状态 / 创建者的同步任务列表分页查询。

3、支持同步任务的状态查询,包括成功任务的指标查询;运行中任务的进度查询;失败任务的报错信息。

 

三、表结构设计

 

CREATE TABLE `data_sync_info` (
  `sync_id` varchar(255) NOT NULL,
  `sync_name` varchar(50) NOT NULL COMMENT '同步名称',
  `sync_desc` varchar(255) DEFAULT NULL COMMENT '同步描述',
  `sync_type` int(5) NOT NULL COMMENT '1-datax,预留字段可以后续替换同步引擎 ',
  `exec_id` varchar(20) NOT NULL COMMENT 'az执行id',
  `tenant_name` varchar(30) DEFAULT NULL COMMENT '租户名,这里的租户指的是对接datax service的各个平台',
  `job_config` text  DEFAULT NULL COMMENT 'datax的执行json',
  `source_datasource_id` varchar(255) DEFAULT NULL COMMENT '来源数据源id',
  `source_datasource_type` varchar(20) NOT NULL COMMENT '原始数据源类型',
  `target_datasource_id` varchar(255) DEFAULT NULL COMMENT '目标数据源id',
  `target_datasource_type` varchar(20) NOT NULL COMMENT '目标数据源类型',
  `running_status` int(5) NOT NULL COMMENT '0-同步中 1-同步失败 2-同步成功',
  `running_msg` text DEFAULT NULL COMMENT 'datax的任务运行成功指标情况或者任务运行失败详情',
  `start_time` datetime DEFAULT NULL,
  `end_time` datetime DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `create_by` varchar(255) NOT NULL DEFAULT NULL COMMENT '任务提交者',
  `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`sync_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

 

四、架构设计

datax(二)datax on azkaban架构设计之datax as a service_第1张图片

4.1 架构说明

1、datax-service模块为自己实现的模块,用于承载外部系统的数据同步需求,以http的方式暴露服务接口,提供任务执行、任务停止、任务列表、任务状态的功能。定时任务采用elastic-job用于周期性地对正在运行的任务进行任务状态更新、任务信息更新(包括任务运行进度、任务成功指标、任务失败信息等)。

2、datax-scheduler模块为自己实现的模块,用于做azkaban上的调度任务,datax-service在进行任务执行、任务停止、以及同步任务状态/信息等操作时,通过azkaban-api与datax-scheduler进行交互。任务状态更新、任务信息更新是通过对datax-scheduler的日志进行解析实现。

3、datax-core表示alibaba datax原生的datax打包工程,带有bin、conf、plugin等目录,需要在每个azkaban executor节点都部署一套放在固定可执行目录。

4、这里用aws s3作为文件存储,用于保存同步任务的datax执行json文件,datax-scheduler在执行时,会去s3上拉取文件到azkaban executor的指定目录下进行执行

 

 

五、接口文档

5.1 同步任务执行接口

简要描述

  • 新建同步任务,并进行执行

请求接口

/api/gdatax/data_sync/v1/data_sync/start

请求方式

  • POST

请求参数说明

参数名

类型

说明

是否必填

syncName
String 同步任务名称
syncDesc
String 同步任务描述
syncType
Integer 同步任务描类型 1-datax
tenantName
String 租户名
jobConfig
String datax的执行json
sourceDatasourceId
String 来源数据源id
sourceDatasourceType
String 原始数据源类型
targetDatasourceId
String 目标数据源id
targetDatasourceType
String 目标数据源类型
creatorBy
String 创建者

 

请求参数示例

{

    "syncName":"xxx同步到xxx",

    "syncDesc":"同步个毛啊",

    "syncType":1,

    "tenantName":"GDMODELLING",

    "jobConfig""{\"job\":{\"setting\":{\"speed\":{\"channel\":10},\"errorLimit\":{\"record\":0,\"percentage\":0.02}},\"content\":[{\"reader\":{\"name\":\"mysqlreader\",\"parameter\":{\"username\":\"remote\",\"password\":\"hangzhoumeiri\",\"column\":[\"`id`\",\"`taskName`\",\"`templateId`\",\"`paramJson`\",\"`userId`\",\"`status`\",\"`jobs`\",\"`stage`\",\"`progress`\",\"`dataFilePath`\",\"`is_deleted`\",\"`create_time`\",\"`last_update_time`\",\"`result`\",\"`job_ids`\",\"`syn`\",\"`end_run_time`\",\"`start_run_time`\",\"`expect_execute_time`\",\"`task_info`\",\"`scheduler_task_id`\"],\"splitPk\":\"id\",\"connection\":[{\"table\":[\"task\"],\"jdbcUrl\":[\"jdbc:mysql://xxx:3306/data_operation\"]}]}},\"writer\":{\"name\":\"mysqlwriter\",\"parameter\":{\"username\":\"remote\",\"password\":\"hangzhoumeiri\",\"column\":[\"`id`\",\"`taskName`\",\"`templateId`\",\"`paramJson`\",\"`userId`\",\"`status`\",\"`jobs`\",\"`stage`\",\"`progress`\",\"`dataFilePath`\",\"`is_deleted`\",\"`create_time`\",\"`last_update_time`\",\"`result`\",\"`job_ids`\",\"`syn`\",\"`end_run_time`\",\"`start_run_time`\",\"`expect_execute_time`\",\"`task_info`\",\"`scheduler_task_id`\"],\"preSql\":[\"\"],\"connection\":[{\"table\":[\"task\"],\"jdbcUrl\":\"jdbc:mysql://xxx:3306/test\"}]}},\"transformer\":[{\"name\":\"dx_substr\",\"parameter\":{\"columnIndex\":1,\"paras\":[\"1\",\"3\"]}}]}]}}",

    "sourceDatasourceId":"123",

    "sourceDatasourceType":"ORACLE",

    "targetDatasourceId":"123",

    "targetDatasourceType":"MYSQL",

    "createBy":"jiaqk"

}

 

返回参数说明

参数名

参数类型

参数说明

syncId
String 同步任务id
syncName
String 同步任务名
syncDesc
String 同步任务详情
syncType
Integer 同步任务类型 1-datax 
execId
String az执行id
tenantName
String 租户名称
jobConfig String datax的执行json
runningStatus
Integer

运行状态

0-同步中 1-同步失败 2-同步成功 3-已停止

runningMsg
String 运行信息,见附录:运行信息说明
startTime String 开始时间
endTime String 结束时间
createTime
String 任务创建时间
createBy
String 创建者
updateTime
String 任务更新时间

 

返回参数示例

{

  "result"0,

  "msg":"同步任务执行成功",

  "data":{

      "syncId":"sdsdsds"

      "syncName""sdssdsd",

      "syncDesc""sdsdsdsdsd",

      "syncType" 0,

      "execId""123213",

      "tenantName""GDMODELLING",

      "jobConfig":"{\"job\":{\"setting\":{\"speed\":{\"channel\":10},\"errorLimit\":{\"record\":0,\"percentage\":0.02}},\"content\":[{\"reader\":{\"name\":\"mysqlreader\",\"parameter\":{\"username\":\"remote\",\"password\":\"hangzhoumeiri\",\"column\":[\"`id`\",\"`taskName`\",\"`templateId`\",\"`paramJson`\",\"`userId`\",\"`status`\",\"`jobs`\",\"`stage`\",\"`progress`\",\"`dataFilePath`\",\"`is_deleted`\",\"`create_time`\",\"`last_update_time`\",\"`result`\",\"`job_ids`\",\"`syn`\",\"`end_run_time`\",\"`start_run_time`\",\"`expect_execute_time`\",\"`task_info`\",\"`scheduler_task_id`\"],\"splitPk\":\"id\",\"connection\":[{\"table\":[\"task\"],\"jdbcUrl\":[\"jdbc:mysql://xxx:3306/data_operation\"]}]}},\"writer\":{\"name\":\"mysqlwriter\",\"parameter\":{\"username\":\"remote\",\"password\":\"hangzhoumeiri\",\"column\":[\"`id`\",\"`taskName`\",\"`templateId`\",\"`paramJson`\",\"`userId`\",\"`status`\",\"`jobs`\",\"`stage`\",\"`progress`\",\"`dataFilePath`\",\"`is_deleted`\",\"`create_time`\",\"`last_update_time`\",\"`result`\",\"`job_ids`\",\"`syn`\",\"`end_run_time`\",\"`start_run_time`\",\"`expect_execute_time`\",\"`task_info`\",\"`scheduler_task_id`\"],\"preSql\":[\"\"],\"connection\":[{\"table\":[\"task\"],\"jdbcUrl\":\"jdbc:mysql://xxx:3306/test\"}]}},\"transformer\":[{\"name\":\"dx_substr\",\"parameter\":{\"columnIndex\":1,\"paras\":[\"1\",\"3\"]}}]}]}}",

       "runningStatus" 2,

       "runningMsg" "{\"task_start_time\":\"2020-03-22\",\"task_end_time\":\"2020-03-22\",\"task_cost_time\":\"11s\",\"tasj_average_flow\":\"231.85KB/s\",\"record_write_speed\":\"4082rec/s\",\"write_record_num\":\"40821\",\"read_wirte_failed_num\":\"0\"}",

       "startTime":"2020-05-13 12:00:00",

       "endTime":"2020-05-13 12:00:00",

       "createTime":"2020-05-13 12:00:00",

       "createBy":"jiaqk",

       "updateTime":"2020-05-13 12:00:00"

  }

}

 

 

 

5.2 同步任务停止接口

简要描述

  • 同步任务停止

请求接口

/api/gdatax/data_sync/v1/data_sync/kill

请求方式

  • POST

请求参数说明

请求参数示例

{

    "syncId":"1232321"

}

返回参数示例

{

  "result"0,

  "msg":"同步任务停止成功",

  "data"null

}


5.3 同步任务列表接口

简要描述

  • 同步任务任务列表接口(根据输入 数据源类型 / 输出数据源类型 / 租户名称 / 同步名称 / 运行状态 / 创建者  分页查询)

请求接口

/api/gdatax/data_sync/v1/data_sync/list

请求方式

  • GET

请求参数说明

参数名

类型

说明

是否必填

syncName
String 同步名称
syncType
Integer 同步类型 1-datax
tenantName
String 租户名称
sourceDatasourceType
String 原始数据源类型
sourceDatasourceId
String 原始数据源id
targetDatasourceType
String 目标数据源类型
targetDatasourceId
String 目标数据源id
runningStatus
Integer 运行状态 0-同步中 1-同步失败 2-同步成功
pageNo
Integer 页号
pageSize
Integer 页长

请求参数示例

{

    "syncName":"xxx到xxx的同步",

    "syncType":0,

    "tenantName":"GDMODELLING",

    "sourceDatasourceType" "MYSQL",

    "sourceDatasourceId" "12313132213",

    "targetDatasourceType" "ORACLE",

    "targetDatasourceId" "12313132213",

    "runningStatus" 0,

    "pageNo" 1,

    "pageSize" 10

}

返回参数说明

参数名

参数类型

参数说明

list
JSONArray 同步任务列表,见list说明
count
Integer 分页总数

list参数说明

参数名

参数类型

参数说明

syncId
String 同步任务id
syncName
String 同步任务名
syncDesc
String 同步任务详情
syncType
Integer 同步任务类型1-datax
execId
String az执行id
tenantName
String 租户名称
jobConfig String datax的执行json
runningStatus
Integer

运行状态

0-同步中 1-同步失败 2-同步成功 3-已停止

runningMsg
String 运行信息,见附录:运行信息说明
startTime String 开始时间
endTime String 结束时间
createTime
String 任务创建时间
createBy
String 创建者
updateTime
String 任务更新时间

 

返回参数示例

{

  "result"0,

  "msg":"查看同步任务列表成功",

  "data":{

     "list":[{

         "syncId":"sdsdsds"

         "syncName""sdssdsd",

         "syncDesc""sdsdsdsdsd",

         "syncType" 1,

         "execId""123213",

         "tenantName""GDMODELLING",

         "jobConfig":"{\"job\":{\"setting\":{\"speed\":{\"channel\":10},\"errorLimit\":{\"record\":0,\"percentage\":0.02}},\"content\":[{\"reader\":{\"name\":\"mysqlreader\",\"parameter\":{\"username\":\"remote\",\"password\":\"hangzhoumeiri\",\"column\":[\"`id`\",\"`taskName`\",\"`templateId`\",\"`paramJson`\",\"`userId`\",\"`status`\",\"`jobs`\",\"`stage`\",\"`progress`\",\"`dataFilePath`\",\"`is_deleted`\",\"`create_time`\",\"`last_update_time`\",\"`result`\",\"`job_ids`\",\"`syn`\",\"`end_run_time`\",\"`start_run_time`\",\"`expect_execute_time`\",\"`task_info`\",\"`scheduler_task_id`\"],\"splitPk\":\"id\",\"connection\":[{\"table\":[\"task\"],\"jdbcUrl\":[\"jdbc:mysql://xxx:3306/data_operation\"]}]}},\"writer\":{\"name\":\"mysqlwriter\",\"parameter\":{\"username\":\"remote\",\"password\":\"hangzhoumeiri\",\"column\":[\"`id`\",\"`taskName`\",\"`templateId`\",\"`paramJson`\",\"`userId`\",\"`status`\",\"`jobs`\",\"`stage`\",\"`progress`\",\"`dataFilePath`\",\"`is_deleted`\",\"`create_time`\",\"`last_update_time`\",\"`result`\",\"`job_ids`\",\"`syn`\",\"`end_run_time`\",\"`start_run_time`\",\"`expect_execute_time`\",\"`task_info`\",\"`scheduler_task_id`\"],\"preSql\":[\"\"],\"connection\":[{\"table\":[\"task\"],\"jdbcUrl\":\"jdbc:mysql://xxx:3306/test\"}]}},\"transformer\":[{\"name\":\"dx_substr\",\"parameter\":{\"columnIndex\":1,\"paras\":[\"1\",\"3\"]}}]}]}}",

         "runningStatus" 2,

         "runningMsg" "{\"taskStartTime\":\"2020-03-22\",\"taskEndTime\":\"2020-03-22\",\"taskCostTime\":\"11s\",\"taskAverageFlow\":\"231.85KB/s\",\"recordWriteSpeed\":\"4082rec/s\",\"writeEecordNum\":\"40821\",\"readWirteFailedNum\":\"0\"}",

         "startTime":"2020-05-13 12:00:00",

         "endTime":"2020-05-13 12:00:00",

         "createTime":"2020-05-13 12:00:00",

         "createBy":"jiaqk",

         "updateTime":"2020-05-13 12:00:00"

     }],

     "count" 10

       

  }

}


 

5.4 同步任务详情批量查询

简要描述

  • 同步任务详情批量查询(包括基本信息、任务状态)

请求接口

/api/gdatax/data_sync/v1/data_sync/detail

请求方式

  • GET

请求参数说明

参数名

类型

说明

是否必填

syncIds
String 同步任务id

请求示例

{

    "syncIds":["123132131","13123123"]

}

返回参数说明

参数名

参数类型

参数说明

list
JSONArray 同步任务列表,见list说明

 

list说明

参数名

参数类型

参数说明

syncId
String 同步任务id
syncName
String 同步任务名
syncDesc
String 同步任务详情
syncType
Integer 同步任务类型1-datax
execId
String az执行id
tenantName
String 租户名称
jobConfig String datax的执行json
runningStatus
Integer

运行状态

0-同步中 1-同步失败 2-同步成功 3-已停止

runningMsg
String 运行信息,见附录:运行信息说明
startTime String 开始时间
endTime String 结束时间
createTime
String 任务创建时间
createBy
String 创建者
updateTime
String 任务更新时间

 

返回示例

{

  "result"0,

  "msg":"获取同步任务详情列表",

  "data":{

         "list":[{

             "syncId":"sdsdsds"

             "syncName""sdssdsd",

             "syncDesc""sdsdsdsdsd",

             "syncType" 0,

             "execId""123213",

             "tenantName""GDMODELLING",

             "jobConfig":"{\"job\":{\"setting\":{\"speed\":{\"channel\":10},\"errorLimit\":{\"record\":0,\"percentage\":0.02}},\"content\":[{\"reader\":{\"name\":\"mysqlreader\",\"parameter\":{\"username\":\"remote\",\"password\":\"hangzhoumeiri\",\"column\":[\"`id`\",\"`taskName`\",\"`templateId`\",\"`paramJson`\",\"`userId`\",\"`status`\",\"`jobs`\",\"`stage`\",\"`progress`\",\"`dataFilePath`\",\"`is_deleted`\",\"`create_time`\",\"`last_update_time`\",\"`result`\",\"`job_ids`\",\"`syn`\",\"`end_run_time`\",\"`start_run_time`\",\"`expect_execute_time`\",\"`task_info`\",\"`scheduler_task_id`\"],\"splitPk\":\"id\",\"connection\":[{\"table\":[\"task\"],\"jdbcUrl\":[\"jdbc:mysql://xxx:3306/data_operation\"]}]}},\"writer\":{\"name\":\"mysqlwriter\",\"parameter\":{\"username\":\"remote\",\"password\":\"hangzhoumeiri\",\"column\":[\"`id`\",\"`taskName`\",\"`templateId`\",\"`paramJson`\",\"`userId`\",\"`status`\",\"`jobs`\",\"`stage`\",\"`progress`\",\"`dataFilePath`\",\"`is_deleted`\",\"`create_time`\",\"`last_update_time`\",\"`result`\",\"`job_ids`\",\"`syn`\",\"`end_run_time`\",\"`start_run_time`\",\"`expect_execute_time`\",\"`task_info`\",\"`scheduler_task_id`\"],\"preSql\":[\"\"],\"connection\":[{\"table\":[\"task\"],\"jdbcUrl\":\"jdbc:mysql://xxx:3306/test\"}]}},\"transformer\":[{\"name\":\"dx_substr\",\"parameter\":{\"columnIndex\":1,\"paras\":[\"1\",\"3\"]}}]}]}}",

             "runningStatus" 2,

             "runningMsg" "{\"task_start_time\":\"2020-03-22\",\"task_end_time\":\"2020-03-22\",\"task_cost_time\":\"11s\",\"task_average_flow\":\"231.85KB/s\",\"record_write_speed\":\"4082rec/s\",\"write_record_num\":\"40821\",\"read_wirte_failed_num\":\"0\"}",

             "startTime":"2020-05-13 12:00:00",

             "endTime":"2020-05-13 12:00:00",

             "createTime":"2020-05-13 12:00:00",

             "createBy":"jiaqk",

             "updateTime":"2020-05-13 12:00:00"

          }]

  }

}

 

5.5 附录:运行信息说明

5.5.1 运行中信息说明

{

    "runningPercentage""100.00%"  // 任务运行百分比

}

5.5.2 运行失败信息说明

{

    //   报错信息

    "errorMessage":"[表不存在,请检查表名或者联系DBA确认该表是否存在]. - 表名为:task 执行的SQL为:select 11111.txt 123.txt 20200320 ajax.js azkaban-exec-server-3.2.0 azkaban-web-server-3.2.0 datax dataxlogs flow-execute-dialog.js gt-bi-app-api-hackathon-datax-service-0.1.0 gt-bi-app-api-hackathon-datax-service-0.1.0.zip looklike.txt part-00000 pkg10000 recheck.sh _SUCCESS user.properties from task where 1=2 具体错误信息为:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table test.task doesnt exist"      

}

5.5.3 运行成功信息说明

{

    "task_average_flow""1.99MB/s",        // 任务平均流量

    "record_write_speed""17543rec/s",   // 记录写入速度

    "write_record_num""1000000",         // 读出记录总数

    "read_write_failed_num""0"              // 读写失败总数

}

 

六、参考代码

代码资源已上传:datax基于azkaban调度的服务实现代码  (包含datax-service和datax-scheduler)

 

七、不足之处

对于同步任务执行的时候的租户设置功能没有执行,感兴趣的胖友可以通过azkaban的user.to.proxy自行进行实现

你可能感兴趣的:(datax,大数据,datax,java,大数据,数据同步)