如何基于日志,同步实现数据的一致性和实时抽取?(4)
选用Spark的理由是很充分的:
这里补充说一下Swifts的作用:
Wormhole和Swifts对比如下: 落HDFS 通过Wormhole Wpark Streaming程序消费kafka的UMS,首先UMS log可以被保存到HDFS上. kafka一般只保存若干天的信息,不会保存全部信息,而HDFS中可以保存所有的历史增删改的信息.这就使得很多事情变为可能:
可以说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中.那么这里涉及到的一个问题就是,什么样的数据可以被更新到数据? 这里最重要的一个原则就是数据的幂等性. 无论是遇到增删改任何的数据,我们面临的问题都是:
对于第一个问题,其实就需要定位数据要找一个唯一的键,常见的有:
对于第二个问题,就涉及到_ums_id_了,因为我们已经保证了_ums_id_大的值更新,因此在找到对应数据行后,根据这个原则来进行替换更新. 之所以要软删除和加入_is_active_列,是为了这样一种情况: 如果已经插入的_ums_id_比较大,是删除的数据(表明这个数据已经删除了),如果不是软删除,此时插入一个_ums_id_小的数据(旧数据),就会真的插入进去. 这就导致旧数据被插入了.不幂等了.所以被删除的数据依然保留(软删除)是有价值的,它能被用于保证数据的幂等性. HBase的保存 插入数据到Hbase中,相当要简单一些.不同的是HBase可以保留多个版本的数据(当然也可以只保留一个版本)默认是保留3个版本; 因此插入数据到HBase,需要解决的问题是:
Version的选择很有意思,利用_ums_id_的唯一性和自增性,与version自身的比较关系一致:即version较大等价于_ums_id_较大,对应的版本较新. 从提高性能的角度,我们可以将整个Spark Streaming的Dataset集合直接插入到HBase,不需要比较.让HBase基于version自动替我们判断哪些数据可以保留,哪些数据不需要保留. Jdbc的插入数据: 插入数据到数据库中,保证幂等的原理虽然简单,要想提高性能在实现上就变得复杂很多,总不能一条一条的比较然后在插入或更新. 我们知道Spark的RDD/dataset都是以集合的方式来操作以提高性能,同样的我们需要以集合操作的方式实现幂等性. (编辑:ASP站长网) |