离线数仓—增量表同步实现
前言
在确定了全量表使用DataX进行同步,增量表使用Maxwell进行同步,且学习了Maxwell相关使用方法之后,开始着手进行增量表数据同步的实现。
一、增量表数据同步
1.增量表数据通道
增量表的数据由Maxwell从MySQL数据库导出,经过Kafka、Flume最终导入到HDFS中
Maxwell实时监控MySQL数据库中的增量表的变化,将发生变化的表的变更数据(JSON类型)发送到Kafka中对应表名的topic中,然后Flume将Kafka中一个topic的数发送到HDFS里。
Maxwell是不支持直接往HDFS里发送数据的,而在大数据领域内,最常用而且支持的是Kafka。
二、MySQL—Maxwell—Kafka的实现
1.Maxwell配置
先回顾一下,所有的增量表如下图所示:
按照规划,总共有13张表需要进行增量同步,因此对Maxwell进行相应的配置,只同步这13张表。
同时,为了方便起见,需要对Maxwell进行额外的配置,把对应表的变更数据发送到对应的topic中。
配置过程如下:
1)修改Maxwell配置文件config.proties:vim /opt/module/maxwell/config.properties
,修改后参数配置如下:
log_level=info
producer=kafka
kafka.bootstrap.servers=hadoop102:9092,hadoop103:9092
#kafka topic动态配置
kafka_topic=%{
table}
# mysql login info
host=hadoop102
user=maxwell
password=maxwell
jdbc_options=useSSL=false&serverTimezone=Asia/Shanghai
#表过滤,只同步特定的13张表
filter= include:gmall.cart_info,include:gmall.comment_info,include:gmall.coupon_use,include:gmall.favor_info,include:gmall.order_detail,include:gmall.order_detail_activity,include:gmall.order_detail_coupon,include:gmall.order_info,include:gmall.order_refund_info,include:gmall.order_status_log,include:gmall.payment_info,include:gmall.refund_payment,include:gmall.user_info
参数说明:
kafka.bootstrap.servers:尽量写多个地址,防止其中一个地址连接不上而出错
kafka_topic:这个参数是写入到的kafka的topic名称,可以是固定的也可以是动态的,例如 maxwell_%{database}_%{table}
这种写法会自动获取对应的database和table名称
filter:这是为了对表进行过滤,Maxwell只能监听某个数据库,不能指定监听某个数据库中的哪些表,这里过滤出来需要的表的名称
2)重启Maxwell
2.Maxwell—Kafka通道测试
在1中完成了Maxwell的配置,接着可以对整个增量表同步通道进行测试。
1)启动zookeeper和kafka集群
2)启动一个kafka consumer,消费任意一个上述的topic数据
3)生成模拟数据
4)观察Kafka是否能够消费到数据
三、Kafka—Flume—HDFS实现
1.Flume配置选取
这里是将Kafka的数据传输到HDFS中,因此Source选取Kafka Source,Sink选取HDFS Sink,Channel选取File Channel。
2.Flume配置关键点
因为Kafka中的数据是存放在13个topic中,因此Kafka Source需要订阅13个topic,然后将对应topic放到HDFS对应的路径上。
一个具体的实例如下:
3.Flume配置具体实现
1)创建Flume配置文件:vim job/kafka_to_hdfs_db.conf
2)配置文件内容如下:
#为各组件命名
a1.sources = r1
a1.channels = c1
a1.sinks = s1
tier1.sources.r1.type = org.apache.flume.source.kafka.KafkaSource
a1.sources.r1.batchSize = 5000
a1.sources.r1.batchDurationMillis = 2000
tier1.sources.r1.kafka.bootstrap.servers = hadoop102:9092,hadoop103:9092,hadoop104:9092
tier1.sources.r1.kafka.topics = cart_info,comment_info,coupon_use,favor_info,order_detail_activity,order_detail_coupon,order_detail,order_info,order_refund_info,order_status_log,payment_info,refund_payment,user_info
a1.sources.r1.kafka.consumer.group.id = flume
a1.sources.r1.setTopicHeader = true
a1.sources.r1.topicHeader = topic
a1.sources.interceptors=i1
a1.sources.interceptors.i1.type=com.atguigu.flume.interceptor.db.TimestampInterceptor$Builder
a1.channels.c1.type = file
a1.channels.c1.checkpointDir = /opt/module/flume/checkpoint/behavior1
a1.channels.c1.dataDirs = /opt/module/flume/data/behavior1/
a1.channels.c1.maxFileSize = 2146435071
a1.channels.c1.capacity = 1000000
a1.channels.c1.keep-alive = 6
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = /origin_data/gmall/db/${topic}_inc/%Y-%m-%d
a1.sinks.k1.hd