作者:mobiledu2502938577 | 来源:互联网 | 2023-09-12 14:11
背景笔者最近一个阶段做一个大数据方面的项目。和其他大数据项目使用Spark,ES不同,这个项目使用存文件的方式。写文件时把用户所需要的数据全部准备好,典型的以磁盘空间换用户查询时间的方式。大概流程如下
背景
笔者最近一个阶段做一个大数据方面的项目。和其他大数据项目使用Spark,ES不同,这个项目使用存文件的方式。
写文件时把用户所需要的数据全部准备好,典型的以磁盘空间换用户查询时间的方式。
大概流程如下:数据进来-->原始数据落磁盘-->小时数据汇总成各种数据报表-->天数据汇总成各种数据报表-->月数据汇总成各种报表。
原始数据量为170亿每天,最终生成各种报表后大概为200G每天,并且要做到数据具有实时性。
一些经验
1. 写代码的时候不用考虑性能问题。当前的环境是机器便宜,人贵,为了速度,时间,上线,先出东西再说。
2. 使用监控工具,比如Munin,看性能瓶颈在什么地方,是内存,CPU还是IO。
- CPU的情况,需要找出热点地区,推荐使用VisualVM, 看CPU最长的线程,函数,找出来,看是否代码有问题,计算是否有优化空间,如果没有只有加硬件一个方法。
- 内存情况,笔者为了减少IO情况,刚开始的时候,为了减少写磁盘的次数,把100个甚至1000个原始数据文件放在内存中,然后集中写, 但这样再遇到其他线程同时执行写磁盘操作的时候,往往造成outofmemory error 。 所以,需要根据数据量来估计内存大小。
- 尽量集中写,对于同一个文件,尽量集中写,而不是多次写。
- 磁盘情况。内存的buffer对磁盘IO非常重要,如果java进程挤占太多系统内存,导致buffer比较小,这会造成写磁盘非常非常的慢。buffer为操作系统对写文件操作buffer的空间,如果这个空间变小,会造成每一次写磁盘都直接跟比较慢的磁盘打交道。
内存图中绿色部分为应用程序所用,蓝色部分为buffer。 CPU图中,蓝色部分为用户所用,紫色部分为IO等待的CPU消耗时间。两边对比,可看出,当内存buffer比较小的时候,CPU IO等待时间非常大,这直接造成CPU的浪费,和数据的积压。所有java的xms参数不能把系统内存吃的太多。