Streamsets Postgresql 实时同步到Kudu

2 篇文章 2 订阅
1 篇文章 0 订阅

Streamsets提供两种方式同步Postgresql,一种是JDBC、query,另一种是CDC方式,实时同步需要两者结合来首次同步。

首先需要全表同步,采用JDBC方式比较好:

这个比同步Mysql方便,可以写多个模式多个表同时同步。

这个是完成一次同步就触发,不至于没有数据进来报错。下一次事务继续同步。

这个一定要配置,不然_int  json 格式就会报错。 

勾选一下,然后Type转换主要是把时间格式转String。 kudu里面记录时间的字段全部是string格式。直接开始就行。

JDBC Multitable Consumer 里面有性能配置,可以参考官网。

等待全量同步的时候,可以配置PostgreSQL CDC Client pipeline流:

 

 

不认识的格式直接当成string 传入流中。 

 Jython Evaluator 配置(ETL重点):

import time
import datetime

for record in records:
    try:
      for change in record.value['change']:
        newRecord = sdcFunctions.createRecord(record.sourceId + str(time.time()))
        newRecord.value = {}
        newRecord.attributes['xid'] = str(record.value['xid'])
        newRecord.attributes['nextlsn'] = record.value['nextlsn']
        newRecord.attributes['timestamp'] = record.value['timestamp']
        newRecord.attributes['kind'] = change['kind']
        newRecord.attributes['schema'] = change['schema']        
        newRecord.attributes['jdbc.tables'] = change['table']
        
        if change['kind'] == 'insert':
          newRecord.attributes['sdc.operation.type'] = '1'
        if change['kind'] == 'delete':
          newRecord.attributes['sdc.operation.type'] = '2'
        if change['kind'] == 'update':
          newRecord.attributes['sdc.operation.type'] = '3'

        if 'columnnames' in change:
          columns = change['columnnames']
          types = change['columntypes']
          values = change['columnvalues']
        else:
          columns = change['oldkeys']['keynames']
          types = change['oldkeys']['keytypes']
          values = change['oldkeys']['keyvalues']
        
        for j in range(len(columns)):
          name = columns[j]
          type = types[j]
          value = values[j]
          newRecord.value[name] = value

        output.write(newRecord)
          ## optional, if we want to keep the original record,
          ## otherwise we just put the new record in the batch.
          #output.write(record)
    except Exception as e:
        # Send record to error
        error.write(record, str(e))

Stream Selector 配置:分流

 kudu端配置比较简单。

当看到JDBC同步的数据很缓慢的时候,就可以直接开启CDC,然后关闭JDBC。有条件的可以先停止原始库写入数据的事务,等JDBC 同步完,开启CDC 再开启原始表的写入数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值