设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 手机 数据 公司
当前位置: 首页 > 服务器 > 安全 > 正文

如何基于日志,同步实现数据的一致性和实时抽取?(4)

发布时间:2021-01-07 06:43 所属栏目:53 来源:网络整理
导读:选用Spark的理由是很充分的: Spark天然的支持各种异构存储系统; 虽然Spark Stream比Storm延时稍差,但Spark有着更好的吞吐量和更好的计算性能; Spark在支持并行计算方面有更强的灵活性; Spark提供了一个技术栈内

选用Spark的理由是很充分的:

  • Spark天然的支持各种异构存储系统;
  • 虽然Spark Stream比Storm延时稍差,但Spark有着更好的吞吐量和更好的计算性能;
  • Spark在支持并行计算方面有更强的灵活性;
  • Spark提供了一个技术栈内解决Sparking Job,Spark Streaming,Spark SQL的统一功能,便于后期开发;

这里补充说一下Swifts的作用:

  • Swifts的本质是读取kafka中的UMS数据,进行实时计算,将结果写入到kafka的另外一个topic.
  • 实时计算可以是很多种方式:比如过滤filter,projection(投影),lookup,流式join window aggregation,可以完成各种具有业务价值的流式实时计算.

Wormhole和Swifts对比如下:

落HDFS

通过Wormhole Wpark Streaming程序消费kafka的UMS,首先UMS log可以被保存到HDFS上.

kafka一般只保存若干天的信息,不会保存全部信息,而HDFS中可以保存所有的历史增删改的信息.这就使得很多事情变为可能:

  • 通过重放HDFS中的日志,我们能够还原任意时间的历史快照.
  • 可以做拉链表,还原每一条记录的历史信息,便于分析;
  • 当程序出现错误是,可以通过回灌(backfill),重新消费消息,重新形成新的快照.

可以说HDFS中的日志是很多的事情基础.

介于Spark原生对parquet支持的很好,Spark SQL能够对Parquet提供很好的查询.UMS落地到HDFS上是保存到Parquet文件中的.Parquet的内容是所有log的增删改信息以及_ums_id_,_ums_ts_都存下来.

Wormhole spark streaming根据namespace 将数据分布存储到不同的目录中,即不同的表和版本放在不同目录中.

由于每次写的Parquet都是小文件,大家知道HDFS对于小文件性能并不好,因此另外还有一个job,每天定时将这些的Parquet文件进行合并成大文件.

每个Parquet文件目录都带有文件数据的起始时间和结束时间.这样在回灌数据时,可以根据选取的时间范围来决定需要读取哪些Parquet文件,不必读取全部数据.

插入或更新数据的幂等性

常常我们遇到的需求是,将数据经过加工落地到数据库或HBase中.那么这里涉及到的一个问题就是,什么样的数据可以被更新到数据?

这里最重要的一个原则就是数据的幂等性.

无论是遇到增删改任何的数据,我们面临的问题都是:

  1. 该更新哪一行;
  2. 更新的策略是什么.

对于第一个问题,其实就需要定位数据要找一个唯一的键,常见的有:

  1. 使用业务库的主键;
  2. 由业务方指定几个列做联合唯一索引;

对于第二个问题,就涉及到_ums_id_了,因为我们已经保证了_ums_id_大的值更新,因此在找到对应数据行后,根据这个原则来进行替换更新.

之所以要软删除和加入_is_active_列,是为了这样一种情况:

如果已经插入的_ums_id_比较大,是删除的数据(表明这个数据已经删除了),如果不是软删除,此时插入一个_ums_id_小的数据(旧数据),就会真的插入进去.

这就导致旧数据被插入了.不幂等了.所以被删除的数据依然保留(软删除)是有价值的,它能被用于保证数据的幂等性.

HBase的保存

插入数据到Hbase中,相当要简单一些.不同的是HBase可以保留多个版本的数据(当然也可以只保留一个版本)默认是保留3个版本;

因此插入数据到HBase,需要解决的问题是:

  1. 选择合适的rowkey:Rowkey的设计是可以选的,用户可以选择源表的主键,也可以选择若干列做联合主键.
  2. 选择合适的version:使用_ums_id_+ 较大的偏移量(比如100亿) 作为row的version.

Version的选择很有意思,利用_ums_id_的唯一性和自增性,与version自身的比较关系一致:即version较大等价于_ums_id_较大,对应的版本较新.

从提高性能的角度,我们可以将整个Spark Streaming的Dataset集合直接插入到HBase,不需要比较.让HBase基于version自动替我们判断哪些数据可以保留,哪些数据不需要保留.

Jdbc的插入数据:

插入数据到数据库中,保证幂等的原理虽然简单,要想提高性能在实现上就变得复杂很多,总不能一条一条的比较然后在插入或更新.

我们知道Spark的RDD/dataset都是以集合的方式来操作以提高性能,同样的我们需要以集合操作的方式实现幂等性.

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读