Flinkx實時和離線同步Postgresql資料到Kafka
Flinkx實時和離線同步Postgresql資料到Kafka
一、環境部署
1.選擇一臺伺服器,安裝了Flink的更好,使用git工具把專案clone到本地
git clone https://github.com/DTStack/flinkx.git
cd flinkx
或者直接下載原始碼
wget https://github.com/DTStack/flinkx/archive/1.8.5.zip
unzip flinkx-1.8.5.zip
cd flink-1.8.5
2.編譯外掛
mvn clean package -DskipTests
編譯需要下載很多依賴,這邊比較慢,如果編譯過程中報錯 找不到DB2、達夢、gbase、ojdbc8等驅動包,這個時候可以使用內部提供的指令碼進行安裝 ./install_jars.sh ,指令碼在bin目錄下面。然後再重新編譯一下就可以了。
離線同步
首先讀取編寫一個比較簡單的任務,讀取pg庫資料,直接列印到控制檯。
任務json檔案:
{
"job": {
"content": [{
"reader": {
"parameter" : {
"column" : [ {
"name" : "id",
"type" : "bigint",
"key" : "id"
} ],
"username" : "賬號",
"password" : "密碼",
"connection" : [ {
"jdbcUrl" : [ "jdbc連線地址" ],
"table" : [ "yrw_test" ]
} ],
"where": "id > 0",
"splitPk": "id",
"fetchSize": 1000,
"queryTimeOut": 1000,
"customSql": "",
"requestAccumulatorInterval": 2
},
"name" : "postgresqlreader"
},
"writer": {
"name": "streamwriter",
"parameter": {
"print": true
}
}
}],
"setting": {
"speed": {
"channel": 1,
"bytes": 0
},
"errorLimit": {
"record": 100
}
}
}
}
執行命令:
/data/bigdata/module/flinkx/flinkx_1.10/bin/flinkx -mode local \
-job /data/bigdata/module/flinkx/job/pg2print.json \
-pluginRoot /data/bigdata/module/flinkx/flinkx_1.10/plugins \
-confProp "{\"flink.checkpoint.interval\":60000}"
這樣就可以執行離線同步pg的任務啦,這是本地模式,當然Flinkx還提供了 standlone和yarn模式,可以參考官網的方式即可。
實時同步
這邊演示通過cdc的方式實時同步pg庫的資料,然後寫入到kafka中。
任務json檔案:
{
"job": {
"content": [{
"reader" : {
"parameter" : {
"username" : "賬號",
"password" : "密碼",
"url" : "pg連線url",
"databaseName" : "資料庫名",
"cat" : "update,insert,delete",
"tableList" : [
"表名"
],
"statusInterval" : 10000,
"lsn" : 0,
"slotName" : "aaa",
"allowCreateSlot" : true,
"temporary" : true,
"pavingData" : true
},
"name" : "pgwalreader"
},
"writer" : {
"parameter": {
"timezone": "UTC",
"topic": "yrw_test_flinkx",
"producerSettings": {
"zookeeper.connect" : "zookeeper的地址",
"bootstrap.servers" : "kafka的bootstrap.servers"
}
},
"name": "kafka10writer"
}
} ],
"setting": {
"speed": {
"channel": 1,
"bytes": 0
},
"errorLimit": {
"record": 100
},
"restore": {
"maxRowNumForCheckpoint": 0,
"isRestore": false,
"isStream" : true,
"restoreColumnName": "",
"restoreColumnIndex": 0
},
"log" : {
"isLogger": false,
"level" : "debug",
"path" : "",
"pattern":""
}
}
}
}
執行命令
/data/bigdata/module/flinkx/flinkx_1.10/bin/flinkx -mode local \
-job /data/bigdata/module/flinkx/job/pg_wal_kafka.json \
-pluginRoot /data/bigdata/module/flinkx/flinkx_1.10/plugins \
-confProp "{\"flink.checkpoint.interval\":60000}" \
-jobid yrw_test_1125
執行後會發現任務出錯,需要修改原始碼
com.dtstack.flinkx.pgwal.format.PgWalInputFormat#openInputFormat
@Override
public void openInputFormat() throws IOException{
super.openInputFormat();//增加這一行
executor = Executors.newFixedThreadPool(1);
queue = new SynchronousQueue<>(true);
}
com.dtstack.flinkx.pgwal.reader.PgwalReader#readData
@Override
public DataStream<Row> readData() {
PgWalInputFormatBuilder builder = new PgWalInputFormatBuilder();
builder.setUsername(username);
builder.setPassword(password);
builder.setUrl(url);
builder.setDatabaseName(databaseName);
builder.setCat(cat);
builder.setPavingData(pavingData);
builder.setTableList(tableList);
builder.setRestoreConfig(restoreConfig);
builder.setStatusInterval(statusInterval);
builder.setLsn(lsn);
builder.setSlotName(slotName);
builder.setAllowCreateSlot(allowCreateSlot);
builder.setTemporary(temporary);
builder.setDataTransferConfig(dataTransferConfig);//增加這一行
return createInput(builder.finish(), "pgwalreader");
}
重新打包編譯即可。
在使用kafka10writer時,會存在一些問題,比如說我當前同步到了pg的資料到kafka中,這個時候kafka有5個分割槽,我如何保證同一個id的操作傳送到同一個分割槽呢,因為只有這樣才能保證資料的一致性。這個時候可以指定id作為record的key,使得同一條記錄的操作傳送到同一個分割槽。
修改com.dtstack.flinkx.kafka10.writer.Kafka10OutputFormat
@Override
protected void emit(Map event) throws IOException {
String tp = Formatter.format(event, topic, timezone);
String key = (String) (event.get("before_id") == null? event.get("after_id"):event.get("before_id"));//將主鍵設定為record的key
producer.send(new ProducerRecord<>(tp, /*event.toString()*/ key, objectMapper.writeValueAsString(event)), (metadata, exception) -> {
if(Objects.nonNull(exception)){
String errorMessage = String.format("send data failed,data 【%s】 ,error info %s",event,ExceptionUtil.getErrorMessage(exception));
LOG.warn(errorMessage);
throw new RuntimeException(errorMessage);
}
});
}
打包重新編譯一下 就ok了。
最後,奉上Flinkx的git連結https://github.com/DTStack/flinkx
相關文章
- flink sql 實時同步及離線同步SQL
- Debezium vs OGG vs Tapdata:如何實時同步 Oracle 資料到 Kafka 訊息佇列?OracleKafka佇列
- Flink同步Kafka資料到ClickHouse分散式表Kafka分散式
- GoldenGate實時投遞資料到大資料平臺(5) - KafkaGo大資料Kafka
- KunlunDB 快速入門 4.0(從Oracle實時同步資料到kunlunDB)Oracle
- PostgreSQL邏輯複製資料同步到kafkaSQLKafka
- excel導資料到PostgresqlExcelSQL
- kafka和websocket實時資料推送KafkaWeb
- canal+mysql+kafka實時資料同步安裝、配置MySqlKafka
- 從OSS裝載資料到PostgreSQLSQL
- 使用Flume消費Kafka資料到HDFSKafka
- 大資料6.1 - 實時分析(storm和kafka)大資料ORMKafka
- 實時資料處理:Kafka 和 FlinkKafka
- mysql通過kafka實現資料實時同步(三)——es叢集配置MySqlKafka
- 技術乾貨|如何利用 ChunJun 實現資料離線同步?
- ORACLE(Linux版本)實時同步資料到MYSQL(Linux版本)解決方案:OGGOracleLinuxMySql
- Kafka 叢集如何實現資料同步?Kafka
- Ubuntu下離線安裝PostgreSQLUbuntuSQL
- mysql 如何毫秒級同步資料到 elasticsearchMySqlElasticsearch
- flinkcdc同步mysql資料到selectdbMySql
- CDC實戰:MySQL實時同步資料到Elasticsearch之陣列集合(array)如何處理【CDC實戰系列十二】MySqlElasticsearch陣列
- mysql和redis實時同步資料怎麼實現MySqlRedis
- Clickhouse Engine kafka 將kafka資料同步clickhouseKafka
- PostgreSQL與Elasticsearch和PGSync的實時資料整合 -ToluSQLElasticsearch
- oracle 資料透過goldengate 實時同步到kafka訊息佇列中OracleGoKafka佇列
- Logstash7.6.2同步Mysql資料到ElasticSearchMySqlElasticsearch
- 使用canal.adapter同步資料到MySQLAPTMySql
- 使用goldengate從mysql同步資料到oracleGoMySqlOracle
- 使用SeaTunnel從InfluxDB同步資料到DorisUX
- 使用Storm、Kafka和ElasticSearch處理實時資料 -javacodegeeksORMKafkaElasticsearchJava
- 永續性Akka、Kafka、Cassandra實現CQRS資料同步Kafka
- PostgreSQL非同步IO實測SQL非同步
- 【Redis 技術探索】「資料遷移實戰」手把手教你如何實現線上 + 離線模式進行遷移Redis資料實戰指南(離線同步資料)Redis模式
- 《離線和實時大資料開發實戰》(二)大資料平臺架構 & 技術概覽大資料架構
- 資料整合工具—FlinkX
- Mysql資料實時同步實踐MySql
- 從物件儲存服務同步資料到Elasticsearch物件Elasticsearch
- ogg 同步pg資料到oracle--步驟Oracle