一个处理大数据的后台服务(已废弃)

简介: 这其实是个小功能,但是我觉得非常有意思。因为这个业务不但总体数据量大,单个数据体也是超大个的。业务场景是这样的:我们需要把数据库的视频和专辑数据给搜索那边。搜索那边规定好了数据的格式和传输方式。全量数据用文件的方式放到hadoop节点上,增量数据用消息队列发送。

这其实是个小功能,但是我觉得非常有意思。因为这个业务不但总体数据量大,单个数据体也是超大个的。业务场景是这样的:我们需要把数据库的视频和专辑数据给搜索那边。搜索那边规定好了数据的格式和传输方式。全量数据用文件的方式放到hadoop节点上,增量数据用消息队列发送。


原计划是每周发送一次全量,增量数据是分钟级。但是实际上最后全量是一条跑一次。因为发现我的程序执行的辣么快。为啥快呢?当然啦,我进行了好几次优化,竟然还通宵了。不过,最重要的基础是……,我就不说我的机器配置了。请看我的JVM参数设置:


 1112728-20170226173027991-169111303.png


真心有做土豪的感觉。公司对我太好了,感动的泪如雨下!

 

下面说一下业务模块,共7个业务模块,使用ScheduledExecutorService启动10个定时任务,分别是:视频全量任务,视频增量任务,视频手动补发任务,专辑全量任务,专辑增量任务,专辑手动补发任务,磁盘清理任务和三个将数据缓存到内存任务。


总体上使用了Spring的控制反转功能加载资源。连Dubbo的资源管理也是用的Spring,只能说明这个控制反转太好用了。持久层框架,我用的是我们大乐视自己研发的mango


视频和专辑的手动补发很简单,就是用ServerSocket开了两个端口监听http请求。然后解析socket的输入流,从输入流里面的参数里提取出需要重发的id列表处理后(处理过程就是增量的逻辑)在输入流中写入响应。因为这个,我可不可以说自己做过socket编程啊!

磁盘清理任务是因为我总共就500G的硬盘。每次执行完全量,一天的数据共80G,所以全量执行前要先执行清理,只保留4天的全量。


我们的视频目前是近千万条的数据,专辑有百万条数据,数据需要查询几个表汇总出数据。而我有125G的内存,所以我将一些常用的字典数据缓存到map里,三个缓存任务就是干这个用的。


先说全量:


为了减少资源之间的等待,我把全量数据分成600个线程,每个线程独立写一个文件。线程执行完进行gz压缩。搜索那边访问我们的磁盘只取压缩后的数据。取到的文件他们那边负责归并。专辑也是一样,但是经过测试,分成了440个线程。因为是24核物理机,经过测试,开启了50个线程的线程池跑这总共的1040个线程。程序启动时将这些全量视频处理线程和全量专辑处理线程都创建好,放到map里。


全量在执行前,会执行线程业务分配线程。


先说视频的分配线程。因为每个视频都要跑所有的数据表,且数据的大小相对比较均匀。ID是数据库里的自增主键。有近千万条数据。首先查询数据库的最大ID和最小ID。用这两个ID的差除以线程数600得到ID间隔。循环从map里取出一个全量视频处理线程,将最小ID最为处理开始ID,最小ID加上ID间隔最后处理结束ID,还有给它分配的线程号传给这个视频处理线程。下一个以上个处理结束ID作为处理ID继续分配。分配到最后一个时,我会把处理结束ID加上1000。这是为了应对执行期间的新增。


专辑因为一条数据中不但要包含专辑本身的信息,还需要将专辑下的视频信息一起合成一条信息。有的专辑下只有一个视频。有的专辑下面却有3万多条视频,跑这一条数据就需要近20分钟。所以线程分配的时候,首先将所有专辑下视频数多于1000的作为超大视频将ID存到一个list里(1000多条)。将剩下的ID放到另外一个list(近百万条数据)。将线程数均分成两份(之所以不直接用440条是因为视频和专辑全量线程数是可配置的)。一部分按ID数均分给超大视频。另一部分按ID数分配给其他视频。将要执行的ID列表和线程号作为参数传给专辑处理线程。那么对于超大视频线程来说,它会处理23ID。对于其他的线程,处理的视频数是几千。


1112728-20170226173044398-1069948176.png


(此处假装我附上代码,代码是公司资源)


当然线程业务分配线程会创建一个日期命名的目录将当天的视频或专辑数据都放在一个目录下。


然后是视频或专辑创建线程。程序一开始将一个AtomicInteger进行incrementAndGet。在此线程结束先gz压缩,然后将此AtomicInteger进行decrementAndGet这是用来判断是否所有的线程都执行完的,因为之后要生成一个视频创建结束的标志。因为有两台机器。搜索首先检查当天数据是否有结束标示,没有就取另一台的数据。之所以要传线程号就是为了作为磁盘文件名的一部分。文件名和目录结构如下图:


1112728-20170226173054991-1400114496.png


(磁盘上的文件)


创建视频的时候,首先查询在开始和结束时间段内的视频数。如果这个地方用limit来查,不能有效利用索引,数据量又大,查询速度慢好几十倍。

 

如果这个视频数小于一次性处理数据量(经过测试,我定到了800)。就一次性处理。如果这个视频数大于这个数据,就循环处理,一次处理800。这样既提高的运行速度又保证了不占用过多的内存。


介于当时考虑的细节过多,描述下来总共需要1万字以上,主要说说当时的要求是尽量快的执行,我在调整参数和逻辑的时候,CPU密集和IO密集两种情况交替出现。几个通宵的尝试才调到了最优。



相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
|
6天前
|
存储 数据可视化 数据管理
基于阿里云服务的数据平台架构实践
本文主要介绍基于阿里云大数据组件服务,对企业进行大数据平台建设的架构实践。
769 2
|
6天前
|
SQL 存储 大数据
某互联网大厂亿级大数据服务平台的建设和实践
某互联网大厂亿级大数据服务平台的建设和实践
81 0
|
6天前
|
分布式计算 运维 数据挖掘
MaxCompute是一个强大的云数据仓库服务
【4月更文挑战第1天】MaxCompute是一个强大的云数据仓库服务
35 1
|
6天前
|
分布式计算 大数据 Hadoop
【经验分享】用Linux脚本管理虚拟机下的大数据服务
【经验分享】用Linux脚本管理虚拟机下的大数据服务
17 1
|
6天前
|
数据可视化 大数据 数据挖掘
瓴羊荣获2023虎啸奖“年度十大AI&大数据服务公司”“数智营销案例铜奖”双重大奖
瓴羊荣获2023虎啸奖“年度十大AI&大数据服务公司”“数智营销案例铜奖”双重大奖
|
6天前
|
SQL 存储 大数据
从0到1介绍一下开源大数据服务平台dataService
从0到1介绍一下开源大数据服务平台dataService
130 1
|
6天前
|
Prometheus 数据可视化 Cloud Native
助力工业物联网,工业大数据之服务域:可视化工具Grafana介绍【三十八】
助力工业物联网,工业大数据之服务域:可视化工具Grafana介绍【三十八】
108 1
|
6天前
|
存储 SQL Oracle
助力工业物联网,工业大数据之服务域:项目总结【三十九】
助力工业物联网,工业大数据之服务域:项目总结【三十九】
51 1
|
6天前
|
SQL Prometheus 监控
助力工业物联网,工业大数据之服务域:node_exporter插件【三十七】
助力工业物联网,工业大数据之服务域:node_exporter插件【三十七】
40 1
|
6天前
|
存储 Prometheus Cloud Native
助力工业物联网,工业大数据之服务域:Prometheus的介绍【三十六】
助力工业物联网,工业大数据之服务域:Prometheus的介绍【三十六】
59 1

热门文章

最新文章