部分用法的官方链接:
https://streamsets.com/documentation/datacollector/3.21.x/help/index.html
中文站:
http://streamsets.vip/
streamsets没有内置的mysql驱动包,CDH版本则需要添加外部库,详见:
https://blog.csdn.net/kkHMou/article/details/115319697
一、单表同步
1、测试用表
mysql测试表:
id主键自增,其余字段varchar
kudu建表:
注:kudu的表字段必须都是存在的,不能和mysql一样设置虚拟自增主键,kudu字段默认大写也都转成小写
我自己使用的是impala-kuku,这里使用HUE界面进行建表
2、mysql配置
注意:mysql的驱动连接后面需要带上字符集设置
…?useUnicode=true&characterEncoding=utf-8
查询SQL:
“SELECT * FROM student WHERE id > ${OFFSET} ORDER BY id ”
streamsets自己会记录offset,单表同步需要根据表中某个不断增长的字段进行同步,固定写法
3、kudu配置
4、测试运行
测试运行并不会记录offset,注意如果测试通过将输出端的数据删除再start整个通道就行
kudu这边数据也进去了,说明通道正常。
5、开启管道
省略
二、实时同步
1、mysql开启binlog
实时同步需要mysql开启binlog服务
vim /etc/my.cnf
追加
server_id=999
log_bin=mysql-bin
binlog_format=ROW
重启mysql使得binlog生效,记住设置的server_id
2、测试用表
基本和上面单表差不多,不赘述了。
注:图中只配置了单表,多表根据下面的配置自行添加测试即可
3、mysql binlog配置
Initial offset:mysql-bin.000011:158420309
4、中间流设置
注:MYSQL数据的TYPE有DELETE、INSERT、UPDATE3种,kudu这里使用UPSERT和DELETE,如果你要用INSERT和UPDATE,那可以在加一条就行,
建议是不用做区分
固定写法注意DELETE对应的是‘OldData’,IPSERT和UPDATA对应的是“Data”
for(var i = 0; i < records.length; i++) {
try {
var newRecord = sdcFunctions.createRecord(true);
newRecord.value = records[i].value['OldData'];
newRecord.value.Type = records[i].value['Type'];
newRecord.value.Database = records[i].value['Database'];
newRecord.value.Table = records[i].value['Table'];
log.info(records[i].value['Type'])
output.write(newRecord);
} catch (e) {
// Send record to error
error.write(records[i], e);
}
}
for(var i = 0; i < records.length; i++) {
try {
var newRecord = sdcFunctions.createRecord(true);
newRecord.value = records[i].value['Data'];
newRecord.value.Type = records[i].value['Type'];
newRecord.value.Database = records[i].value['Database'];
newRecord.value.Table = records[i].value['Table'];
log.info(records[i].value['Type'])
output.write(newRecord);
} catch (e) {
// Send record to error
error.write(records[i], e);
}
}
5、kudu设置
delete
upsert
6、测试
测试的时候只会读取10条,读取不到我们新建的表是正常的,在通过stream selector进行过滤时,以此输出来判断我们写的Type、Table、Database等等是否写的有问题
7、开启流
7.1 向mysql测试表写入3条数据
7.2 修改mysql一条数据
7.3 删除一条数据
8、其他
对于开启binlog服务的mysql,streamsets这边只能启用一个MySQL Binary Log,开启了一个,另一个就会停止。
但是,MySQL Binary Log和单表的JDBC Query是可以共存启动的。
可以根据实际的业务场景,对不通类型的表进行不同的处理