四、业-解

一、项目背景

1、背景需求

项目描述:公司智能工厂产品中一个智慧运输项目,还有设备全生命管理、能源分析、智能楼宇,

开发前期是一个工厂园区的定制项目,为根据国家政策,补助实现工业数字化转型, 他们全国有好几个工业园,每个园区都比较大,园区除他们自己的工厂外,还有其他同行业其他小厂。他们准备自己维护设备管理、物业管理、车辆管理等。

这个项目的需求:
主要是开发一个的用户付费运输货物,自己维护园区中货物转送管理与收益,相当于外面货拉拉业务有自己专门的小程序。

我们主要负责技术实现:
1)用户叫车下订单运输后,后台可实时监控车辆位置,同时会进行相关用户/订单/车辆的统计分析,类似货拉拉。

2)为实现用户车辆订单的分析做好基础,把业务库中四个表同步到hbase表。 不在业务库上分析,不能影响正常业务,我们解耦数据,

3)利用sparkSQL对hbase中几个业务表进行统计分析。

实现流程:

  • 1)将业务库中四张表车辆表、用户表,订单表以及司管方表, 通过maxwell实时的解析mysql的binlog数据,将数据发送到kafka,
  • 2)sparkSteaing消费kafka,foreachPartion实时存储数据到hbase。
  • 3)保存数据到Hbase ,考虑我rowkey设计,设置压缩,实现数据的均匀的分区, 避免Hbase表的数据倾斜与热点的问题,前创建hbase表时,

2、数据源描述

1)hbase建表预分区

1)hbase建表
数据库四张表对应hbase的四张表,通过rowkey设计,实现数据的均匀的分区,避免Hbase数据的倾斜,(加盐,反转,hash)

预分区的规则:0000|、0001|、0002|、…、0008|,|是字典码值最大的一个

rowkey 为 hash(mysql表的主键id)% 16 + 时间戳

使用phoenix来映射hbase的数据,实现数据的查询操作,不用rowkey去查询hbase里面的数据,

2)司机表driver_info具体字段

乘客表renter_info具体字段
订单表order_info_201907具体字段
司管方表opt_alliance_business具体字段

司机表driver_info:司机id ,电话,车辆id,、车辆类型、注册时间、

乘客表renter_info:乘客id, 乘客姓名,电话,注册时间

订单表order_info:订单id, 车辆id、乘客id、订单类型(0实时订单1预约订单)、订单状态cancel:(0未取消,1用户取消,2司机取消,3超时未接单)、订单里程、支付费用、行驶花费时间、订单创建时间、完成时间

二、maxwell监控binlog

maxwell的基本介绍

maxwell是一款专业解析mysql的binlog的数据同步的工具,功能与canal类似(canal是阿里开源的一款数据实时同步工具),我们可以通过maxwell或者canal来实现binlog的实时解析,实现数据的实时同步。官方网址:http://maxwells-daemon.io/

maxwell与canal的比较
主要区别:

  • 1、虽然Maxwell不能直接支持HA,但是它支持断点还原,即错误解决后重启继续上次点儿读取数据。
  • 2、Canal是服务端,数据过来了并不能直接写出去,需要一个客户端:syncClient去获取数据;Maxwell即是服务端也是客户端
  • 3、Maxwell支持Bootstrap,即刷全量的数据,而Canal不支持。
  • 4、Maxwell只支持Json,而Canel数据格式自由

个人选择Maxwell:
a、服务端和客户端是一体的
b、Maxwell是轻量级的,出错风险低,Canal经常出错
c、虽然部署的是单台,但是具有断点还原能力,出错好解决
d、Maxwell代码质量非常好,且社区更加的活跃

maxwell解析

通过maxwell来解析mysql的binlog日志, 实时捕获mysql数据库当中的数据,发送到kafka当中,然后我们就可以通过sparkStreaming程序来实现解析kafka当中的json格式的数据,保存到Hbase当中去

maxwell来解析mysql的binlog日志:

插入数据:
{“database”:“test”,“table”:“myuser”,“type”:“insert”,“ts”:1583758029,“xid”:287,“xoffset”:0,“data”:{“id”:1,“name”:“zhangsan”,“age”:null}}
更新数据:
{“database”:“test”,“table”:“myuser”,“type”:“update”,“ts”:1583758071,“xid”:349,“commit”:true,“data”:{“id”:1,“name”:“xiaolaodi”,“age”:null},“old”:{“name”:“zhangsan”}}
删除数据的json:
{“database”:“test”,“table”:“myuser”,“type”:“delete”,“ts”:1583758092,“xid”:378,“commit”:true,“data”:{“id”:1,“name”:“xiaolaodi”,“age”:null}}

node03执行以下命令开发maxwell配置文件

cd /kkb/install/maxwell-1.22.1
vim travel.properties

log_level=INFO
producer=kafka
kafka.bootstrap.servers=node01:9092,node02:9092,node03:9092
host=node03.kaikeba.com
user=maxwell
password=123456
producer_ack_timeout = 600000
port=3306
######### output format stuff ###############
output_binlog_position=ture
output_server_id=true
output_thread_id=ture
output_commit_info=true
output_row_query=true
output_ddl=false
output_nulls=true
output_xoffset=true
output_schema_id=true
######### output format stuff ###############
kafka_topic= veche
kafka_partition_hash=murmur3
kafka_key_format=hash
kafka.compression.type=snappy
kafka.retries=5
kafka.acks=all
producer_partition_by=primary_key 未设置时,按照表名hash,一个表数据全在一个hbase分区,可能数据热点,设置主键为分区key
############ kafka stuff #############
############## misc stuff ###########
bootstrapper=async
############## misc stuff ##########
############## filter ###############
filter=exclude:., include: travel.order_info_201904,include: travel.order_info_201905,include: travel.order_info_201906,include: travel.order_info_201907,include: travel.order_info_201908,include: travel.order_info_201906,include: travel.order_info_201910,include: travel.order_info_201911,include: travel.order_info_201912,include: travel.renter_info,include: travel.driver_info ,include: travel.opt_alliance_business

node01执行以下命令创建kafka的topic

cd /kkb/install/kafka_2.11-1.0.1/ bin/kafka-topics.sh --create --topic veche --partitions 3 --replication-factor 1 --zookeeper node01:2181,node02:2181,node03:2181

三、sparkSreaming 存储数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、项目经验

1、maxwell会造成数据倾斜?

创建kafka的topic的时候,有三个分区,所有的数据全部都取到了1号分区,就会造成数据倾斜的问题???

maxwell默认的分区规则使用的是dbname.hashCode % partitioner个数不同的数据库里面的数据,放到不同的分区里面去,相同的数据库里面的数据,
一定会将数据放到相同的分区里面。

默认,按表名分区,一个表的数据全部放在一个分区
去修改成 按主键分区

filter没懂。。
filter=exclude:., include: travel.order_info_201904,include: travel.opt_alliance_business
############## filter ###############
过滤我们不需要所有的数据库以及所有的数据库表,需要travel下面的四张表

2、HBASE一个数据多次写入

如果HBASE设计预分区散列之后这样如果同一个数据多次写入,
会出现重复数据吧 如果用唯一值且是主键可以保证数据不重复吧

不会出现重复数据 如果是同一个数据,且时间戳是一样的,不会出现重复数据,会进行数据的覆盖。

flink消费kafka的时候保证仅一次语义是不是flink的方法内部已经帮我们实现了

对的,可以将kafka的消费状态给保存起来,
flink天生支持state的保存
如果实时的将数据写入es,那么kibana可以实时的看到报表嘛
可以的,没问题的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值