尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SQL Server 源连接器(Jdbc)完整指南:从驱动部署到并行分片读取

SQL Server 源连接器(Jdbc)完整指南:从驱动部署到并行分片读取 SQL Server 源连接器Jdbc完整指南从驱动部署到并行分片读取【免费下载链接】seatunnelSeaTunnel is a multimodal, high-performance, distributed, massive data integration tool.项目地址: https://gitcode.com/GitHub_Trending/se/seatunnel本文基于 Apache SeaTunnel 的 JDBC SQL Server 源连接器编写系统讲解其支持范围、依赖部署、数据类型映射、全部源参数、并行分片原理与四个实战配置示例适合需要将 SQL Server 2008 数据批量同步到大数据平台的开发者直接参考使用。概述SQL Server 源连接器是 SeaTunnel JDBC 连接器家族的一员它通过 Microsoft 官方mssql-jdbc驱动读取 SQL Server 中的表或自定义查询结果。该连接器在 connector-jdbc 模块中以统一的JdbcSource 插件形态存在通过 URL 自动识别方言并加载对应的 SQL Server 实现。从项目结构来看SQL Server 相关的方言实现集中在 seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/sqlserver/ 目录包括SqlServerDialect方言入口负责 SQL 引用、行数估算、分块查询与 schema 变更SqlserverTypeMapper/SqlServerTypeConverterJDBC 类型与 SeaTunnel 类型的双向转换SqlserverJdbcRowConverter结果集与 PreparedStatement 的取值/赋值细节如 DATETIMEOFFSET、二进制空值处理。阅读完本文后你将能够部署驱动依赖、理解类型映射、掌握全部配置参数并独立编写单表、并行、多表与列裁剪等真实可运行的 HOCON 任务。支持的版本与引擎支持的 SQL Server 版本2008 及以上仅供参考。支持的引擎Spark、Flink、SeaTunnel Zeta。依赖部署Spark / Flink 引擎将 mssql-jdbc 驱动 jar 包 放置到每个执行节点的${SEATUNNEL_HOME}/plugins/目录具体为$SEATUNNEL_HOME/plugins/jdbc/lib/。例如cp mssql-jdbc-xxx.jar $SEATUNNEL_HOME/plugins/jdbc/lib/SeaTunnel Zeta 引擎将驱动 jar 放置到${SEATUNNEL_HOME}/lib/目录后重启受影响的 SeaTunnel 进程使驱动进入类路径。主要功能批处理JDBC Source 是有界数据源读取数据库查询当前可见数据后结束精确一次列投影支持查询 SQL 并实现投影效果并行度支持用户自定义分割支持多表读取注意该连接器不支持流处理。若需持续捕获新增、更新与删除请使用对应的 CDC 连接器。支持的数据源信息数据源支持版本驱动urlmavenSQL Server支持版本 2008com.microsoft.sqlserver.jdbc.SQLServerDriverjdbc:sqlserver://localhost:1433下载数据类型映射SQL Server 源连接器通过 SqlserverTypeMapper 与 SqlServerTypeConverter 完成类型转换映射关系如下SQL Server 数据类型SeaTunnel 数据类型BITBOOLEANTINYINT / SMALLINTSMALLINTINTEGER / INTINTBIGINTBIGINTNUMERIC(p,s) / DECIMAL(p,s) / MONEY / SMALLMONEYDECIMAL(p,s)FLOAT(1~24) / REALFLOATDOUBLE / FLOAT(24)DOUBLECHAR / NCHAR / VARCHAR / NTEXT / NVARCHAR / TEXT / XMLSTRINGDATEDATETIME(s)TIME(s)DATETIME / DATETIME2 / DATETIMEOFFSET / SMALLDATETIMETIMESTAMP(s)BINARY / VARBINARY / IMAGEBYTES从源码可观察到几个值得注意的细节FLOAT类型的映射取决于精度SqlServerTypeMapper.mappingColumn中float(1-24)的 char 长度为 7映射为 FLOATfloat(25-53)的 char 长度为 15映射为 DOUBLESqlServerTypeConverter.convert中同样以precision 24判断DATETIMEOFFSET映射为带时区的OFFSET_DATE_TIME类型SqlserverJdbcRowConverter通过setObject直接写入OffsetDateTimenvarchar/nchar是双字节类型SqlserverTypeMapper会把其精度乘以 2precision * 2以转换为 SeaTunnel 的长度语义varchar/nvarchar/varbinary的长度为-1时对应MAX类型如VARCHAR(MAX)、NVARCHAR(MAX)、VARBINARY(MAX)UNIQUEIDENTIFIERGUID与SQL_VARIANT映射为 STRING。数据源参数除common-options源通用选项外SQL Server 源连接器支持以下参数。url与driver始终必填由于部分数据库允许无认证连接账号与密码不是统一必填项。名称类型是否必填默认值描述urlString是-JDBC 连接的 URL例如jdbc:sqlserver://127.0.0.1:1434;databaseTestDBdriverString是-用于连接远程数据源的 JDBC 类名SQL Server 使用com.microsoft.sqlserver.jdbc.SQLServerDriverusernameString否-连接实例的用户名passwordString否-连接实例的密码queryString否-查询语句。当未配置table_path和table_list时必填connection_check_timeout_secInt否30等待用于验证连接的数据库操作完成的时间秒partition_columnString否-用于并行度分区的列名仅支持数值类型partition_lower_boundLong否-partition_column扫描的最小值如果未设置SeaTunnel 将查询数据库获取最小值partition_upper_boundLong否-partition_column扫描的最大值如果未设置SeaTunnel 将查询数据库获取最大值partition_numInt否job parallelism分区数量仅支持正整数。默认值为作业并行度fetch_sizeInt否0查询使用的行获取大小。0表示使用 JDBC 默认值。增大可减少对数据库的命中次数propertiesMap否-额外的连接配置参数。当 properties 与 URL 含相同参数时由驱动的具体实现决定优先级use_regexBoolean否false控制table_path的正则匹配。true时按正则匹配false默认时按精确路径匹配table_pathString否-表的完整路径可用于替代query。示例testdb.test_schema.table1table_listArray否-要读取的表列表可替代table_pathwhere_conditionString否-所有表/查询的通用行过滤条件必须以where开头。例如where id 100split.sizeInt否8096表的分割大小行数读取表时会被分割为多个 splitsplit.even-distribution.factor.lower-boundDouble否0.05分块键分布因子的下界split.even-distribution.factor.upper-boundDouble否100分块键分布因子的上界split.sample-sharding.thresholdInt否1000触发采样分片策略的估算分片数阈值split.allow-samplingBoolean否true是否允许对分布不均匀的分片键使用采样分片策略。false时退回到迭代式不均匀分片use_select_countBoolean否false是否在分片前用select count(*)估算表行数skip_analyzeBoolean否false是否跳过分片前的表行数分析split.inverse-sampling.rateInt否1000采样分片策略中采样率的倒数。1000表示 1/1000 的采样率common-options否-源插件通用参数请参考 源通用选项从 JdbcSourceOptions.java 的源码可以看到这些参数均在 JDBC 源层面统一实现SQL Server 方言通过SqlServerDialect提供分片所需的 SQL 生成逻辑。关于使用前提与限制上文表格中的参数均以org.apache.seatunnel.connectors.seatunnel.jdbc.config.JdbcSourceOptions与 docs/zh/connectors/source/Jdbc.md 为实际来源其中部分参数如use_select_count、skip_analyze在 JDBC 文档中标注为仅适用于 OracleSQL Server 场景下请以实测结果为准。并行读取器JDBC 源连接器支持从表中并行读取数据。SeaTunnel 将使用某些规则来分割表中的数据然后交给读取器进行读取。读取器的数量由parallelism选项决定。分割键规则如果partition_column不为空将使用它来计算分割。该列必须在支持的分割数据类型中。如果partition_column为空SeaTunnel 将从表中读取模式并获取主键和唯一索引。如果主键和唯一索引中有多个列则将使用支持的分割数据类型中的第一列来分割数据。支持的分割数据类型StringNumberint、bigint、decimal 等Date分割相关选项split.size一个 split 中包含多少行。表被读入时会被分割为多个 split。默认值 8096。split.even-distribution.factor.lower-bound不推荐使用分块键分布因子的下界。(MAX(id) - MIN(id) 1) / 行数大于等于该下界时认为表分布均匀否则进入采样分片路径。默认值为 0.05。split.even-distribution.factor.upper-bound不推荐使用分块键分布因子的上界。逻辑与下界对称。默认值为 100.0。split.sample-sharding.threshold触发采样分片策略的估算分片数阈值。当分布因子超出上下界范围、且估算分片数近似行数 / 分片大小超过该阈值时将使用采样分片策略以更高效地处理大数据集。默认值为 1000。split.inverse-sampling.rate采样分片策略中采样率的倒数。默认值为 1000即 1/1000 的采样率。split.allow-sampling是否允许基于采样的分片策略。设置为false时无论预估分片数是否超过阈值系统都回退到迭代式不均匀分片。默认值为true。partition_column [string]用于分割数据的列名。partition_upper_bound [BigDecimal]partition_column扫描的最大值。如果未设置SeaTunnel 将查询数据库获取最大值。partition_lower_bound [BigDecimal]partition_column扫描的最小值。如果未设置SeaTunnel 将查询数据库获取最小值。partition_num [int]不推荐使用正确的方法是通过split.size控制分割数量需要分割为多少个 split仅支持正整数。默认值为作业并行度。分片相关的方言实现从 SqlServerDialect.java 源码可以看到 SQL Server 方言在分片中的两个关键实现行数估算approximateRowCntStatement若未配置 query或 query 不含 WHERE 且配置了table_path则使用sys.dm_db_partition_stats系统视图估算总行数index_id 2即堆或聚集索引的统计否则回退到COUNT(*)子查询。分块最大值查询queryNextChunkMax通过SELECT TOP (chunkSize) ... ORDER BY 分片列 ASC的方式取出每个 chunk 的上界值供读取器按范围拉取数据。这体现了split.size在 SQL Server 方言中由TOP子句驱动的实现细节。提示如果表无法分割例如表没有主键或唯一索引且未设置partition_column将以单并发运行。单表读取可使用table_path替代query多表读取请使用table_list。关于table_list与顶层table_path/query的互斥关系JdbcSourceFactory.java 中的TableListExclusiveValidator会在提交时校验where_condition则通过WhereConditionPrefixValidator强制要求以where开头以避免运行期 SQL 语法错误。任务示例简单的例子读取数据表的简单单个任务env { parallelism 1 job.mode BATCH } source { Jdbc { driver com.microsoft.sqlserver.jdbc.SQLServerDriver url jdbc:sqlserver://localhost:1433;databaseNamecolumn_type_test username SA password Y.sa123456 query select * from full_types_jdbc } } transform { # 如果你想了解更多关于如何配置 seatunnel 的信息并查看转换插件的完整列表 # 请前往 https://seatunnel.apache.org/docs/transforms/sql } sink { Console {} }并行示例使用您配置的分区字段并行读取数据。如果需要读取整张表可以结合query或table_path使用。env { parallelism 10 job.mode BATCH } source { Jdbc { driver com.microsoft.sqlserver.jdbc.SQLServerDriver url jdbc:sqlserver://localhost:1433;databaseNamecolumn_type_test username SA password Y.sa123456 query select * from full_types_jdbc partition_column id partition_num 10 } } transform { # 如果你想了解更多关于如何配置 seatunnel 的信息并查看转换插件的完整列表 # 请前往 https://seatunnel.apache.org/docs/transforms/sql } sink { Console {} }整库多表读取env { parallelism 4 job.mode BATCH } source { Jdbc { driver com.microsoft.sqlserver.jdbc.SQLServerDriver url jdbc:sqlserver://localhost:1433;databaseNamecolumn_type_test username SA password Y.sa123456 table_list [ { table_path column_type_test.dbo.full_types_jdbc } { table_path column_type_test.dbo.orders, query select id, name, status from column_type_test.dbo.orders } ] where_condition where id 0 split.size 10000 } } transform { Sql { plugin_input Jdbc plugin_output tmp_id_name query select id, name from full_types_jdbc } } sink { Console {} }自定义列裁剪示例env { parallelism 1 job.mode BATCH } source { Jdbc { driver com.microsoft.sqlserver.jdbc.SQLServerDriver url jdbc:sqlserver://localhost:1433;databaseNamecolumn_type_test username SA password Y.sa123456 table_path column_type_test.dbo.full_types_jdbc query select id, name from column_type_test.dbo.full_types_jdbc } } transform { } sink { Jdbc { driver com.microsoft.sqlserver.jdbc.SQLServerDriver url jdbc:sqlserver://localhost:1433;databaseNamecolumn_type_test username SA password Y.sa123456 generate_sink_sql true database column_type_test table dbo.full_types_jdbc } }运行任务将上述任一配置保存为$SEATUNNEL_HOME/config/下的.conf文件然后执行cd ${SEATUNNEL_HOME} ./bin/seatunnel.sh --config ./config/your-task.conf -m local若使用 Zeta 引擎请确保已按上文说明将 mssql-jdbc 驱动放入$SEATUNNEL_HOME/lib/并重启进程。变更日志SQL Server 连接器的历史变更记录统一维护在 docs/zh/connectors/changelog/connector-jdbc.md其中与 SQL Server 直接相关的变更包括修复 SqlServer JDBC URL 解析错误2.3.10 起支持 SQL Server 建表 DDL2.3.10 起修复数据库名包含点号时 SQL Server 建表问题2.3.11 起。总结SQL Server 源连接器以统一的Jdbc插件形态存在于 connector-jdbc 模块中通过 URL 自动匹配 SqlServerDialect 方言实现分片、行数估算与类型映射。无论是简单的全表快照、按partition_column并行读取、table_list多表读取还是结合table_path的列裁剪都可以用统一的 HOCON 配置完成。对于需要持续捕获变更数据的场景建议进一步参考项目中的 SQL Server CDC 连接器。【免费下载链接】seatunnelSeaTunnel is a multimodal, high-performance, distributed, massive data integration tool.项目地址: https://gitcode.com/GitHub_Trending/se/seatunnel创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表