From 3944752098c4625e69999822b0adeb1096952987 Mon Sep 17 00:00:00 2001 From: springcat <15868107710@139.com> Date: Fri, 27 Jul 2018 11:40:07 +0800 Subject: [PATCH 01/77] =?UTF-8?q?=E5=AE=98=E6=96=B9=E7=9A=84maven=E5=BA=93?= =?UTF-8?q?tablestore-streamclient=E6=B2=A1=E6=9C=891.0.0-SNAPSHOT?= =?UTF-8?q?=EF=BC=8C=E5=8F=AA=E6=9C=891.0.0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- otsstreamreader/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/otsstreamreader/pom.xml b/otsstreamreader/pom.xml index dca4de23..31911126 100644 --- a/otsstreamreader/pom.xml +++ b/otsstreamreader/pom.xml @@ -32,7 +32,7 @@ com.aliyun.openservices tablestore-streamclient - 1.0.0-SNAPSHOT + 1.0.0 com.google.code.gson From 24cdfc37ea5cceb0d1ac68d94d1c6fd2366c70ad Mon Sep 17 00:00:00 2001 From: csurong Date: Mon, 3 Dec 2018 17:25:13 +0800 Subject: [PATCH 02/77] =?UTF-8?q?=E5=A2=9E=E5=8A=A0odpsReader=E5=AE=98?= =?UTF-8?q?=E6=96=B9=E7=A4=BA=E4=BE=8B=E4=B8=AD=E7=9A=84=E5=BF=85=E9=A1=BB?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- odpsreader/doc/odpsreader.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/odpsreader/doc/odpsreader.md b/odpsreader/doc/odpsreader.md index 0ae52894..a79377de 100644 --- a/odpsreader/doc/odpsreader.md +++ b/odpsreader/doc/odpsreader.md @@ -58,7 +58,8 @@ ODPSReader 支持读取分区表、非分区表,不支持读取虚拟视图。 ], "packageAuthorizedProject": "yourCurrentProjectName", "splitMode": "record", - "odpsServer": "http://xxx/api" + "odpsServer": "http://xxx/api", + "tunnelServer": "http://dt.odps.aliyun.com" } }, "writer": { From de583090dd8c54eb3658e4d227a13c647c2d69f0 Mon Sep 17 00:00:00 2001 From: "zhaofeng.zhou" Date: Mon, 2 Sep 2019 17:32:21 +0800 Subject: [PATCH 03/77] Fix otsstreamreader compile failure. --- otsstreamreader/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/otsstreamreader/pom.xml b/otsstreamreader/pom.xml index dca4de23..042ac5e7 100644 --- a/otsstreamreader/pom.xml +++ b/otsstreamreader/pom.xml @@ -10,7 +10,7 @@ com.alibaba.datax otsstreamreader - 0.0.1-SNAPSHOT + 0.0.1 @@ -32,7 +32,7 @@ com.aliyun.openservices tablestore-streamclient - 1.0.0-SNAPSHOT + 1.0.0 com.google.code.gson From c64dab42aa5ab9e9478cc73433f6817568e00ee3 Mon Sep 17 00:00:00 2001 From: lizhirong Date: Fri, 20 Sep 2019 14:16:25 +0800 Subject: [PATCH 04/77] [fix]throw dataXException --- .../main/java/com/alibaba/datax/core/job/JobContainer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/alibaba/datax/core/job/JobContainer.java b/core/src/main/java/com/alibaba/datax/core/job/JobContainer.java index 50f1cf7b..26b2989f 100755 --- a/core/src/main/java/com/alibaba/datax/core/job/JobContainer.java +++ b/core/src/main/java/com/alibaba/datax/core/job/JobContainer.java @@ -427,7 +427,7 @@ public class JobContainer extends AbstractContainer { Long channelLimitedByteSpeed = this.configuration .getLong(CoreConstant.DATAX_CORE_TRANSPORT_CHANNEL_SPEED_BYTE); if (channelLimitedByteSpeed == null || channelLimitedByteSpeed <= 0) { - DataXException.asDataXException( + throw DataXException.asDataXException( FrameworkErrorCode.CONFIG_ERROR, "在有总bps限速条件下,单个channel的bps值不能为空,也不能为非正数"); } @@ -448,7 +448,7 @@ public class JobContainer extends AbstractContainer { Long channelLimitedRecordSpeed = this.configuration.getLong( CoreConstant.DATAX_CORE_TRANSPORT_CHANNEL_SPEED_RECORD); if (channelLimitedRecordSpeed == null || channelLimitedRecordSpeed <= 0) { - DataXException.asDataXException(FrameworkErrorCode.CONFIG_ERROR, + throw DataXException.asDataXException(FrameworkErrorCode.CONFIG_ERROR, "在有总tps限速条件下,单个channel的tps值不能为空,也不能为非正数"); } From ad3e8d6332c07f37cb33a2e453f620be3a4b2deb Mon Sep 17 00:00:00 2001 From: c-agam Date: Thu, 31 Oct 2019 11:34:21 +0800 Subject: [PATCH 05/77] Update osswriter.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit object配置项修正: 经测试,原文档中object配置项:/cdo/datax应该替换为cdo/datax才能文档中所述功能 --- osswriter/doc/osswriter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osswriter/doc/osswriter.md b/osswriter/doc/osswriter.md index cf7180e1..120eeb90 100644 --- a/osswriter/doc/osswriter.md +++ b/osswriter/doc/osswriter.md @@ -104,7 +104,7 @@ OSSWriter实现了从DataX协议转为OSS中的TXT文件功能,OSS本身是无 * 描述:OSSWriter写入的文件名,OSS使用文件名模拟目录的实现。
使用"object": "datax",写入object以datax开头,后缀添加随机字符串。 - 使用"object": "/cdo/datax",写入的object以/cdo/datax开头,后缀随机添加字符串,/作为OSS模拟目录的分隔符。 + 使用"object": "cdo/datax",写入的object以cdo/datax开头,后缀随机添加字符串,/作为OSS模拟目录的分隔符。 * 必选:是
From 30cc3d56a221b9c5aa7151e1479965a46b10f771 Mon Sep 17 00:00:00 2001 From: woaer Date: Thu, 14 Nov 2019 10:30:24 +0800 Subject: [PATCH 06/77] Update userGuid.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :pencil2: 修复拼写错误 --- userGuid.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/userGuid.md b/userGuid.md index 7abd3e2a..153c8111 100644 --- a/userGuid.md +++ b/userGuid.md @@ -64,7 +64,7 @@ DataX本身作为数据同步框架,将不同数据源的同步抽象为从源 * 配置示例:从stream读取数据并打印到控制台 - * 第一步、创建创业的配置文件(json格式) + * 第一步、创建作业的配置文件(json格式) 可以通过命令查看配置模板: python datax.py -r {YOUR_READER} -w {YOUR_WRITER} From 235d4d3378945b26122abfe22b0bfaed7122076f Mon Sep 17 00:00:00 2001 From: BoYiZhang Date: Thu, 6 Feb 2020 00:31:15 +0800 Subject: [PATCH 07/77] fix bug DataXException is not work . --- .../main/java/com/alibaba/datax/core/job/JobContainer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/alibaba/datax/core/job/JobContainer.java b/core/src/main/java/com/alibaba/datax/core/job/JobContainer.java index 50f1cf7b..26b2989f 100755 --- a/core/src/main/java/com/alibaba/datax/core/job/JobContainer.java +++ b/core/src/main/java/com/alibaba/datax/core/job/JobContainer.java @@ -427,7 +427,7 @@ public class JobContainer extends AbstractContainer { Long channelLimitedByteSpeed = this.configuration .getLong(CoreConstant.DATAX_CORE_TRANSPORT_CHANNEL_SPEED_BYTE); if (channelLimitedByteSpeed == null || channelLimitedByteSpeed <= 0) { - DataXException.asDataXException( + throw DataXException.asDataXException( FrameworkErrorCode.CONFIG_ERROR, "在有总bps限速条件下,单个channel的bps值不能为空,也不能为非正数"); } @@ -448,7 +448,7 @@ public class JobContainer extends AbstractContainer { Long channelLimitedRecordSpeed = this.configuration.getLong( CoreConstant.DATAX_CORE_TRANSPORT_CHANNEL_SPEED_RECORD); if (channelLimitedRecordSpeed == null || channelLimitedRecordSpeed <= 0) { - DataXException.asDataXException(FrameworkErrorCode.CONFIG_ERROR, + throw DataXException.asDataXException(FrameworkErrorCode.CONFIG_ERROR, "在有总tps限速条件下,单个channel的tps值不能为空,也不能为非正数"); } From 07022e1276f27796f2728716466ab9d9ba97b914 Mon Sep 17 00:00:00 2001 From: dufeng3 Date: Fri, 27 Mar 2020 16:10:51 +0800 Subject: [PATCH 08/77] =?UTF-8?q?=E4=BF=AE=E6=94=B9dataxPluginDev.md?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=AD=E7=9A=84=E6=96=87=E5=AD=97=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dataxPluginDev.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataxPluginDev.md b/dataxPluginDev.md index e4828d5a..50a1ba6d 100644 --- a/dataxPluginDev.md +++ b/dataxPluginDev.md @@ -111,7 +111,7 @@ public class SomeReader extends Reader { ``` `Job`接口功能如下: -- `init`: Job对象初始化工作,测试可以通过`super.getPluginJobConf()`获取与本插件相关的配置。读插件获得配置中`reader`部分,写插件获得`writer`部分。 +- `init`: Job对象初始化工作,此时可以通过`super.getPluginJobConf()`获取与本插件相关的配置。读插件获得配置中`reader`部分,写插件获得`writer`部分。 - `prepare`: 全局准备工作,比如odpswriter清空目标表。 - `split`: 拆分`Task`。参数`adviceNumber`框架建议的拆分数,一般是运行时所配置的并发度。值返回的是`Task`的配置列表。 - `post`: 全局的后置工作,比如mysqlwriter同步完影子表后的rename操作。 From d6b70be5ac08c75d2f61ddc30bd1f8b50087a97b Mon Sep 17 00:00:00 2001 From: dufeng3 Date: Fri, 27 Mar 2020 17:09:13 +0800 Subject: [PATCH 09/77] =?UTF-8?q?dataxPluginDev.md=E4=B8=AD=E6=8A=8A?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=86=99=E6=88=90=E7=A9=BF=E4=BB=B6=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dataxPluginDev.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataxPluginDev.md b/dataxPluginDev.md index 50a1ba6d..ba47b22c 100644 --- a/dataxPluginDev.md +++ b/dataxPluginDev.md @@ -155,7 +155,7 @@ public class SomeReader extends Reader { ``` - `name`: 插件名称,大小写敏感。框架根据用户在配置文件中指定的名称来搜寻插件。 **十分重要** 。 -- `class`: 入口类的全限定名称,框架通过反射穿件入口类的实例。**十分重要** 。 +- `class`: 入口类的全限定名称,框架通过反射插件入口类的实例。**十分重要** 。 - `description`: 描述信息。 - `developer`: 开发人员。 From 2484343adeb12f19dd4a3deabe19b04473a6a5e1 Mon Sep 17 00:00:00 2001 From: Liu Jianping Date: Fri, 10 Apr 2020 15:43:28 +0800 Subject: [PATCH 10/77] gdbwriter: update to support set-property MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 添加id/label/属性字段长度限制 2. 添加对reader列索引格式,增加'#{i}'支持,同时兼容原格式 2. 添加SET属性导入支持 --- .../plugin/writer/gdbwriter/GdbWriter.java | 194 +++++----- .../writer/gdbwriter/GdbWriterErrorCode.java | 3 +- .../datax/plugin/writer/gdbwriter/Key.java | 250 +++++++------ .../gdbwriter/client/GdbGraphManager.java | 44 +-- .../gdbwriter/client/GdbWriterConfig.java | 48 +-- .../gdbwriter/mapping/DefaultGdbMapper.java | 314 ++++++++-------- .../writer/gdbwriter/mapping/GdbMapper.java | 2 +- .../gdbwriter/mapping/MapperConfig.java | 68 ++++ .../writer/gdbwriter/mapping/MappingRule.java | 39 +- .../gdbwriter/mapping/MappingRuleFactory.java | 285 ++++++++------- .../writer/gdbwriter/mapping/ValueType.java | 102 +++--- .../gdbwriter/model/AbstractGdbGraph.java | 224 ++++++------ .../writer/gdbwriter/model/GdbEdge.java | 32 +- .../writer/gdbwriter/model/GdbElement.java | 103 +++++- .../writer/gdbwriter/model/GdbGraph.java | 13 +- .../gdbwriter/model/ScriptGdbGraph.java | 338 ++++++++++-------- .../writer/gdbwriter/util/ConfigHelper.java | 76 ++-- .../util/GdbDuplicateIdException.java | 19 +- 18 files changed, 1233 insertions(+), 921 deletions(-) create mode 100644 gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/MapperConfig.java diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/GdbWriter.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/GdbWriter.java index 753d89fc..6470e9e6 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/GdbWriter.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/GdbWriter.java @@ -1,10 +1,5 @@ package com.alibaba.datax.plugin.writer.gdbwriter; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.*; -import java.util.function.Function; - import com.alibaba.datax.common.element.Record; import com.alibaba.datax.common.exception.DataXException; import com.alibaba.datax.common.plugin.RecordReceiver; @@ -18,24 +13,33 @@ import com.alibaba.datax.plugin.writer.gdbwriter.mapping.MappingRule; import com.alibaba.datax.plugin.writer.gdbwriter.mapping.MappingRuleFactory; import com.alibaba.datax.plugin.writer.gdbwriter.model.GdbElement; import com.alibaba.datax.plugin.writer.gdbwriter.model.GdbGraph; - import groovy.lang.Tuple2; import io.netty.util.concurrent.DefaultThreadFactory; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GdbWriter extends Writer { - private static final Logger log = LoggerFactory.getLogger(GdbWriter.class); +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; - private static Function mapper = null; - private static GdbGraph globalGraph = null; - private static boolean session = false; +public class GdbWriter extends Writer { + private static final Logger log = LoggerFactory.getLogger(GdbWriter.class); + + private static Function mapper = null; + private static GdbGraph globalGraph = null; + private static boolean session = false; /** * Job 中的方法仅执行一次,Task 中方法会由框架启动多个 Task 线程并行执行。 *

* 整个 Writer 执行流程是: + * *

      * Job类init-->prepare-->split
      *
@@ -46,17 +50,16 @@ public class GdbWriter extends Writer {
      * 
*/ public static class Job extends Writer.Job { - private static final Logger LOG = LoggerFactory - .getLogger(Job.class); + private static final Logger LOG = LoggerFactory.getLogger(Job.class); private Configuration jobConfig = null; - + @Override public void init() { - LOG.info("GDB datax plugin writer job init begin ..."); - this.jobConfig = getPluginJobConf(); - GdbWriterConfig.of(this.jobConfig); - LOG.info("GDB datax plugin writer job init end."); + LOG.info("GDB datax plugin writer job init begin ..."); + this.jobConfig = getPluginJobConf(); + GdbWriterConfig.of(this.jobConfig); + LOG.info("GDB datax plugin writer job init end."); /** * 注意:此方法仅执行一次。 @@ -71,37 +74,37 @@ public class GdbWriter extends Writer { * 注意:此方法仅执行一次。 * 最佳实践:如果 Job 中有需要进行数据同步之前的处理,可以在此处完成,如果没有必要则可以直接去掉。 */ - super.prepare(); + super.prepare(); - MappingRule rule = MappingRuleFactory.getInstance().createV2(jobConfig); + final MappingRule rule = MappingRuleFactory.getInstance().createV2(this.jobConfig); - mapper = new DefaultGdbMapper().getMapper(rule); - session = jobConfig.getBool(Key.SESSION_STATE, false); + mapper = new DefaultGdbMapper(this.jobConfig).getMapper(rule); + session = this.jobConfig.getBool(Key.SESSION_STATE, false); /** * client connect check before task */ try { - globalGraph = GdbGraphManager.instance().getGraph(jobConfig, false); - } catch (RuntimeException e) { + globalGraph = GdbGraphManager.instance().getGraph(this.jobConfig, false); + } catch (final RuntimeException e) { throw DataXException.asDataXException(GdbWriterErrorCode.FAIL_CLIENT_CONNECT, e.getMessage()); } } @Override - public List split(int mandatoryNumber) { + public List split(final int mandatoryNumber) { /** * 注意:此方法仅执行一次。 * 最佳实践:通常采用工具静态类完成把 Job 配置切分成多个 Task 配置的工作。 * 这里的 mandatoryNumber 是强制必须切分的份数。 */ - LOG.info("split begin..."); - List configurationList = new ArrayList(); - for (int i = 0; i < mandatoryNumber; i++) { - configurationList.add(this.jobConfig.clone()); - } - LOG.info("split end..."); - return configurationList; + LOG.info("split begin..."); + final List configurationList = new ArrayList(); + for (int i = 0; i < mandatoryNumber; i++) { + configurationList.add(this.jobConfig.clone()); + } + LOG.info("split end..."); + return configurationList; } @Override @@ -127,7 +130,7 @@ public class GdbWriter extends Writer { public static class Task extends Writer.Task { private Configuration taskConfig; - + private int failed = 0; private int batchRecords; private ExecutorService submitService = null; @@ -139,24 +142,24 @@ public class GdbWriter extends Writer { * 注意:此方法每个 Task 都会执行一次。 * 最佳实践:此处通过对 taskConfig 配置的读取,进而初始化一些资源为 startWrite()做准备。 */ - this.taskConfig = super.getPluginJobConf(); - batchRecords = taskConfig.getInt(Key.MAX_RECORDS_IN_BATCH, GdbWriterConfig.DEFAULT_RECORD_NUM_IN_BATCH); - submitService = new ThreadPoolExecutor(1, 1, 0L, - TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>(), new DefaultThreadFactory("submit-dsl")); + this.taskConfig = super.getPluginJobConf(); + this.batchRecords = this.taskConfig.getInt(Key.MAX_RECORDS_IN_BATCH, GdbWriterConfig.DEFAULT_RECORD_NUM_IN_BATCH); + this.submitService = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>(), + new DefaultThreadFactory("submit-dsl")); - if (!session) { - graph = globalGraph; - } else { - /** - * 分批创建session client,由于服务端groovy编译性能的限制 - */ - try { - Thread.sleep((getTaskId()/10)*10000); - } catch (Exception e) { - // ... - } - graph = GdbGraphManager.instance().getGraph(taskConfig, session); - } + if (!session) { + this.graph = globalGraph; + } else { + /** + * 分批创建session client,由于服务端groovy编译性能的限制 + */ + try { + Thread.sleep((getTaskId() / 10) * 10000); + } catch (final Exception e) { + // ... + } + this.graph = GdbGraphManager.instance().getGraph(this.taskConfig, session); + } } @Override @@ -165,64 +168,69 @@ public class GdbWriter extends Writer { * 注意:此方法每个 Task 都会执行一次。 * 最佳实践:如果 Task 中有需要进行数据同步之前的处理,可以在此处完成,如果没有必要则可以直接去掉。 */ - super.prepare(); + super.prepare(); } @Override - public void startWrite(RecordReceiver recordReceiver) { + public void startWrite(final RecordReceiver recordReceiver) { /** * 注意:此方法每个 Task 都会执行一次。 * 最佳实践:此处适当封装确保简洁清晰完成数据写入工作。 */ - Record r; - Future future = null; - List> records = new ArrayList<>(batchRecords); + Record r; + Future future = null; + List> records = new ArrayList<>(this.batchRecords); - while ((r = recordReceiver.getFromReader()) != null) { - records.add(new Tuple2<>(r, mapper.apply(r))); + while ((r = recordReceiver.getFromReader()) != null) { + try { + records.add(new Tuple2<>(r, mapper.apply(r))); + } catch (final Exception ex) { + getTaskPluginCollector().collectDirtyRecord(r, ex); + continue; + } - if (records.size() >= batchRecords) { - wait4Submit(future); + if (records.size() >= this.batchRecords) { + wait4Submit(future); - final List> batch = records; - future = submitService.submit(() -> batchCommitRecords(batch)); - records = new ArrayList<>(batchRecords); - } - } + final List> batch = records; + future = this.submitService.submit(() -> batchCommitRecords(batch)); + records = new ArrayList<>(this.batchRecords); + } + } - wait4Submit(future); - if (!records.isEmpty()) { - final List> batch = records; - future = submitService.submit(() -> batchCommitRecords(batch)); - wait4Submit(future); - } + wait4Submit(future); + if (!records.isEmpty()) { + final List> batch = records; + future = this.submitService.submit(() -> batchCommitRecords(batch)); + wait4Submit(future); + } } - private void wait4Submit(Future future) { - if (future == null) { - return; - } + private void wait4Submit(final Future future) { + if (future == null) { + return; + } - try { - future.get(); - } catch (Exception e) { - e.printStackTrace(); - } + try { + future.get(); + } catch (final Exception e) { + e.printStackTrace(); + } } private boolean batchCommitRecords(final List> records) { - TaskPluginCollector collector = getTaskPluginCollector(); - try { - List> errors = graph.add(records); - errors.forEach(t -> collector.collectDirtyRecord(t.getFirst(), t.getSecond())); - failed += errors.size(); - } catch (Exception e) { - records.forEach(t -> collector.collectDirtyRecord(t.getFirst(), e)); - failed += records.size(); - } + final TaskPluginCollector collector = getTaskPluginCollector(); + try { + final List> errors = this.graph.add(records); + errors.forEach(t -> collector.collectDirtyRecord(t.getFirst(), t.getSecond())); + this.failed += errors.size(); + } catch (final Exception e) { + records.forEach(t -> collector.collectDirtyRecord(t.getFirst(), e)); + this.failed += records.size(); + } - records.clear(); - return true; + records.clear(); + return true; } @Override @@ -231,7 +239,7 @@ public class GdbWriter extends Writer { * 注意:此方法每个 Task 都会执行一次。 * 最佳实践:如果 Task 中有需要进行数据同步之后的后续处理,可以在此处完成。 */ - log.info("Task done, dirty record count - {}", failed); + log.info("Task done, dirty record count - {}", this.failed); } @Override @@ -241,9 +249,9 @@ public class GdbWriter extends Writer { * 最佳实践:通常配合Task 中的 post() 方法一起完成 Task 的资源释放。 */ if (session) { - graph.close(); + this.graph.close(); } - submitService.shutdown(); + this.submitService.shutdown(); } } diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/GdbWriterErrorCode.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/GdbWriterErrorCode.java index a6f506ef..e1c9080b 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/GdbWriterErrorCode.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/GdbWriterErrorCode.java @@ -27,7 +27,6 @@ public enum GdbWriterErrorCode implements ErrorCode { @Override public String toString() { - return String.format("Code:[%s], Description:[%s]. ", this.code, - this.description); + return String.format("Code:[%s], Description:[%s]. ", this.code, this.description); } } \ No newline at end of file diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/Key.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/Key.java index f2e37005..afa58239 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/Key.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/Key.java @@ -6,136 +6,164 @@ public final class Key { * 此处声明插件用到的需要插件使用者提供的配置项 */ - public final static String HOST = "host"; - public final static String PORT = "port"; + public final static String HOST = "host"; + public final static String PORT = "port"; public final static String USERNAME = "username"; - public static final String PASSWORD = "password"; + public static final String PASSWORD = "password"; - /** - * import type and mode - */ - public static final String IMPORT_TYPE = "labelType"; - public static final String UPDATE_MODE = "writeMode"; + /** + * import type and mode + */ + public static final String IMPORT_TYPE = "labelType"; + public static final String UPDATE_MODE = "writeMode"; - /** - * label prefix issue - */ - public static final String ID_TRANS_RULE = "idTransRule"; - public static final String SRC_ID_TRANS_RULE = "srcIdTransRule"; - public static final String DST_ID_TRANS_RULE = "dstIdTransRule"; + /** + * label prefix issue + */ + public static final String ID_TRANS_RULE = "idTransRule"; + public static final String SRC_ID_TRANS_RULE = "srcIdTransRule"; + public static final String DST_ID_TRANS_RULE = "dstIdTransRule"; - public static final String LABEL = "label"; - public static final String SRC_LABEL = "srcLabel"; - public static final String DST_LABEL = "dstLabel"; + public static final String LABEL = "label"; + public static final String SRC_LABEL = "srcLabel"; + public static final String DST_LABEL = "dstLabel"; - public static final String MAPPING = "mapping"; + public static final String MAPPING = "mapping"; - /** - * column define in Gdb - */ - public static final String COLUMN = "column"; - public static final String COLUMN_NAME = "name"; - public static final String COLUMN_VALUE = "value"; - public static final String COLUMN_TYPE = "type"; - public static final String COLUMN_NODE_TYPE = "columnType"; + /** + * column define in Gdb + */ + public static final String COLUMN = "column"; + public static final String COLUMN_NAME = "name"; + public static final String COLUMN_VALUE = "value"; + public static final String COLUMN_TYPE = "type"; + public static final String COLUMN_NODE_TYPE = "columnType"; - /** - * Gdb Vertex/Edge elements - */ - public static final String ID = "id"; - public static final String FROM = "from"; - public static final String TO = "to"; - public static final String PROPERTIES = "properties"; - public static final String PROP_KEY = "name"; - public static final String PROP_VALUE = "value"; - public static final String PROP_TYPE = "type"; + /** + * Gdb Vertex/Edge elements + */ + public static final String ID = "id"; + public static final String FROM = "from"; + public static final String TO = "to"; + public static final String PROPERTIES = "properties"; + public static final String PROP_KEY = "name"; + public static final String PROP_VALUE = "value"; + public static final String PROP_TYPE = "type"; - public static final String PROPERTIES_JSON_STR = "propertiesJsonStr"; - public static final String MAX_PROPERTIES_BATCH_NUM = "maxPropertiesBatchNumber"; + public static final String PROPERTIES_JSON_STR = "propertiesJsonStr"; + public static final String MAX_PROPERTIES_BATCH_NUM = "maxPropertiesBatchNumber"; - /** - * session less client configure for connect pool - */ - public static final String MAX_IN_PROCESS_PER_CONNECTION = "maxInProcessPerConnection"; - public static final String MAX_CONNECTION_POOL_SIZE = "maxConnectionPoolSize"; - public static final String MAX_SIMULTANEOUS_USAGE_PER_CONNECTION = "maxSimultaneousUsagePerConnection"; + /** + * session less client configure for connect pool + */ + public static final String MAX_IN_PROCESS_PER_CONNECTION = "maxInProcessPerConnection"; + public static final String MAX_CONNECTION_POOL_SIZE = "maxConnectionPoolSize"; + public static final String MAX_SIMULTANEOUS_USAGE_PER_CONNECTION = "maxSimultaneousUsagePerConnection"; - public static final String MAX_RECORDS_IN_BATCH = "maxRecordsInBatch"; - public static final String SESSION_STATE = "session"; + public static final String MAX_RECORDS_IN_BATCH = "maxRecordsInBatch"; + public static final String SESSION_STATE = "session"; - public static enum ImportType { - /** - * Import vertices - */ - VERTEX, - /** - * Import edges - */ - EDGE; - } - - public static enum UpdateMode { - /** - * Insert new records, fail if exists - */ - INSERT, - /** - * Skip this record if exists - */ - SKIP, - /** - * Update property of this record if exists - */ - MERGE; - } + /** + * request length limit, include gdb element string length GDB字段长度限制配置,可分别配置各字段的限制,超过限制的记录会当脏数据处理 + */ + public static final String MAX_GDB_STRING_LENGTH = "maxStringLengthLimit"; + public static final String MAX_GDB_ID_LENGTH = "maxIdStringLengthLimit"; + public static final String MAX_GDB_LABEL_LENGTH = "maxLabelStringLengthLimit"; + public static final String MAX_GDB_PROP_KEY_LENGTH = "maxPropKeyStringLengthLimit"; + public static final String MAX_GDB_PROP_VALUE_LENGTH = "maxPropValueStringLengthLimit"; - public static enum ColumnType { - /** - * vertex or edge id - */ - primaryKey, + public static final String MAX_GDB_REQUEST_LENGTH = "maxRequestLengthLimit"; - /** - * vertex property - */ - vertexProperty, + public static enum ImportType { + /** + * Import vertices + */ + VERTEX, + /** + * Import edges + */ + EDGE; + } - /** - * start vertex id of edge - */ - srcPrimaryKey, + public static enum UpdateMode { + /** + * Insert new records, fail if exists + */ + INSERT, + /** + * Skip this record if exists + */ + SKIP, + /** + * Update property of this record if exists + */ + MERGE; + } - /** - * end vertex id of edge - */ - dstPrimaryKey, + public static enum ColumnType { + /** + * vertex or edge id + */ + primaryKey, - /** - * edge property - */ - edgeProperty, + /** + * vertex property + */ + vertexProperty, - /** - * vertex json style property - */ - vertexJsonProperty, + /** + * vertex setProperty + */ + vertexSetProperty, - /** - * edge json style property - */ - edgeJsonProperty - } + /** + * start vertex id of edge + */ + srcPrimaryKey, - public static enum IdTransRule { - /** - * vertex or edge id with 'label' prefix - */ - labelPrefix, + /** + * end vertex id of edge + */ + dstPrimaryKey, - /** - * vertex or edge id raw - */ - none - } + /** + * edge property + */ + edgeProperty, + + /** + * vertex json style property + */ + vertexJsonProperty, + + /** + * edge json style property + */ + edgeJsonProperty + } + + public static enum IdTransRule { + /** + * vertex or edge id with 'label' prefix + */ + labelPrefix, + + /** + * vertex or edge id raw + */ + none + } + + public static enum PropertyType { + /** + * single Vertex Property + */ + single, + + /** + * set Vertex Property + */ + set + } } diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/client/GdbGraphManager.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/client/GdbGraphManager.java index ac06013c..53668127 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/client/GdbGraphManager.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/client/GdbGraphManager.java @@ -3,37 +3,37 @@ */ package com.alibaba.datax.plugin.writer.gdbwriter.client; +import java.util.ArrayList; +import java.util.List; + import com.alibaba.datax.common.util.Configuration; import com.alibaba.datax.plugin.writer.gdbwriter.model.GdbGraph; import com.alibaba.datax.plugin.writer.gdbwriter.model.ScriptGdbGraph; -import java.util.ArrayList; -import java.util.List; - /** * @author jerrywang * */ public class GdbGraphManager implements AutoCloseable { - private static final GdbGraphManager instance = new GdbGraphManager(); - - private List graphs = new ArrayList<>(); - - public static GdbGraphManager instance() { - return instance; - } + private static final GdbGraphManager INSTANCE = new GdbGraphManager(); - public GdbGraph getGraph(Configuration config, boolean session) { - GdbGraph graph = new ScriptGdbGraph(config, session); - graphs.add(graph); - return graph; - } + private List graphs = new ArrayList<>(); - @Override - public void close() { - for(GdbGraph graph : graphs) { - graph.close(); - } - graphs.clear(); - } + public static GdbGraphManager instance() { + return INSTANCE; + } + + public GdbGraph getGraph(final Configuration config, final boolean session) { + final GdbGraph graph = new ScriptGdbGraph(config, session); + this.graphs.add(graph); + return graph; + } + + @Override + public void close() { + for (final GdbGraph graph : this.graphs) { + graph.close(); + } + this.graphs.clear(); + } } diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/client/GdbWriterConfig.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/client/GdbWriterConfig.java index 0266a010..dbc68b90 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/client/GdbWriterConfig.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/client/GdbWriterConfig.java @@ -3,39 +3,43 @@ */ package com.alibaba.datax.plugin.writer.gdbwriter.client; +import static com.alibaba.datax.plugin.writer.gdbwriter.util.ConfigHelper.assertConfig; +import static com.alibaba.datax.plugin.writer.gdbwriter.util.ConfigHelper.assertHasContent; + import com.alibaba.datax.common.util.Configuration; import com.alibaba.datax.plugin.writer.gdbwriter.Key; -import static com.alibaba.datax.plugin.writer.gdbwriter.util.ConfigHelper.*; - /** * @author jerrywang * */ public class GdbWriterConfig { - public static final int DEFAULT_MAX_IN_PROCESS_PER_CONNECTION = 4; - public static final int DEFAULT_MAX_CONNECTION_POOL_SIZE = 8; - public static final int DEFAULT_MAX_SIMULTANEOUS_USAGE_PER_CONNECTION = 8; - public static final int DEFAULT_BATCH_PROPERTY_NUM = 30; - public static final int DEFAULT_RECORD_NUM_IN_BATCH = 16; + public static final int DEFAULT_MAX_IN_PROCESS_PER_CONNECTION = 4; + public static final int DEFAULT_MAX_CONNECTION_POOL_SIZE = 8; + public static final int DEFAULT_MAX_SIMULTANEOUS_USAGE_PER_CONNECTION = 8; + public static final int DEFAULT_BATCH_PROPERTY_NUM = 30; + public static final int DEFAULT_RECORD_NUM_IN_BATCH = 16; - private Configuration config; + public static final int MAX_STRING_LENGTH = 10240; + public static final int MAX_REQUEST_LENGTH = 65535 - 1000; - private GdbWriterConfig(Configuration config) { - this.config = config; + private Configuration config; - validate(); - } + private GdbWriterConfig(final Configuration config) { + this.config = config; - private void validate() { - assertHasContent(config, Key.HOST); - assertConfig(Key.PORT, () -> config.getInt(Key.PORT) > 0); + validate(); + } - assertHasContent(config, Key.USERNAME); - assertHasContent(config, Key.PASSWORD); - } - - public static GdbWriterConfig of(Configuration config) { - return new GdbWriterConfig(config); - } + public static GdbWriterConfig of(final Configuration config) { + return new GdbWriterConfig(config); + } + + private void validate() { + assertHasContent(this.config, Key.HOST); + assertConfig(Key.PORT, () -> this.config.getInt(Key.PORT) > 0); + + assertHasContent(this.config, Key.USERNAME); + assertHasContent(this.config, Key.PASSWORD); + } } diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/DefaultGdbMapper.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/DefaultGdbMapper.java index f5957295..73a94cf5 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/DefaultGdbMapper.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/DefaultGdbMapper.java @@ -3,6 +3,8 @@ */ package com.alibaba.datax.plugin.writer.gdbwriter.mapping; +import static com.alibaba.datax.plugin.writer.gdbwriter.Key.ImportType.VERTEX; + import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -12,179 +14,191 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import com.alibaba.datax.common.element.Record; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.datax.common.util.Configuration; import com.alibaba.datax.plugin.writer.gdbwriter.Key; import com.alibaba.datax.plugin.writer.gdbwriter.model.GdbEdge; import com.alibaba.datax.plugin.writer.gdbwriter.model.GdbElement; import com.alibaba.datax.plugin.writer.gdbwriter.model.GdbVertex; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; -import static com.alibaba.datax.plugin.writer.gdbwriter.Key.ImportType.VERTEX; - /** * @author jerrywang * */ @Slf4j public class DefaultGdbMapper implements GdbMapper { - private static final Pattern STR_PATTERN = Pattern.compile("\\$\\{(\\d+)}"); - private static final Pattern NORMAL_PATTERN = Pattern.compile("^\\$\\{(\\d+)}$"); + private static final Pattern STR_DOLLAR_PATTERN = Pattern.compile("\\$\\{(\\d+)}"); + private static final Pattern NORMAL_DOLLAR_PATTERN = Pattern.compile("^\\$\\{(\\d+)}$"); - @Override - public Function getMapper(MappingRule rule) { - return r -> { - GdbElement e = (rule.getImportType() == VERTEX) ? new GdbVertex() : new GdbEdge(); - forElement(rule).accept(r, e); - return e; + private static final Pattern STR_NUM_PATTERN = Pattern.compile("#\\{(\\d+)}"); + private static final Pattern NORMAL_NUM_PATTERN = Pattern.compile("^#\\{(\\d+)}$"); + + public DefaultGdbMapper() {} + + public DefaultGdbMapper(final Configuration config) { + MapperConfig.getInstance().updateConfig(config); + } + + private static BiConsumer forElement(final MappingRule rule) { + final boolean numPattern = rule.isNumPattern(); + final List> properties = new ArrayList<>(); + for (final MappingRule.PropertyMappingRule propRule : rule.getProperties()) { + final Function keyFunc = forStrColumn(numPattern, propRule.getKey()); + + if (propRule.getValueType() == ValueType.STRING) { + final Function valueFunc = forStrColumn(numPattern, propRule.getValue()); + properties.add((r, e) -> { + e.addProperty(keyFunc.apply(r), valueFunc.apply(r), propRule.getPType()); + }); + } else { + final Function valueFunc = + forObjColumn(numPattern, propRule.getValue(), propRule.getValueType()); + properties.add((r, e) -> { + e.addProperty(keyFunc.apply(r), valueFunc.apply(r), propRule.getPType()); + }); + } + } + + if (rule.getPropertiesJsonStr() != null) { + final Function jsonFunc = forStrColumn(numPattern, rule.getPropertiesJsonStr()); + properties.add((r, e) -> { + final String propertiesStr = jsonFunc.apply(r); + final JSONObject root = (JSONObject)JSONObject.parse(propertiesStr); + final JSONArray propertiesList = root.getJSONArray("properties"); + + for (final Object object : propertiesList) { + final JSONObject jsonObject = (JSONObject)object; + final String key = jsonObject.getString("k"); + final String name = jsonObject.getString("v"); + final String type = jsonObject.getString("t"); + final String card = jsonObject.getString("c"); + + if (key == null || name == null) { + continue; + } + addToProperties(e, key, name, type, card); + } + }); + } + + final BiConsumer ret = (r, e) -> { + final String label = forStrColumn(numPattern, rule.getLabel()).apply(r); + String id = forStrColumn(numPattern, rule.getId()).apply(r); + + if (rule.getImportType() == Key.ImportType.EDGE) { + final String to = forStrColumn(numPattern, rule.getTo()).apply(r); + final String from = forStrColumn(numPattern, rule.getFrom()).apply(r); + if (to == null || from == null) { + log.error("invalid record to: {} , from: {}", to, from); + throw new IllegalArgumentException("to or from missed in edge"); + } + ((GdbEdge)e).setTo(to); + ((GdbEdge)e).setFrom(from); + + // generate UUID for edge + if (id == null) { + id = UUID.randomUUID().toString(); + } + } + + if (id == null || label == null) { + log.error("invalid record id: {} , label: {}", id, label); + throw new IllegalArgumentException("id or label missed"); + } + + e.setId(id); + e.setLabel(label); + + properties.forEach(p -> p.accept(r, e)); }; - } + return ret; + } - private static BiConsumer forElement(MappingRule rule) { - List> properties = new ArrayList<>(); - for (MappingRule.PropertyMappingRule propRule : rule.getProperties()) { - Function keyFunc = forStrColumn(propRule.getKey()); + private static Function forObjColumn(final boolean numPattern, final String rule, final ValueType type) { + final Pattern pattern = numPattern ? NORMAL_NUM_PATTERN : NORMAL_DOLLAR_PATTERN; + final Matcher m = pattern.matcher(rule); + if (m.matches()) { + final int index = Integer.valueOf(m.group(1)); + return r -> type.applyColumn(r.getColumn(index)); + } else { + return r -> type.fromStrFunc(rule); + } + } - if (propRule.getValueType() == ValueType.STRING) { - final Function valueFunc = forStrColumn(propRule.getValue()); - properties.add((r, e) -> { - String k = keyFunc.apply(r); - String v = valueFunc.apply(r); - if (k != null && v != null) { - e.getProperties().put(k, v); - } - }); - } else { - final Function valueFunc = forObjColumn(propRule.getValue(), propRule.getValueType()); - properties.add((r, e) -> { - String k = keyFunc.apply(r); - Object v = valueFunc.apply(r); - if (k != null && v != null) { - e.getProperties().put(k, v); - } - }); - } - } + private static Function forStrColumn(final boolean numPattern, final String rule) { + final List> list = new ArrayList<>(); + final Pattern pattern = numPattern ? STR_NUM_PATTERN : STR_DOLLAR_PATTERN; + final Matcher m = pattern.matcher(rule); + int last = 0; + while (m.find()) { + final String index = m.group(1); + // as simple integer index. + final int i = Integer.parseInt(index); - if (rule.getPropertiesJsonStr() != null) { - Function jsonFunc = forStrColumn(rule.getPropertiesJsonStr()); - properties.add((r, e) -> { - String propertiesStr = jsonFunc.apply(r); - JSONObject root = (JSONObject)JSONObject.parse(propertiesStr); - JSONArray propertiesList = root.getJSONArray("properties"); + final int tmp = last; + final int start = m.start(); + list.add((sb, record) -> { + sb.append(rule.subSequence(tmp, start)); + if (record.getColumn(i) != null && record.getColumn(i).getByteSize() > 0) { + sb.append(record.getColumn(i).asString()); + } + }); - for (Object object : propertiesList) { - JSONObject jsonObject = (JSONObject)object; - String key = jsonObject.getString("k"); - String name = jsonObject.getString("v"); - String type = jsonObject.getString("t"); + last = m.end(); + } - if (key == null || name == null) { - continue; - } - addToProperties(e, key, name, type); - } - }); - } + final int tmp = last; + list.add((sb, record) -> { + sb.append(rule.subSequence(tmp, rule.length())); + }); - BiConsumer ret = (r, e) -> { - String label = forStrColumn(rule.getLabel()).apply(r); - String id = forStrColumn(rule.getId()).apply(r); + return r -> { + final StringBuilder sb = new StringBuilder(); + list.forEach(c -> c.accept(sb, r)); + final String res = sb.toString(); + return res.isEmpty() ? null : res; + }; + } - if (rule.getImportType() == Key.ImportType.EDGE) { - String to = forStrColumn(rule.getTo()).apply(r); - String from = forStrColumn(rule.getFrom()).apply(r); - if (to == null || from == null) { - log.error("invalid record to: {} , from: {}", to, from); - throw new IllegalArgumentException("to or from missed in edge"); - } - ((GdbEdge)e).setTo(to); - ((GdbEdge)e).setFrom(from); + private static boolean addToProperties(final GdbElement e, final String key, final String value, final String type, final String card) { + final Object pValue; + final ValueType valueType = ValueType.fromShortName(type); - // generate UUID for edge - if (id == null) { - id = UUID.randomUUID().toString(); - } - } + if (valueType == ValueType.STRING) { + pValue = value; + } else if (valueType == ValueType.INT || valueType == ValueType.INTEGER) { + pValue = Integer.valueOf(value); + } else if (valueType == ValueType.LONG) { + pValue = Long.valueOf(value); + } else if (valueType == ValueType.DOUBLE) { + pValue = Double.valueOf(value); + } else if (valueType == ValueType.FLOAT) { + pValue = Float.valueOf(value); + } else if (valueType == ValueType.BOOLEAN) { + pValue = Boolean.valueOf(value); + } else { + log.error("invalid property key {}, value {}, type {}", key, value, type); + return false; + } - if (id == null || label == null) { - log.error("invalid record id: {} , label: {}", id, label); - throw new IllegalArgumentException("id or label missed"); - } + // apply vertexSetProperty + if (Key.PropertyType.set.name().equals(card) && (e instanceof GdbVertex)) { + e.addProperty(key, pValue, Key.PropertyType.set); + } else { + e.addProperty(key, pValue); + } + return true; + } - e.setId(id); - e.setLabel(label); - - properties.forEach(p -> p.accept(r, e)); - }; - return ret; - } - - static Function forObjColumn(String rule, ValueType type) { - Matcher m = NORMAL_PATTERN.matcher(rule); - if (m.matches()) { - int index = Integer.valueOf(m.group(1)); - return r -> type.applyColumn(r.getColumn(index)); - } else { - return r -> type.fromStrFunc(rule); - } - } - - static Function forStrColumn(String rule) { - List> list = new ArrayList<>(); - Matcher m = STR_PATTERN.matcher(rule); - int last = 0; - while (m.find()) { - String index = m.group(1); - // as simple integer index. - int i = Integer.parseInt(index); - - final int tmp = last; - final int start = m.start(); - list.add((sb, record) -> { - sb.append(rule.subSequence(tmp, start)); - if(record.getColumn(i) != null && record.getColumn(i).getByteSize() > 0) { - sb.append(record.getColumn(i).asString()); - } - }); - - last = m.end(); - } - - final int tmp = last; - list.add((sb, record) -> { - sb.append(rule.subSequence(tmp, rule.length())); - }); - - return r -> { - StringBuilder sb = new StringBuilder(); - list.forEach(c -> c.accept(sb, r)); - String res = sb.toString(); - return res.isEmpty() ? null : res; - }; - } - - static boolean addToProperties(GdbElement e, String key, String value, String type) { - ValueType valueType = ValueType.fromShortName(type); - - if(valueType == ValueType.STRING) { - e.getProperties().put(key, value); - } else if (valueType == ValueType.INT) { - e.getProperties().put(key, Integer.valueOf(value)); - } else if (valueType == ValueType.LONG) { - e.getProperties().put(key, Long.valueOf(value)); - } else if (valueType == ValueType.DOUBLE) { - e.getProperties().put(key, Double.valueOf(value)); - } else if (valueType == ValueType.FLOAT) { - e.getProperties().put(key, Float.valueOf(value)); - } else if (valueType == ValueType.BOOLEAN) { - e.getProperties().put(key, Boolean.valueOf(value)); - } else { - log.error("invalid property key {}, value {}, type {}", key, value, type); - return false; - } - - return true; - } + @Override + public Function getMapper(final MappingRule rule) { + return r -> { + final GdbElement e = (rule.getImportType() == VERTEX) ? new GdbVertex() : new GdbEdge(); + forElement(rule).accept(r, e); + return e; + }; + } } diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/GdbMapper.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/GdbMapper.java index 3282f203..6a717a95 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/GdbMapper.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/GdbMapper.java @@ -13,5 +13,5 @@ import com.alibaba.datax.plugin.writer.gdbwriter.model.GdbElement; * */ public interface GdbMapper { - Function getMapper(MappingRule rule); + Function getMapper(MappingRule rule); } diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/MapperConfig.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/MapperConfig.java new file mode 100644 index 00000000..241cd31a --- /dev/null +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/MapperConfig.java @@ -0,0 +1,68 @@ +/* + * (C) 2019-present Alibaba Group Holding Limited. + * + * This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public + * License version 2 as published by the Free Software Foundation. + */ +package com.alibaba.datax.plugin.writer.gdbwriter.mapping; + +import com.alibaba.datax.common.util.Configuration; +import com.alibaba.datax.plugin.writer.gdbwriter.Key; +import com.alibaba.datax.plugin.writer.gdbwriter.client.GdbWriterConfig; + +/** + * @author : Liu Jianping + * @date : 2019/10/15 + */ + +public class MapperConfig { + private static MapperConfig instance = new MapperConfig(); + private int maxIdLength; + private int maxLabelLength; + private int maxPropKeyLength; + private int maxPropValueLength; + + private MapperConfig() { + this.maxIdLength = GdbWriterConfig.MAX_STRING_LENGTH; + this.maxLabelLength = GdbWriterConfig.MAX_STRING_LENGTH; + this.maxPropKeyLength = GdbWriterConfig.MAX_STRING_LENGTH; + this.maxPropValueLength = GdbWriterConfig.MAX_STRING_LENGTH; + } + + public static MapperConfig getInstance() { + return instance; + } + + public void updateConfig(final Configuration config) { + final int length = config.getInt(Key.MAX_GDB_STRING_LENGTH, GdbWriterConfig.MAX_STRING_LENGTH); + + Integer sLength = config.getInt(Key.MAX_GDB_ID_LENGTH); + this.maxIdLength = sLength == null ? length : sLength; + + sLength = config.getInt(Key.MAX_GDB_LABEL_LENGTH); + this.maxLabelLength = sLength == null ? length : sLength; + + sLength = config.getInt(Key.MAX_GDB_PROP_KEY_LENGTH); + this.maxPropKeyLength = sLength == null ? length : sLength; + + sLength = config.getInt(Key.MAX_GDB_PROP_VALUE_LENGTH); + this.maxPropValueLength = sLength == null ? length : sLength; + } + + public int getMaxIdLength() { + return this.maxIdLength; + } + + public int getMaxLabelLength() { + return this.maxLabelLength; + } + + public int getMaxPropKeyLength() { + return this.maxPropKeyLength; + } + + public int getMaxPropValueLength() { + return this.maxPropValueLength; + } + +} diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/MappingRule.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/MappingRule.java index c0c58d88..971fd6da 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/MappingRule.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/MappingRule.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.datax.plugin.writer.gdbwriter.Key.ImportType; +import com.alibaba.datax.plugin.writer.gdbwriter.Key.PropertyType; import lombok.Data; @@ -16,26 +17,30 @@ import lombok.Data; */ @Data public class MappingRule { - private String id = null; + private String id = null; - private String label = null; - - private ImportType importType = null; - - private String from = null; + private String label = null; - private String to = null; + private ImportType importType = null; - private List properties = new ArrayList<>(); + private String from = null; - private String propertiesJsonStr = null; + private String to = null; - @Data - public static class PropertyMappingRule { - private String key = null; - - private String value = null; - - private ValueType valueType = null; - } + private List properties = new ArrayList<>(); + + private String propertiesJsonStr = null; + + private boolean numPattern = false; + + @Data + public static class PropertyMappingRule { + private String key = null; + + private String value = null; + + private ValueType valueType = null; + + private PropertyType pType = PropertyType.single; + } } diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/MappingRuleFactory.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/MappingRuleFactory.java index 0738ac17..3e3a2afe 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/MappingRuleFactory.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/MappingRuleFactory.java @@ -3,18 +3,21 @@ */ package com.alibaba.datax.plugin.writer.gdbwriter.mapping; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import com.alibaba.datax.common.exception.DataXException; import com.alibaba.datax.common.util.Configuration; import com.alibaba.datax.plugin.writer.gdbwriter.GdbWriterErrorCode; import com.alibaba.datax.plugin.writer.gdbwriter.Key; -import com.alibaba.datax.plugin.writer.gdbwriter.Key.ImportType; -import com.alibaba.datax.plugin.writer.gdbwriter.Key.IdTransRule; import com.alibaba.datax.plugin.writer.gdbwriter.Key.ColumnType; +import com.alibaba.datax.plugin.writer.gdbwriter.Key.IdTransRule; +import com.alibaba.datax.plugin.writer.gdbwriter.Key.ImportType; import com.alibaba.datax.plugin.writer.gdbwriter.mapping.MappingRule.PropertyMappingRule; import com.alibaba.datax.plugin.writer.gdbwriter.util.ConfigHelper; -import lombok.extern.slf4j.Slf4j; -import java.util.List; +import lombok.extern.slf4j.Slf4j; /** * @author jerrywang @@ -22,66 +25,94 @@ import java.util.List; */ @Slf4j public class MappingRuleFactory { - private static final MappingRuleFactory instance = new MappingRuleFactory(); - - public static final MappingRuleFactory getInstance() { - return instance; - } + private static final MappingRuleFactory instance = new MappingRuleFactory(); + private static final Pattern STR_PATTERN = Pattern.compile("\\$\\{(\\d+)}"); + private static final Pattern STR_NUM_PATTERN = Pattern.compile("#\\{(\\d+)}"); - @Deprecated - public MappingRule create(Configuration config, ImportType type) { - MappingRule rule = new MappingRule(); - rule.setId(config.getString(Key.ID)); - rule.setLabel(config.getString(Key.LABEL)); - if (type == ImportType.EDGE) { - rule.setFrom(config.getString(Key.FROM)); - rule.setTo(config.getString(Key.TO)); - } - - rule.setImportType(type); - - List configurations = config.getListConfiguration(Key.PROPERTIES); - if (configurations != null) { - for (Configuration prop : config.getListConfiguration(Key.PROPERTIES)) { - PropertyMappingRule propRule = new PropertyMappingRule(); - propRule.setKey(prop.getString(Key.PROP_KEY)); - propRule.setValue(prop.getString(Key.PROP_VALUE)); - propRule.setValueType(ValueType.fromShortName(prop.getString(Key.PROP_TYPE).toLowerCase())); - rule.getProperties().add(propRule); - } - } - - String propertiesJsonStr = config.getString(Key.PROPERTIES_JSON_STR, null); - if (propertiesJsonStr != null) { - rule.setPropertiesJsonStr(propertiesJsonStr); - } - - return rule; - } - - public MappingRule createV2(Configuration config) { - try { - ImportType type = ImportType.valueOf(config.getString(Key.IMPORT_TYPE)); - return createV2(config, type); - } catch (NullPointerException e) { - throw DataXException.asDataXException(GdbWriterErrorCode.CONFIG_ITEM_MISS, Key.IMPORT_TYPE); - } catch (IllegalArgumentException e) { - throw DataXException.asDataXException(GdbWriterErrorCode.BAD_CONFIG_VALUE, Key.IMPORT_TYPE); - } + public static MappingRuleFactory getInstance() { + return instance; } - public MappingRule createV2(Configuration config, ImportType type) { - MappingRule rule = new MappingRule(); + private static boolean isPattern(final String value, final MappingRule rule, final boolean checked) { + if (checked) { + return true; + } - ConfigHelper.assertHasContent(config, Key.LABEL); - rule.setLabel(config.getString(Key.LABEL)); - rule.setImportType(type); + if (value == null || value.isEmpty()) { + return false; + } - IdTransRule srcTransRule = IdTransRule.none; + Matcher m = STR_PATTERN.matcher(value); + if (m.find()) { + rule.setNumPattern(false); + return true; + } + + m = STR_NUM_PATTERN.matcher(value); + if (m.find()) { + rule.setNumPattern(true); + return true; + } + + return false; + } + + @Deprecated + public MappingRule create(final Configuration config, final ImportType type) { + final MappingRule rule = new MappingRule(); + rule.setId(config.getString(Key.ID)); + rule.setLabel(config.getString(Key.LABEL)); + if (type == ImportType.EDGE) { + rule.setFrom(config.getString(Key.FROM)); + rule.setTo(config.getString(Key.TO)); + } + + rule.setImportType(type); + + final List configurations = config.getListConfiguration(Key.PROPERTIES); + if (configurations != null) { + for (final Configuration prop : config.getListConfiguration(Key.PROPERTIES)) { + final PropertyMappingRule propRule = new PropertyMappingRule(); + propRule.setKey(prop.getString(Key.PROP_KEY)); + propRule.setValue(prop.getString(Key.PROP_VALUE)); + propRule.setValueType(ValueType.fromShortName(prop.getString(Key.PROP_TYPE).toLowerCase())); + rule.getProperties().add(propRule); + } + } + + final String propertiesJsonStr = config.getString(Key.PROPERTIES_JSON_STR, null); + if (propertiesJsonStr != null) { + rule.setPropertiesJsonStr(propertiesJsonStr); + } + + return rule; + } + + public MappingRule createV2(final Configuration config) { + try { + final ImportType type = ImportType.valueOf(config.getString(Key.IMPORT_TYPE)); + return createV2(config, type); + } catch (final NullPointerException e) { + throw DataXException.asDataXException(GdbWriterErrorCode.CONFIG_ITEM_MISS, Key.IMPORT_TYPE); + } catch (final IllegalArgumentException e) { + throw DataXException.asDataXException(GdbWriterErrorCode.BAD_CONFIG_VALUE, Key.IMPORT_TYPE); + } + } + + public MappingRule createV2(final Configuration config, final ImportType type) { + final MappingRule rule = new MappingRule(); + boolean patternChecked = false; + + ConfigHelper.assertHasContent(config, Key.LABEL); + rule.setLabel(config.getString(Key.LABEL)); + rule.setImportType(type); + patternChecked = isPattern(rule.getLabel(), rule, patternChecked); + + IdTransRule srcTransRule = IdTransRule.none; IdTransRule dstTransRule = IdTransRule.none; if (type == ImportType.EDGE) { - ConfigHelper.assertHasContent(config, Key.SRC_ID_TRANS_RULE); - ConfigHelper.assertHasContent(config, Key.DST_ID_TRANS_RULE); + ConfigHelper.assertHasContent(config, Key.SRC_ID_TRANS_RULE); + ConfigHelper.assertHasContent(config, Key.DST_ID_TRANS_RULE); srcTransRule = IdTransRule.valueOf(config.getString(Key.SRC_ID_TRANS_RULE)); dstTransRule = IdTransRule.valueOf(config.getString(Key.DST_ID_TRANS_RULE)); @@ -94,88 +125,96 @@ public class MappingRuleFactory { ConfigHelper.assertHasContent(config, Key.DST_LABEL); } } - ConfigHelper.assertHasContent(config, Key.ID_TRANS_RULE); - IdTransRule transRule = IdTransRule.valueOf(config.getString(Key.ID_TRANS_RULE)); + ConfigHelper.assertHasContent(config, Key.ID_TRANS_RULE); + final IdTransRule transRule = IdTransRule.valueOf(config.getString(Key.ID_TRANS_RULE)); - List configurationList = config.getListConfiguration(Key.COLUMN); - ConfigHelper.assertConfig(Key.COLUMN, () -> (configurationList != null && !configurationList.isEmpty())); - for (Configuration column : configurationList) { - ConfigHelper.assertHasContent(column, Key.COLUMN_NAME); - ConfigHelper.assertHasContent(column, Key.COLUMN_VALUE); - ConfigHelper.assertHasContent(column, Key.COLUMN_TYPE); - ConfigHelper.assertHasContent(column, Key.COLUMN_NODE_TYPE); + final List configurationList = config.getListConfiguration(Key.COLUMN); + ConfigHelper.assertConfig(Key.COLUMN, () -> (configurationList != null && !configurationList.isEmpty())); + for (final Configuration column : configurationList) { + ConfigHelper.assertHasContent(column, Key.COLUMN_NAME); + ConfigHelper.assertHasContent(column, Key.COLUMN_VALUE); + ConfigHelper.assertHasContent(column, Key.COLUMN_TYPE); + ConfigHelper.assertHasContent(column, Key.COLUMN_NODE_TYPE); - String columnValue = column.getString(Key.COLUMN_VALUE); - ColumnType columnType = ColumnType.valueOf(column.getString(Key.COLUMN_NODE_TYPE)); - if (columnValue == null || columnValue.isEmpty()) { - // only allow edge empty id - ConfigHelper.assertConfig("empty column value", - () -> (type == ImportType.EDGE && columnType == ColumnType.primaryKey)); - } + final String columnValue = column.getString(Key.COLUMN_VALUE); + final ColumnType columnType = ColumnType.valueOf(column.getString(Key.COLUMN_NODE_TYPE)); + if (columnValue == null || columnValue.isEmpty()) { + // only allow edge empty id + ConfigHelper.assertConfig("empty column value", + () -> (type == ImportType.EDGE && columnType == ColumnType.primaryKey)); + } + patternChecked = isPattern(columnValue, rule, patternChecked); - if (columnType == ColumnType.primaryKey) { - ValueType propType = ValueType.fromShortName(column.getString(Key.COLUMN_TYPE)); - ConfigHelper.assertConfig("only string is allowed in primary key", () -> (propType == ValueType.STRING)); + if (columnType == ColumnType.primaryKey) { + final ValueType propType = ValueType.fromShortName(column.getString(Key.COLUMN_TYPE)); + ConfigHelper.assertConfig("only string is allowed in primary key", + () -> (propType == ValueType.STRING)); - if (transRule == IdTransRule.labelPrefix) { - rule.setId(config.getString(Key.LABEL) + columnValue); - } else { - rule.setId(columnValue); - } - } else if (columnType == ColumnType.edgeJsonProperty || columnType == ColumnType.vertexJsonProperty) { - // only support one json property in column - ConfigHelper.assertConfig("multi JsonProperty", () -> (rule.getPropertiesJsonStr() == null)); - - rule.setPropertiesJsonStr(columnValue); - } else if (columnType == ColumnType.vertexProperty || columnType == ColumnType.edgeProperty) { - PropertyMappingRule propertyMappingRule = new PropertyMappingRule(); - - propertyMappingRule.setKey(column.getString(Key.COLUMN_NAME)); - propertyMappingRule.setValue(columnValue); - ValueType propType = ValueType.fromShortName(column.getString(Key.COLUMN_TYPE)); - ConfigHelper.assertConfig("unsupported property type", () -> propType != null); - - propertyMappingRule.setValueType(propType); - rule.getProperties().add(propertyMappingRule); - } else if (columnType == ColumnType.srcPrimaryKey) { - if (type != ImportType.EDGE) { - continue; - } - - ValueType propType = ValueType.fromShortName(column.getString(Key.COLUMN_TYPE)); - ConfigHelper.assertConfig("only string is allowed in primary key", () -> (propType == ValueType.STRING)); - - if (srcTransRule == IdTransRule.labelPrefix) { - rule.setFrom(config.getString(Key.SRC_LABEL) + columnValue); + if (transRule == IdTransRule.labelPrefix) { + rule.setId(config.getString(Key.LABEL) + columnValue); } else { - rule.setFrom(columnValue); + rule.setId(columnValue); } - } else if (columnType == ColumnType.dstPrimaryKey) { + } else if (columnType == ColumnType.edgeJsonProperty || columnType == ColumnType.vertexJsonProperty) { + // only support one json property in column + ConfigHelper.assertConfig("multi JsonProperty", () -> (rule.getPropertiesJsonStr() == null)); + + rule.setPropertiesJsonStr(columnValue); + } else if (columnType == ColumnType.vertexProperty || columnType == ColumnType.edgeProperty + || columnType == ColumnType.vertexSetProperty) { + final PropertyMappingRule propertyMappingRule = new PropertyMappingRule(); + + propertyMappingRule.setKey(column.getString(Key.COLUMN_NAME)); + propertyMappingRule.setValue(columnValue); + final ValueType propType = ValueType.fromShortName(column.getString(Key.COLUMN_TYPE)); + ConfigHelper.assertConfig("unsupported property type", () -> propType != null); + + if (columnType == ColumnType.vertexSetProperty) { + propertyMappingRule.setPType(Key.PropertyType.set); + } + propertyMappingRule.setValueType(propType); + rule.getProperties().add(propertyMappingRule); + } else if (columnType == ColumnType.srcPrimaryKey) { if (type != ImportType.EDGE) { continue; } - ValueType propType = ValueType.fromShortName(column.getString(Key.COLUMN_TYPE)); - ConfigHelper.assertConfig("only string is allowed in primary key", () -> (propType == ValueType.STRING)); + final ValueType propType = ValueType.fromShortName(column.getString(Key.COLUMN_TYPE)); + ConfigHelper.assertConfig("only string is allowed in primary key", + () -> (propType == ValueType.STRING)); + + if (srcTransRule == IdTransRule.labelPrefix) { + rule.setFrom(config.getString(Key.SRC_LABEL) + columnValue); + } else { + rule.setFrom(columnValue); + } + } else if (columnType == ColumnType.dstPrimaryKey) { + if (type != ImportType.EDGE) { + continue; + } + + final ValueType propType = ValueType.fromShortName(column.getString(Key.COLUMN_TYPE)); + ConfigHelper.assertConfig("only string is allowed in primary key", + () -> (propType == ValueType.STRING)); if (dstTransRule == IdTransRule.labelPrefix) { rule.setTo(config.getString(Key.DST_LABEL) + columnValue); } else { rule.setTo(columnValue); } - } - } + } + } - if (rule.getImportType() == ImportType.EDGE) { - if (rule.getId() == null) { - rule.setId(""); - log.info("edge id is missed, uuid be default"); - } - ConfigHelper.assertConfig("to needed in edge", () -> (rule.getTo() != null)); - ConfigHelper.assertConfig("from needed in edge", () -> (rule.getFrom() != null)); - } - ConfigHelper.assertConfig("id needed", () -> (rule.getId() != null)); + if (rule.getImportType() == ImportType.EDGE) { + if (rule.getId() == null) { + rule.setId(""); + log.info("edge id is missed, uuid be default"); + } + ConfigHelper.assertConfig("to needed in edge", () -> (rule.getTo() != null)); + ConfigHelper.assertConfig("from needed in edge", () -> (rule.getFrom() != null)); + } + ConfigHelper.assertConfig("id needed", () -> (rule.getId() != null)); - return rule; - } + return rule; + } } diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/ValueType.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/ValueType.java index 9ad8bd8d..969fda3b 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/ValueType.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/mapping/ValueType.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.function.Function; import com.alibaba.datax.common.element.Column; + import lombok.extern.slf4j.Slf4j; /** @@ -16,56 +17,61 @@ import lombok.extern.slf4j.Slf4j; */ @Slf4j public enum ValueType { - INT(Integer.class, "int", Column::asLong, Integer::valueOf), - LONG(Long.class, "long", Column::asLong, Long::valueOf), - DOUBLE(Double.class, "double", Column::asDouble, Double::valueOf), - FLOAT(Float.class, "float", Column::asDouble, Float::valueOf), - BOOLEAN(Boolean.class, "boolean", Column::asBoolean, Boolean::valueOf), - STRING(String.class, "string", Column::asString, String::valueOf); + /** + * property value type + */ + INT(Integer.class, "int", Column::asLong, Integer::valueOf), + INTEGER(Integer.class, "integer", Column::asLong, Integer::valueOf), + LONG(Long.class, "long", Column::asLong, Long::valueOf), + DOUBLE(Double.class, "double", Column::asDouble, Double::valueOf), + FLOAT(Float.class, "float", Column::asDouble, Float::valueOf), + BOOLEAN(Boolean.class, "boolean", Column::asBoolean, Boolean::valueOf), + STRING(String.class, "string", Column::asString, String::valueOf); - private Class type = null; - private String shortName = null; - private Function columnFunc = null; - private Function fromStrFunc = null; + private Class type = null; + private String shortName = null; + private Function columnFunc = null; + private Function fromStrFunc = null; - private ValueType(Class type, String name, Function columnFunc, Function fromStrFunc) { - this.type = type; - this.shortName = name; - this.columnFunc = columnFunc; - this.fromStrFunc = fromStrFunc; - - ValueTypeHolder.shortName2type.put(name, this); - } - - public static ValueType fromShortName(String name) { - return ValueTypeHolder.shortName2type.get(name); - } + private ValueType(final Class type, final String name, final Function columnFunc, + final Function fromStrFunc) { + this.type = type; + this.shortName = name; + this.columnFunc = columnFunc; + this.fromStrFunc = fromStrFunc; - public Class type() { - return this.type; - } - - public String shortName() { - return this.shortName; - } - - public Object applyColumn(Column column) { - try { - if (column == null) { - return null; - } - return columnFunc.apply(column); - } catch (Exception e) { - log.error("applyColumn error {}, column {}", e.toString(), column); - throw e; - } - } - - public Object fromStrFunc(String str) { - return fromStrFunc.apply(str); - } + ValueTypeHolder.shortName2type.put(name, this); + } - private static class ValueTypeHolder { - private static Map shortName2type = new HashMap<>(); - } + public static ValueType fromShortName(final String name) { + return ValueTypeHolder.shortName2type.get(name); + } + + public Class type() { + return this.type; + } + + public String shortName() { + return this.shortName; + } + + public Object applyColumn(final Column column) { + try { + if (column == null) { + return null; + } + return this.columnFunc.apply(column); + } catch (final Exception e) { + log.error("applyColumn error {}, column {}", e.toString(), column); + throw e; + } + } + + public Object fromStrFunc(final String str) { + return this.fromStrFunc.apply(str); + } + + private static class ValueTypeHolder { + private static Map shortName2type = new HashMap<>(); + } } diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/AbstractGdbGraph.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/AbstractGdbGraph.java index 0c31c644..038663ac 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/AbstractGdbGraph.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/AbstractGdbGraph.java @@ -3,20 +3,24 @@ */ package com.alibaba.datax.plugin.writer.gdbwriter.model; -import com.alibaba.datax.common.util.Configuration; -import com.alibaba.datax.plugin.writer.gdbwriter.Key; -import com.alibaba.datax.plugin.writer.gdbwriter.client.GdbWriterConfig; +import static com.alibaba.datax.plugin.writer.gdbwriter.client.GdbWriterConfig.DEFAULT_BATCH_PROPERTY_NUM; +import static com.alibaba.datax.plugin.writer.gdbwriter.client.GdbWriterConfig.MAX_REQUEST_LENGTH; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.TimeUnit; -import lombok.extern.slf4j.Slf4j; import org.apache.tinkerpop.gremlin.driver.Client; import org.apache.tinkerpop.gremlin.driver.Cluster; import org.apache.tinkerpop.gremlin.driver.RequestOptions; import org.apache.tinkerpop.gremlin.driver.ResultSet; import org.apache.tinkerpop.gremlin.driver.ser.Serializers; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.TimeUnit; +import com.alibaba.datax.common.util.Configuration; +import com.alibaba.datax.plugin.writer.gdbwriter.Key; +import com.alibaba.datax.plugin.writer.gdbwriter.client.GdbWriterConfig; + +import lombok.extern.slf4j.Slf4j; /** * @author jerrywang @@ -24,128 +28,124 @@ import java.util.concurrent.TimeUnit; */ @Slf4j public abstract class AbstractGdbGraph implements GdbGraph { - private final static int DEFAULT_TIMEOUT = 30000; + private final static int DEFAULT_TIMEOUT = 30000; - protected Client client = null; - protected Key.UpdateMode updateMode = Key.UpdateMode.INSERT; - protected int propertiesBatchNum = GdbWriterConfig.DEFAULT_BATCH_PROPERTY_NUM; - protected boolean session = false; + protected Client client = null; + protected Key.UpdateMode updateMode = Key.UpdateMode.INSERT; + protected int propertiesBatchNum = DEFAULT_BATCH_PROPERTY_NUM; + protected boolean session = false; + protected int maxRequestLength = GdbWriterConfig.MAX_REQUEST_LENGTH; + protected AbstractGdbGraph() {} - protected AbstractGdbGraph() {} + protected AbstractGdbGraph(final Configuration config, final boolean session) { + initClient(config, session); + } - protected AbstractGdbGraph(Configuration config, boolean session) { - initClient(config, session); - } + protected void initClient(final Configuration config, final boolean session) { + this.updateMode = Key.UpdateMode.valueOf(config.getString(Key.UPDATE_MODE, "INSERT")); + log.info("init graphdb client"); + final String host = config.getString(Key.HOST); + final int port = config.getInt(Key.PORT); + final String username = config.getString(Key.USERNAME); + final String password = config.getString(Key.PASSWORD); + int maxDepthPerConnection = + config.getInt(Key.MAX_IN_PROCESS_PER_CONNECTION, GdbWriterConfig.DEFAULT_MAX_IN_PROCESS_PER_CONNECTION); - protected void initClient(Configuration config, boolean session) { - updateMode = Key.UpdateMode.valueOf(config.getString(Key.UPDATE_MODE, "INSERT")); - log.info("init graphdb client"); - String host = config.getString(Key.HOST); - int port = config.getInt(Key.PORT); - String username = config.getString(Key.USERNAME); - String password = config.getString(Key.PASSWORD); - int maxDepthPerConnection = config.getInt(Key.MAX_IN_PROCESS_PER_CONNECTION, - GdbWriterConfig.DEFAULT_MAX_IN_PROCESS_PER_CONNECTION); + int maxConnectionPoolSize = + config.getInt(Key.MAX_CONNECTION_POOL_SIZE, GdbWriterConfig.DEFAULT_MAX_CONNECTION_POOL_SIZE); - int maxConnectionPoolSize = config.getInt(Key.MAX_CONNECTION_POOL_SIZE, - GdbWriterConfig.DEFAULT_MAX_CONNECTION_POOL_SIZE); + int maxSimultaneousUsagePerConnection = config.getInt(Key.MAX_SIMULTANEOUS_USAGE_PER_CONNECTION, + GdbWriterConfig.DEFAULT_MAX_SIMULTANEOUS_USAGE_PER_CONNECTION); - int maxSimultaneousUsagePerConnection = config.getInt(Key.MAX_SIMULTANEOUS_USAGE_PER_CONNECTION, - GdbWriterConfig.DEFAULT_MAX_SIMULTANEOUS_USAGE_PER_CONNECTION); + this.session = session; + if (this.session) { + maxConnectionPoolSize = GdbWriterConfig.DEFAULT_MAX_CONNECTION_POOL_SIZE; + maxDepthPerConnection = GdbWriterConfig.DEFAULT_MAX_IN_PROCESS_PER_CONNECTION; + maxSimultaneousUsagePerConnection = GdbWriterConfig.DEFAULT_MAX_SIMULTANEOUS_USAGE_PER_CONNECTION; + } - this.session = session; - if (this.session) { - maxConnectionPoolSize = GdbWriterConfig.DEFAULT_MAX_CONNECTION_POOL_SIZE; - maxDepthPerConnection = GdbWriterConfig.DEFAULT_MAX_IN_PROCESS_PER_CONNECTION; - maxSimultaneousUsagePerConnection = GdbWriterConfig.DEFAULT_MAX_SIMULTANEOUS_USAGE_PER_CONNECTION; - } + try { + final Cluster cluster = Cluster.build(host).port(port).credentials(username, password) + .serializer(Serializers.GRAPHBINARY_V1D0).maxContentLength(1048576) + .maxInProcessPerConnection(maxDepthPerConnection).minInProcessPerConnection(0) + .maxConnectionPoolSize(maxConnectionPoolSize).minConnectionPoolSize(maxConnectionPoolSize) + .maxSimultaneousUsagePerConnection(maxSimultaneousUsagePerConnection).resultIterationBatchSize(64) + .create(); + this.client = session ? cluster.connect(UUID.randomUUID().toString()).init() : cluster.connect().init(); + warmClient(maxConnectionPoolSize * maxDepthPerConnection); + } catch (final RuntimeException e) { + log.error("Failed to connect to GDB {}:{}, due to {}", host, port, e); + throw e; + } - try { - Cluster cluster = Cluster.build(host).port(port).credentials(username, password) - .serializer(Serializers.GRAPHBINARY_V1D0) - .maxContentLength(1048576) - .maxInProcessPerConnection(maxDepthPerConnection) - .minInProcessPerConnection(0) - .maxConnectionPoolSize(maxConnectionPoolSize) - .minConnectionPoolSize(maxConnectionPoolSize) - .maxSimultaneousUsagePerConnection(maxSimultaneousUsagePerConnection) - .resultIterationBatchSize(64) - .create(); - client = session ? cluster.connect(UUID.randomUUID().toString()).init() : cluster.connect().init(); - warmClient(maxConnectionPoolSize*maxDepthPerConnection); - } catch (RuntimeException e) { - log.error("Failed to connect to GDB {}:{}, due to {}", host, port, e); - throw e; - } + this.propertiesBatchNum = config.getInt(Key.MAX_PROPERTIES_BATCH_NUM, DEFAULT_BATCH_PROPERTY_NUM); + this.maxRequestLength = config.getInt(Key.MAX_GDB_REQUEST_LENGTH, MAX_REQUEST_LENGTH); + } - propertiesBatchNum = config.getInt(Key.MAX_PROPERTIES_BATCH_NUM, GdbWriterConfig.DEFAULT_BATCH_PROPERTY_NUM); - } + /** + * @param dsl + * @param parameters + */ + protected void runInternal(final String dsl, final Map parameters) throws Exception { + final RequestOptions.Builder options = RequestOptions.build().timeout(DEFAULT_TIMEOUT); + if (parameters != null && !parameters.isEmpty()) { + parameters.forEach(options::addParameter); + } + final ResultSet results = this.client.submitAsync(dsl, options.create()).get(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); + results.all().get(DEFAULT_TIMEOUT + 1000, TimeUnit.MILLISECONDS); + } - /** - * @param dsl - * @param parameters - */ - protected void runInternal(String dsl, final Map parameters) throws Exception { - RequestOptions.Builder options = RequestOptions.build().timeout(DEFAULT_TIMEOUT); - if (parameters != null && !parameters.isEmpty()) { - parameters.forEach(options::addParameter); - } + void beginTx() { + if (!this.session) { + return; + } - ResultSet results = client.submitAsync(dsl, options.create()).get(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); - results.all().get(DEFAULT_TIMEOUT + 1000, TimeUnit.MILLISECONDS); - } + final String dsl = "g.tx().open()"; + this.client.submit(dsl).all().join(); + } - void beginTx() { - if (!session) { - return; - } + void doCommit() { + if (!this.session) { + return; + } - String dsl = "g.tx().open()"; - client.submit(dsl).all().join(); - } + try { + final String dsl = "g.tx().commit()"; + this.client.submit(dsl).all().join(); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } - void doCommit() { - if (!session) { - return; - } + void doRollback() { + if (!this.session) { + return; + } - try { - String dsl = "g.tx().commit()"; - client.submit(dsl).all().join(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } + final String dsl = "g.tx().rollback()"; + this.client.submit(dsl).all().join(); + } - void doRollback() { - if (!session) { - return; - } + private void warmClient(final int num) { + try { + beginTx(); + runInternal("g.V('test')", null); + doCommit(); + log.info("warm graphdb client over"); + } catch (final Exception e) { + log.error("warmClient error"); + doRollback(); + throw new RuntimeException(e); + } + } - String dsl = "g.tx().rollback()"; - client.submit(dsl).all().join(); - } - - private void warmClient(int num) { - try { - beginTx(); - runInternal("g.V('test')", null); - doCommit(); - log.info("warm graphdb client over"); - } catch (Exception e) { - log.error("warmClient error"); - doRollback(); - throw new RuntimeException(e); - } - } - - @Override - public void close() { - if (client != null) { - log.info("close graphdb client"); - client.close(); - } - } + @Override + public void close() { + if (this.client != null) { + log.info("close graphdb client"); + this.client.close(); + } + } } diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/GdbEdge.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/GdbEdge.java index d42c9182..0bd42057 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/GdbEdge.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/GdbEdge.java @@ -3,7 +3,8 @@ */ package com.alibaba.datax.plugin.writer.gdbwriter.model; -import lombok.Data; +import com.alibaba.datax.plugin.writer.gdbwriter.mapping.MapperConfig; + import lombok.EqualsAndHashCode; import lombok.ToString; @@ -11,10 +12,33 @@ import lombok.ToString; * @author jerrywang * */ -@Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class GdbEdge extends GdbElement { - private String from = null; - private String to = null; + private String from = null; + private String to = null; + + public String getFrom() { + return this.from; + } + + public void setFrom(final String from) { + final int maxIdLength = MapperConfig.getInstance().getMaxIdLength(); + if (from.length() > maxIdLength) { + throw new IllegalArgumentException("from length over limit(" + maxIdLength + ")"); + } + this.from = from; + } + + public String getTo() { + return this.to; + } + + public void setTo(final String to) { + final int maxIdLength = MapperConfig.getInstance().getMaxIdLength(); + if (to.length() > maxIdLength) { + throw new IllegalArgumentException("to length over limit(" + maxIdLength + ")"); + } + this.to = to; + } } diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/GdbElement.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/GdbElement.java index af3c7090..3d513a6a 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/GdbElement.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/GdbElement.java @@ -3,18 +3,107 @@ */ package com.alibaba.datax.plugin.writer.gdbwriter.model; -import java.util.HashMap; -import java.util.Map; +import java.util.LinkedList; +import java.util.List; -import lombok.Data; +import com.alibaba.datax.plugin.writer.gdbwriter.Key.PropertyType; +import com.alibaba.datax.plugin.writer.gdbwriter.mapping.MapperConfig; /** * @author jerrywang * */ -@Data public class GdbElement { - String id = null; - String label = null; - Map properties = new HashMap<>(); + private String id = null; + private String label = null; + private List properties = new LinkedList<>(); + + public String getId() { + return this.id; + } + + public void setId(final String id) { + final int maxIdLength = MapperConfig.getInstance().getMaxIdLength(); + if (id.length() > maxIdLength) { + throw new IllegalArgumentException("id length over limit(" + maxIdLength + ")"); + } + this.id = id; + } + + public String getLabel() { + return this.label; + } + + public void setLabel(final String label) { + final int maxLabelLength = MapperConfig.getInstance().getMaxLabelLength(); + if (label.length() > maxLabelLength) { + throw new IllegalArgumentException("label length over limit(" + maxLabelLength + ")"); + } + this.label = label; + } + + public List getProperties() { + return this.properties; + } + + public void addProperty(final String propKey, final Object propValue, final PropertyType card) { + if (propKey == null || propValue == null) { + return; + } + + final int maxPropKeyLength = MapperConfig.getInstance().getMaxPropKeyLength(); + if (propKey.length() > maxPropKeyLength) { + throw new IllegalArgumentException("property key length over limit(" + maxPropKeyLength + ")"); + } + if (propValue instanceof String) { + final int maxPropValueLength = MapperConfig.getInstance().getMaxPropValueLength(); + if (((String)propValue).length() > maxPropKeyLength) { + throw new IllegalArgumentException("property value length over limit(" + maxPropValueLength + ")"); + } + } + + this.properties.add(new GdbProperty(propKey, propValue, card)); + } + + public void addProperty(final String propKey, final Object propValue) { + addProperty(propKey, propValue, PropertyType.single); + } + + @Override + public String toString() { + final StringBuffer sb = new StringBuffer(this.id + "[" + this.label + "]{"); + this.properties.forEach(n -> { + sb.append(n.cardinality.name()); + sb.append("["); + sb.append(n.key); + sb.append(" - "); + sb.append(String.valueOf(n.value)); + sb.append("]"); + }); + return sb.toString(); + } + + public static class GdbProperty { + private String key; + private Object value; + private PropertyType cardinality; + + private GdbProperty(final String key, final Object value, final PropertyType card) { + this.key = key; + this.value = value; + this.cardinality = card; + } + + public PropertyType getCardinality() { + return this.cardinality; + } + + public String getKey() { + return this.key; + } + + public Object getValue() { + return this.value; + } + } } diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/GdbGraph.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/GdbGraph.java index 5b98c502..5d9b4508 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/GdbGraph.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/GdbGraph.java @@ -3,18 +3,19 @@ */ package com.alibaba.datax.plugin.writer.gdbwriter.model; -import com.alibaba.datax.common.element.Record; -import groovy.lang.Tuple2; - import java.util.List; +import com.alibaba.datax.common.element.Record; + +import groovy.lang.Tuple2; + /** * @author jerrywang * */ public interface GdbGraph extends AutoCloseable { - List> add(List> records); + List> add(List> records); - @Override - void close(); + @Override + void close(); } diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/ScriptGdbGraph.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/ScriptGdbGraph.java index 7f898431..9ecee8ab 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/ScriptGdbGraph.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/model/ScriptGdbGraph.java @@ -3,15 +3,17 @@ */ package com.alibaba.datax.plugin.writer.gdbwriter.model; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; import com.alibaba.datax.common.element.Record; import com.alibaba.datax.common.util.Configuration; - import com.alibaba.datax.plugin.writer.gdbwriter.Key; import com.alibaba.datax.plugin.writer.gdbwriter.util.GdbDuplicateIdException; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; + import groovy.lang.Tuple2; import lombok.extern.slf4j.Slf4j; @@ -21,176 +23,198 @@ import lombok.extern.slf4j.Slf4j; */ @Slf4j public class ScriptGdbGraph extends AbstractGdbGraph { - private static final String VAR_PREFIX = "GDB___"; - private static final String VAR_ID = VAR_PREFIX + "id"; - private static final String VAR_LABEL = VAR_PREFIX + "label"; - private static final String VAR_FROM = VAR_PREFIX + "from"; - private static final String VAR_TO = VAR_PREFIX + "to"; - private static final String VAR_PROP_KEY = VAR_PREFIX + "PK"; - private static final String VAR_PROP_VALUE = VAR_PREFIX + "PV"; - private static final String ADD_V_START = "g.addV(" + VAR_LABEL + ").property(id, " + VAR_ID + ")"; - private static final String ADD_E_START = "g.addE(" + VAR_LABEL + ").property(id, " + VAR_ID + ").from(V(" - + VAR_FROM + ")).to(V(" + VAR_TO + "))"; + private static final String VAR_PREFIX = "GDB___"; + private static final String VAR_ID = VAR_PREFIX + "id"; + private static final String VAR_LABEL = VAR_PREFIX + "label"; + private static final String VAR_FROM = VAR_PREFIX + "from"; + private static final String VAR_TO = VAR_PREFIX + "to"; + private static final String VAR_PROP_KEY = VAR_PREFIX + "PK"; + private static final String VAR_PROP_VALUE = VAR_PREFIX + "PV"; + private static final String ADD_V_START = "g.addV(" + VAR_LABEL + ").property(id, " + VAR_ID + ")"; + private static final String ADD_E_START = + "g.addE(" + VAR_LABEL + ").property(id, " + VAR_ID + ").from(V(" + VAR_FROM + ")).to(V(" + VAR_TO + "))"; - private static final String UPDATE_V_START = "g.V("+VAR_ID+")"; - private static final String UPDATE_E_START = "g.E("+VAR_ID+")"; + private static final String UPDATE_V_START = "g.V(" + VAR_ID + ")"; + private static final String UPDATE_E_START = "g.E(" + VAR_ID + ")"; - private Cache propertyCache; - private Random random; + private Random random; - public ScriptGdbGraph() { - propertyCache = Caffeine.newBuilder().maximumSize(1024).build(); - random = new Random(); - } + public ScriptGdbGraph() { + this.random = new Random(); + } - public ScriptGdbGraph(Configuration config, boolean session) { - super(config, session); + public ScriptGdbGraph(final Configuration config, final boolean session) { + super(config, session); - propertyCache = Caffeine.newBuilder().maximumSize(1024).build(); - random = new Random(); + this.random = new Random(); + log.info("Init as ScriptGdbGraph."); + } - log.info("Init as ScriptGdbGraph."); - } + /** + * Apply list of {@link GdbElement} to GDB, return the failed records + * + * @param records + * list of element to apply + * @return + */ + @Override + public List> add(final List> records) { + final List> errors = new ArrayList<>(); + try { + beginTx(); + for (final Tuple2 elementTuple2 : records) { + try { + addInternal(elementTuple2.getSecond()); + } catch (final Exception e) { + errors.add(new Tuple2<>(elementTuple2.getFirst(), e)); + } + } + doCommit(); + } catch (final Exception ex) { + doRollback(); + throw new RuntimeException(ex); + } + return errors; + } - /** - * Apply list of {@link GdbElement} to GDB, return the failed records - * @param records list of element to apply - * @return - */ - @Override - public List> add(List> records) { - List> errors = new ArrayList<>(); - try { - beginTx(); - for (Tuple2 elementTuple2 : records) { - try { - addInternal(elementTuple2.getSecond()); - } catch (Exception e) { - errors.add(new Tuple2<>(elementTuple2.getFirst(), e)); - } - } - doCommit(); - } catch (Exception ex) { - doRollback(); - throw new RuntimeException(ex); - } - return errors; - } + private void addInternal(final GdbElement element) { + try { + addInternal(element, false); + } catch (final GdbDuplicateIdException e) { + if (this.updateMode == Key.UpdateMode.SKIP) { + log.debug("Skip duplicate id {}", element.getId()); + } else if (this.updateMode == Key.UpdateMode.INSERT) { + throw new RuntimeException(e); + } else if (this.updateMode == Key.UpdateMode.MERGE) { + if (element.getProperties().isEmpty()) { + return; + } - private void addInternal(GdbElement element) { - try { - addInternal(element, false); - } catch (GdbDuplicateIdException e) { - if (updateMode == Key.UpdateMode.SKIP) { - log.debug("Skip duplicate id {}", element.getId()); - } else if (updateMode == Key.UpdateMode.INSERT) { - throw new RuntimeException(e); - } else if (updateMode == Key.UpdateMode.MERGE) { - if (element.getProperties().isEmpty()) { - return; - } + try { + addInternal(element, true); + } catch (final GdbDuplicateIdException e1) { + log.error("duplicate id {} while update...", element.getId()); + throw new RuntimeException(e1); + } + } + } + } - try { - addInternal(element, true); - } catch (GdbDuplicateIdException e1) { - log.error("duplicate id {} while update...", element.getId()); - throw new RuntimeException(e1); - } - } - } - } + private void addInternal(final GdbElement element, final boolean update) throws GdbDuplicateIdException { + boolean firstAdd = !update; + final boolean isVertex = (element instanceof GdbVertex); + final List params = element.getProperties(); + final List subParams = new ArrayList<>(this.propertiesBatchNum); - private void addInternal(GdbElement element, boolean update) throws GdbDuplicateIdException { - Map params = element.getProperties(); - Map subParams = new HashMap<>(propertiesBatchNum); - boolean firstAdd = !update; - boolean isVertex = (element instanceof GdbVertex); + final int idLength = element.getId().length(); + int attachLength = element.getLabel().length(); + if (element instanceof GdbEdge) { + attachLength += ((GdbEdge)element).getFrom().length(); + attachLength += ((GdbEdge)element).getTo().length(); + } - for (Map.Entry entry : params.entrySet()) { - subParams.put(entry.getKey(), entry.getValue()); - if (subParams.size() >= propertiesBatchNum) { - setGraphDbElement(element, subParams, isVertex, firstAdd); - firstAdd = false; - subParams.clear(); - } - } - if (!subParams.isEmpty() || firstAdd) { - setGraphDbElement(element, subParams, isVertex, firstAdd); - } - } + int requestLength = idLength; + for (final GdbElement.GdbProperty entry : params) { + final String propKey = entry.getKey(); + final Object propValue = entry.getValue(); - private Tuple2> buildDsl(GdbElement element, - Map properties, - boolean isVertex, boolean firstAdd) { - Map params = new HashMap<>(); + int appendLength = propKey.length(); + if (propValue instanceof String) { + appendLength += ((String)propValue).length(); + } - String dslPropertyPart = propertyCache.get(properties.size(), keys -> { - final StringBuilder sb = new StringBuilder(); - for (int i = 0; i < keys; i++) { - sb.append(".property(").append(VAR_PROP_KEY).append(i) - .append(", ").append(VAR_PROP_VALUE).append(i).append(")"); - } - return sb.toString(); - }); + if (checkSplitDsl(firstAdd, requestLength, attachLength, appendLength, subParams.size())) { + setGraphDbElement(element, subParams, isVertex, firstAdd); + firstAdd = false; + subParams.clear(); + requestLength = idLength; + } - String dsl; - if (isVertex) { - dsl = (firstAdd ? ADD_V_START : UPDATE_V_START) + dslPropertyPart; - } else { - dsl = (firstAdd ? ADD_E_START : UPDATE_E_START) + dslPropertyPart; - if (firstAdd) { - params.put(VAR_FROM, ((GdbEdge)element).getFrom()); - params.put(VAR_TO, ((GdbEdge)element).getTo()); - } - } + requestLength += appendLength; + subParams.add(entry); + } + if (!subParams.isEmpty() || firstAdd) { + checkSplitDsl(firstAdd, requestLength, attachLength, 0, 0); + setGraphDbElement(element, subParams, isVertex, firstAdd); + } + } - int index = 0; - for (Map.Entry entry : properties.entrySet()) { - params.put(VAR_PROP_KEY+index, entry.getKey()); - params.put(VAR_PROP_VALUE+index, entry.getValue()); - index++; - } + private boolean checkSplitDsl(final boolean firstAdd, final int requestLength, final int attachLength, final int appendLength, + final int propNum) { + final int length = firstAdd ? requestLength + attachLength : requestLength; + if (length > this.maxRequestLength) { + throw new IllegalArgumentException("request length over limit(" + this.maxRequestLength + ")"); + } + return length + appendLength > this.maxRequestLength || propNum >= this.propertiesBatchNum; + } - if (firstAdd) { - params.put(VAR_LABEL, element.getLabel()); - } - params.put(VAR_ID, element.getId()); + private Tuple2> buildDsl(final GdbElement element, final List properties, + final boolean isVertex, final boolean firstAdd) { + final Map params = new HashMap<>(); + final StringBuilder sb = new StringBuilder(); + if (isVertex) { + sb.append(firstAdd ? ADD_V_START : UPDATE_V_START); + } else { + sb.append(firstAdd ? ADD_E_START : UPDATE_E_START); + } - return new Tuple2<>(dsl, params); - } + for (int i = 0; i < properties.size(); i++) { + final GdbElement.GdbProperty prop = properties.get(i); - private void setGraphDbElement(GdbElement element, Map properties, - boolean isVertex, boolean firstAdd) throws GdbDuplicateIdException { - int retry = 10; - int idleTime = random.nextInt(10) + 10; - Tuple2> elementDsl = buildDsl(element, properties, isVertex, firstAdd); + sb.append(".property("); + if (prop.getCardinality() == Key.PropertyType.set) { + sb.append("set, "); + } + sb.append(VAR_PROP_KEY).append(i).append(", ").append(VAR_PROP_VALUE).append(i).append(")"); - while (retry > 0) { - try { - runInternal(elementDsl.getFirst(), elementDsl.getSecond()); - log.debug("AddElement {}", element.getId()); - return; - } catch (Exception e) { - String cause = e.getCause() == null ? "" : e.getCause().toString(); - if (cause.contains("rejected from")) { - retry--; - try { - Thread.sleep(idleTime); - } catch (InterruptedException e1) { - // ... - } - idleTime = Math.min(idleTime * 2, 2000); - continue; - } else if (firstAdd && cause.contains("GraphDB id exists")) { - throw new GdbDuplicateIdException(e); - } - log.error("Add Failed id {}, dsl {}, params {}, e {}", element.getId(), - elementDsl.getFirst(), elementDsl.getSecond(), e); - throw new RuntimeException(e); - } - } - log.error("Add Failed id {}, dsl {}, params {}", element.getId(), - elementDsl.getFirst(), elementDsl.getSecond()); - throw new RuntimeException("failed to queue new element to server"); - } + params.put(VAR_PROP_KEY + i, prop.getKey()); + params.put(VAR_PROP_VALUE + i, prop.getValue()); + } + + if (firstAdd) { + params.put(VAR_LABEL, element.getLabel()); + if (!isVertex) { + params.put(VAR_FROM, ((GdbEdge)element).getFrom()); + params.put(VAR_TO, ((GdbEdge)element).getTo()); + } + } + params.put(VAR_ID, element.getId()); + + return new Tuple2<>(sb.toString(), params); + } + + private void setGraphDbElement(final GdbElement element, final List properties, final boolean isVertex, + final boolean firstAdd) throws GdbDuplicateIdException { + int retry = 10; + int idleTime = this.random.nextInt(10) + 10; + final Tuple2> elementDsl = buildDsl(element, properties, isVertex, firstAdd); + + while (retry > 0) { + try { + runInternal(elementDsl.getFirst(), elementDsl.getSecond()); + log.debug("AddElement {}", element.getId()); + return; + } catch (final Exception e) { + final String cause = e.getCause() == null ? "" : e.getCause().toString(); + if (cause.contains("rejected from") || cause.contains("Timeout waiting to lock key")) { + retry--; + try { + Thread.sleep(idleTime); + } catch (final InterruptedException e1) { + // ... + } + idleTime = Math.min(idleTime * 2, 2000); + continue; + } else if (firstAdd && cause.contains("GraphDB id exists")) { + throw new GdbDuplicateIdException(e); + } + log.error("Add Failed id {}, dsl {}, params {}, e {}", element.getId(), elementDsl.getFirst(), + elementDsl.getSecond(), e); + throw new RuntimeException(e); + } + } + log.error("Add Failed id {}, dsl {}, params {}", element.getId(), elementDsl.getFirst(), + elementDsl.getSecond()); + throw new RuntimeException("failed to queue new element to server"); + } } diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/util/ConfigHelper.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/util/ConfigHelper.java index 77175197..178b5e7c 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/util/ConfigHelper.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/util/ConfigHelper.java @@ -7,53 +7,57 @@ import java.io.IOException; import java.io.InputStream; import java.util.function.Supplier; +import org.apache.commons.lang3.StringUtils; + import com.alibaba.datax.common.exception.DataXException; import com.alibaba.datax.common.util.Configuration; import com.alibaba.datax.plugin.writer.gdbwriter.GdbWriterErrorCode; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import org.apache.commons.lang3.StringUtils; - /** * @author jerrywang * */ public interface ConfigHelper { - static void assertConfig(String key, Supplier f) { - if (!f.get()) { - throw DataXException.asDataXException(GdbWriterErrorCode.BAD_CONFIG_VALUE, key); - } - } + static void assertConfig(final String key, final Supplier f) { + if (!f.get()) { + throw DataXException.asDataXException(GdbWriterErrorCode.BAD_CONFIG_VALUE, key); + } + } - static void assertHasContent(Configuration config, String key) { - assertConfig(key, () -> StringUtils.isNotBlank(config.getString(key))); - } + static void assertHasContent(final Configuration config, final String key) { + assertConfig(key, () -> StringUtils.isNotBlank(config.getString(key))); + } - /** - * NOTE: {@code Configuration::get(String, Class)} doesn't work. - * - * @param conf Configuration - * @param key key path to configuration - * @param cls Class of result type - * @return the target configuration object of type T - */ - static T getConfig(Configuration conf, String key, Class cls) { - JSONObject j = (JSONObject) conf.get(key); - return JSON.toJavaObject(j, cls); - } - - /** - * Create a configuration from the specified file on the classpath. - * - * @param name file name - * @return Configuration instance. - */ - static Configuration fromClasspath(String name) { - try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(name)) { - return Configuration.from(is); - } catch (IOException e) { - throw new IllegalArgumentException("File not found: " + name); - } - } + /** + * NOTE: {@code Configuration::get(String, Class)} doesn't work. + * + * @param conf + * Configuration + * @param key + * key path to configuration + * @param cls + * Class of result type + * @return the target configuration object of type T + */ + static T getConfig(final Configuration conf, final String key, final Class cls) { + final JSONObject j = (JSONObject)conf.get(key); + return JSON.toJavaObject(j, cls); + } + + /** + * Create a configuration from the specified file on the classpath. + * + * @param name + * file name + * @return Configuration instance. + */ + static Configuration fromClasspath(final String name) { + try (final InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(name)) { + return Configuration.from(is); + } catch (final IOException e) { + throw new IllegalArgumentException("File not found: " + name); + } + } } diff --git a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/util/GdbDuplicateIdException.java b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/util/GdbDuplicateIdException.java index e531d51b..dba641b0 100644 --- a/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/util/GdbDuplicateIdException.java +++ b/gdbwriter/src/main/java/com/alibaba/datax/plugin/writer/gdbwriter/util/GdbDuplicateIdException.java @@ -1,9 +1,8 @@ /* - * (C) 2019-present Alibaba Group Holding Limited. + * (C) 2019-present Alibaba Group Holding Limited. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. + * This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public + * License version 2 as published by the Free Software Foundation. */ package com.alibaba.datax.plugin.writer.gdbwriter.util; @@ -13,11 +12,11 @@ package com.alibaba.datax.plugin.writer.gdbwriter.util; */ public class GdbDuplicateIdException extends Exception { - public GdbDuplicateIdException(Exception e) { - super(e); - } + public GdbDuplicateIdException(Exception e) { + super(e); + } - public GdbDuplicateIdException() { - super(); - } + public GdbDuplicateIdException() { + super(); + } } From e09ec84f450d51cae678de96be7a8a4a429f90e1 Mon Sep 17 00:00:00 2001 From: Liu Jianping Date: Fri, 10 Apr 2020 16:03:38 +0800 Subject: [PATCH 11/77] gdbwriter: update readme doc --- gdbwriter/doc/gdbwriter.md | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/gdbwriter/doc/gdbwriter.md b/gdbwriter/doc/gdbwriter.md index 82cdd899..70524a59 100644 --- a/gdbwriter/doc/gdbwriter.md +++ b/gdbwriter/doc/gdbwriter.md @@ -41,6 +41,14 @@ GDBWriter通过DataX框架获取Reader生成的协议数据,使用`g.addV/E(GD { "random": "60,64", "type": "string" + }, + { + "random": "100,1000", + "type": "long" + }, + { + "random": "32,48", + "type": "string" } ], "sliceRecordCount": 1000 @@ -70,6 +78,18 @@ GDBWriter通过DataX框架获取Reader生成的协议数据,使用`g.addV/E(GD "name": "vertex_propKey", "value": "${2}", "type": "string", + "columnType": "vertexSetProperty" + }, + { + "name": "vertex_propKey", + "value": "${3}", + "type": "long", + "columnType": "vertexSetProperty" + }, + { + "name": "vertex_propKey2", + "value": "${4}", + "type": "string", "columnType": "vertexProperty" } ] @@ -290,6 +310,7 @@ GDBWriter通过DataX框架获取Reader生成的协议数据,使用`g.addV/E(GD * primaryKey:表示该字段是主键id * 点枚举值: * vertexProperty:labelType为点时,表示该字段是点的普通属性 + * vertexSetProperty:labelType为点时,表示该字段是点的SET属性,value是SET属性中的一个属性值 * vertexJsonProperty:labelType为点时,表示是点json属性,value结构请见备注**json properties示例**,点配置最多只允许出现一个json属性; * 边枚举值: * srcPrimaryKey:labelType为边时,表示该字段是起点主键id @@ -305,6 +326,14 @@ GDBWriter通过DataX框架获取Reader生成的协议数据,使用`g.addV/E(GD > {"k":"age","t":"int","v":"20"}, > {"k":"sex","t":"string","v":"male"} > ]} + > + > # json格式同样支持给点添加SET属性,格式如下 + > {"properties":[ + > {"k":"name","t":"string","v":"tom","c":"set"}, + > {"k":"name","t":"string","v":"jack","c":"set"}, + > {"k":"age","t":"int","v":"20"}, + > {"k":"sex","t":"string","v":"male"} + > ]} > ``` ## 4 性能报告 @@ -367,4 +396,5 @@ DataX压测机器 - GDBWriter插件与用户查询DSL使用相同的GDB实例端口,导入时可能会影响查询性能 ## FAQ -无 +1. 使用SET属性需要升级GDB实例到`1.0.20`版本及以上。 +2. 边只支持普通单值属性,不能给边写SET属性数据。 From 05d1851d9985bcc2d863d9526edde5dbce8876b0 Mon Sep 17 00:00:00 2001 From: Liu Jianping Date: Mon, 13 Apr 2020 10:29:33 +0800 Subject: [PATCH 12/77] gdbreader: reader for Aliyun GDB --- gdbreader/doc/gdbreader.md | 260 ++++++++++++++++++ gdbreader/pom.xml | 125 +++++++++ gdbreader/src/main/assembly/package.xml | 35 +++ .../plugin/reader/gdbreader/GdbReader.java | 231 ++++++++++++++++ .../reader/gdbreader/GdbReaderErrorCode.java | 39 +++ .../datax/plugin/reader/gdbreader/Key.java | 86 ++++++ .../gdbreader/mapping/DefaultGdbMapper.java | 150 ++++++++++ .../reader/gdbreader/mapping/MappingRule.java | 79 ++++++ .../gdbreader/mapping/MappingRuleFactory.java | 76 +++++ .../reader/gdbreader/mapping/ValueType.java | 128 +++++++++ .../gdbreader/model/AbstractGdbGraph.java | 89 ++++++ .../reader/gdbreader/model/GdbElement.java | 39 +++ .../reader/gdbreader/model/GdbGraph.java | 65 +++++ .../gdbreader/model/ScriptGdbGraph.java | 192 +++++++++++++ .../reader/gdbreader/util/ConfigHelper.java | 77 ++++++ gdbreader/src/main/resources/plugin.json | 6 + .../main/resources/plugin_job_template.json | 77 ++++++ pom.xml | 1 + 18 files changed, 1755 insertions(+) create mode 100644 gdbreader/doc/gdbreader.md create mode 100644 gdbreader/pom.xml create mode 100644 gdbreader/src/main/assembly/package.xml create mode 100644 gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/GdbReader.java create mode 100644 gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/GdbReaderErrorCode.java create mode 100644 gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/Key.java create mode 100644 gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/mapping/DefaultGdbMapper.java create mode 100644 gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/mapping/MappingRule.java create mode 100644 gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/mapping/MappingRuleFactory.java create mode 100644 gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/mapping/ValueType.java create mode 100644 gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/model/AbstractGdbGraph.java create mode 100644 gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/model/GdbElement.java create mode 100644 gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/model/GdbGraph.java create mode 100644 gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/model/ScriptGdbGraph.java create mode 100644 gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/util/ConfigHelper.java create mode 100644 gdbreader/src/main/resources/plugin.json create mode 100644 gdbreader/src/main/resources/plugin_job_template.json diff --git a/gdbreader/doc/gdbreader.md b/gdbreader/doc/gdbreader.md new file mode 100644 index 00000000..e883f20d --- /dev/null +++ b/gdbreader/doc/gdbreader.md @@ -0,0 +1,260 @@ + +# DataX GDBReader + +## 1. 快速介绍 + +GDBReader插件实现读取GDB实例数据的功能,通过`Gremlin Client`连接远程GDB实例,按配置提供的`label`生成查询DSL,遍历点或边数据,包括属性数据,并将数据写入到Record中给到Writer使用。 + +## 2. 实现原理 + +GDBReader使用`Gremlin Client`连接GDB实例,按`label`分不同Task取点或边数据。 +单个Task中按`label`遍历点或边的id,再切分范围分多次请求查询点或边和属性数据,最后将点或边数据根据配置转换成指定格式记录发送给下游写插件。 + +GDBReader按`label`切分多个Task并发,同一个`label`的数据批量异步获取来加快读取速度。如果配置读取的`label`列表为空,任务启动前会从GDB查询所有`label`再切分Task。 + +## 3. 功能说明 + +GDB中点和边不同,读取需要区分点和边点配置。 + +### 3.1 点配置样例 + +``` +{ + "job": { + "setting": { + "speed": { + "channel": 1 + } + "errorLimit": { + "record": 1 + } + }, + + "content": [ + { + "reader": { + "name": "gdbreader", + "parameter": { + "host": "10.218.145.24", + "port": 8182, + "username": "***", + "password": "***", + "fetchBatchSize": 100, + "rangeSplitSize": 1000, + "labelType": "VERTEX", + "labels": ["label1", "label2"], + "column": [ + { + "name": "id", + "type": "string", + "columnType": "primaryKey" + }, + { + "name": "label", + "type": "string", + "columnType": "primaryLabel" + }, + { + "name": "age", + "type": "int", + "columnType": "vertexProperty" + } + ] + } + }, + "writer": { + "name": "streamwriter", + "parameter": { + "print": true + } + } + } + ] + } +} +``` + +### 3.2 边配置样例 + +``` +{ + "job": { + "setting": { + "speed": { + "channel": 1 + }, + "errorLimit": { + "record": 1 + } + }, + + "content": [ + { + "reader": { + "name": "gdbreader", + "parameter": { + "host": "10.218.145.24", + "port": 8182, + "username": "***", + "password": "***", + "fetchBatchSize": 100, + "rangeSplitSize": 1000, + "labelType": "EDGE", + "labels": ["label1", "label2"], + "column": [ + { + "name": "id", + "type": "string", + "columnType": "primaryKey" + }, + { + "name": "label", + "type": "string", + "columnType": "primaryLabel" + }, + { + "name": "srcId", + "type": "string", + "columnType": "srcPrimaryKey" + }, + { + "name": "srcLabel", + "type": "string", + "columnType": "srcPrimaryLabel" + }, + { + "name": "dstId", + "type": "string", + "columnType": "srcPrimaryKey" + }, + { + "name": "dstLabel", + "type": "string", + "columnType": "srcPrimaryLabel" + }, + { + "name": "name", + "type": "string", + "columnType": "edgeProperty" + }, + { + "name": "weight", + "type": "double", + "columnType": "edgeProperty" + } + ] + } + }, + + "writer": { + "name": "streamwriter", + "parameter": { + "print": true + } + } + } + ] + } +} +``` + +### 3.3 参数说明 + +* **host** + * 描述:GDB实例连接地址,对应'实例管理'->'基本信息'页面的网络地址 + * 必选:是 + * 默认值:无 + +* **port** + * 描述:GDB实例连接地址对应的端口 + * 必选:是 + * 默认值:8182 + +* **username** + * 描述:GDB实例账号名 + * 必选:是 + * 默认值:无 + +* **password** + * 描述:GDB实例账号名对应的密码 + * 必选:是 + * 默认值:无 + +* **fetchBatchSize** + * 描述:一次GDB请求读取点或边的数量,响应包含点或边以及属性 + * 必选:是 + * 默认值:100 + +* **rangeSplitSize** + * 描述:id遍历,一次遍历请求扫描的id个数 + * 必选:是 + * 默认值:10 \* fetchBatchSize + +* **labels** + * 描述:标签数组,即需要导出的点或边标签,支持读取多个标签,用数组表示。如果留空([]),表示GDB中所有点或边标签 + * 必选:是 + * 默认值:无 + +* **labelType** + * 描述:数据标签类型,支持点、边两种枚举值 + * VERTEX:表示点 + * EDGE:表示边 + * 必选:是 + * 默认值:无 + +* **column** + * 描述:点或边字段映射关系配置 + * 必选:是 + * 默认值:无 + +* **column -> name** + * 描述:点或边映射关系的字段名,指定属性时表示读取的属性名,读取其他字段时会被忽略 + * 必选:是 + * 默认值:无 + +* **column -> type** + * 描述:点或边映射关系的字段类型 + * id, label在GDB中都是string类型,配置非string类型时可能会转换失败 + * 普通属性支持基础类型,包括int, long, float, double, boolean, string + * GDBReader尽量将读取到的数据转换成配置要求的类型,但转换失败会导致该条记录错误 + * 必选:是 + * 默认值:无 + +* **column -> columnType** + * 描述:GDB点或边数据到列数据的映射关系,支持以下枚举值: + * primaryKey: 表示该字段是点或边的id + * primaryLabel: 表示该字段是点或边的label + * srcPrimaryKey: 表示该字段是边关联的起点id,只在读取边时使用 + * srcPrimaryLabel: 表示该字段是边关联的起点label,只在读取边时使用 + * dstPrimaryKey: 表示该字段是边关联的终点id,只在读取边时使用 + * dstPrimaryLabel: 表示该字段是边关联的终点label,只在读取边时使用 + * vertexProperty: 表示该字段是点的属性,只在读取点时使用,应用到SET属性时只读取其中的一个属性值 + * vertexJsonProperty: 表示该字段是点的属性集合,只在读取点时使用。属性集合使用JSON格式输出,包含所有的属性,不能与其他vertexProperty配置一起使用 + * edgeProperty: 表示该字段是边的属性,只在读取边时使用 + * edgeJsonProperty: 表示该字段是边的属性集合,只在读取边时使用。属性集合使用JSON格式输出,包含所有的属性,不能与其他edgeProperty配置一起使用 + * 必选:是 + * 默认值:无 + * vertexJsonProperty格式示例,新增`c`字段区分SET属性,但是SET属性只包含单个属性值时会标记成普通属性 + ``` + {"properties":[ + {"k":"name","t","string","v":"Jack","c":"set"}, + {"k":"name","t","string","v":"Luck","c":"set"}, + {"k":"age","t","int","v":"20","c":"single"} + ]} + ``` + * edgeJsonProperty格式示例,边不支持多值属性 + ``` + {"properties":[ + {"k":"created_at","t","long","v":"153498653"}, + {"k":"weight","t","double","v":"3.14"} + ]} + +## 4 性能报告 +(TODO) + +## 5 使用约束 +无 + +## 6 FAQ +无 + diff --git a/gdbreader/pom.xml b/gdbreader/pom.xml new file mode 100644 index 00000000..a226a21f --- /dev/null +++ b/gdbreader/pom.xml @@ -0,0 +1,125 @@ + + + + datax-all + com.alibaba.datax + 0.0.1-SNAPSHOT + + 4.0.0 + + gdbreader + + com.alibaba.datax + 0.0.1-SNAPSHOT + + + + com.alibaba.datax + datax-common + ${datax-project-version} + + + slf4j-log4j12 + org.slf4j + + + + + com.alibaba.datax + datax-core + ${datax-project-version} + test + + + slf4j-log4j12 + org.slf4j + + + + + + org.slf4j + slf4j-api + + + ch.qos.logback + logback-classic + + + + org.apache.tinkerpop + gremlin-driver + 3.4.1 + + + org.projectlombok + lombok + 1.18.8 + + + org.junit.jupiter + junit-jupiter-api + 5.4.0 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.4.0 + test + + + + + + + + + maven-compiler-plugin + + 1.6 + 1.6 + ${project-sourceEncoding} + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.0 + + + **/*Test*.class + + + + + + maven-assembly-plugin + + + src/main/assembly/package.xml + + datax + + + + dwzip + package + + single + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + + diff --git a/gdbreader/src/main/assembly/package.xml b/gdbreader/src/main/assembly/package.xml new file mode 100644 index 00000000..c834c2f2 --- /dev/null +++ b/gdbreader/src/main/assembly/package.xml @@ -0,0 +1,35 @@ + + + + dir + + false + + + src/main/resources + + plugin.json + plugin_job_template.json + + plugin/reader/gdbreader + + + target/ + + gdbreader-0.0.1-SNAPSHOT.jar + + plugin/reader/gdbreader + + + + + + false + plugin/reader/gdbreader/libs + runtime + + + diff --git a/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/GdbReader.java b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/GdbReader.java new file mode 100644 index 00000000..025e7b51 --- /dev/null +++ b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/GdbReader.java @@ -0,0 +1,231 @@ +package com.alibaba.datax.plugin.reader.gdbreader; + +import com.alibaba.datax.common.element.Record; +import com.alibaba.datax.common.exception.DataXException; +import com.alibaba.datax.common.plugin.RecordSender; +import com.alibaba.datax.common.spi.Reader; +import com.alibaba.datax.common.util.Configuration; +import com.alibaba.datax.plugin.reader.gdbreader.mapping.DefaultGdbMapper; +import com.alibaba.datax.plugin.reader.gdbreader.mapping.MappingRule; +import com.alibaba.datax.plugin.reader.gdbreader.mapping.MappingRuleFactory; +import com.alibaba.datax.plugin.reader.gdbreader.model.GdbElement; +import com.alibaba.datax.plugin.reader.gdbreader.model.GdbGraph; +import com.alibaba.datax.plugin.reader.gdbreader.model.ScriptGdbGraph; +import com.alibaba.datax.plugin.reader.gdbreader.util.ConfigHelper; +import org.apache.tinkerpop.gremlin.driver.ResultSet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.LinkedList; +import java.util.List; + +public class GdbReader extends Reader { + private final static int DEFAULT_FETCH_BATCH_SIZE = 200; + private static GdbGraph graph; + private static Key.ExportType exportType; + + /** + * Job 中的方法仅执行一次,Task 中方法会由框架启动多个 Task 线程并行执行。 + *

+ * 整个 Reader 执行流程是: + *

+     * Job类init-->prepare-->split
+     *
+     *                            Task类init-->prepare-->startRead-->post-->destroy
+     *                            Task类init-->prepare-->startRead-->post-->destroy
+     *
+     *                                                                             Job类post-->destroy
+     * 
+ */ + public static class Job extends Reader.Job { + private static final Logger LOG = LoggerFactory.getLogger(Job.class); + + private Configuration jobConfig = null; + + @Override + public void init() { + this.jobConfig = super.getPluginJobConf(); + + /** + * 注意:此方法仅执行一次。 + * 最佳实践:通常在这里对用户的配置进行校验:是否缺失必填项?有无错误值?有没有无关配置项?... + * 并给出清晰的报错/警告提示。校验通常建议采用静态工具类进行,以保证本类结构清晰。 + */ + + ConfigHelper.assertGdbClient(jobConfig); + ConfigHelper.assertLabels(jobConfig); + try { + exportType = Key.ExportType.valueOf(jobConfig.getString(Key.EXPORT_TYPE)); + } catch (NullPointerException | IllegalArgumentException e) { + throw DataXException.asDataXException(GdbReaderErrorCode.BAD_CONFIG_VALUE, Key.EXPORT_TYPE); + } + } + + @Override + public void prepare() { + /** + * 注意:此方法仅执行一次。 + * 最佳实践:如果 Job 中有需要进行数据同步之前的处理,可以在此处完成,如果没有必要则可以直接去掉。 + */ + + try { + graph = new ScriptGdbGraph(jobConfig, exportType); + } catch (RuntimeException e) { + throw DataXException.asDataXException(GdbReaderErrorCode.FAIL_CLIENT_CONNECT, e.getMessage()); + } + } + + @Override + public List split(int adviceNumber) { + /** + * 注意:此方法仅执行一次。 + * 最佳实践:通常采用工具静态类完成把 Job 配置切分成多个 Task 配置的工作。 + * 这里的 adviceNumber 是框架根据用户的同步速度的要求建议的切分份数,仅供参考,不是强制必须切分的份数。 + */ + List labels = ConfigHelper.assertLabels(jobConfig); + + /** + * 配置label列表为空时,尝试查询GDB中所有label,添加到读取列表 + */ + if (labels.isEmpty()) { + try { + labels.addAll(graph.getLabels().keySet()); + } catch (RuntimeException ex) { + throw DataXException.asDataXException(GdbReaderErrorCode.FAIL_FETCH_LABELS, ex.getMessage()); + } + } + + if (labels.isEmpty()) { + throw DataXException.asDataXException(GdbReaderErrorCode.FAIL_FETCH_LABELS, "none labels to read"); + } + + return ConfigHelper.splitConfig(jobConfig, labels); + } + + @Override + public void post() { + /** + * 注意:此方法仅执行一次。 + * 最佳实践:如果 Job 中有需要进行数据同步之后的后续处理,可以在此处完成。 + */ + } + + @Override + public void destroy() { + /** + * 注意:此方法仅执行一次。 + * 最佳实践:通常配合 Job 中的 post() 方法一起完成 Job 的资源释放。 + */ + try { + graph.close(); + } catch (Exception ex) { + LOG.error("Failed to close client : {}", ex); + } + } + + } + + public static class Task extends Reader.Task { + private static final Logger LOG = LoggerFactory.getLogger(Task.class); + private static MappingRule rule; + private Configuration taskConfig; + private String fetchLabel = null; + + private int rangeSplitSize; + private int fetchBatchSize; + + @Override + public void init() { + this.taskConfig = super.getPluginJobConf(); + + /** + * 注意:此方法每个 Task 都会执行一次。 + * 最佳实践:此处通过对 taskConfig 配置的读取,进而初始化一些资源为 startRead()做准备。 + */ + fetchLabel = taskConfig.getString(Key.LABEL); + fetchBatchSize = taskConfig.getInt(Key.FETCH_BATCH_SIZE, DEFAULT_FETCH_BATCH_SIZE); + rangeSplitSize = taskConfig.getInt(Key.RANGE_SPLIT_SIZE, fetchBatchSize * 10); + rule = MappingRuleFactory.getInstance().create(taskConfig, exportType); + } + + @Override + public void prepare() { + /** + * 注意:此方法仅执行一次。 + * 最佳实践:如果 Job 中有需要进行数据同步之后的处理,可以在此处完成,如果没有必要则可以直接去掉。 + */ + } + + @Override + public void startRead(RecordSender recordSender) { + /** + * 注意:此方法每个 Task 都会执行一次。 + * 最佳实践:此处适当封装确保简洁清晰完成数据读取工作。 + */ + + String start = ""; + while (true) { + List ids; + try { + ids = graph.fetchIds(fetchLabel, start, rangeSplitSize); + if (ids.isEmpty()) { + break; + } + start = ids.get(ids.size() - 1); + } catch (Exception ex) { + throw DataXException.asDataXException(GdbReaderErrorCode.FAIL_FETCH_IDS, ex.getMessage()); + } + + // send range fetch async + int count = ids.size(); + List resultSets = new LinkedList<>(); + for (int pos = 0; pos < count; pos += fetchBatchSize) { + int rangeSize = Math.min(fetchBatchSize, count - pos); + String endId = ids.get(pos + rangeSize - 1); + String beginId = ids.get(pos); + + List propNames = rule.isHasProperty() ? rule.getPropertyNames() : null; + try { + resultSets.add(graph.fetchElementsAsync(fetchLabel, beginId, endId, propNames)); + } catch (Exception ex) { + // just print error logs and continues + LOG.error("failed to request label: {}, start: {}, end: {}, e: {}", fetchLabel, beginId, endId, ex); + } + } + + // get range fetch dsl results + resultSets.forEach(results -> { + try { + List elements = graph.getElement(results); + elements.forEach(element -> { + Record record = recordSender.createRecord(); + DefaultGdbMapper.getMapper(rule).accept(element, record); + recordSender.sendToWriter(record); + }); + recordSender.flush(); + } catch (Exception ex) { + LOG.error("failed to send records e {}", ex); + } + }); + } + } + + @Override + public void post() { + /** + * 注意:此方法每个 Task 都会执行一次。 + * 最佳实践:如果 Task 中有需要进行数据同步之后的后续处理,可以在此处完成。 + */ + } + + @Override + public void destroy() { + /** + * 注意:此方法每个 Task 都会执行一次。 + * 最佳实践:通常配合Task 中的 post() 方法一起完成 Task 的资源释放。 + */ + } + + } + +} \ No newline at end of file diff --git a/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/GdbReaderErrorCode.java b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/GdbReaderErrorCode.java new file mode 100644 index 00000000..1d320bbd --- /dev/null +++ b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/GdbReaderErrorCode.java @@ -0,0 +1,39 @@ +package com.alibaba.datax.plugin.reader.gdbreader; + +import com.alibaba.datax.common.spi.ErrorCode; + +public enum GdbReaderErrorCode implements ErrorCode { + /** + * + */ + BAD_CONFIG_VALUE("GdbReader-00", "The value you configured is invalid."), + FAIL_CLIENT_CONNECT("GdbReader-02", "GDB connection is abnormal."), + UNSUPPORTED_TYPE("GdbReader-03", "Unsupported data type conversion."), + FAIL_FETCH_LABELS("GdbReader-04", "Error pulling all labels, it is recommended to configure the specified label pull."), + FAIL_FETCH_IDS("GdbReader-05", "Pull range id error."), + ; + + private final String code; + private final String description; + + private GdbReaderErrorCode(String code, String description) { + this.code = code; + this.description = description; + } + + @Override + public String getCode() { + return this.code; + } + + @Override + public String getDescription() { + return this.description; + } + + @Override + public String toString() { + return String.format("Code:[%s], Description:[%s]. ", this.code, + this.description); + } +} \ No newline at end of file diff --git a/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/Key.java b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/Key.java new file mode 100644 index 00000000..31d5e631 --- /dev/null +++ b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/Key.java @@ -0,0 +1,86 @@ +package com.alibaba.datax.plugin.reader.gdbreader; + +public final class Key { + + /** + * 此处声明插件用到的需要插件使用者提供的配置项 + */ + public final static String HOST = "host"; + public final static String PORT = "port"; + public final static String USERNAME = "username"; + public static final String PASSWORD = "password"; + + public static final String LABEL = "labels"; + public static final String EXPORT_TYPE = "labelType"; + + public static final String RANGE_SPLIT_SIZE = "RangeSplitSize"; + public static final String FETCH_BATCH_SIZE = "fetchBatchSize"; + + public static final String COLUMN = "column"; + public static final String COLUMN_NAME = "name"; + public static final String COLUMN_TYPE = "type"; + public static final String COLUMN_NODE_TYPE = "columnType"; + + public enum ExportType { + /** + * Import vertices + */ + VERTEX, + /** + * Import edges + */ + EDGE + } + + public enum ColumnType { + /** + * vertex or edge id + */ + primaryKey, + + /** + * vertex or edge label + */ + primaryLabel, + + /** + * vertex property + */ + vertexProperty, + + /** + * collects all vertex property to Json list + */ + vertexJsonProperty, + + /** + * start vertex id of edge + */ + srcPrimaryKey, + + /** + * start vertex label of edge + */ + srcPrimaryLabel, + + /** + * end vertex id of edge + */ + dstPrimaryKey, + + /** + * end vertex label of edge + */ + dstPrimaryLabel, + + /** + * edge property + */ + edgeProperty, + + /** + * collects all edge property to Json list + */ + edgeJsonProperty, + } +} diff --git a/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/mapping/DefaultGdbMapper.java b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/mapping/DefaultGdbMapper.java new file mode 100644 index 00000000..d874cf36 --- /dev/null +++ b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/mapping/DefaultGdbMapper.java @@ -0,0 +1,150 @@ +/* + * (C) 2019-present Alibaba Group Holding Limited. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +package com.alibaba.datax.plugin.reader.gdbreader.mapping; + +import com.alibaba.datax.common.element.Record; +import com.alibaba.datax.plugin.reader.gdbreader.model.GdbElement; +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceProperty; +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertexProperty; + +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author : Liu Jianping + * @date : 2019/9/6 + */ + +public class DefaultGdbMapper { + + public static BiConsumer getMapper(MappingRule rule) { + return (gdbElement, record) -> rule.getColumns().forEach(columnMappingRule -> { + Object value = null; + ValueType type = columnMappingRule.getValueType(); + String name = columnMappingRule.getName(); + Map props = gdbElement.getProperties(); + + switch (columnMappingRule.getColumnType()) { + case dstPrimaryKey: + value = gdbElement.getTo(); + break; + case srcPrimaryKey: + value = gdbElement.getFrom(); + break; + case primaryKey: + value = gdbElement.getId(); + break; + case primaryLabel: + value = gdbElement.getLabel(); + break; + case dstPrimaryLabel: + value = gdbElement.getToLabel(); + break; + case srcPrimaryLabel: + value = gdbElement.getFromLabel(); + break; + case vertexProperty: + value = forVertexOnePropertyValue().apply(props.get(name)); + break; + case edgeProperty: + value = forEdgePropertyValue().apply(props.get(name)); + break; + case edgeJsonProperty: + value = forEdgeJsonProperties().apply(props); + break; + case vertexJsonProperty: + value = forVertexJsonProperties().apply(props); + break; + default: + break; + } + record.addColumn(type.applyObject(value)); + }); + } + + + /** + * parser ReferenceProperty value for edge + * + * @return property value + */ + private static Function forEdgePropertyValue() { + return prop -> { + if (prop instanceof ReferenceProperty) { + return ((ReferenceProperty) prop).value(); + } + return null; + }; + } + + /** + * parser ReferenceVertexProperty value for vertex + * + * @return the first property value in list + */ + private static Function forVertexOnePropertyValue() { + return props -> { + if (props instanceof List) { + // get the first one property if more than one + Object o = ((List) props).get(0); + if (o instanceof ReferenceVertexProperty) { + return ((ReferenceVertexProperty) o).value(); + } + } + return null; + }; + } + + /** + * parser all edge properties to json string + * + * @return json string + */ + private static Function, String> forEdgeJsonProperties() { + return props -> "{\"properties\":[" + + props.entrySet().stream().filter(p -> p.getValue() instanceof ReferenceProperty) + .map(p -> "{\"k\":\"" + ((ReferenceProperty) p.getValue()).key() + "\"," + + "\"t\":\"" + ((ReferenceProperty) p.getValue()).value().getClass().getSimpleName().toLowerCase() + "\"," + + "\"v\":\"" + String.valueOf(((ReferenceProperty) p.getValue()).value()) + "\"}") + .collect(Collectors.joining(",")) + + "]}"; + } + + /** + * parser all vertex properties to json string, include set-property + * + * @return json string + */ + private static Function, String> forVertexJsonProperties() { + return props -> "{\"properties\":[" + + props.entrySet().stream().filter(p -> p.getValue() instanceof List) + .map(p -> forVertexPropertyStr().apply((List) p.getValue())) + .collect(Collectors.joining(",")) + + "]}"; + } + + /** + * parser one vertex property to json string item, set 'cardinality' + * + * @return json string item + */ + private static Function, String> forVertexPropertyStr() { + return vp -> { + final String setFlag = vp.size() > 1 ? "set" : "single"; + return vp.stream().filter(p -> p instanceof ReferenceVertexProperty) + .map(p -> "{\"k\":\"" + ((ReferenceVertexProperty) p).key() + "\"," + + "\"t\":\"" + ((ReferenceVertexProperty) p).value().getClass().getSimpleName().toLowerCase() + "\"," + + "\"v\":\"" + String.valueOf(((ReferenceVertexProperty) p).value()) + "\"," + + "\"c\":\"" + setFlag + "\"}") + .collect(Collectors.joining(",")); + }; + } +} diff --git a/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/mapping/MappingRule.java b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/mapping/MappingRule.java new file mode 100644 index 00000000..7baed498 --- /dev/null +++ b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/mapping/MappingRule.java @@ -0,0 +1,79 @@ +/* + * (C) 2019-present Alibaba Group Holding Limited. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +package com.alibaba.datax.plugin.reader.gdbreader.mapping; + +import com.alibaba.datax.common.exception.DataXException; +import com.alibaba.datax.plugin.reader.gdbreader.GdbReaderErrorCode; +import com.alibaba.datax.plugin.reader.gdbreader.Key.ColumnType; +import com.alibaba.datax.plugin.reader.gdbreader.Key.ExportType; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author : Liu Jianping + * @date : 2019/9/6 + */ + +@Data +public class MappingRule { + private boolean hasRelation = false; + private boolean hasProperty = false; + private ExportType type = ExportType.VERTEX; + + /** + * property names for property key-value + */ + private List propertyNames = new ArrayList<>(); + + private List columns = new ArrayList<>(); + + void addColumn(ColumnType columnType, ValueType type, String name) { + ColumnMappingRule rule = new ColumnMappingRule(); + rule.setColumnType(columnType); + rule.setName(name); + rule.setValueType(type); + + if (columnType == ColumnType.vertexProperty || columnType == ColumnType.edgeProperty) { + propertyNames.add(name); + hasProperty = true; + } + + boolean hasTo = columnType == ColumnType.dstPrimaryKey || columnType == ColumnType.dstPrimaryLabel; + boolean hasFrom = columnType == ColumnType.srcPrimaryKey || columnType == ColumnType.srcPrimaryLabel; + if (hasTo || hasFrom) { + hasRelation = true; + } + + columns.add(rule); + } + + void addJsonColumn(ColumnType columnType) { + ColumnMappingRule rule = new ColumnMappingRule(); + rule.setColumnType(columnType); + rule.setName("json"); + rule.setValueType(ValueType.STRING); + + if (!propertyNames.isEmpty()) { + throw DataXException.asDataXException(GdbReaderErrorCode.BAD_CONFIG_VALUE, "JsonProperties should be only property"); + } + + columns.add(rule); + hasProperty = true; + } + + @Data + protected static class ColumnMappingRule { + private String name = null; + + private ValueType valueType = null; + + private ColumnType columnType = null; + } +} diff --git a/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/mapping/MappingRuleFactory.java b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/mapping/MappingRuleFactory.java new file mode 100644 index 00000000..c71a19ac --- /dev/null +++ b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/mapping/MappingRuleFactory.java @@ -0,0 +1,76 @@ +/* + * (C) 2019-present Alibaba Group Holding Limited. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +package com.alibaba.datax.plugin.reader.gdbreader.mapping; + +import com.alibaba.datax.common.exception.DataXException; +import com.alibaba.datax.common.util.Configuration; +import com.alibaba.datax.plugin.reader.gdbreader.GdbReaderErrorCode; +import com.alibaba.datax.plugin.reader.gdbreader.Key; +import com.alibaba.datax.plugin.reader.gdbreader.Key.ColumnType; +import com.alibaba.datax.plugin.reader.gdbreader.Key.ExportType; +import com.alibaba.datax.plugin.reader.gdbreader.util.ConfigHelper; + +import java.util.List; + +/** + * @author : Liu Jianping + * @date : 2019/9/20 + */ + +public class MappingRuleFactory { + private static final MappingRuleFactory instance = new MappingRuleFactory(); + + public static MappingRuleFactory getInstance() { + return instance; + } + + public MappingRule create(Configuration config, ExportType exportType) { + MappingRule rule = new MappingRule(); + + rule.setType(exportType); + List configurationList = config.getListConfiguration(Key.COLUMN); + for (Configuration column : configurationList) { + ColumnType columnType; + try { + columnType = ColumnType.valueOf(column.getString(Key.COLUMN_NODE_TYPE)); + } catch (NullPointerException | IllegalArgumentException e) { + throw DataXException.asDataXException(GdbReaderErrorCode.BAD_CONFIG_VALUE, Key.COLUMN_NODE_TYPE); + } + + if (exportType == ExportType.VERTEX) { + // only id/label/property column allow when vertex + ConfigHelper.assertConfig(Key.COLUMN_NODE_TYPE, () -> + columnType == ColumnType.primaryKey || columnType == ColumnType.primaryLabel + || columnType == ColumnType.vertexProperty || columnType == ColumnType.vertexJsonProperty); + } else if (exportType == ExportType.EDGE) { + // edge + ConfigHelper.assertConfig(Key.COLUMN_NODE_TYPE, () -> + columnType == ColumnType.primaryKey || columnType == ColumnType.primaryLabel + || columnType == ColumnType.srcPrimaryKey || columnType == ColumnType.srcPrimaryLabel + || columnType == ColumnType.dstPrimaryKey || columnType == ColumnType.dstPrimaryLabel + || columnType == ColumnType.edgeProperty || columnType == ColumnType.edgeJsonProperty); + } + + if (columnType == ColumnType.edgeProperty || columnType == ColumnType.vertexProperty) { + String name = column.getString(Key.COLUMN_NAME); + ValueType propType = ValueType.fromShortName(column.getString(Key.COLUMN_TYPE)); + + ConfigHelper.assertConfig(Key.COLUMN_NAME, () -> name != null); + if (propType == null) { + throw DataXException.asDataXException(GdbReaderErrorCode.UNSUPPORTED_TYPE, Key.COLUMN_TYPE); + } + rule.addColumn(columnType, propType, name); + } else if (columnType == ColumnType.vertexJsonProperty || columnType == ColumnType.edgeJsonProperty) { + rule.addJsonColumn(columnType); + } else { + rule.addColumn(columnType, ValueType.STRING, null); + } + } + return rule; + } +} diff --git a/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/mapping/ValueType.java b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/mapping/ValueType.java new file mode 100644 index 00000000..826e0493 --- /dev/null +++ b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/mapping/ValueType.java @@ -0,0 +1,128 @@ +/* + * (C) 2019-present Alibaba Group Holding Limited. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +package com.alibaba.datax.plugin.reader.gdbreader.mapping; + +import com.alibaba.datax.common.element.BoolColumn; +import com.alibaba.datax.common.element.Column; +import com.alibaba.datax.common.element.DoubleColumn; +import com.alibaba.datax.common.element.LongColumn; +import com.alibaba.datax.common.element.StringColumn; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +/** + * @author : Liu Jianping + * @date : 2019/9/6 + */ + +public enum ValueType { + /** + * transfer gdb element object value to DataX Column data + *

+ * int, long -> LongColumn + * float, double -> DoubleColumn + * bool -> BooleanColumn + * string -> StringColumn + */ + INT(Integer.class, "int", ValueTypeHolder::longColumnMapper), + INTEGER(Integer.class, "integer", ValueTypeHolder::longColumnMapper), + LONG(Long.class, "long", ValueTypeHolder::longColumnMapper), + DOUBLE(Double.class, "double", ValueTypeHolder::doubleColumnMapper), + FLOAT(Float.class, "float", ValueTypeHolder::doubleColumnMapper), + BOOLEAN(Boolean.class, "boolean", ValueTypeHolder::boolColumnMapper), + STRING(String.class, "string", ValueTypeHolder::stringColumnMapper), + ; + + private Class type = null; + private String shortName = null; + private Function columnFunc = null; + + ValueType(Class type, String name, Function columnFunc) { + this.type = type; + this.shortName = name; + this.columnFunc = columnFunc; + + ValueTypeHolder.shortName2type.put(shortName, this); + } + + public static ValueType fromShortName(String name) { + return ValueTypeHolder.shortName2type.get(name); + } + + public Column applyObject(Object value) { + if (value == null) { + return null; + } + return columnFunc.apply(value); + } + + private static class ValueTypeHolder { + private static Map shortName2type = new HashMap<>(); + + private static LongColumn longColumnMapper(Object o) { + long v; + if (o instanceof Integer) { + v = (int) o; + } else if (o instanceof Long) { + v = (long) o; + } else if (o instanceof String) { + v = Long.valueOf((String) o); + } else { + throw new RuntimeException("Failed to cast " + o.getClass() + " to Long"); + } + + return new LongColumn(v); + } + + private static DoubleColumn doubleColumnMapper(Object o) { + double v; + if (o instanceof Integer) { + v = (double) (int) o; + } else if (o instanceof Long) { + v = (double) (long) o; + } else if (o instanceof Float) { + v = (double) (float) o; + } else if (o instanceof Double) { + v = (double) o; + } else if (o instanceof String) { + v = Double.valueOf((String) o); + } else { + throw new RuntimeException("Failed to cast " + o.getClass() + " to Double"); + } + + return new DoubleColumn(v); + } + + private static BoolColumn boolColumnMapper(Object o) { + boolean v; + if (o instanceof Integer) { + v = ((int) o != 0); + } else if (o instanceof Long) { + v = ((long) o != 0); + } else if (o instanceof Boolean) { + v = (boolean) o; + } else if (o instanceof String) { + v = Boolean.valueOf((String) o); + } else { + throw new RuntimeException("Failed to cast " + o.getClass() + " to Boolean"); + } + + return new BoolColumn(v); + } + + private static StringColumn stringColumnMapper(Object o) { + if (o instanceof String) { + return new StringColumn((String) o); + } else { + return new StringColumn(String.valueOf(o)); + } + } + } +} diff --git a/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/model/AbstractGdbGraph.java b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/model/AbstractGdbGraph.java new file mode 100644 index 00000000..4eda2eed --- /dev/null +++ b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/model/AbstractGdbGraph.java @@ -0,0 +1,89 @@ +/* + * (C) 2019-present Alibaba Group Holding Limited. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +package com.alibaba.datax.plugin.reader.gdbreader.model; + +import com.alibaba.datax.common.util.Configuration; +import com.alibaba.datax.plugin.reader.gdbreader.Key; +import org.apache.tinkerpop.gremlin.driver.Client; +import org.apache.tinkerpop.gremlin.driver.Cluster; +import org.apache.tinkerpop.gremlin.driver.RequestOptions; +import org.apache.tinkerpop.gremlin.driver.Result; +import org.apache.tinkerpop.gremlin.driver.ResultSet; +import org.apache.tinkerpop.gremlin.driver.ser.Serializers; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @author : Liu Jianping + * @date : 2019/9/6 + */ + +public abstract class AbstractGdbGraph implements GdbGraph { + final static int DEFAULT_TIMEOUT = 30000; + private static final Logger log = LoggerFactory.getLogger(AbstractGdbGraph.class); + private Client client; + + AbstractGdbGraph() { + } + + AbstractGdbGraph(Configuration config) { + log.info("init graphdb client"); + String host = config.getString(Key.HOST); + int port = config.getInt(Key.PORT); + String username = config.getString(Key.USERNAME); + String password = config.getString(Key.PASSWORD); + + try { + Cluster cluster = Cluster.build(host).port(port).credentials(username, password) + .serializer(Serializers.GRAPHBINARY_V1D0) + .maxContentLength(1024 * 1024) + .resultIterationBatchSize(64) + .create(); + client = cluster.connect().init(); + + warmClient(); + } catch (RuntimeException e) { + log.error("Failed to connect to GDB {}:{}, due to {}", host, port, e); + throw e; + } + } + + protected List runInternal(String dsl, Map params) throws Exception { + return runInternalAsync(dsl, params).all().get(DEFAULT_TIMEOUT + 1000, TimeUnit.MILLISECONDS); + } + + protected ResultSet runInternalAsync(String dsl, Map params) throws Exception { + RequestOptions.Builder options = RequestOptions.build().timeout(DEFAULT_TIMEOUT); + if (params != null && !params.isEmpty()) { + params.forEach(options::addParameter); + } + return client.submitAsync(dsl, options.create()).get(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); + } + + private void warmClient() { + try { + runInternal("g.V('test')", null); + log.info("warm graphdb client over"); + } catch (Exception e) { + log.error("warmClient error"); + throw new RuntimeException(e); + } + } + + @Override + public void close() throws Exception { + if (client != null) { + log.info("close graphdb client"); + client.close(); + } + } +} diff --git a/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/model/GdbElement.java b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/model/GdbElement.java new file mode 100644 index 00000000..79619ad0 --- /dev/null +++ b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/model/GdbElement.java @@ -0,0 +1,39 @@ +/* + * (C) 2019-present Alibaba Group Holding Limited. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +package com.alibaba.datax.plugin.reader.gdbreader.model; + +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author : Liu Jianping + * @date : 2019/9/6 + */ + +@Data +public class GdbElement { + String id = null; + String label = null; + String to = null; + String from = null; + String toLabel = null; + String fromLabel = null; + + Map properties = new HashMap<>(); + + public GdbElement() { + } + + public GdbElement(String id, String label) { + this.id = id; + this.label = label; + } + +} diff --git a/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/model/GdbGraph.java b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/model/GdbGraph.java new file mode 100644 index 00000000..e6651293 --- /dev/null +++ b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/model/GdbGraph.java @@ -0,0 +1,65 @@ +/* + * (C) 2019-present Alibaba Group Holding Limited. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +package com.alibaba.datax.plugin.reader.gdbreader.model; + +import org.apache.tinkerpop.gremlin.driver.ResultSet; + +import java.util.List; +import java.util.Map; + +/** + * @author : Liu Jianping + * @date : 2019/9/6 + */ + +public interface GdbGraph extends AutoCloseable { + + /** + * Get All labels of GraphDB + * + * @return labels map included numbers + */ + Map getLabels(); + + /** + * Get the Ids list of special 'label', size up to 'limit' + * + * @param label is Label of Vertex or Edge + * @param start of Ids range to get + * @param limit size of Ids list + * @return Ids list + */ + List fetchIds(String label, String start, long limit); + + /** + * Fetch element in async mode, just send query dsl to server + * + * @param label node label to filter + * @param start range begin(included) + * @param end range end(included) + * @param propNames propKey list to fetch + * @return future to get result later + */ + ResultSet fetchElementsAsync(String label, String start, String end, List propNames); + + /** + * Get get element from Response @{ResultSet} + * + * @param results Response of Server + * @return element sets + */ + List getElement(ResultSet results); + + /** + * close graph client + * + * @throws Exception if fails + */ + @Override + void close() throws Exception; +} diff --git a/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/model/ScriptGdbGraph.java b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/model/ScriptGdbGraph.java new file mode 100644 index 00000000..8c08b819 --- /dev/null +++ b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/model/ScriptGdbGraph.java @@ -0,0 +1,192 @@ +/* + * (C) 2019-present Alibaba Group Holding Limited. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +package com.alibaba.datax.plugin.reader.gdbreader.model; + +import com.alibaba.datax.common.util.Configuration; +import com.alibaba.datax.plugin.reader.gdbreader.Key.ExportType; +import org.apache.tinkerpop.gremlin.driver.Result; +import org.apache.tinkerpop.gremlin.driver.ResultSet; +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge; +import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @author : Liu Jianping + * @date : 2019/9/6 + */ + +public class ScriptGdbGraph extends AbstractGdbGraph { + private static final Logger log = LoggerFactory.getLogger(ScriptGdbGraph.class); + + private final static String LABEL = "GDB___LABEL"; + private final static String START_ID = "GDB___ID"; + private final static String END_ID = "GDB___ID_END"; + private final static String LIMIT = "GDB___LIMIT"; + + private final static String FETCH_VERTEX_IDS_DSL = "g.V().hasLabel(" + LABEL + ").has(id, gt(" + START_ID + ")).limit(" + LIMIT + ").id()"; + private final static String FETCH_EDGE_IDS_DSL = "g.E().hasLabel(" + LABEL + ").has(id, gt(" + START_ID + ")).limit(" + LIMIT + ").id()"; + + private final static String FETCH_VERTEX_LABELS_DSL = "g.V().groupCount().by(label)"; + private final static String FETCH_EDGE_LABELS_DSL = "g.E().groupCount().by(label)"; + + /** + * fetch node range [START_ID, END_ID] + */ + private final static String FETCH_RANGE_VERTEX_DSL = "g.V().hasLabel(" + LABEL + ").has(id, gte(" + START_ID + ")).has(id, lte(" + END_ID + "))"; + private final static String FETCH_RANGE_EDGE_DSL = "g.E().hasLabel(" + LABEL + ").has(id, gte(" + START_ID + ")).has(id, lte(" + END_ID + "))"; + private final static String PART_WITH_PROP_DSL = ".as('a').project('node', 'props').by(select('a')).by(select('a').propertyMap("; + + private final ExportType exportType; + + public ScriptGdbGraph(ExportType exportType) { + super(); + this.exportType = exportType; + } + + public ScriptGdbGraph(Configuration config, ExportType exportType) { + super(config); + this.exportType = exportType; + } + + @Override + public List fetchIds(final String label, final String start, long limit) { + Map params = new HashMap(3) {{ + put(LABEL, label); + put(START_ID, start); + put(LIMIT, limit); + }}; + String fetchDsl = exportType == ExportType.VERTEX ? FETCH_VERTEX_IDS_DSL : FETCH_EDGE_IDS_DSL; + + List ids = new ArrayList<>(); + try { + List results = runInternal(fetchDsl, params); + + // transfer result to id string + results.forEach(id -> ids.add(id.getString())); + } catch (Exception e) { + log.error("fetch range node failed, label {}, start {}", label, start); + throw new RuntimeException(e); + } + return ids; + } + + @Override + public ResultSet fetchElementsAsync(final String label, final String start, final String end, final List propNames) { + Map params = new HashMap<>(3); + params.put(LABEL, label); + params.put(START_ID, start); + params.put(END_ID, end); + + String prefixDsl = exportType == ExportType.VERTEX ? FETCH_RANGE_VERTEX_DSL : FETCH_RANGE_EDGE_DSL; + StringBuilder fetchDsl = new StringBuilder(prefixDsl); + if (propNames != null) { + fetchDsl.append(PART_WITH_PROP_DSL); + for (int i = 0; i < propNames.size(); i++) { + String propName = "GDB___PK" + String.valueOf(i); + params.put(propName, propNames.get(i)); + + fetchDsl.append(propName); + if (i != propNames.size() - 1) { + fetchDsl.append(", "); + } + } + fetchDsl.append("))"); + } + + try { + return runInternalAsync(fetchDsl.toString(), params); + } catch (Exception e) { + log.error("Failed to fetch range node startId {}, end {} , e {}", start, end, e); + throw new RuntimeException(e); + } + } + + @Override + @SuppressWarnings("unchecked") + public List getElement(ResultSet results) { + List elements = new LinkedList<>(); + try { + List resultList = results.all().get(DEFAULT_TIMEOUT + 1000, TimeUnit.MILLISECONDS); + + resultList.forEach(n -> { + Object o = n.getObject(); + GdbElement element = new GdbElement(); + if (o instanceof Map) { + // project response + Object node = ((Map) o).get("node"); + Object props = ((Map) o).get("props"); + + mapNodeToElement(node, element); + mapPropToElement((Map) props, element); + } else { + // range node response + mapNodeToElement(n.getObject(), element); + } + if (element.getId() != null) { + elements.add(element); + } + }); + } catch (Exception e) { + log.error("Failed to get node: {}", e); + throw new RuntimeException(e); + } + return elements; + } + + private void mapNodeToElement(Object node, GdbElement element) { + if (node instanceof ReferenceVertex) { + ReferenceVertex v = (ReferenceVertex) node; + + element.setId((String) v.id()); + element.setLabel(v.label()); + } else if (node instanceof ReferenceEdge) { + ReferenceEdge e = (ReferenceEdge) node; + + element.setId((String) e.id()); + element.setLabel(e.label()); + element.setTo((String) e.inVertex().id()); + element.setToLabel(e.inVertex().label()); + element.setFrom((String) e.outVertex().id()); + element.setFromLabel(e.outVertex().label()); + } + } + + private void mapPropToElement(Map props, GdbElement element) { + element.setProperties(props); + } + + @Override + public Map getLabels() { + String dsl = exportType == ExportType.VERTEX ? FETCH_VERTEX_LABELS_DSL : FETCH_EDGE_LABELS_DSL; + + try { + List results = runInternal(dsl, null); + Map labelMap = new HashMap<>(2); + + Map labels = results.get(0).get(Map.class); + labels.forEach((k, v) -> { + String label = (String) k; + Long count = (Long) v; + labelMap.put(label, count); + }); + + return labelMap; + } catch (Exception e) { + log.error("Failed to fetch label list, please give special labels and run again, e {}", e); + throw new RuntimeException(e); + } + } +} diff --git a/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/util/ConfigHelper.java b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/util/ConfigHelper.java new file mode 100644 index 00000000..2ec9d153 --- /dev/null +++ b/gdbreader/src/main/java/com/alibaba/datax/plugin/reader/gdbreader/util/ConfigHelper.java @@ -0,0 +1,77 @@ +/* + * (C) 2019-present Alibaba Group Holding Limited. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +package com.alibaba.datax.plugin.reader.gdbreader.util; + +import com.alibaba.datax.common.exception.DataXException; +import com.alibaba.datax.common.util.Configuration; +import com.alibaba.datax.plugin.reader.gdbreader.GdbReaderErrorCode; +import com.alibaba.datax.plugin.reader.gdbreader.Key; +import org.apache.commons.lang3.StringUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +/** + * @author : Liu Jianping + * @date : 2019/9/6 + */ + +public interface ConfigHelper { + static void assertConfig(String key, Supplier f) { + if (!f.get()) { + throw DataXException.asDataXException(GdbReaderErrorCode.BAD_CONFIG_VALUE, key); + } + } + + static void assertHasContent(Configuration config, String key) { + assertConfig(key, () -> StringUtils.isNotBlank(config.getString(key))); + } + + static void assertGdbClient(Configuration config) { + assertHasContent(config, Key.HOST); + assertConfig(Key.PORT, () -> config.getInt(Key.PORT) > 0); + + assertHasContent(config, Key.USERNAME); + assertHasContent(config, Key.PASSWORD); + } + + static List assertLabels(Configuration config) { + Object labels = config.get(Key.LABEL); + if (!(labels instanceof List)) { + throw DataXException.asDataXException(GdbReaderErrorCode.BAD_CONFIG_VALUE, "labels should be List"); + } + + List list = (List) labels; + List configLabels = new ArrayList<>(0); + list.forEach(n -> configLabels.add(String.valueOf(n))); + + return configLabels; + } + + static List splitConfig(Configuration config, List labels) { + List configs = new ArrayList<>(); + for (String label : labels) { + Configuration conf = config.clone(); + conf.set(Key.LABEL, label); + + configs.add(conf); + } + return configs; + } + + static Configuration fromClasspath(String name) { + try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(name)) { + return Configuration.from(is); + } catch (IOException e) { + throw new IllegalArgumentException("File not found: " + name); + } + } +} diff --git a/gdbreader/src/main/resources/plugin.json b/gdbreader/src/main/resources/plugin.json new file mode 100644 index 00000000..4fedfa24 --- /dev/null +++ b/gdbreader/src/main/resources/plugin.json @@ -0,0 +1,6 @@ +{ + "name": "gdbreader", + "class": "com.alibaba.datax.plugin.reader.gdbreader.GdbReader", + "description": "useScene: prod. mechanism: connect GDB with gremlin-client, execute 'g.V().propertyMap() or g.E().propertyMap()' to get record", + "developer": "alibaba" +} \ No newline at end of file diff --git a/gdbreader/src/main/resources/plugin_job_template.json b/gdbreader/src/main/resources/plugin_job_template.json new file mode 100644 index 00000000..bfca7780 --- /dev/null +++ b/gdbreader/src/main/resources/plugin_job_template.json @@ -0,0 +1,77 @@ +{ + "job": { + "setting": { + "speed": { + "channel": 1 + }, + "errorLimit": { + "record": 1 + } + }, + + "content": [ + { + "reader": { + "name": "gdbreader", + "parameter": { + "host": "10.218.145.24", + "port": 8182, + "username": "***", + "password": "***", + "labelType": "EDGE", + "labels": ["label1", "label2"], + "column": [ + { + "name": "id", + "type": "string", + "columnType": "primaryKey" + }, + { + "name": "label", + "type": "string", + "columnType": "primaryLabel" + }, + { + "name": "srcId", + "type": "string", + "columnType": "srcPrimaryKey" + }, + { + "name": "srcLabel", + "type": "string", + "columnType": "srcPrimaryLabel" + }, + { + "name": "dstId", + "type": "string", + "columnType": "srcPrimaryKey" + }, + { + "name": "dstLabel", + "type": "string", + "columnType": "srcPrimaryLabel" + }, + { + "name": "name", + "type": "string", + "columnType": "edgeProperty" + }, + { + "name": "weight", + "type": "double", + "columnType": "edgeProperty" + } + ] + } + }, + + "writer": { + "name": "streamwriter", + "parameter": { + "print": true + } + } + } + ] + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index dc006b5a..121c47d8 100755 --- a/pom.xml +++ b/pom.xml @@ -66,6 +66,7 @@ tsdbreader opentsdbreader cassandrareader + gdbreader mysqlwriter From d9f2f4aa0d09c99c6d000ecdca069b16a3338c7e Mon Sep 17 00:00:00 2001 From: "jiye.tjy" Date: Tue, 14 Apr 2020 21:22:23 +0800 Subject: [PATCH 13/77] Add Clickhouse Writer --- clickhousewriter/pom.xml | 94 +++++ .../src/main/assembly/package.xml | 35 ++ .../clickhousewriter/ClickhouseWriter.java | 330 ++++++++++++++++++ .../ClickhouseWriterErrorCode.java | 31 ++ .../src/main/resources/plugin.json | 6 + .../main/resources/plugin_job_template.json | 21 ++ package.xml | 7 + .../datax/plugin/rdbms/util/DataBaseType.java | 7 +- pom.xml | 1 + 9 files changed, 531 insertions(+), 1 deletion(-) create mode 100644 clickhousewriter/pom.xml create mode 100755 clickhousewriter/src/main/assembly/package.xml create mode 100644 clickhousewriter/src/main/java/com/alibaba/datax/plugin/writer/clickhousewriter/ClickhouseWriter.java create mode 100644 clickhousewriter/src/main/java/com/alibaba/datax/plugin/writer/clickhousewriter/ClickhouseWriterErrorCode.java create mode 100755 clickhousewriter/src/main/resources/plugin.json create mode 100644 clickhousewriter/src/main/resources/plugin_job_template.json diff --git a/clickhousewriter/pom.xml b/clickhousewriter/pom.xml new file mode 100644 index 00000000..41b956f4 --- /dev/null +++ b/clickhousewriter/pom.xml @@ -0,0 +1,94 @@ + + + + datax-all + com.alibaba.datax + 0.0.1-SNAPSHOT + + + 4.0.0 + clickhousewriter + clickhousewriter + jar + + + + ru.yandex.clickhouse + clickhouse-jdbc + 0.2.4 + + + com.alibaba.datax + datax-core + ${datax-project-version} + + + com.alibaba.datax + datax-common + ${datax-project-version} + + + com.alibaba.datax + simulator + ${datax-project-version} + test + + + org.slf4j + slf4j-api + + + + ch.qos.logback + logback-classic + + + + com.alibaba.datax + plugin-rdbms-util + ${datax-project-version} + + + + + + src/main/java + + **/*.properties + + + + + + + maven-compiler-plugin + + ${jdk-version} + ${jdk-version} + ${project-sourceEncoding} + + + + + maven-assembly-plugin + + + src/main/assembly/package.xml + + datax + + + + dwzip + package + + single + + + + + + + \ No newline at end of file diff --git a/clickhousewriter/src/main/assembly/package.xml b/clickhousewriter/src/main/assembly/package.xml new file mode 100755 index 00000000..d1128bd1 --- /dev/null +++ b/clickhousewriter/src/main/assembly/package.xml @@ -0,0 +1,35 @@ + + + + dir + + false + + + src/main/resources + + plugin.json + plugin_job_template.json + + plugin/writer/clickhousewriter + + + target/ + + clickhousewriter-0.0.1-SNAPSHOT.jar + + plugin/writer/clickhousewriter + + + + + + false + plugin/writer/clickhousewriter/libs + runtime + + + diff --git a/clickhousewriter/src/main/java/com/alibaba/datax/plugin/writer/clickhousewriter/ClickhouseWriter.java b/clickhousewriter/src/main/java/com/alibaba/datax/plugin/writer/clickhousewriter/ClickhouseWriter.java new file mode 100644 index 00000000..6b2de4a3 --- /dev/null +++ b/clickhousewriter/src/main/java/com/alibaba/datax/plugin/writer/clickhousewriter/ClickhouseWriter.java @@ -0,0 +1,330 @@ +package com.alibaba.datax.plugin.writer.clickhousewriter; + +import com.alibaba.datax.common.element.Column; +import com.alibaba.datax.common.element.StringColumn; +import com.alibaba.datax.common.exception.CommonErrorCode; +import com.alibaba.datax.common.exception.DataXException; +import com.alibaba.datax.common.plugin.RecordReceiver; +import com.alibaba.datax.common.spi.Writer; +import com.alibaba.datax.common.util.Configuration; +import com.alibaba.datax.plugin.rdbms.util.DBUtilErrorCode; +import com.alibaba.datax.plugin.rdbms.util.DataBaseType; +import com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import ru.yandex.clickhouse.ClickHouseTuple; + +import java.sql.Array; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.sql.Types; +import java.util.List; +import java.util.regex.Pattern; + +public class ClickhouseWriter extends Writer { + private static final DataBaseType DATABASE_TYPE = DataBaseType.ClickHouse; + + public static class Job extends Writer.Job { + private Configuration originalConfig = null; + private CommonRdbmsWriter.Job commonRdbmsWriterMaster; + + @Override + public void init() { + this.originalConfig = super.getPluginJobConf(); + this.commonRdbmsWriterMaster = new CommonRdbmsWriter.Job(DATABASE_TYPE); + this.commonRdbmsWriterMaster.init(this.originalConfig); + } + + @Override + public void prepare() { + this.commonRdbmsWriterMaster.prepare(this.originalConfig); + } + + @Override + public List split(int mandatoryNumber) { + return this.commonRdbmsWriterMaster.split(this.originalConfig, mandatoryNumber); + } + + @Override + public void post() { + this.commonRdbmsWriterMaster.post(this.originalConfig); + } + + @Override + public void destroy() { + this.commonRdbmsWriterMaster.destroy(this.originalConfig); + } + } + + public static class Task extends Writer.Task { + private Configuration writerSliceConfig; + + private CommonRdbmsWriter.Task commonRdbmsWriterSlave; + + @Override + public void init() { + this.writerSliceConfig = super.getPluginJobConf(); + + this.commonRdbmsWriterSlave = new CommonRdbmsWriter.Task(DATABASE_TYPE) { + @Override + protected PreparedStatement fillPreparedStatementColumnType(PreparedStatement preparedStatement, int columnIndex, int columnSqltype, Column column) throws SQLException { + try { + if (column.getRawData() == null) { + preparedStatement.setNull(columnIndex + 1, columnSqltype); + return preparedStatement; + } + + java.util.Date utilDate; + switch (columnSqltype) { + case Types.CHAR: + case Types.NCHAR: + case Types.CLOB: + case Types.NCLOB: + case Types.VARCHAR: + case Types.LONGVARCHAR: + case Types.NVARCHAR: + case Types.LONGNVARCHAR: + preparedStatement.setString(columnIndex + 1, column + .asString()); + break; + + case Types.TINYINT: + case Types.SMALLINT: + case Types.INTEGER: + case Types.BIGINT: + case Types.DECIMAL: + case Types.FLOAT: + case Types.REAL: + case Types.DOUBLE: + String strValue = column.asString(); + if (emptyAsNull && "".equals(strValue)) { + preparedStatement.setNull(columnIndex + 1, columnSqltype); + } else { + switch (columnSqltype) { + case Types.TINYINT: + case Types.SMALLINT: + case Types.INTEGER: + preparedStatement.setInt(columnIndex + 1, column.asBigInteger().intValue()); + break; + case Types.BIGINT: + preparedStatement.setLong(columnIndex + 1, column.asLong()); + break; + case Types.DECIMAL: + preparedStatement.setBigDecimal(columnIndex + 1, column.asBigDecimal()); + break; + case Types.REAL: + case Types.FLOAT: + preparedStatement.setFloat(columnIndex + 1, column.asDouble().floatValue()); + break; + case Types.DOUBLE: + preparedStatement.setDouble(columnIndex + 1, column.asDouble()); + break; + } + } + break; + + case Types.DATE: + if (this.resultSetMetaData.getRight().get(columnIndex) + .equalsIgnoreCase("year")) { + if (column.asBigInteger() == null) { + preparedStatement.setString(columnIndex + 1, null); + } else { + preparedStatement.setInt(columnIndex + 1, column.asBigInteger().intValue()); + } + } else { + java.sql.Date sqlDate = null; + try { + utilDate = column.asDate(); + } catch (DataXException e) { + throw new SQLException(String.format( + "Date 类型转换错误:[%s]", column)); + } + + if (null != utilDate) { + sqlDate = new java.sql.Date(utilDate.getTime()); + } + preparedStatement.setDate(columnIndex + 1, sqlDate); + } + break; + + case Types.TIME: + java.sql.Time sqlTime = null; + try { + utilDate = column.asDate(); + } catch (DataXException e) { + throw new SQLException(String.format( + "Date 类型转换错误:[%s]", column)); + } + + if (null != utilDate) { + sqlTime = new java.sql.Time(utilDate.getTime()); + } + preparedStatement.setTime(columnIndex + 1, sqlTime); + break; + + case Types.TIMESTAMP: + Timestamp sqlTimestamp = null; + if (column instanceof StringColumn && column.asString() != null) { + String timeStampStr = column.asString(); + // JAVA TIMESTAMP 类型入参必须是 "2017-07-12 14:39:00.123566" 格式 + String pattern = "^\\d+-\\d+-\\d+ \\d+:\\d+:\\d+.\\d+"; + boolean isMatch = Pattern.matches(pattern, timeStampStr); + if (isMatch) { + sqlTimestamp = Timestamp.valueOf(timeStampStr); + preparedStatement.setTimestamp(columnIndex + 1, sqlTimestamp); + break; + } + } + try { + utilDate = column.asDate(); + } catch (DataXException e) { + throw new SQLException(String.format( + "Date 类型转换错误:[%s]", column)); + } + + if (null != utilDate) { + sqlTimestamp = new Timestamp( + utilDate.getTime()); + } + preparedStatement.setTimestamp(columnIndex + 1, sqlTimestamp); + break; + + case Types.BINARY: + case Types.VARBINARY: + case Types.BLOB: + case Types.LONGVARBINARY: + preparedStatement.setBytes(columnIndex + 1, column + .asBytes()); + break; + + case Types.BOOLEAN: + preparedStatement.setInt(columnIndex + 1, column.asBigInteger().intValue()); + break; + + // warn: bit(1) -> Types.BIT 可使用setBoolean + // warn: bit(>1) -> Types.VARBINARY 可使用setBytes + case Types.BIT: + if (this.dataBaseType == DataBaseType.MySql) { + Boolean asBoolean = column.asBoolean(); + if (asBoolean != null) { + preparedStatement.setBoolean(columnIndex + 1, asBoolean); + } else { + preparedStatement.setNull(columnIndex + 1, Types.BIT); + } + } else { + preparedStatement.setString(columnIndex + 1, column.asString()); + } + break; + + default: + boolean isHandled = fillPreparedStatementColumnType4CustomType(preparedStatement, + columnIndex, columnSqltype, column); + if (isHandled) { + break; + } + throw DataXException + .asDataXException( + DBUtilErrorCode.UNSUPPORTED_TYPE, + String.format( + "您的配置文件中的列配置信息有误. 因为DataX 不支持数据库写入这种字段类型. 字段名:[%s], 字段类型:[%d], 字段Java类型:[%s]. 请修改表中该字段的类型或者不同步该字段.", + this.resultSetMetaData.getLeft() + .get(columnIndex), + this.resultSetMetaData.getMiddle() + .get(columnIndex), + this.resultSetMetaData.getRight() + .get(columnIndex))); + } + return preparedStatement; + } catch (DataXException e) { + // fix类型转换或者溢出失败时,将具体哪一列打印出来 + if (e.getErrorCode() == CommonErrorCode.CONVERT_NOT_SUPPORT || + e.getErrorCode() == CommonErrorCode.CONVERT_OVER_FLOW) { + throw DataXException + .asDataXException( + e.getErrorCode(), + String.format( + "类型转化错误. 字段名:[%s], 字段类型:[%d], 字段Java类型:[%s]. 请修改表中该字段的类型或者不同步该字段.", + this.resultSetMetaData.getLeft() + .get(columnIndex), + this.resultSetMetaData.getMiddle() + .get(columnIndex), + this.resultSetMetaData.getRight() + .get(columnIndex))); + } else { + throw e; + } + } + } + + private Object toJavaArray(Object val) { + if (null == val) { + return null; + } else if (val instanceof JSONArray) { + Object[] valArray = ((JSONArray) val).toArray(); + for (int i = 0; i < valArray.length; i++) { + valArray[i] = this.toJavaArray(valArray[i]); + } + return valArray; + } else { + return val; + } + } + + boolean fillPreparedStatementColumnType4CustomType(PreparedStatement ps, + int columnIndex, int columnSqltype, + Column column) throws SQLException { + switch (columnSqltype) { + case Types.OTHER: + if (this.resultSetMetaData.getRight().get(columnIndex).startsWith("Tuple")) { + throw DataXException + .asDataXException(ClickhouseWriterErrorCode.TUPLE_NOT_SUPPORTED_ERROR, ClickhouseWriterErrorCode.TUPLE_NOT_SUPPORTED_ERROR.getDescription()); + } else { + ps.setString(columnIndex + 1, column.asString()); + } + return true; + + case Types.ARRAY: + Connection conn = ps.getConnection(); + List values = JSON.parseArray(column.asString(), Object.class); + for (int i = 0; i < values.size(); i++) { + values.set(i, this.toJavaArray(values.get(i))); + } + Array array = conn.createArrayOf("String", values.toArray()); + ps.setArray(columnIndex + 1, array); + return true; + + default: + break; + } + + return false; + } + }; + + this.commonRdbmsWriterSlave.init(this.writerSliceConfig); + } + + @Override + public void prepare() { + this.commonRdbmsWriterSlave.prepare(this.writerSliceConfig); + } + + @Override + public void startWrite(RecordReceiver recordReceiver) { + this.commonRdbmsWriterSlave.startWrite(recordReceiver, this.writerSliceConfig, super.getTaskPluginCollector()); + } + + @Override + public void post() { + this.commonRdbmsWriterSlave.post(this.writerSliceConfig); + } + + @Override + public void destroy() { + this.commonRdbmsWriterSlave.destroy(this.writerSliceConfig); + } + } + +} \ No newline at end of file diff --git a/clickhousewriter/src/main/java/com/alibaba/datax/plugin/writer/clickhousewriter/ClickhouseWriterErrorCode.java b/clickhousewriter/src/main/java/com/alibaba/datax/plugin/writer/clickhousewriter/ClickhouseWriterErrorCode.java new file mode 100644 index 00000000..4fc63ae1 --- /dev/null +++ b/clickhousewriter/src/main/java/com/alibaba/datax/plugin/writer/clickhousewriter/ClickhouseWriterErrorCode.java @@ -0,0 +1,31 @@ +package com.alibaba.datax.plugin.writer.clickhousewriter; + +import com.alibaba.datax.common.spi.ErrorCode; + +public enum ClickhouseWriterErrorCode implements ErrorCode { + TUPLE_NOT_SUPPORTED_ERROR("ClickhouseWriter-00", "不支持TUPLE类型导入."), + ; + + private final String code; + private final String description; + + private ClickhouseWriterErrorCode(String code, String description) { + this.code = code; + this.description = description; + } + + @Override + public String getCode() { + return this.code; + } + + @Override + public String getDescription() { + return this.description; + } + + @Override + public String toString() { + return String.format("Code:[%s], Description:[%s].", this.code, this.description); + } +} diff --git a/clickhousewriter/src/main/resources/plugin.json b/clickhousewriter/src/main/resources/plugin.json new file mode 100755 index 00000000..ff1acf01 --- /dev/null +++ b/clickhousewriter/src/main/resources/plugin.json @@ -0,0 +1,6 @@ +{ + "name": "clickhousewriter", + "class": "com.alibaba.datax.plugin.writer.clickhousewriter.ClickhouseWriter", + "description": "useScene: prod. mechanism: Jdbc connection using the database, execute insert sql.", + "developer": "jiye.tjy" +} \ No newline at end of file diff --git a/clickhousewriter/src/main/resources/plugin_job_template.json b/clickhousewriter/src/main/resources/plugin_job_template.json new file mode 100644 index 00000000..2e1ceed0 --- /dev/null +++ b/clickhousewriter/src/main/resources/plugin_job_template.json @@ -0,0 +1,21 @@ +{ + "name": "clickhousewriter", + "parameter": { + "username": "username", + "password": "password", + "column": ["col1", "col2", "col3"], + "connection": [ + { + "jdbcUrl": "jdbc:clickhouse://:[/]", + "table": ["table1", "table2"] + } + ], + "preSql": [], + "postSql": [], + + "batchSize": 65536, + "batchByteSize": 134217728, + "dryRun": false, + "writeMode": "insert" + } +} \ No newline at end of file diff --git a/package.xml b/package.xml index 42185f54..6d97b372 100755 --- a/package.xml +++ b/package.xml @@ -357,5 +357,12 @@ datax + + clickhousewriter/target/datax/ + + **/*.* + + datax + diff --git a/plugin-rdbms-util/src/main/java/com/alibaba/datax/plugin/rdbms/util/DataBaseType.java b/plugin-rdbms-util/src/main/java/com/alibaba/datax/plugin/rdbms/util/DataBaseType.java index 55d9e47b..ea11d99b 100755 --- a/plugin-rdbms-util/src/main/java/com/alibaba/datax/plugin/rdbms/util/DataBaseType.java +++ b/plugin-rdbms-util/src/main/java/com/alibaba/datax/plugin/rdbms/util/DataBaseType.java @@ -18,7 +18,8 @@ public enum DataBaseType { PostgreSQL("postgresql", "org.postgresql.Driver"), RDBMS("rdbms", "com.alibaba.datax.plugin.rdbms.util.DataBaseType"), DB2("db2", "com.ibm.db2.jcc.DB2Driver"), - ADS("ads","com.mysql.jdbc.Driver"); + ADS("ads","com.mysql.jdbc.Driver"), + ClickHouse("clickhouse", "ru.yandex.clickhouse.ClickHouseDriver"); private String typeName; @@ -54,6 +55,8 @@ public enum DataBaseType { break; case PostgreSQL: break; + case ClickHouse: + break; case RDBMS: break; default: @@ -91,6 +94,8 @@ public enum DataBaseType { break; case PostgreSQL: break; + case ClickHouse: + break; case RDBMS: break; default: diff --git a/pom.xml b/pom.xml index dc006b5a..d720533a 100755 --- a/pom.xml +++ b/pom.xml @@ -93,6 +93,7 @@ adbpgwriter gdbwriter cassandrawriter + clickhousewriter plugin-rdbms-util plugin-unstructured-storage-util From b8428efe3cdcfbf39026790eb6a4f4b8b11842b8 Mon Sep 17 00:00:00 2001 From: duyong6380 Date: Wed, 13 May 2020 17:55:16 +0800 Subject: [PATCH 14/77] Update ftpwriter.md --- ftpwriter/doc/ftpwriter.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ftpwriter/doc/ftpwriter.md b/ftpwriter/doc/ftpwriter.md index bf2e726f..6b1b2687 100644 --- a/ftpwriter/doc/ftpwriter.md +++ b/ftpwriter/doc/ftpwriter.md @@ -63,6 +63,7 @@ FtpWriter实现了从DataX协议转为FTP文件功能,FTP文件本身是无结 "nullFormat": "null", "dateFormat": "yyyy-MM-dd", "fileFormat": "csv", + "suffix": ".csv", "header": [] } } @@ -200,6 +201,14 @@ FtpWriter实现了从DataX协议转为FTP文件功能,FTP文件本身是无结 * 必选:否
* 默认值:text
+ +* **suffix** + + * 描述:最后输出文件的后缀,当前支持 ".text"以及".csv" + + * 必选:否
+ + * 默认值:""
* **header** From f09515c95cc37beb137db31dc38a926971f0aed8 Mon Sep 17 00:00:00 2001 From: Willian Z Date: Mon, 25 May 2020 13:43:47 +0800 Subject: [PATCH 15/77] Update mysqlwriter.md --- mysqlwriter/doc/mysqlwriter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysqlwriter/doc/mysqlwriter.md b/mysqlwriter/doc/mysqlwriter.md index f6abd242..5368775c 100644 --- a/mysqlwriter/doc/mysqlwriter.md +++ b/mysqlwriter/doc/mysqlwriter.md @@ -147,7 +147,7 @@ MysqlWriter 通过 DataX 框架获取 Reader 生成的协议数据,根据你 * **column** - * 描述:目的表需要写入数据的字段,字段之间用英文逗号分隔。例如: "column": ["id","name","age"]。如果要依次写入全部列,使用*表示, 例如: "column": ["*"]。 + * 描述:目的表需要写入数据的字段,字段之间用英文逗号分隔。例如: "column": ["id","name","age"]。如果要依次写入全部列,使用`*`表示, 例如: `"column": ["*"]`。 **column配置项必须指定,不能留空!** From 5891b49f5d389fa87cd6df5334d4326a423d189b Mon Sep 17 00:00:00 2001 From: Liu Jian Date: Mon, 25 May 2020 16:10:38 +0800 Subject: [PATCH 16/77] Fix missing simulator package #661 #676 --- clickhousewriter/pom.xml | 6 ------ .../plugin/writer/clickhousewriter/ClickhouseWriter.java | 1 - 2 files changed, 7 deletions(-) diff --git a/clickhousewriter/pom.xml b/clickhousewriter/pom.xml index 41b956f4..76c5fb1f 100644 --- a/clickhousewriter/pom.xml +++ b/clickhousewriter/pom.xml @@ -29,12 +29,6 @@ datax-common ${datax-project-version} - - com.alibaba.datax - simulator - ${datax-project-version} - test - org.slf4j slf4j-api diff --git a/clickhousewriter/src/main/java/com/alibaba/datax/plugin/writer/clickhousewriter/ClickhouseWriter.java b/clickhousewriter/src/main/java/com/alibaba/datax/plugin/writer/clickhousewriter/ClickhouseWriter.java index 6b2de4a3..b928d421 100644 --- a/clickhousewriter/src/main/java/com/alibaba/datax/plugin/writer/clickhousewriter/ClickhouseWriter.java +++ b/clickhousewriter/src/main/java/com/alibaba/datax/plugin/writer/clickhousewriter/ClickhouseWriter.java @@ -12,7 +12,6 @@ import com.alibaba.datax.plugin.rdbms.util.DataBaseType; import com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; -import ru.yandex.clickhouse.ClickHouseTuple; import java.sql.Array; import java.sql.Connection; From f75321f4a4370437178b1be7ed4c6aecc0a2c5b6 Mon Sep 17 00:00:00 2001 From: dataccs Date: Tue, 26 May 2020 01:51:08 +0800 Subject: [PATCH 17/77] Update odpswriter.md --- odpswriter/doc/odpswriter.md | 84 +++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/odpswriter/doc/odpswriter.md b/odpswriter/doc/odpswriter.md index 053a77c2..d81672b0 100644 --- a/odpswriter/doc/odpswriter.md +++ b/odpswriter/doc/odpswriter.md @@ -33,47 +33,51 @@ ODPSWriter插件用于实现往ODPS插入或者更新数据,主要提供给etl ```json { - "job": { - "setting": { - "speed": {"byte": 1048576} + "job": { + "setting": { + "speed": { + "byte": 1048576 + } + }, + "content": [ + { + "reader": { + "name": "streamreader", + "parameter": { + "column": [ + { + "value": "DataX", + "type": "string" + }, + { + "value": "test", + "type": "bytes" + } + ], + "sliceRecordCount": 100000 + } }, - "content": [ - { - "reader": { - "name": "streamreader", - "parameter": { - "column" : [ - { - "value": "DataX", - "type": "string" - }, - { - "value": "test", - "type": "bytes" - } - ], - "sliceRecordCount": 100000 - } - }, - "writer": { - "name": "odpswriter", - "parameter": { - "project": "chinan_test", - "table": "odps_write_test00_partitioned", - "partition":"school=SiChuan-School,class=1", - "column": ["id","name"], - "accessId": "xxx", - "accessKey": "xxxx", - "truncate": true, - "odpsServer": "http://sxxx/api", - "tunnelServer": "http://xxx", - "accountType": "aliyun" - } - } - } - } - ] - } + "writer": { + "name": "odpswriter", + "parameter": { + "project": "chinan_test", + "table": "odps_write_test00_partitioned", + "partition": "school=SiChuan-School,class=1", + "column": [ + "id", + "name" + ], + "accessId": "xxx", + "accessKey": "xxxx", + "truncate": true, + "odpsServer": "http://sxxx/api", + "tunnelServer": "http://xxx", + "accountType": "aliyun" + } + } + } + ] + } } ``` From f0db8135e7f781a77fb683eb143d29582286cff9 Mon Sep 17 00:00:00 2001 From: chenyang Date: Tue, 2 Jun 2020 15:10:59 +0800 Subject: [PATCH 18/77] =?UTF-8?q?=E6=9B=B4=E6=96=B0postgresqlwriter.md?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=AD=E5=85=B3=E4=BA=8E*=E6=9C=AA?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 源文件中的内容为:如果要依次写入全部列,使用*表示, 例如: "column": ["*"] 但是在网站上查看说明时,显示为:如果要依次写入全部列,使用表示, 例如: "column": [""] 这个引起了使用者的误解,对*进行转义后可显示正常,更改为: 如果要依次写入全部列,使用\*表示, 例如: "column": ["\*"] --- postgresqlwriter/doc/postgresqlwriter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/postgresqlwriter/doc/postgresqlwriter.md b/postgresqlwriter/doc/postgresqlwriter.md index 662da2e4..e9e25908 100644 --- a/postgresqlwriter/doc/postgresqlwriter.md +++ b/postgresqlwriter/doc/postgresqlwriter.md @@ -141,7 +141,7 @@ PostgresqlWriter通过 DataX 框架获取 Reader 生成的协议数据,根据 * **column** - * 描述:目的表需要写入数据的字段,字段之间用英文逗号分隔。例如: "column": ["id","name","age"]。如果要依次写入全部列,使用*表示, 例如: "column": ["*"] + * 描述:目的表需要写入数据的字段,字段之间用英文逗号分隔。例如: "column": ["id","name","age"]。如果要依次写入全部列,使用\*表示, 例如: "column": ["\*"] 注意:1、我们强烈不推荐你这样配置,因为当你目的表字段个数、类型等有改动时,你的任务可能运行不正确或者失败 2、此处 column 不能配置任何常量值 From 66de85112d121a0d80926f5296a27531b0a7c40f Mon Sep 17 00:00:00 2001 From: tofuHero Date: Fri, 19 Jun 2020 15:24:24 +0800 Subject: [PATCH 19/77] Update txtfilewriter.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 3.3 类型转换处 表格格式 markdown 不识别,已转成 可识别的样子 --- txtfilewriter/doc/txtfilewriter.md | 1 - 1 file changed, 1 deletion(-) diff --git a/txtfilewriter/doc/txtfilewriter.md b/txtfilewriter/doc/txtfilewriter.md index e8daab73..dd61142c 100644 --- a/txtfilewriter/doc/txtfilewriter.md +++ b/txtfilewriter/doc/txtfilewriter.md @@ -187,7 +187,6 @@ TxtFileWriter实现了从DataX协议转为本地TXT文件功能,本地文件 | DataX 内部类型| 本地文件 数据类型 | | -------- | ----- | -| | Long |Long | | Double |Double| | String |String| From 21f2539ce6c1f72cf704e03bdd89ba939023ee81 Mon Sep 17 00:00:00 2001 From: XuDaojie Date: Fri, 3 Jul 2020 14:47:28 +0800 Subject: [PATCH 20/77] =?UTF-8?q?=E8=A1=A5=E5=85=85mongodbreader=E6=96=87?= =?UTF-8?q?=E6=A1=A3=EF=BC=8C=E4=BF=AE=E6=AD=A3=E9=83=A8=E5=88=86=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E9=94=99=E8=AF=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dataxPluginDev.md | 2 +- mongodbreader/doc/mongodbreader.md | 1 + transformer/doc/transformer.md | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/dataxPluginDev.md b/dataxPluginDev.md index e4828d5a..62567a3b 100644 --- a/dataxPluginDev.md +++ b/dataxPluginDev.md @@ -435,7 +435,7 @@ DataX的内部类型在实现上会选用不同的java类型: #### 如何处理脏数据 -在`Reader.Task`和`Writer.Task`中,功过`AbstractTaskPlugin.getPluginCollector()`可以拿到一个`TaskPluginCollector`,它提供了一系列`collectDirtyRecord`的方法。当脏数据出现时,只需要调用合适的`collectDirtyRecord`方法,把被认为是脏数据的`Record`传入即可。 +在`Reader.Task`和`Writer.Task`中,通过`AbstractTaskPlugin.getTaskPluginCollector()`可以拿到一个`TaskPluginCollector`,它提供了一系列`collectDirtyRecord`的方法。当脏数据出现时,只需要调用合适的`collectDirtyRecord`方法,把被认为是脏数据的`Record`传入即可。 用户可以在任务的配置中指定脏数据限制条数或者百分比限制,当脏数据超出限制时,框架会结束同步任务,退出。插件需要保证脏数据都被收集到,其他工作交给框架就好。 diff --git a/mongodbreader/doc/mongodbreader.md b/mongodbreader/doc/mongodbreader.md index 3535d5b7..6d1e6a99 100644 --- a/mongodbreader/doc/mongodbreader.md +++ b/mongodbreader/doc/mongodbreader.md @@ -132,6 +132,7 @@ MongoDBReader通过Datax框架从MongoDB并行的读取数据,通过主控的J * name:Column的名字。【必填】 * type:Column的类型。【选填】 * splitter:因为MongoDB支持数组类型,但是Datax框架本身不支持数组类型,所以mongoDB读出来的数组类型要通过这个分隔符合并成字符串。【选填】 +* query: MongoDB的额外查询条件。【选填】 #### 5 类型转换 diff --git a/transformer/doc/transformer.md b/transformer/doc/transformer.md index 84fab96a..247ab39b 100644 --- a/transformer/doc/transformer.md +++ b/transformer/doc/transformer.md @@ -2,7 +2,7 @@ ## Transformer定义 -在数据同步、传输过程中,存在用户对于数据传输进行特殊定制化的需求场景,包括裁剪列、转换列等工作,可以借助ETL的T过程实现(Transformer)。DataX包含了完成的E(Extract)、T(Transformer)、L(Load)支持。 +在数据同步、传输过程中,存在用户对于数据传输进行特殊定制化的需求场景,包括裁剪列、转换列等工作,可以借助ETL的T过程实现(Transformer)。DataX包含了完整的E(Extract)、T(Transformer)、L(Load)支持。 ## 运行模型 From 1a2ca67bd797c966f2805f7e3bc95615187345c8 Mon Sep 17 00:00:00 2001 From: randomGear <59956407+randomGear@users.noreply.github.com> Date: Wed, 8 Jul 2020 15:01:14 +0800 Subject: [PATCH 21/77] Update oraclereader.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在DEMO中的querysql在结尾不应该添加 `;`,不然会导致ORA-00911: 无效字符 --- oraclereader/doc/oraclereader.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oraclereader/doc/oraclereader.md b/oraclereader/doc/oraclereader.md index 250527ae..bf35ff72 100644 --- a/oraclereader/doc/oraclereader.md +++ b/oraclereader/doc/oraclereader.md @@ -101,7 +101,7 @@ OracleReader插件实现了从Oracle读取数据。在底层实现上,OracleRe "connection": [ { "querySql": [ - "select db_id,on_line_flag from db_info where db_id < 10;" + "select db_id,on_line_flag from db_info where db_id < 10" ], "jdbcUrl": [ "jdbc:oracle:thin:@[HOST_NAME]:PORT:[DATABASE_NAME]" From d763fa33c6ab6b289ad288aaa0f650a01c6ac6a9 Mon Sep 17 00:00:00 2001 From: liuzhai <578091472@qq.com> Date: Tue, 21 Jul 2020 15:03:26 +0800 Subject: [PATCH 22/77] =?UTF-8?q?=E4=BF=AE=E5=A4=8Drdbmsreader=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E6=97=A0=E6=B3=95plugin.json=E4=B8=8B?= =?UTF-8?q?=E9=A9=B1=E5=8A=A8=EF=BC=8C=E5=AF=BC=E8=87=B4=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E8=BF=9E=E6=8E=A5=E6=8A=A5=E9=94=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datax/plugin/reader/rdbmsreader/RdbmsReader.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rdbmsreader/src/main/java/com/alibaba/datax/plugin/reader/rdbmsreader/RdbmsReader.java b/rdbmsreader/src/main/java/com/alibaba/datax/plugin/reader/rdbmsreader/RdbmsReader.java index 3153e114..f070287a 100755 --- a/rdbmsreader/src/main/java/com/alibaba/datax/plugin/reader/rdbmsreader/RdbmsReader.java +++ b/rdbmsreader/src/main/java/com/alibaba/datax/plugin/reader/rdbmsreader/RdbmsReader.java @@ -5,6 +5,7 @@ import com.alibaba.datax.common.plugin.RecordSender; import com.alibaba.datax.common.spi.Reader; import com.alibaba.datax.common.util.Configuration; import com.alibaba.datax.plugin.rdbms.reader.CommonRdbmsReader; +import com.alibaba.datax.plugin.rdbms.util.DBUtil; import com.alibaba.datax.plugin.rdbms.util.DBUtilErrorCode; import com.alibaba.datax.plugin.rdbms.util.DataBaseType; @@ -12,7 +13,10 @@ import java.util.List; public class RdbmsReader extends Reader { private static final DataBaseType DATABASE_TYPE = DataBaseType.RDBMS; - + static { + //加载插件下面配置的驱动类 + DBUtil.loadDriverClass("reader", "rdbms"); + } public static class Job extends Reader.Job { private Configuration originalConfig; From 04d0937779d2a48bbc4fd0fdc8b87107e3a92c67 Mon Sep 17 00:00:00 2001 From: liuzhai <578091472@qq.com> Date: Tue, 21 Jul 2020 15:03:40 +0800 Subject: [PATCH 23/77] =?UTF-8?q?=E4=BF=AE=E5=A4=8Drdbmswriter=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E6=97=A0=E6=B3=95plugin.json=E4=B8=8B?= =?UTF-8?q?=E9=A9=B1=E5=8A=A8=EF=BC=8C=E5=AF=BC=E8=87=B4=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E8=BF=9E=E6=8E=A5=E6=8A=A5=E9=94=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datax/plugin/reader/rdbmswriter/RdbmsWriter.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rdbmswriter/src/main/java/com/alibaba/datax/plugin/reader/rdbmswriter/RdbmsWriter.java b/rdbmswriter/src/main/java/com/alibaba/datax/plugin/reader/rdbmswriter/RdbmsWriter.java index 49ef3877..71fe7956 100755 --- a/rdbmswriter/src/main/java/com/alibaba/datax/plugin/reader/rdbmswriter/RdbmsWriter.java +++ b/rdbmswriter/src/main/java/com/alibaba/datax/plugin/reader/rdbmswriter/RdbmsWriter.java @@ -4,6 +4,7 @@ import com.alibaba.datax.common.exception.DataXException; import com.alibaba.datax.common.plugin.RecordReceiver; import com.alibaba.datax.common.spi.Writer; import com.alibaba.datax.common.util.Configuration; +import com.alibaba.datax.plugin.rdbms.util.DBUtil; import com.alibaba.datax.plugin.rdbms.util.DBUtilErrorCode; import com.alibaba.datax.plugin.rdbms.util.DataBaseType; import com.alibaba.datax.plugin.rdbms.writer.CommonRdbmsWriter; @@ -13,7 +14,10 @@ import java.util.List; public class RdbmsWriter extends Writer { private static final DataBaseType DATABASE_TYPE = DataBaseType.RDBMS; - + static { + //加载插件下面配置的驱动类 + DBUtil.loadDriverClass("writer", "rdbms"); + } public static class Job extends Writer.Job { private Configuration originalConfig = null; private CommonRdbmsWriter.Job commonRdbmsWriterMaster; From 4150aab4a9dcc53de28d216869a9747f3c59877a Mon Sep 17 00:00:00 2001 From: coderxiao Date: Tue, 28 Jul 2020 15:15:17 +0800 Subject: [PATCH 24/77] FQA->FAQ FQA->FAQ --- dataxPluginDev.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataxPluginDev.md b/dataxPluginDev.md index e4828d5a..7ac6e3d3 100644 --- a/dataxPluginDev.md +++ b/dataxPluginDev.md @@ -468,4 +468,4 @@ DataX的内部类型在实现上会选用不同的java类型: - 测试参数集(多组),系统参数(比如并发数),插件参数(比如batchSize) - 不同参数下同步速度(Rec/s, MB/s),机器负载(load, cpu)等,对数据源压力(load, cpu, mem等)。 6. **约束限制**:是否存在其他的使用限制条件。 -7. **FQA**:用户经常会遇到的问题。 +7. **FAQ**:用户经常会遇到的问题。 From 066df492ca22525b29b9a32d6345cdaaadb295c6 Mon Sep 17 00:00:00 2001 From: Trafalgar Date: Wed, 12 Aug 2020 11:59:15 +0800 Subject: [PATCH 25/77] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update DataX开源用户交流群 信息 --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 80cf3c0f..18c63b6f 100644 --- a/README.md +++ b/README.md @@ -108,7 +108,11 @@ This software is free to use under the Apache License [Apache license](https://g 8. 对高并发、高稳定可用性、高性能、大数据处理有过实际项目及产品经验者优先考虑; 9. 有大数据产品、云产品、中间件技术解决方案者优先考虑。 ```` -钉钉用户群:23169395 - +钉钉用户群: +- [钉钉群聊DataX开源用户交流群,点击进入查看详情](https://qr.dingtalk.com/action/joingroup?code=v1,k1,jFDN77MJW5l3biuATCChEIWAkPl3zwghL8vvKpCsm04=&_dt_no_comment=1&origin=11) +- [钉钉群聊DataX开源用户交流群2,点击进入查看详情](https://qr.dingtalk.com/action/joingroup?code=v1,k1,5FrKlj7R/ECgNgcXp1xTz2kPt84G6LlsVAfK1KbE83s=&_dt_no_comment=1&origin=11) +- [钉钉群聊DataX开源用户交流群3,点击进入查看详情](https://qr.dingtalk.com/action/joingroup?code=v1,k1,knmqnHrcf70ZVV6ue0HLBAzOdvoOwZ6hVAfK1KbE83s=&_dt_no_comment=1&origin=11) +- [钉钉群聊DataX开源用户交流群4,点击进入查看详情](https://qr.dingtalk.com/action/joingroup?code=v1,k1,YLUnCO3SSji+5AblIC960Hx225T+B6U5VAfK1KbE83s=&_dt_no_comment=1&origin=11) +- [钉钉群聊DataX开源用户交流群5,点击进入查看详情](https://qr.dingtalk.com/action/joingroup?code=v1,k1,7lmI79zKGbZdUKbIwN0axLH2vpZknilCVAfK1KbE83s=&_dt_no_comment=1&origin=11) From 6e2df5578e8c539fd57a5f6914435eea1b3026a5 Mon Sep 17 00:00:00 2001 From: Trafalgar Date: Wed, 12 Aug 2020 12:27:20 +0800 Subject: [PATCH 26/77] Add files via upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit add 交流群二维码图片 --- images/DataX开源用户交流群.jpg | Bin 0 -> 197306 bytes images/DataX开源用户交流群2.jpg | Bin 0 -> 199418 bytes images/DataX开源用户交流群3.jpg | Bin 0 -> 193411 bytes images/DataX开源用户交流群4.jpg | Bin 0 -> 195733 bytes images/DataX开源用户交流群5.jpg | Bin 0 -> 193664 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/DataX开源用户交流群.jpg create mode 100644 images/DataX开源用户交流群2.jpg create mode 100644 images/DataX开源用户交流群3.jpg create mode 100644 images/DataX开源用户交流群4.jpg create mode 100644 images/DataX开源用户交流群5.jpg diff --git a/images/DataX开源用户交流群.jpg b/images/DataX开源用户交流群.jpg new file mode 100644 index 0000000000000000000000000000000000000000..28155f38b1c70ab8de6d8976a8ab610eb72bbfe7 GIT binary patch literal 197306 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⪻_^o^{-m8(W&z!{sz= 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

ck@;Sbjbrt<}s>lc7dB*xJ(i+VYMb-Gov2}~@ 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%0D@x=nrO&hLwUrl* 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

HqSLy`<((%^>EgJY*GM;V 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

O=hffZh_=hJinSi_K;(u0MNd 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 literal 0 HcmV?d00001 diff --git a/images/DataX开源用户交流群3.jpg b/images/DataX开源用户交流群3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..923061e8ed442c9b40e14d12bb442deb49a6834a GIT binary patch literal 193411 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

jyn6U>HnSbs5z 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