> 写在前面
1. 赛题答疑联系人(可通过旺旺联系):万少
2. 开始Coding前请仔细阅读以下内容
3. 外部赛复赛旺旺群:1251809708
4. 该文档根据实际情况会进行更新,选手每次写代码前建议pull下该样例工程,查看README文件的变化
# ================================================== 赛题规则 ============================================================
# 1. 赛题描述
题目主要解决的是数据同步领域范畴:实时增量同步,主要的技术挑战为模拟数据库的主备复制,提供"高效"的实时同步能力。即给定一批固定的增量数据变更信息,程序需要收集增量变更信息,并进行一定的数据重放计算,然后将最终结果输出到给定的目标文件中。增量数据的变更信息为了简化处理,会给出明文的数据,主要包含数据库的insert/update/delete三种类型的数据。具体的增量数据变更信息的数据格式见环境描述部分。数据重放主要是指模拟数据库的insert/update/delete语义,允许使用一些中间过程的存储。
# 2. 环境描述:
## 2.1 整体格式
有2台机器,简称A、B机器,A机器里会保存增量数据文件并且在固定的目录下提供10个文本文件,每个文本文件大概为1GB左右。每个文件有若干条变更信息。每条变更信息的记录由多列构成。文本中每行记录的格式为:
| binaryId | timestamp |schema|table|变更类型|列信息|变更前列值| 变更后列值|列信息|列值|...|
| ------------- |-------------| -------------| -------------| -------------| ------------| -------------| -------------|------------| -------------|-------------|
## 2.2 格式解释:
a. binaryId: 一个唯一的字符串编号,例子:000001:106
b. timestamp
* 数据变更发生的时间戳,毫秒精度,例子:1489133349000
c. schema/table
* 数据变更对应的库名和表名
d. 变更类型(主要分为I/U/D)
* I代表insert, U代表update, D代表delete
d. 列信息
* 列信息主要格式为,列名:类型:是否主键
* 类型主要分为1和2
* 1代表为数字类型,数字类型范围为0<= x <= 2^64-1
* 2代表为字符串类型,0<= len <= 65536
* 是否主键:0或者1 (0代表否,1代表是)
* 例1: keyValue:1:1 代表列名为id,类型为数字,是主键
* 例2: name:2:0 代表列名为name,类型为字符串,非主键
e. 列值
* 主要分为变更前和变更后,NULL代表物理值为NULL(空值),(可不考虑字符串本身为"NULL"的特殊情况)
* insert变更,只有变更后列值,其变更前列值为<NULL>,会包含所有的列信息
* upadate变更,都会有变更前和后的列值,会包含主键和发生变更列的信息(未发生变更过的列不会给出,不是全列信息)
* delete变革,只有变更前列值,会包含所有的列信息
## 2.3 格式例子
实际例子:
* 000001:106|1489133349000|test|user|I|keyValue:1:1|NULL|102|name:2:0|NULL|ljh|score:1:0|<NULL>|98|
* 000001:106|1489133349000|test|user|U|keyValue:1:1|102|102|score:1:0|98|95| //执行了变更update score=95 where keyValue=102
## 2.4 注意事项
1. 每一行代表一条变更数据,注意几个数据变更场景
2. 表的主键值也可能会发生update变更
3. 表的一行记录也可能发生先delete后insert
3. 整个数据变更内容是从零条记录开始构建的,即为任意一条行记录的update之前一定会有对应行的insert语句,delete之前也一定有一条insert,不考虑DDL变更产生列类型变化,也不需要考虑其他异常情况
#3. 程序要求
## 3.1 程序实现
分为server和client两部分:
1. server会传入对应的文本的绝对路径地址,启动后需要开启网络服务,等待client建立链接之后,需要使用push机制主动开始推送数据到client
2. client在启动时会传入server机器地址,主动和server建立链接之后,等待server推送数据,接收到数据后进行数据重放处理,等收完所有数据后,生成最终的结果到给定的目标文件名.
## 3.2 程序校验
结果校验,会传入一批数据(格式为:schema+table+pk),程序要按顺序返回每个主键对应记录的所有列的最终值.时间计算,会计算从程序启动到最后返回结果的时间差值
## 3.3 使用语言
JAVA
# 4. 排名规则
在结果校验100%正确的前提下,按照总耗时进行排名,耗时越少排名越靠前,时间精确到毫秒。
# ================================ 如何模拟赛题数据 ===================================
1. 从阿里云代码仓库下载[canal(复赛模拟数据版)](https://code.aliyun.com/wanshao/canal.git)。canal是一款开源的mysql实时数据解析工具,在github的地址为[canal(开源版)](https://github.com/alibaba/canal)
2. 自己安装好mysql,并且建好相关的schema和table
3. 根据[QuickStart](https://github.com/alibaba/canal/wiki/QuickStart)启动canal server
4. 启动[canal(复赛模拟数据版)](https://code.aliyun.com/wanshao/canal.git)中的SimpleCanalClientTest这个客户端程序(建议直接在IDE中启动)
5. 对mysql数据库进行一些DML操作,触发binlog变更,默认在/Users/wanshao/work/canal_data/canal.txt路径下会生成符合赛题要求的变更数据
PS:
1. 修改默认路径请更改AbstractCanalClientTest.storeChangeToDisk()方法
2. canal中转化数据的代码请看:analyseEntryAndFlushToFile()方法
3. canal中解析生成赛题数据时,现在只有int类型换解析成"数字类型",其他的类型都会解析成"字符串类型"
4. 生成大量数据的时候请使用canal项目里面的startup.sh里面的JVM参数启动CanalLauncher和SimpleCanalClientTest,避免GC问题
为了方便选手测试,也提供了生产好的数据和答案(用的钉钉的网盘),选手可以下载,其中数据文件可以通过split命令自行分割成10个小文件来测试
- [测试文件](https://space.dingtalk.com/c/ggHaACQ4Mzc5MDMzMy05NzA1LTRhOWMtYmMyNi1iMjAyNGFiNTg5OTECzhngP1o)
另外选手可以使用如下的存储过程来生成数据:
```
CREATE TABLE student(
keyValue INT NOT NULL AUTO_INCREMENT,
first_name VARCHAR(10) NOT NULL,
last_name VARCHAR(10) NOT NULL,
sex VARCHAR(5) NOT NULL,
score INT NOT NULL,
PRIMARY KEY (`keyValue`)
);
/**增加学生数据的存储过程-- **/
DROP PROCEDURE IF EXISTS add_student;
DELIMITER //
create PROCEDURE add_student(in num INT)
BEGIN
DECLARE rowid INT DEFAULT 0;
DECLARE firstname CHAR(1);
DECLARE name1 CHAR(1);
DECLARE name2 CHAR(1);
DECLARE lastname VARCHAR(3) DEFAULT '';
DECLARE sex CHAR(1);
DECLARE score INT DEFAULT 0;
DECLARE updateFirstName CHAR(1);
DECLARE updateLastName CHAR(1);
DECLARE updateScore INT DEFAULT 0;
SET @exedata = "";
WHILE rowid < num DO
SET firstname = SUBSTRING('赵钱孙李周吴郑王林杨柳刘孙陈江阮侯邹高彭徐',FLOOR(1+21*RAND()),1);
SET name1 = SUBSTRING('一二三四五六七八九十甲乙丙丁静景京晶名明铭敏闵民军君俊骏天田甜兲恬益依成城诚立莉力黎励',floor(1+43*RAND()),1);
SET name2 = SUBSTRING('一二三四五六七八九十甲乙丙丁静景京晶名明铭敏闵民军君俊骏天田甜兲恬益依成城诚立莉力黎励',floor(1+43*RAND()),1);
SET sex=SUBSTRING('男女',floor(1+2*RAND()),1);
SET score= FLOOR(40 + (RAND() *60));
SET lastname=SUBSTRING('一二三四五六七八九十甲乙丙丁静景京晶名明铭敏闵民军君俊骏天田甜雨恬益依娥我他刚人发上乐',floor(1+43*RAND()),1);
SET rowid = rowid + 1;
IF ROUND(RAND())=0 THEN
SET lastname =name1;
END IF;
IF ROUND(RAND())=1 THEN
SET lastname = CONCAT(name1,name2);
EN
没有合适的资源?快使用搜索试试~ 我知道了~
第三届阿里巴巴中间件性能挑战赛复赛-模拟阿里双十一分布式数据同步 比赛代码.zip
共27个文件
java:20个
xml:3个
txt:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 89 浏览量
2023-10-06
20:19:05
上传
评论
收藏 1.79MB ZIP 举报
温馨提示
# 1. 赛题描述 题目主要解决的是数据同步领域范畴:实时增量同步,主要的技术挑战为模拟数据库的主备复制,提供"高效"的实时同步能力。即给定一批固定的增量数据变更信息,程序需要收集增量变更信息,并进行一定的数据重放计算,然后将最终结果输出到给定的目标文件中。增量数据的变更信息为了简化处理,会给出明文的数据,主要包含数据库的insert/update/delete三种类型的数据。具体的增量数据变更信息的数据格式见环境描述部分。数据重放主要是指模拟数据库的insert/update/delete语义,允许使用一些中间过程的存储。 # 2. 环境描述: ## 2.1 整体格式 有2台机器,简称A、B机器,A机器里会保存增量数据文件并且在固定的目录下提供10个文本文件,每个文本文件大概为1GB左右。每个文件有若干条变更信息。每条变更信息的记录由多列构成。文本中每行记录的格式为: | binaryId | timestamp | schema | table | 变更类型 | 列信息 | 变更前列值 | 变更后列值 | 列信息 | 列值 | ... | | -------- | --
资源推荐
资源详情
资源评论
收起资源包目录
第三届阿里巴巴中间件性能挑战赛复赛-模拟阿里双十一分布式数据同步 比赛代码.zip (27个子文件)
ori_code
pom.xml 4KB
src
resources
Result.txt 9.18MB
logback.xml 3KB
assembly.xml 386B
main
java
META-INF
MANIFEST.MF 75B
com
alibaba
middleware
race
sync
Utils.java 2KB
ConnectionListener.java 1KB
ReadService.java 7KB
Client.java 3KB
UpdateService.java 11KB
WrappedMessageArray.java 706B
MessageArrayQueue.java 889B
MessageStore.java 8KB
DataSaveInboundHandler.java 4KB
Constants.java 1KB
UnsafeByteBuffer.java 1KB
ValueEvent.java 681B
ParseService.java 22KB
test
LineBasedFrameDecoderServer.java 4KB
LineBasedFrameDecoderClient.java 3KB
OperationTest.java 905B
MessageDataBlock.java 892B
Server.java 4KB
SimpleByteBuffer.java 836B
ServerDemoInHandler.java 3KB
.gitignore 74B
README.md 20KB
共 27 条
- 1
资源评论
白话机器学习
- 粉丝: 1w+
- 资源: 7671
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功