关于海量数据处理分析的经验总结

     对海量的数据进行处理是一项艰巨而复杂的任务。缘由有如下几个方面:算法

        1、数据量过大,数据中什么状况均可能存在。若是说有10条数据,那么大不了每条去逐一检查,人为处理,若是有上百条数据,也能够考虑,若是数据上到千万级别,甚至过亿,那不是手工能解决的了,必须经过工具或者程序进行处理,尤为海量的数据中,什么状况均可能存在,例如,数据中某处格式出了问题,尤为在程序处理时,前面还能正常处理,忽然到了某个地方问题出现了,程序终止了。
        2、软硬件要求高,系统资源占用率高。对海量的数据进行处理,除了好的方法,最重要的就是合理使用工具,合理分配系统资源。通常状况,若是处理的数据过TB级,小型机是要考虑的,普通的机子若是有好的方法能够考虑,不过也必须加大CPU和内存,就象面对着千军万马,光有勇气没有一兵一卒是很难取胜的。
        3、要求很高的处理方法和技巧。这也是本文的写做目的所在,好的处理方法是一位工程师长期工做经验的积累,也是我的的经验的总结。没有通用的处理方法,但有通用的原理和规则。数据库

  那么处理海量数据有哪些经验和技巧呢,我把我所知道的罗列一下,以供你们参考:缓存

1、选用优秀的数据库工具
        如今的数据库工具厂家比较多,对海量数据的处理对所使用的数据库工具要求比较高,通常使用Oracle或者DB2,微软公司SQL Server 2005性能也不错。另外在BI领域:数据库,数据仓库,多维数据库,数据挖掘等相关工具也要进行选择,像好的ETL工具和好的OLAP工具都十分必要,例如Informatic,Eassbase等。笔者在实际数据处理项目中,对天天6000万条的日志数据进行处理,使用SQL Server 2000须要花费6小时,而使用SQL Server 2005则只须要花费3小时。
2、编写优良的程序代码
        处理数据离不开优秀的程序代码,尤为在进行复杂数据处理时,必须使用程序。好的程序代码对数据的处理相当重要,这不只仅是数据处理准确度的问题,更是数据处理效率的问题。良好的程序代码应该包含好的算法,包含好的处理流程,包含好的效率,包含好的异常处理机制等。
3、对海量数据进行分区操做
        对海量数据进行分区操做十分必要,例如针对按年份存取的数据,咱们能够按年进行分区,不一样的数据库有不一样的分区方式,不过处理机制大致相同。例如SQL Server的数据库分区是将不一样的数据存于不一样的文件组下,而不一样的文件组存于不一样的磁盘分区下,这样将数据分散开,减少磁盘I/O,减少了系统负荷,并且还能够将日志,索引等放于不一样的分区下。
4、创建普遍的索引
        对海量的数据处理,对大表创建索引是必行的,创建索引要考虑到具体状况,例如针对大表的分组、排序等字段,都要创建相应索引,通常还能够创建复合索引,对常常插入的表则创建索引时要当心,笔者在处理数据时,曾经在一个ETL流程中,当插入表时,首先删除索引,而后插入完毕,创建索引,并实施聚合操做,聚合完成后,再次插入前仍是删除索引,因此索引要用到好的时机,索引的填充因子和汇集、非汇集索引都要考虑。
5、创建缓存机制
        当数据量增长时,通常的处理工具都要考虑到缓存问题。缓存大小设置的好差也关系到数据处理的成败,例如,笔者在处理2亿条数据聚合操做时,缓存设置为100000条/Buffer,这对于这个级别的数据量是可行的。
6、加大虚拟内存
        若是系统资源有限,内存提示不足,则能够靠增长虚拟内存来解决。笔者在实际项目中曾经遇到针对18亿条的数据进行处理,内存为1GB,1个P4 2.4G的CPU,对这么大的数据量进行聚合操做是有问题的,提示内存不足,那么采用了加大虚拟内存的方法来解决,在6块磁盘分区上分别创建了6个4096M的磁盘分区,用于虚拟内存,这样虚拟的内存则增长为 4096*6 + 1024 = 25600 M,解决了数据处理中的内存不足问题。
7、分批处理
        海量数据处理难由于数据量大,那么解决海量数据处理难的问题其中一个技巧是减小数据量。能够对海量数据分批处理,而后处理后的数据再进行合并操做,这样逐个击破,有利于小数据量的处理,不至于面对大数据量带来的问题,不过这种方法也要因时因势进行,若是不容许拆分数据,还须要另想办法。不过通常的数据按天、按月、按年等存储的,均可以采用先分后合的方法,对数据进行分开处理。
8、使用临时表和中间表
        数据量增长时,处理中要考虑提早汇总。这样作的目的是化整为零,大表变小表,分块处理完成后,再利用必定的规则进行合并,处理过程当中的临时表的使用和中间结果的保存都很是重要,若是对于超海量的数据,大表处理不了,只能拆分为多个小表。若是处理过程当中须要多步汇总操做,可按汇总步骤一步步来,不要一条语句完成,一口气吃掉一个胖子。
9、优化查询SQL语句
        在对海量数据进行查询处理过程当中,查询的SQL语句的性能对查询效率的影响是很是大的,编写高效优良的SQL脚本和存储过程是数据库工做人员的职责,也是检验数据库工做人员水平的一个标准,在对SQL语句的编写过程当中,例如减小关联,少用或不用游标,设计好高效的数据库表结构等都十分必要。笔者在工做中试着对1亿行的数据使用游标,运行3个小时没有出结果,这是必定要改用程序处理了。
10、使用文本格式进行处理
        对通常的数据处理可使用数据库,若是对复杂的数据处理,必须借助程序,那么在程序操做数据库和程序操做文本之间选择,是必定要选择程序操做文本的,缘由为:程序操做文本速度快;对文本进行处理不容易出错;文本的存储不受限制等。例如通常的海量的网络日志都是文本格式或者csv格式(文本格式),对它进行处理牵扯到数据清洗,是要利用程序进行处理的,而不建议导入数据库再作清洗。
11、 定制强大的清洗规则和出错处理机制
        海量数据中存在着不一致性,极有可能出现某处的瑕疵。例如,一样的数据中的时间字段,有的可能为非标准的时间,出现的缘由可能为应用程序的错误,系统的错误等,这是在进行数据处理时,必须制定强大的数据清洗规则和出错处理机制。
12、 创建视图或者物化视图
        视图中的数据来源于基表,对海量数据的处理,能够将数据按必定的规则分散到各个基表中,查询或处理过程当中能够基于视图进行,这样分散了磁盘I/O,正如10根绳子吊着一根柱子和一根吊着一根柱子的区别。
十3、 避免使用32位机子(极端状况)
        目前的计算机不少都是32位的,那么编写的程序对内存的须要便受限制,而不少的海量数据处理是必须大量消耗内存的,这便要求更好性能的机子,其中对位数的限制也十分重要。
十4、考虑操做系统问题
        海量数据处理过程当中,除了对数据库,处理程序等要求比较高之外,对操做系统的要求也放到了重要的位置,通常是必须使用服务器的,并且对系统的安全性和稳定性等要求也比较高。尤为对操做系统自身的缓存机制,临时空间的处理等问题都须要综合考虑。
十5、使用数据仓库和多维数据库存储
        数据量加大是必定要考虑OLAP的,传统的报表可能五、6个小时出来结果,而基于Cube的查询可能只须要几分钟,所以处理海量数据的利器是OLAP多维分析,即创建数据仓库,创建多维数据集,基于多维数据集进行报表展示和数据挖掘等。
十6、使用采样数据,进行数据挖掘
        基于海量数据的数据挖掘正在逐步兴起,面对着超海量的数据,通常的挖掘软件或算法每每采用数据抽样的方式进行处理,这样的偏差不会很高,大大提升了处理效率和处理的成功率。通常采样时要注意数据的完整性和,防止过大的误差。笔者曾经对1亿2千万行的表数据进行采样,抽取出400万行,经测试软件测试处理的偏差为千分之五,客户能够接受。
        还有一些方法,须要在不一样的状况和场合下运用,例如使用代理键等操做,这样的好处是加快了聚合时间,由于对数值型的聚合比对字符型的聚合快得多。相似的状况须要针对不一样的需求进行处理。
       海量数据是发展趋势,对数据分析和挖掘也愈来愈重要,从海量数据中提取有用信息重要而紧迫,这便要求处理要准确,精度要高,并且处理时间要短,获得有价值信息要快,因此,对海量数据的研究颇有前途,也很值得进行普遍深刻的研究。安全

相关文章
相关标签/搜索