龙空技术网

你知道如何处理大数据量吗?(数据拆分篇)

老顾聊技术 2542

前言:

此时姐妹们对“java大数据的处理”大概比较关怀,看官们都想要剖析一些“java大数据的处理”的相关内容。那么小编也在网摘上网罗了一些关于“java大数据的处理””的相关文章,希望咱们能喜欢,朋友们一起来了解一下吧!

欢迎关注头条号:老顾聊技术

精品原创技术分享,知识的组装工

目录前言场景为什么会很慢优化数据获取拆分数据约定分片高可用总结前言

最近发现员工在处理业务时,一旦遇到大的数据量,就会很慢,而且经常会把jvm搞死。小伙伴们还理所应当的反馈,数据量太大了,所以这样子。

记得毕业的时候,面试华为有个面试题,【如何网络传输几个G的大文件】?当初年轻没有答上来。下面我们就来分析一下如何处理大的数据量。

场景

现在有100万条数据等待着处理,我们怎么去处理它?而且能否抽象成公共的方法进行处理?我们这边讨论的是数据已经准备好了,可以理解为已经存储在数据库中了。

我们来分析一下正常的处理数据流程:

1、获取要处理的数据

2、处理数据

3、返回处理结果以及状态:成功或失败

4、处理结果进行上报

为什么会很慢

数据处理,一般的方法,先获得数据,再对数据进行处理,等待处理结果,再上报。

获取数据慢

如果有100万的数据量,那我们在获取数据这个逻辑,就要去获取100万次,数据存储在数据库中,那就要和数据库交互100万次,这个肯定会慢

处理数据慢

如果处理一条数据,我们耗时需要100ms,那么处理100万条,就需要10万秒,也就是需要27.7个小时,单单处理数据就会很慢。

上报数据慢

处理一条数据后,要把结果上报,如果一条数据处理完后,上报到业务系统需要100ms,那100万条,也需要27.7个小时,也会很慢

这个就是我们小伙伴按照正常的处理流程,去处理大数据量时,会很慢的原因。根本原因是用同步方式进行业务处理。

如何去解决?核心思想就是分拆模块,并行处理。

记得华为【如何网络传输几个G的大文件】的面试题吗?再想想一些下载软件,是如何下载大的文件的?小伙伴应该一下子就会说用多线程,把大文件分拆成N个小文件,1个线程单独去处理一个小文件。

优化数据获取

在获取数据时,一般是一次处理一条数据,每次到数据库中获取。那我们可以优化一下:

批量数据

每次获取数据时,不要获取一条数据进行处理,如:每次去数据库获取个1000条数据到本地jvm缓存中,然后进行本地循环处理数据。

处理完1000条之后,再去数据库取1000条数据,这样的批量获取数据,就极大的优化了和数据库交互的次数,提升了1000倍。

我们再想想可以不可以再优化一下。我们上面的批量方案,是在单个jvm进程中处理的,那能不能有多个进程或服务器去处理数据呢?

拆分数据

上图中,就利用多个服务器进行处理数据,这样又提升了处理数据的能力,其实就是把数据拆分到多个处理服务器中。不过引入这个方案就会遇到一个问题,就是如何避免数据重复处理?

这个问题的产生是因为在获取数据时,不知道数据是否已经被拿走去处理了,当然我们可以把数据增加个处理状态:【未处理,处理中,处理成功,处理失败】。获取数据时选择【未处理】的数据,获取到数据后,要把数据的处理状态设置为【处理中】。

上面的业务逻辑是没有问题,但如果多个服务器去同时去获取时,会产生竞争,也会有可能获取到重复的数据。

分布式锁

这个时候可以引入分布式锁,避免同时去获取数据,如何利用锁,防止缓存击穿?重构思想的重要性 小伙伴不了解分布式锁,可以看之前的文章。

我们再想一下,是否可以在优化一下,因为利用分布锁也是比较影响性能的,多服务器之间同时获取时,还是要等待的,虽然他们大多数的时候不可能同时完成一批数据,但也是有可能的。

约定分片

我们可以采取约定分片的方式,如服务器A只处理ID为【1~30万】数据,服务器B只处理ID【30万~60万】的数据,服务器C只处理【60万~100万】的数据。

也就是程序在获取数据的时候,我们已经规划好分片的规则,让不同的服务器去处理不同的分片数据,这样多个服务器就不存在数据竞争的问题。因为他们处理的是不同的数据。

如果觉得服务器不够,可以在增加服务器,分片规则可以设置在数据库中,和之前的如何永不迁移数据和避免热点? 根据服务器指标分配数据量(揭秘篇) 原理类似。

高可用

我们发现上面的设计,一旦某个分片处理服务器挂了,那这些分片的数据就没法处理了。小伙伴有没有解决方案?其实很简单,就是在分片的基础上面,加上集群化处理。

上图中,增加了服务器A-1,A-2,同时负责【1~30万】的数据处理任务,一旦服务器A挂了,A-1,A-2照样可以处理数据。

当然一样会遇到数据重复处理的问题,这个时候就可以采用分布锁方案,进行小范围加锁。

总结

这里老顾介绍了如何把大数据量进行拆分,划分成小份,同步进行处理,这样就可以极大提升处理效率。

当然这里介绍的是处理大数据量第一步,如何设计获取数据?下面老顾还会介绍处理数据的优化、以及数据上报等,不过相对获取数据的方案,处理数据以及上报数据结果,相对比较简单,小伙伴们先自行思考一下。

-End-

如有收获,请帮忙转发,您的鼓励是作者最大的动力,谢谢!

10几年的经验实战分享

相关微服务,分布式,高并发,高可用,企业实战,干货等原创文章正在路上

欢迎关注头条号:老顾聊技术

精品原创技术分享,知识的组装工

推荐阅读

1、分享大厂分布式唯一ID设计方案,快来围观

2、你想了解一线大厂的分布式唯一ID生成方案吗?

3、如何永不迁移数据和避免热点? 根据服务器指标分配数据量(揭秘篇)

4、你知道怎么分库分表吗?如何做到永不迁移数据和避免热点吗?

5、你了解大型网站的页面静态化吗?

6、你知道如何更新缓存吗?如何保证缓存和数据库双写一致性?

7、你知道怎么解决DB读写分离,导致数据不一致问题吗?

8、DB读写分离情况下,如何解决缓存和数据库不一致性问题?

9、你真的知道怎么使用缓存吗?

10、如何利用锁,防止缓存击穿?重构思想的重要性

11、海量订单产生的业务高峰期,如何避免消息的重复消费?

12、你知道如何保障生产端100%消息投递成功吗?

标签: #java大数据的处理