使用singer tap-postgres 同步数据到pg
singer 是一个很不错的开源etl 解决方案,以下演示一个简单的数据从pg 同步到pg
很简单就是使用tap-postgres + target-postgres
环境准备
对于测试的环境的数据库使用docker-compose 运行
- docker-compose 文件
version: "3"
services:
tap:
image: postgres:9.6.11
ports:
- "5433:5432"
environment:
- "POSTGRES_PASSWORD:dalong"
target:
image: postgres:9.6.11
ports:
- "5432:5432"
environment:
- "POSTGRES_PASSWORD:dalong"
- tap 以及target 环境的配置
singer 推荐的环境配置使用python venv 虚拟环境
tap 配置
mkdir tap-pg
cd tap-pg
python3 -m venv venv
source venv/bin/activate
pip install tap-postgre
target 配置
mkdir target-pg
cdtarget-pg
python3 -m venv venv
source venv/bin/activate
pip installtarget-postgres
- 项目结构
-rw-r--r-- 1 dalong staff 251B 6 5 14:20 docker-compose.yaml
-rw-r--r-- 1 dalong staff 145B 6 5 14:27 tap-pg.json
-rw-r--r-- 1 dalong staff 143B 6 5 14:27 target-pg.json
- 启动pg 数据库以及初始化测试数据
docker-compose up -d
导入测试数据: 注意连接 localhost 5433 端口pg 服务
CREATE TABLE userapps (
id SERIAL PRIMARY KEY,
username text,
userappname text
);
INSERT INTO "public"."userapps"("id","username","userappname")
VALUES
(1,E'dalong',E'app'),
(2,E'first',E'login');
使用tap 以及target
- 配置数据库连接
tap: tap-pg.json
{
"host": "localhost",
"port": 5433,
"dbname": "postgres",
"user": "postgres",
"password": "dalong",
"schema": "public"
}
target: target 数据库配置
{
"host": "localhost",
"port": 5432,
"dbname": "postgres",
"user": "postgres",
"password": "dalong",
"schema": "copy"
}
- tap 模式发现
运行方式
./tap-pg/venv/bin/tap-postgres -c ta-pg.json -d > catalog.json
- 选择需要同步的表以及同步方式
以下为一个简单的demo,实际可以自己根据情况调整
{
"streams": [
{
"table_name": "userapps",
"stream": "userapps",
"metadata": [
{
"breadcrumb": [],
"metadata": {
"table-key-properties": [
"id"
],
+ "selected": true,
+ "replication-method": "FULL_TABLE",
"schema-name": "public",
"database-name": "postgres",
"row-count": 0,
"is-view": false
}
},
{
"breadcrumb": [
"properties",
"id"
],
"metadata": {
"sql-datatype": "integer",
"inclusion": "automatic",
"selected-by-default": true
}
},
{
"breadcrumb": [
"properties",
"username"
],
"metadata": {
"sql-datatype": "text",
"inclusion": "available",
"selected-by-default": true
}
},
{
"breadcrumb": [
"properties",
"userappname"
],
"metadata": {
"sql-datatype": "text",
"inclusion": "available",
"selected-by-default": true
}
}
],
"tap_stream_id": "postgres-public-userapps",
"schema": {
"type": "object",
"properties": {
"id": {
"type": [
"integer"
],
"minimum": -2147483648,
"maximum": 2147483647
},
"username": {
"type": [
"null",
"string"
]
},
"userappname": {
"type": [
"null",
"string"
]
}
},
"definitions": {
"sdc_recursive_integer_array": {
"type": [
"null",
"integer",
"array"
],
"items": {
"$ref": "#/definitions/sdc_recursive_integer_array"
}
},
"sdc_recursive_number_array": {
"type": [
"null",
"number",
"array"
],
"items": {
"$ref": "#/definitions/sdc_recursive_number_array"
}
},
"sdc_recursive_string_array": {
"type": [
"null",
"string",
"array"
],
"items": {
"$ref": "#/definitions/sdc_recursive_string_array"
}
},
"sdc_recursive_boolean_array": {
"type": [
"null",
"boolean",
"array"
],
"items": {
"$ref": "#/definitions/sdc_recursive_boolean_array"
}
},
"sdc_recursive_timestamp_array": {
"type": [
"null",
"string",
"array"
],
"format": "date-time",
"items": {
"$ref": "#/definitions/sdc_recursive_timestamp_array"
}
},
"sdc_recursive_object_array": {
"type": [
"null",
"object",
"array"
],
"items": {
"$ref": "#/definitions/sdc_recursive_object_array"
}
}
}
}
}
]
}
- 执行同步
./tap-pg/venv/bin/tap-postgres -c tap-pg.json --catalog catalog.json | ./target-pg/venv/bin/target-postgres -c target-pg.json
效果
/Users/dalong/mylearning/singer-project/target-pg/venv/lib/python3.7/site-packages/psycopg2/__init__.py:144: UserWarning: The psycopg2 wheel
package will be renamed from release 2.8; in order to keep installing from binary please use "pip install psycopg2-binary" instead. For det
ails see: <http://initd.org/psycopg/docs/install.html#binary-install-from-pypi>.
""")
INFO Selected streams: ['postgres-public-userapps']
INFO No currently_syncing found
INFO Beginning sync of stream(postgres-public-userapps) with sync method(full)
INFO Stream postgres-public-userapps is using full_table replication
INFO Current Server Encoding: UTF8
INFO Current Client Encoding: UTF8
INFO hstore is UNavailable
INFO Beginning new Full Table replication 1559717835286
INFO select SELECT "id" , "userappname" , "username" , xmin::text::bigint
FROM "public"."userapps"
ORDER BY xmin::text ASC with itersize 20000
INFO METRIC: {"type": "counter", "metric": "record_count", "value": 2, "tags": {}}
INFO Table 'userapps' does not exist. Creating... CREATE TABLE copy.userapps ("id" bigint, "userappname" character varying, "username" character varying, PRIMARY KEY ("id"))
INFO Loading 2 rows into 'userapps'
INFO COPY userapps_temp ("id", "userappname", "username") FROM STDIN WITH (FORMAT CSV, ESCAPE '\')
INFO UPDATE 0
INFO INSERT 0 2
{"bookmarks": {"postgres-public-userapps": {"last_replication_method": "FULL_TABLE", "version": 1559717835286, "xmin": null}}, "currently_syncing": null}
- 界面效果

说明
以上只是一个简单的演示,实际上我们可选的工具很多,比如dbt,pgloader,数据导出导入,其他类似etl 工具,或者使用pg 的fdw,dblink。。。
参考资料
https://github.com/rongfengliang/singer-pg2pg
https://github.com/singer-io/tap-postgres
https://www.getdbt.com/
https://github.com/dimitri/pgloader
https://www.postgresql.org/docs/10/contrib-dblink-function.html
使用singer tap-postgres 同步数据到pg的更多相关文章
- pipelinewise 基于singer 指南的的数据pipeline 工具
pipelinewise 是基于开源singer 指南开发的数据pipeline工具,与singer tap 以及target 兼容 支持的特性 内置的elt 特性 轻量级 支持多种复制方法,cdc( ...
- 实现从Oracle增量同步数据到GreenPlum
简介: GreenPlum是一个基于PostgreSQL数据库开发的MPP架构的数据库仓库,适用于OLAP系统,支持50PB(1PB=1000TB)级海量数据的存储和处理. 背景: 目前有一个业务是需 ...
- sql笨办法同步数据
Helpers.SqlHelper sqlHelper = new Helpers.SqlHelper("server=***;database=Cms;user id=sa;passwor ...
- 对Big Table进行全表更新,导致 Replication 同步数据的过程十分缓慢
在Publisher database中更新一个big table,数据行数是3.4亿多.由于没有更新 clustered Index key,因此,只产生了3.4亿多个Update Commands ...
- 【转】CentOS5.6下配置rsync内网同步数据到外网
[转]CentOS5.6下配置rsync内网同步数据到外网 本文转自:http://www.linuxidc.com/Linux/2012-06/64070.htm 一.需求 卫士那边有一个需求,就是 ...
- zookeeper源码分析三LEADER与FOLLOWER同步数据流程
根据二)中的分析,如果一台zookeeper服务器成为集群中的leader,那么一定是当前所有服务器中保存数据最多的服务器,所以在这台服务器成为leader之后,首先要做的事情就是与集群中的其它服务器 ...
- Dynamo涉及的算法和协议——p2p架构,一致性hash容错+gossip协议获取集群状态+向量时钟同步数据
转自:http://www.letiantian.me/2014-06-16-dynamo-algorithm-protocol/ Dynamo是Amazon的一个分布式的键值系统,P2P架构,没有主 ...
- Windows 之间用rsync同步数据(cwRsyncServer配置)
rsync是一款优秀的数据同步软件,在跨服务器,跨机房,跨国备份服务器的首选工具,下面就来介绍下如何配置安装cwRsyncServer很大多数软件一样是B/C架构,cwRsyncServer是rsyn ...
- linux和windows同步数据 cwrsync client to rsync server
linux和windows同步数据,rsync server cwrsync client linux server一般系统都自带rsync,如果没有就挂载系统盘自己安装一下,安装挺简单的不用我再多 ...
随机推荐
- 手把手教你做JavaWeb项目:登录模块
现如今,无论是客户端还是移动端,无论是游戏登陆还是社交平台登陆,无处不在的“登陆”.那么你知道怎么制作吗?今天就为你娓娓道来: 用户登录 在各大信息管理系统中,登录功能是必不可少的,他的作用就是验证用 ...
- sqoop与hbase导入导出数据
环境:sqoop1.4.6+hadoop2.6+hbase1.1+mysql5.7 说明: 1.文中的导入导出的表结构借鉴了网上的某篇博客 2.mysql导入hbase可以直接通过sqoop进行 3. ...
- Centos复制的系统无法获取IP地址
本文主要是解决自己玩虚拟机时遇到的问题,网上查询了很多资料,最好综合多方的资料进行如下总结,如果无法解决您得问题,不要着急慢慢梳理总会解决的,加油~~~ 1.添加一块新的虚拟机的网卡2.删除rm -r ...
- 【面试突击】-SpringBoot面试题(一)
Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...
- 英语foteball足球历史
foteball n.足球 现代足球 参见:现代足球 现代足球起源地是在英格兰.传说在11世纪,英格兰与丹麦之间有过一场战争,战争结束后,英格兰人在清理战争废墟时发现一个丹麦入侵者的头骨,出于愤恨,他 ...
- Cglib invoke为什么会死循环?
目录 Cglib invoke为什么会死循环? 动态代理子类的java文件 动态代理子类实例化过程 动态代理类调用过程 动态代理之MethodProxy.invokeSuper Cglib invok ...
- 小米8seroot后更改hosts文件记录
1.先备份原有文件,在设置中有个备份与恢复,可以备份,备份后链接电脑,传电脑上 2.下载开发版miui,安装 3.解bl锁,先到官网申请,按照提示操作. 4.备份文件传到手机,恢复文件 5.获得roo ...
- influxDB应用及TICK stack
InfluxData平台用于处理度量和事件的时间序列平台,常被称为TICK stack,包含4个组件:Telegraf,influxDB,Chronograf和Kapacitor,分别负责时间序列数据 ...
- VMware15.5版本通过挂载系统光盘搭建yum仓库
VMware15.5版本通过挂载系统光盘搭建yum仓库一.1.打开CentOS 7虚拟机. 2.登录虚拟机,选择未列出 用户名:root 密码:输入自己设置的密码 点击登录. 3.右键单击打开终端. ...
- Matplotlib:mpl_toolkits.mplot3d工具包
简介 mpl_toolkits.mplot3d是Matplotlib里面专门用来画三维图的工具包,官方指南请点击此处<mplot3d tutorial> 使用 导入 使用from mpl_ ...