大数据和云计算的关系
i. 数据不会被第三方修改(比如,是否有另一个应用也在修改这些数据?)云计算与大数据之间是相辅相成,相得益彰的关系。
海量数据查询 海量数据查询优化
海量数据查询 海量数据查询优化
云计算与大数据的区别
1、目的不同:大数据是为了发掘信息价值,而云计算主要是通过互联网管理资源,提供相应的服务。
2.Hashing3、背景不同:大数据的出现在于用户和各行各业所产生大的数据呈现几何倍数的增a) 实体延迟加载:通过使用实现长;云计算的出现在于用户服务需求的增长,以及企业处理业务的能力的提高。
4、价值不同:大数据的价值在于发掘数据的有效信息,云计算则可以大量节约使用成本。
hibernate的优化问题?
大数据挖掘处理需要云计算作为平台,而大数据涵盖的价值和规律则能够使云计算更好的与行业应用结合并发挥更大的作用。云计算将计算资源作为服务支撑大数据的挖掘,而大数据的发展趋势是对实时交互的海量数据查询、分析提供了各自需要的价值信息。大体上,对于HIBERNATE性能调优的主要考虑点如下:
数据库设计调整
HQL优化
API的正确使用(如根据不同的业务类型选用不同的及查询API)
主配置参数(日志,查询缓存,fetch_size, batch_size等)
映射文件优化(ID生成策略,二级缓存,延迟加载,关联优化)
一级缓存的管理
针对二级缓存,还有许多特有的策略
事务控制策略。
1、 数据库设计
a) 降低关联的复杂性
b) 尽量不使用联合主键
c) ID的生成机制,不同的数据库所提供的机制并不完全一样
d) 适当的冗余数据,不过分追求高范式
2、 HQL优化
HQL如果抛开它同HIBERNATE本身一些缓存机制的关联,HQL的优化技巧同普通的SQL优化技巧一样,可以很容易在网上找到一些经验之谈。
3、 主配置
a) 查询缓存,同下面讲的缓存不太一样,它是针对HQL语句的缓存,即完全一样的语句再次执行时可以利用缓存数据。但是,查询缓存在一个交易系统(数据变更频繁,查询条件相同的机率并不大)中可能会起反作用:它会白白耗费大量的系统资源但却难以派上用场。
b) fetch_size,同JDBC的相关参数作用类似,参数并不是越大越好,而应根据业务特征去设置
c) batch_size同上。
d) 生产系统中,切记要关掉SQL语句打印。
4、 缓存
b) SESSION缓存:在一个HIBERNATE SESSION有效,这级缓存的可干预性不强,大多于HIBERNATE自动管理,但它提供清除缓存的方法,这在大批量增加/更新作是有效的。比如,同时增加十万条记录,按常规方式进行,很可能会发现OutofMemeroy的异常,这时可能需要手动清除这一级缓存:Session.evict以及Session.clear
c) 应用缓存:在一个SESSIONFACTORY中有效,因此也是优化的重中之重,因此,各类策略也考虑的较多,在将数据放入这一级缓存之前,需要考虑一些前提条件:
ii.基本原理及要点:使用bit数组来表示某些元素是否存在,比如8位电话号码 数据不会太大
iii. 数据不会频繁更新(否则使用CACHE可能适得其反)
iv. 数据会被频繁查询
v. 数据不是关键数据(如涉及钱,安全等方面a) 数据库级缓存:这级缓存是效和安全的,但不同的数据库可管理的层次并不一样,比如,在ORACLE中,可以在建表时指定将整个表置于缓存当中。的问题)。
缓存有几种形式,可以在映射文件中配置:read-only(只读,适用于很少变更的静态数据/历史数据),nonstrict-read-write,read-write(比较普遍的形式,效率一般),transactional(JTA中,且支持的缓存产品较少)
d) 分布式缓存:同c)的配置一样,只是缓存产品的选用不同,在目前的HIBERNATE中可供选择的不多,oscache, jboss cache,目前的大多数项目,对它们的用于集群的使用(特别是关键交易系统)都持保守态度。在集群环境中,只利用数据库级的缓存是最安全的。
5、 延迟加载
b) 延迟加载:通过实现自有的SET/LIST,HIBERNATE提供了这方面的支持
c) 属性延迟加载:
6、 方法选用
a) 完成同样一件事,HIBERNATE提供了可供选择的一些方式,但具体使用什么方式,可能用性能/代码都会有影响。显示,一次返回十万条记录(List/Set/Bag/Map等)进行处理,很可能导致内存不够的问题,而如果用基于游标(ScrollableResults)或Iterator的结果集,则不存在这样的问题。
b) Session的load/get方法,前者会使用二级缓存,而后者则不使用。
c) Query和list/iterator,如果去仔细研究一下它们,你可能会发现很多有意思的情况,二者主要区别(如果使用了Spring,在HibernateTemplate中对应find,iterator方法):
i. list只能利用查询缓存(但在交易系统中查询缓存作用不大),无法利用二级缓存中的单个实体,但list查出的对象会写入二级缓存,但它一般只生成较少的执行SQL语句,很多情况就是一条(无关联)。
ii. iterator则可以利用二级缓存,对于一条查询语句,它会先从数据库中找出所有符合条件的记录的ID,再通过ID去缓存找,对于缓存中没有的记录,再构造语句从数据库中查出,因此很容易知道,如果缓存中没有任何符合条件的记录,使用iterator会产生N+1条SQL语句(N为符合条件的记录数)
iii. 通过iterator,配合缓存管理API,在海量数据查询中可以很好的解决内存问题,如:
while(it.hasNext()){
YouObject object = (YouObject)it.next();
session.evict(youObject);
sessionFactory.ev(YouObject.class, youObject.getId());
}如果用list方法,很可能就出OutofMemory错误了。
iv. 通过上面的说明,我想你应该知道如何去使用这两个方法了。
7、 的选用
在HIBERNATE 3.1文档的“19.5. Understanding Collection performance”中有详细的说明。
8、 事务控制
事务方面对性能有影响的主要包括:事务方式的选用,事务隔离级别以及锁的选用
a) 事务方式选用:如果不涉及多个事务管理器事务的话,不需要使用JTA,只有JDBC的事务控制就可以。
b) 事务隔离级别:参见标准的SQL事务隔离级别
c) 锁的选用:悲观锁(一般由具体的事务管理器实现),对于长事务效率低,但安全。乐观锁(一般在应用级别实现),如在HIBERNATE中可以定义VERSION字段,显然,如果有多个应用作数据,且这些应用不是用同一种乐观锁机制,则乐观锁会失效。因此,针对不同的数据应有不同的策略,同前面许多情况一样,很多时候我们是在效率与安全/准确性上找一个平衡点,无论如何,优化都不是一个纯技术的问题,你应该对你的应用和业务特征有足够的了解。
9、 批量作
即使是使用JDBC,在进行大批数据更新时,BATCH与不使用BATCH上也有很大的别。我们可以通过设置batch_size来让其支持批量作。
举个例子,要批量删除某表中的对象,如“delete Account”,打出来的语句,会发现HIBERNATE找出了所有ACCOUNT的ID,再进行删除,这主要是为了维护二级缓存,这样效率肯定高不了,在后续的版本中增加了bulk delete/update,但这也无法解决缓存的维护问题。也就是说,由于有了二级缓存的维护问题,HIBERNATE的批量作效率并不尽如人意!
如何处理海量数据
第三集-大数据与云计算。科技视野在实际的工作环境下,许多人会遇到海量数据这个复杂而艰巨的问题,它的主要难点有以下几个方面:
可用思路:trie树+堆,数据库索引,划分子集分别统计,hash,分布式计算,近似统计,外排序一、数据量过大,数据中什么情况都可能存在。
三、对海量数据进行分区作如果说有10条数据,那么大不了每条去逐一检查,人为处理,如果有上百条数据,也可以考虑,如果数据上到千万级别,甚至 过亿,那不是手工能解决的了,必须通过工具或者程序进行处理,尤其海量的数据中,什么情况都可能存在,例如,数据中某处格式出了问题,尤其在程序处理时, 前面还能正常处理,突然到了某个地方问题出现了,程序终止了。
二、软硬件要求高,系统资源占用率高。
对海量的数据进行处理,除了好的方法,最重要的就是合理使用工具,合理分配系统资源。一般情况,如果处理的数据过TB级,小型机是要考虑的,普通的机子如果有好的方法可以考虑,不过也必须加大CPU和内存,就象面对着千军万马,光有勇气没有一兵一卒是很难取胜的。
三、要求很高的处理方法和技巧。
这也是本文的写作目的所在,好的处理方法是一位工程师长期工作经验的积累,也是个人的经验的总结。没有通用的处理方法,但有通用的原理和规则。
下面我们来详细介绍一下处理海量数据的经验和技巧:
现在的数据库工具厂家比较多,对海量数据的处理对所使用的数据库工具要求比较高,一般使用Oracle或者DB2,微软 公司最近发布的SQL 2005性能也不错。另外在BI领域:数据库,数据仓库,数据库,数据挖掘等相关工具也要进行选择,象好的ETL工具和好的OLAP工具都十分必要, 例如Informatic,Easase等。笔者在实际数据分析项目中,对每天6000万条的日志数据进行处理,使用SQL 2000需要花费6小时,而使用SQL 2005则只需要花费3小时。
二、编写优良的程序代码
处理数据离不开的程序代码,尤其在进行复杂数据处理时,必须使用程序。好的程序代码对数据的处理至关重要,这不仅仅是数据处理准确度的问题,更是数据处理效率的问题。良好的程序代码应该包含好的算法,包含好的处理流程,包含好的效率,包含好的异常处理机制等。
对海量数据进行分区作十分必要,例如针对按年份存取的数据,我们可以按年进行分区,不同的数据库有不同的分区方式,不 过处理机制大体相同。例如SQL 的数据库分区是将不同的数据存于不同的文件组下,而不同的文件组存于不同的磁盘分区下,这样将数据分散开,减小磁盘I/O,减小了系统负荷, 而且还可以将日志,索引等放于不同的分区下。
四、建立广泛的索引
对海量的数据处理,对大表建立索引是必行的,建立索引要考虑到具体情况,例如针对大表的分组、排序等字段,都要建立相应 索引,一般还可以建立复合索引,对经常插入的表则建立索引时要小心,笔者在处理数据时,曾经在一个ETL流程中,当插入表时,首先删除索引,然后插入完 毕,建立索引,并实施聚合作,聚合完成后,再次插入前还是删除索引,所以索引要用到好的时机,索引的填充因子和聚集、非聚集索引都要考虑。
当数据量增加时,一般的处理工具都要考虑到缓存问题。缓存大小设置的好也关系到数据处理的成败,例如,笔者在处理2亿条数据聚合作时,缓存设置为100000条/Buffer,这对于这个级别的数据量是可行的。
六、加大虚拟内存
如果系统资源有限,内存提示不足,则可以靠增加虚拟内存来解决。笔者在实际项目中曾经遇到针对18亿条的数据进行处理, 内存为1GB,1个P42.4G的CPU,对这么大的数据量进行聚合作是有问题的,提示内存不足,那么采用了加大虚拟内存的方法来解决,在6块磁盘分区 上分别建立了6个4096M的磁盘分区,用于虚拟内存,这样虚拟的内存则增加为 40966 + 1024 =25600 M,解决了数据处理中的内存不足问题。
七、分批处理
海量数据处理难因为数据量大,那么解决海量数据处理难的问题其中一个技巧是减少数据量。可以对海量数据分批处理,然后处 理后的数据再进行合并作,这样逐个击破,有利于小数据量的处理,不至于面对大数据量带来的问题,不过这种方法也要因时因势进行,如果不允许拆分数据,还 需要另想办法。不过一般的数据按天、按月、按年等存储的,都可以采用先分后合的方法,对数据进行分开处理。
八、使用临时表和中间表
数据量增加时,处理中要考虑提前汇总。这样做的目的是化整为零,大表变小表,分块处理完成后,再利用一定的规则进行合 并,处理过程中的临时表的使用和中间结果的保存都非常重要,如果对于超海量的数据,大表处理不了,只能拆分为多个小表。如果处理过程中需要多步汇总作, 可按汇总步骤一步步来,不要一条语句完成,一口气吃掉一个胖子。
九、优化查询SQL语句
十、使用文本格式进行处理
对一般的数据处理可以使用数据库,如果对复杂的数据处理,必须借助程序,那么在程序作数据库和程序作文本之间选择, 是一定要选择程序作文本的,原因为:程序作文本速度快;对文本进行处理不容易出错;文本的存储不受限制等。例如一般的海量的网络日志都是文本格式或者 csv格式(文本格式),对它进行处理牵扯到数据清洗,是要利用程序进行处理的,而不建议导入数据库再做清洗。
十一、定制强大的清洗规则和出错处理机制
海量数据中存在着不一致性,极有可能出现某处的瑕疵。例如,同样的数据中的时间字段,有的可能为非标准的时间,出现的原因可能为应用程序的错误,系统的错误等,这是在进行数据处理时,必须制定强大的数据清洗规则和出错处理机制。
十二、建立视图或者物化视图
视图中的数据来源于基表,对海量数据的处理,可以将数据按一定的规则分散到各个基表中,查询或处理过程中可以基于视图进行,这样分散了磁盘I/O,正如10根绳子吊着一根柱子和一根吊着一根柱子的区别。
十三、避免使用32位机子(极端情况)
目前的计算机很多都是32位的,那么编写的程序对内存的需要便受限制,而很多的海量数据处理是必须大量消耗内存的,这便要求更好性能的机子,其中对位数的限制也十分重要。
十四、考虑作系统问题
海量数据处理过程中,除了对数据库,处理程序等要求比较高以外,对作系统的要求也放到了重要的位置,一般是必须使用的,而且对系统的安全性和稳定性等要求也比较高。尤其对作系统自身的缓存机制,临时空间的处理等问题都需要综合考虑。
十五、使用数据仓库和数据库存储
数据量加大是一定要考虑OLAP的,传统的报表可能5、6个小时出来结果,而基于Cube的查询可能只需要几分钟,因此处理海量数据的利器是OLAP分析,即建立数据仓库,建立数据集,基于数据集进行报表展现和数据挖掘等。
十六、使用采样数据,进行数据挖掘
基于海量数据的数据挖掘正在逐步兴起,面对着超海量的数据,一般的挖掘软件或算法往往采用数据抽样的方式进行处理,这样 的误不会很高,大大提高了处理效率和处理的。一般采样时要注意数据的完整性和,防止过大的偏。笔者曾经对1亿2千万行的表数据进行采样,抽取出 400万行,经测试软件测试处理的误为千分之五,客户可以接受。
还有一些方法,需要在不同的情况和场合下运用,例如使用键等作,这样的好处是加快了聚合时间,因为对数值型的聚合比对字符型的聚合快得多。类似的情况需要针对不同的需求进行处理。
海量数据是发展趋势,对数据分析和挖掘也越来越重要,从海量数据中提取有用信息重要而紧迫,这便要求处理要准确,精度要高,而且处理时间要短,得到有价值信息要快,所以,对海量数据的研究很有前途,也很值得进行广泛深入的研究。
Big Data详细资料大全
大数据说的是一种移动互联网和物联网背景下的应用场景,各种应用产生的巨量数据,需要处理和分析,挖掘有价值的信息;云计算说的是一种技术解决方案,就是利用这种技术可以解决计算、存储、数据库等一系列IT基础设施的按需构建的需求。两者并不是同一在对海量数据进行查询处理过程中,查询的SQL语句的性能对查询效率的影响是非常大的,编写高效优良的SQL脚本和存储 过程是数据库的职责,也是检验数据库水平的一个标准,在对SQL语句的编写过程中,例如减少关联,少用或不用游标,设计好高效的数据库表 结构等都十分必要。笔者在工作中试着对1亿行的数据使用游标,运行3个小时没有出结果,这是一定要改用程序处理了。个层面的东西。Big Data(大数据),或称巨量资料,指的是所涉及的资料量规模巨大到无法通过目前主流软体工具,在合理时间内达到撷取、管理、处理、并整理成为帮助企业经营决策更积极目的的资讯。
基本介绍 中文名 :大数据 外文名 :Big Data 或称 :巨量资料 包括 :数据量、时效性、多样性 基本信息,技术综述,Cache篇,分散式资料库,分散式系统篇,数据集市篇,NoSQL篇,总结, 基本信息 Big Data大数据,谈的不仅仅是数据量,其实包含了数据量(Volume)、时效性(Velocity)、多样性(Variety)、可疑性(Veracity): Volume:数据量大量数据的产生、处理、保存,谈的就是Big Data就字面上的意思,就是谈海量数据 Velocity:时效性这个词我有看到几个解释,但我认为用IBM的解释来说是比较恰当的,就是处理的时效,既然前头提到Big Data其中一个用途是做市场预测,那处理的时效如果太长就失去了预测的意义了,所以处理的时效对Big Data来说也是非常关键的,500万笔数据的深入分析,可能只能花5分钟的时间 Variety:多变性指的是数据的形态,包含文字、影音、网页、串流等等结构性、非结构性的数据 Veracity:可疑性指的是当数据的来源变得更多元时,这些数据本身的可靠度、质量是否足够,若数据本身就是有问题的,那分析后的结果也不会是正确的。 技术综述 Big Data是近来的一个技术热点,但从名字就能判断它并不是什么新词。毕竟,大是一个相对概念。历史上,资料库、数据仓库、数据集市等信息管理领域的技术,很大程度上也是为了解决大规模数据的问题。被誉为数据仓库之父的Bill Inmon早在20世纪90年代就经常将Big Data挂在嘴边了。 然而,Big Data作为一个专有名词成为热点,主要应归功于近年来网际网路、云计算、移动和物联网的迅猛发展。无所不在的移动设备、RFID、感测器每分每秒都在产生数据,数以亿计用户的网际网路服务时时刻刻在产生巨量的互动……要处理的数据量实在是太大、增长太快了,而业务需求和竞争压力对数据处理的实时性、有效性又提出了更高要求,传统的常规技术手段根本无法应付。 在这种情况下,技术人员纷纷研发和采用了一批新技术,主要包括分散式快取、基于MPP的分散式资料库、分散式档案系统、各种NoSQL分散式存储方案等。 10年前,Eric Brewer提出的CAP定理,指出:一个分散式系统不可能满足一致性、可用性和分区容忍性这三个需求,最多只能同时满足两个。系统的关注点不同,采用的策略也不一样。只有真正理解了系统的需求,才有可能利用好CAP定理。 架构师一般有两个方向来利用CAP理论。 Key-Value存储,如Amazon Dynamo等,可以根据CAP理论灵活选择不同倾向的资料库产品。 领域模型+分散式快取+存储,可根据CAP理论结合自己的项目定制灵活的分散式方案,但难度较高。 对大型网站,可用性与分区容忍性优先权要高于数据一致性,一般会尽量朝着A、P的方向设计,然后通过其他手段保证对于一致性的商务需求。架构设计师不要将精力浪费在如何设计能满足三者的完美分散式系统,而应该懂得取舍。 不同的数据对一致性的要求是不同的。SNS网站可以容忍相对较长时间的不一致,而不影响交易和用户体验;而像支付宝这样的交易和账务数据则是非常敏感的,通常不能容忍超过秒级的不一致。 Cache篇 快取在Web开发中运用越来越广泛,mem-cached是a(运营LiveJournal的技术团队)开发的一套分散式记忆体对象快取系统,用于在动态系统中减少资料库负载,提升性能。 图1 memcached构成 memcached具有以下特点: 协定简单;基于libnt的处理;内置记忆体存储方式;memcached不互相通信的分散式。 memcached处理的原子是每一个(Key,Value)对(以下简称KV对),Key会通过一个hash算法转化成hash-Key,便于查找、对比以及做到尽可能的散列。同时,memcached用的是一个二级散列,通过一张大hash表来维护。 memcached由两个核心组件组成:服务端(ms)和客户端(mc),在一个memcached的查询中,mc先通过计算Key的hash值来确定KV对所处在的ms位置。当ms确定后,mc就会传送一个查询请求给对应的ms,让它来查找确切的数据。因为这之间没有互动以及多播协定,所以memcached互动带给网路的影响是最小化的。 MemcacheDB是一个分散式、Key-Value形式的持久存储系统。它不是一个快取组件,而是一个基于对象存取的、可靠的、快速的持久存储引擎。协定与memcached一致(不完整),所以很多memcached客户端都可以跟它连线。MemcacheDB采用Berkeley DB作为持久存储组件,因此很多Berkeley DB的特性它都支持。 类似这样的产品也很多,如淘宝Tair就是Key-Value结构存储,在淘宝得到了广泛使用。后来Tair也做了一个持久化版本,思路基本与新浪MemcacheDB一致。 分散式资料库 支付宝公司在国内最早使用Greenplum资料库,将数据仓库从原来的Oracle RAC平台迁移到Greenplum集群。Greenplum强大的计算能力用来支持支付宝日益2、对象不同:大数据的对象是数据,云计算的对象是互联网资源以及应用等。发展的业务需求。Greenplum数据引擎软体专为新一代数据仓库所需的大规模数据和复杂查询功能所设计,基于MPP(海量并行处理)和Shared-Nothing(完全无共享)架构,基于开源软体和x86商用硬体设计(性价比更高)。 图2 Greenplum数据引擎软体 分散式系统篇 谈到分散式档案系统,不得不提的是Google的GFS。基于大量安装有Linux作业系统的普通PC构成的集群系统,整个集群系统由一台Master(通常有几台备份)和若干台Trunk构成。GFS中档案备份成固定大小的Trunk分别存储在不同的Trunk上,每个Trunk有多份(通常为3份)拷贝,也存储在不同的Trunk上。Master负责维护GFS中的 Metadata,即档案名称及其Trunk信息。客户端先从Master上得到档案的Metadata,根据要读取的数据在档案中的位置与相应的Trunk通信,获取档案数据。 在Google的论文发表后,就诞生了Hadoop。截至今日,Hadoop被很多网际网路公司所追捧,百度的搜寻日志分析,腾讯、淘宝和支付宝的数据仓库都可以看到Hadoop的身影。 引自Facebook工程师的Hive与Hadoop关系图 Hadoop具备低廉的硬体成本、开源的软体体系、较强的灵活性、允许用户自己修改代码等特点,同时能支持海量数据存储和计算任务。 Hive是一个基于Hadoop的数据仓库平台,将转化为相应的MapReduce程式基于Hadoop执行。通过Hive,开发人员可以方便地进行ETL开发。 如图所示,引用一张Facebook工程师做的Hive和Hadoop的关系图。 Yonghong Data Mart的Data Grid的分散式档案存储系统(DFS) 是在Hadoop HDFS基础上进行的改造和扩展,将伺服器集群内所有上存储的档案统一管理和存储。这些包括的一个NamingNode,在 DFS 内部提供元数据服务;许多MapNode,提供存储块。存储在 DFS 中的档案被分成块,然后将这些块到多个计算机中(Map Node)。这与传统的 RAID 架构大不相同。块的大小和的块数量在创建档案时由客户机决定。Naming Node存在伺服器集群内所有上的档案作,例如档案创建、删除、移动、重命名等等。 数据集市篇 数据集市(Data Mart) ,也叫数据市场,是一个从作的数据和其他的为某个特殊的专业人员团体服务的数据源中收集数据的仓库。从范围上来说,数据是从企业范围的资料库、数据仓库,或者是更加专业的数据仓库中抽取出来的。数据中心的重点就在于它迎合了专业用户群体的特殊需求,在分析、内容、表现,以及易用方面。数据中心的用户希望数据是由他们熟悉的术语表现的。 国外知名的Garnter关于数据集市产品报告中,位于象限的敏捷商业智慧型产品有QlikView, Tableau和SpotView,都是全记忆体计算的数据集市产品,在大数据方面对传统商业智慧型产品巨头形成了挑战。国内BI产品起步较晚,知名的敏捷型商业智慧型产品有PowerBI, 永洪科技的Z-Suite,SmartBI等,其中永洪科技的Z-Data Mart是一款热记忆体计算的数据集市产品。国内的德昂信息也是一家数据集市产品的系统集成商。 Yonghong Data Mart是永洪科技基于自有技术研发的一款数据存储、数据处理的软体。 Yonghong Data Mart底层技术: 1. 分散式计算 2. 分散式通信 3. 记忆体计算 4. 列存储 5. 库内计算 NoSQL篇 随着数据量增长,越来越多的人关注NoSQL,特别是2010年下半年,Facebook选择HBase来做实时讯息存储系统,替换原来开发的Cassandra系统。这使得很多人开始关注HBase。Facebook选择HBase是基于短期小批量临时数据和长期增长的很少被访问到的数据这两个需求来考虑的。 HBase是一个高可靠性、高性能、面向列、可伸缩的分散式存储系统,利用HBase技术可在廉价PC 上搭建大规模结构化存储集群。HBase是BigTable的开源实现,使用HDFS作为其档案存储系统。Google运行MapReduce来处理BigTable中的海量数据,HBase同样利用MapReduce来处理HBase中的海量数据;BigTable利用Chubby作为协同服务,HBase则利用Zookeeper作为对应。 总结 近来NoSQL资料库的使用越来越普及,几乎所有的大型网际网路公司都在这个领域进行着实践和探索。在享受了这类资料库与生俱来的扩展性、容错性、高读写吞吐外(尽管各主流NoSQL仍在不断完善中),越来越多的实际需求把人们带到了NoSQL并不擅长的其他领域,比如搜寻、准实时统计分析、简单事务等。实践中一般会在NoSQL的外围组合一些其他技术形成一个整体解决方案。 图4 线上套用系统与数据平台的无缝融入
求asp海量数据查询代码,如数据500W以上。100分
那你检索一下搜索引擎技术方面的资料。
这不是AS当然Hive的缺点非常明显,定义的是分钟级别的查询延迟,估计都是在比较理想的情况。 但是作为数据仓库的每日批量工具,的确是一个稳定合格的产品。P能完成的!
这种技术叫“全文检索”。
ASP目前还没有这种能力。
不过结合数据库SQL S初用HIBERNATE的人也许都遇到过性能问题,实现同一功能,用HIBERNATE与用JDBC性能相十几倍很正常,如果不及早调整,很可能影响整个项目的进度。ERVER可以做到。
可别说你500W的数据用的是ADruid的优点还是支持实时与查询功能,解约了很多开发工作。CCESS数据库哦。
你找找资料,是SQL SERVER的全文检索功能。得修改表结构了。不过对于500W的数据SQL能否吃得消我也不太清楚。但除此之外,你也没有别的好办法了。毕竟搜索引擎的技术不是人人都能搞的。
技术选型 - OLAP大数据技术哪家强?
Bloom filter将中的元素映射到位数组中,用k(k为哈希函数个数)个映射位是否全1表示元素在不在这个中。Counting bloom filter(CBF)将位数组中的每一位扩展为一个counter,从而支持了元素的删除作。Spectral Bloom Filter(SBF)将其与元素的出现次数关联。SBF采用counter中的最小值来近似表示元素的出现频率。Lambda架构的核心理念是“流批一体化”,因为随着机器性能和数据框架的不断完善,用户其实不关心底层是如何运行的,批处理也好,流式处理也罢,能按照统一的模型返回结果就可以了,这就是Lambda架构诞生的原因。现在很多应用,例如Spark和Flink,都支持这种结构,也就是数据进入平台后,可以选择批处理运行,也可以选择流式处理运行,但不管怎样,一致性都是相同的。
Kylin
Kylin的主要特点是预计算,提前计算好各个cube,这样的优点是查询快速,秒级延迟;缺点也非常明显,灵活性不足,无法做一些 探索 式的,关联性的数据分析。
适合的场景也是比较固定的,场景清晰的地方。
C“what”: {0, 1}lickHouse
Clickhouse由yandex公司开发。专为在线数据分析而设计。
Clickhouse的特点首先是快 ,为了快采用了列式储存,列式储存更好的支持压缩,压缩后的数据传输量变小,所以更快;同时支持分片,支持分布式执行,支持SQL。
ClickHouse很轻量级,支持数据压缩和最终数据一致性,其数据量级在PB级别。
另外Clickhouse不是为关联分析而生,所以多表关联支持的不太好。
同样Clickhouse不能修改或者删除数据,仅能用于批量删除或修改。没有完整的事务支持,不支持二级索引等等,缺点也非常明显。
与Kylin相比ClickHouse更加的灵活,sql支持的更好,但是相比Kylin,ClickHouse不支持大并发,也就是不能很多访问同时在线。
总之ClickHouse用于在线数据分析,支持功能简单。CPU 利用率高,速度极快。的场景用于行为统计分析。
Hive
Hive这个工具,大家一定很熟悉,大数据仓库的工具。可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能。
主要功能是可以将sql语句转换为相对应的MapReduce任务进行运行Druid是专为海量数据集上的做高性能 OLAP而设计的数据存储和分析系统。,这样可能处理海量的数据批量,
Hive与HDFS结合紧密,在大数据开始初期,提供一种直接使用sql就能访问HDFS的方案,摆脱了写MapReduce任务的方式,极大的降低了大数据的门槛。
Presto极大的改进了Hive的查询速度,而且Presto 本身并不存储数据,但是可以接入多种数据源,并且支持跨数据源的级联查询,支持包括复杂查询、聚合、连接等等。
Presto由于是基于内存的,缺点可能是多张大表关联作时易引起内存溢出错误。
另外Presto不支持OLTP的场景,所以不要把Presto当做数据库来使用。
Presto相比ClickHouse优点主要是多表join效果好。相比ClickHouse的支持功能简单,场景支持单一,Presto支持复杂的查询,应用范围更广。
Impala
Impala是Cloudera 公司推出,提供对 HDFS、Hbase 数据的高性能、低延迟的交互式 SQL 查询功能。
Impala 使用 Hive的元数据, 完全在内存中计算。是CDH 平台的 PB 级大数据实时查询分析引擎。
Impala 的缺点也很明显,首先依赖Hive,而且稳定性也稍,元数据需要单独的mysql/pgsql来存储,对数据源的支持比较少,很多nosql是不支持的。但是,估计是cloudera的国内市场推广做的不错,Impala在国内的市场不错。
SparkSQL
SparkSQL的前身是Shark,它将 SQL 查询与 Spark 程序无缝集成,可以将结构化数据作为 Spark 的 RDD 进行查询。
SparkSQL后续不再受限于Hive,只是兼容Hive。
SparkSQL提供了sql访问和API访问的接口。
支持访问各式各样的数据源,包括Hive, Avro, Parquet, ORC, JSON, and JDBC。
Drill好像国内使用的很少,根据定义,Drill是一个低延迟的分布式海量数据交互式查询引擎,支持多种数据源,包括hadoop,NoSQL存储等等。
除了支持多种的数据源,Drill跟BI工具集成比较好。
Druid
Druid 的架构是 Lambda 架构,分成实时层和批处理层。
Druid的核心设计结合了数据仓库,时间序列数据库和搜索系统的思想,以创建一个统一的系统,用于针对各种用例的实时分析。Druid将这三个系统中每个系统的关键特征合并到其接收层,存储格式,查询层和核心体系结构中。
Kudu
kudu是一套完全的分布式存储引擎,很多设计概念上借鉴了HBase,但是又跟HBase不同,不需要HDFS,通过raft做数据;分片策略支持keyrange和hash等多种。
数据格式在parquet基础上做了些修改,支持二级索引,更像一个列式存储,而不是HBase schema-free的kv方式。
kudu也是cloudera主导的项目,跟Impala结合比较好,通过impala可以支持update作。
Hbase
Hbase使用的很广,更多的是作为一个KV数据库来使用,查询的速度很快。
Hawq
Hawq是一个Hadoop原生大规模并行SQL分析引擎,Hawq采用 MPP 架构,改进了针对 Hadoop 的基于成本的查询优化器。
除了能高效处理本身的内部数据,还可通过 PXF 访问 HDFS、Hive、HBase、JSON 等外部数据源。HAWQ全面兼容 SQL 标准,还可用 SQL 完成简单的数据挖掘和机器学习。无论是功能特性,还是性能表现,HAWQ 都比较适用于构建 Hadoop 分析型数据仓库应用。
大数据可视化分析工具有哪些?
避免使用Hibernate框架Tableau 连续六年在Gather BI与数据分析魔力象限报告中占据地位的体量巨大的老牌产品。Tableau功能强大,注重细节,倾向于较专业的数据分析师,只要数据预先处理好,就可以制作很多绚丽多彩Drill的信息图。
Qlik Sense 作为一款典型的敏捷BI桌面软件,有着良好的性能,图形风格简洁清晰很好的突显了数据主体,覆盖数据源类型广且自建的qvd、qvx文件优化了数据加载速度,比直接录入数据文件或接入数据库更快。
DataFocus 支持中英文类自然语言搜索的数据分析系统,采用自动建模和简单搜索式的交互,系统便可以自动以数据或图表给予回答,支持进行数据筛选、钻取、数据联动等作,自由、多角度地分析数据。让不具备代码能力、不熟悉数据结构的业务人员也能迅速上手制作出美观深入的数据图形,DataFocus提供私有化部署系统的免费试用。
大数据可视化分析工具用了那么多,还是喜欢亿信ABI。其内置了非常多种统计图,比如常用的柱状图、折线图等,还有一些热门的统计图,比如:雷达图、风险图、力导向布局图等。同时,统计图支持多种配色,属性可以自定义,可以做出来很好看的展示效果。
ABI有一个分析模块叫可视化分析,其中的酷屏分析可以制作各种交互式常规屏、大屏。内置了百余种可视化效果组件,还可以自己定义HTML组件,编写js、css等就可以实现想要的效果,动态效果超赞。
大数据可视化分析工具,既然是大数据,那必须得有处理海量数据的能力和图形展现和交互的能力。能快速的收集、筛选、分析、归纳、展现决策者所需要的信息,并根据新增的数据进行实时更新。
这方面的工具一般是企业级的应用,像国外的Tableau、Qlik、Microsoft、SAS、IBM都有支持数据分析和分析结果展示的产品,个中优劣你可以分别去了解下。国内阵营的话,有侧重于可视化展示的也有侧重于数据分析的,两者兼有的以商业智能产品比如FineBI为代表。
大数据可视化分析工具国内有蛮多的,都是各有千秋。
OurwayBI数据可视化分析工具采用Node.js。Node.js是一个Jascript运行环境(runtime),它实际上是对Google V8引擎进行了封装。V8引擎执行Jascript的速度非常快,利用基于时间序列的内存计算技术,减少与数据库的交互,可大大提升效率。作指引更易上手:OurwayBI为了让用户不进行任何培训即可掌握常用作,设置了作指引,智能用户逐步掌握基本作及各项技巧。整个产品的UI进行了大量细节优化,以增加使用者的美观要求与使用体验等。
用BDP个人版和Tabluea这两款工具,都是可视化分析的工具,各有千秋。
1、Tabluea:之前他为了学习特地花钱买过Tabluea的个人版,话说真的蛮贵的,一年要999刀,就只买了一年,我也玩过他们很多功能,工具挺不错的,功能挺强大的,可视化效果真心不错,也有数据钻取、动态的功能效果,但是Tabluea真的太贵了。
2、BDP个人版:作并不难,函数那些不需要自己写,拖拽字段,然后选择图表类型就能出现各种可视化图表,还可以调整颜色等,可视化效果还是很不错的。而且BDP个人版有个好处:就是当我替换了工作表数据,我做可视化图表就会自动更新了,不需要重新劳动的感觉也是蛮好的。但是BDP个人版暂时不能接数据库,可能是因为免费吧,但这问题比较头痛,希望尽快能有。
大数据可视化分析工具,既然是大数据,那必须得有处理海量数据的能力和图形展现和交互的能力。能快速的收集、筛选、分析、归纳、展现决策者所需要的信息,并根据新增的数据进行实时更新。
这方面的工具一般是企业级的应用,像国外的Tableau、Qlik、Microsoft、SAS、IBM都有支持数据分析和分析结果展示的产品,个中优劣你可以分别去了解下。国内阵营的话,有侧重于可视化展示的也有侧重于数据分析的,两者兼有的以商业智能产品比如FineBI为代表。
国内的DataHunter
几款超级实用的数据可视Presto化工具,帮助数据分析一招亮眼
云计算和大数据的区别
目前 Druid 的去重都是非的,Druid 适合处理星型模型的数据,不支持关联作。也不支持数据的更新。云计算和大数据能做什么,很多人都分不清楚,那么云计算与大数据的关系是什么呢?今天就给大家简单的分析一下。
嵌套查询时 尽可能地在次select就把查询范围缩到最小云计算:云计算是通过互联网提供全球用户计算力、存储服务,为互联网信息处理提供硬件基础。云计算,简单说就是把你自己电脑里的或者公司上的硬盘、CPU都放到网上,统一动态调用,现在比较有名的云计算服务商是亚马逊的AWS。
大数据:大数据运用日趋成熟的云计算技术从浩瀚的互联网信息海洋中获得有价值的信息进行信息归纳、检索、整合,为互联网信息处理提供软件基础。大数据,简单说,就是把所有的数据放到一起分析,找到关联,实现预测。这里的所有数据对应的是之前的抽样调研取得的部分数据。
云计算与大数据的关系:
云计算是基础,没有云计算,无法实现大数据存储与计算。大数据是应用,没有大数据,云计算就缺少了目标与价值。两者都需要人工智能的参与,人工智能是互联网信息系统有序化后的一种商业应用。这才是:云计算与大数据真正的出口!
而商业智能中的智能从何而来?方法之一就是通过大数据这个工具来对大量数据进行处理,从而得出一些关联性的结论,从这些关联性中来获得,因此,大数据是商业智能的一种工具。 而大数据要分析大量的数据,这对于系统的计算能力和处理能力要求是非常高的,传统的方式是需要一个超级计算机来进行处理,但这样就导致了计算能力空的时候闲着、忙的时候又不够的问题, 而云计算的弹性扩展和水平扩展的模式很适合计算能力按需调用,因此,云计算为大数据提供了计算能力和资源等物质基础。
关于大数据和云计算的关系人们通常会有误解。而且也会把它们混起来说,分别做一句话直白解释就是:云计算就是硬件资源的虚拟化;大数据就是海量数据的高效处理。
虽然上面的一句话解释不是非常的贴切,但是可以帮助你简单的理解二者的区别。另外,如果做一个更形象的解释,云计算相当于我们的计算机和作系统,将大量的硬件资源虚拟化之后再进行分配使用,在云计算领域目前的老大应该算是Amazon,可以说为云计算提供了商业化的标准,另外值得关注的还有VMware(其实从这一点可以帮助你理解云计算和虚拟化的关系),开源的云平台最有活力的就是Openstack了;
大数据相当于海量数据的“数据库”,而且通观大数据领域的发展也能看出,当前的大数据处理一直在向着近似于传统数据库体验的方向发展,Hadoop的产生使我们能够用普通机器建立稳定的处理TB级数据的集群,把传统而昂贵的并行计算等概念一下就拉到了我们的面前,但是其不适合数据分析人员使用(因为MapReduce开发复杂),所以PigLatin和Hive出现了(分别是Yahoo!和facebook发起的项目,说到这补充一下,在大数据领域Google、facebook、twitter等前沿的互联网公司作出了很积极和强大的贡献),为我们带来了类SQL的作,到这里作方式像SQL了,但是处理效率很慢,和传统的数据库的处理效率有天壤之别,所以人们又在想怎样在大数据处理上不只是作方式类SQL,而处理速度也能“类SQL”,Google为我们带来了Dremel/PowerDrill等技术,Cloudera(Hadoop商业化最强的公司,Hadoop之父cutting就在这里负责技术)的Impala也出现了。
云计算(cloud computing)是基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。云是网络、互联网的一种比喻说法。过去在图中往往用云来表示电信网,后来也用来表示互联网和底层基础设施的抽象。狭义云计算指IT基础设施的交付和使用模式,指通过网络以按需、易扩展的方式获得所需资源;广义云计算指服务的交付和使用模式,指通过网络以按需、易扩展的方式获得所需服务。这种服务可以是IT和软件、互联网相关,也可是其他服务。它意味着计算能力也可作为一种商品通过互联网进行流通。
大数据(big data),或称海量数据,指的是所涉及的资料量规模巨大到无法透过目前主流软件工具,在合理时间内达到撷取、管理、处理、并整理成为帮助企业经营决策更积极目的的资讯。大数据的4V特点:Volume、Velocity、Variety、Veracity。
从技术上看,大数据与云计算的关系就像一枚硬的正反面一样密不可分。大数据必然无法用单台的计算机进行处理,必须采用分布式计算架构。它的特色在于对海量数据的挖掘,但它必须依托云计算的分布式处理、分布式数据库、云存储和虚拟化技术。
大数据管理,分布式进行文件系统,如Hadoop、Mapreduce数据分割与访问执行;同时SQL支持,以Hive+HADOOP为代表的SQL界面支持,在大数据技术上用云计算构建下一代数据仓库成为热门话题。从系统需求来看,大数据的架构对系统提出了新的挑战:
1、集成度更高。一个标准机箱限度完成特定任务。
2、配置更合理、速度更快。存储、、I/O通道、内存、CPU、网络均衡设计,针对数据仓库访问设计,比传统类似平台高出一个数量级以上。
3、整体能耗更低。同等计算任务,能耗。
5、管理维护费用低。数据藏的常规管理全部集成。
6、可规划和预见的系统扩容、升级路线图。
云计算是什么?
一般说来,它是基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。云计算是一种按使用量举个例子我们设错误率为0.01,则此时m应大概是n的13倍。这样k大概是8个。付费的IT服务模式,这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算资源共享池(资源包括网络,,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。
大数据是什么?
大数据的5V特点:Volume(大量)、Velocity(高速)、Variety(多样)、Value(低价值密度)、Veracity(真实性)。
大数据数据量大、产生的速度快且多样,同时大数据具有低价值密度的特点,同时大数据也可能会夹杂一些干扰,影响数据的真实性。
区别:
关系:
大数据是云计算非常重要的应用场景,而云计算则为大数据的处理和数据挖掘都提供了的技术解决方案。
大数据技术是指从各种各样类型的数据中,快速获得有价值信息的能力。适用于大数据的技术,包括大规模并行处理(MPP)数据库,数据挖掘电网,分布式文件系统,分布式数据库,云计算平台,互联网,和可扩展的存储系统。
云计算是基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。云是网络、互联网的一种比喻说法。过去在图中往往用云来表示电信网,后来也用来表示互联网和底层基础设施的抽象。
介绍一下海量数据的处理方法
4、系统更加稳定可靠。能够消除各种单点故障环节,统一一个部件、器件的品质和标准。介绍一下海量数据的处理方法
适用范围:可以用来实现数据字典,进行数据的判重,或者求交集
基本原理及要点:
对于原理来说很简单,位数组+k个hash函数。将hash函数对应的值的位数组置1,查找时如果发现所有hash函数对应位都是1说明存在,很明显这个过程并不保证查找的结果是正确的。同时也不支持删除一个已经插入的关键字,因为该关键字对应的位会牵动到其他的关键字。所以一个简单的改进就是 counting Bloom filter,用一个counter数组代替位数组,就可以支持删除了。
还有一个比较重要的问题,如 何根据输入元素个数n,确定位数组m的大小及hash函数个数。当hash函数个数k=(ln2)(m/n)时错误率最小。在错误率不大于E的情况 下,m至少要等于nlg(1/E)才能表示任意n个元素的。但m还应该更大些,因为还要保证bit数组里至少一半为0,则m应 该>=nlg(1/E)lge 大概就是nlg(1/E)1.44倍(lg表示以2为底的对数)。
注意这里m与n的单位不同,m是bit为单位,而n则是以元素个数为单位(准确的说是不同元素的个数)。通常单个元素的长度都是有很多bit的。所以使用bloom filter内存上通常都是节省的。
扩展:
问题实例:给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。如果是三个乃至n个文件呢?
根据这个问题我们来计算下内存的占用,4G=2^32大概是40亿8大概是340亿,n=50亿,如果按出错率0.01算需要的大概是650亿个bit。 现在可用的是340亿,相并不多,这样可能会使出错率上升些。另外如果这些ip是一一对应的,就可以转换成ip,则大大简单了。
适用范围:快速查找,删除的基本数据结构,通常需要总数据量可以放入内存
基本原理及要点:
hash函数选择,针对字符串,整数,排列,具体相应的hash方法。
碰撞处理,一种是open hashing,也称为拉链法;另一种就是closed hashing,也称开地址法,opened addressing。
扩展:
d-left hashing中的d是多个的意思,我们先简化这个问题,看一看2-left hashing。2-left hashing指的是将一个哈希表分成长度相等的两半,分别叫做T1和T2,给T1和T2分别配备一个哈希函数,h1和h2。在存储一个新的key时,同时用两个哈希函数进行计算,得出两个地址h1[key]和h2[key]。这时需要检查T1中的h1[key]位置和T2中的h2[key]位置,哪一个位置已经存储的(有碰撞的)key比较多,然后将新key存储在负载少的位置。如果两边一样多,比如两个位置都为空或者都存储了一个key,就把新key 存储在左边的T1子表中,2-left也由此而来。在查找一个key时,必须进行两次hash,同时查找两个位置。
问题实例:1).海量日志数据,提取出某日访问百度次数最多的那个IP。
IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。
3.bit-map
适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下
扩展:bloom filter可以看做是对bit-map的扩展
1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。
8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可。
2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。
将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map。
4.堆
适用范围:海量数据前n大,并且n比较小,堆可以放入内存
基本原理及要点:堆求前n小,最小堆求前n大。方法,比如求前n小,我们比较当前元素与堆里的元素,如果它小于元素,则应该替换那个元 素。这样得到的n个元素就是最小的n个。适合大数据量,求前n小,n的大小比较小的情况,这样可以扫描一遍即可得到所有的前n元素,效率很高。
扩展:双堆,一个堆与一个最小堆结合,可以用来维护中位数。
1)100w个数中找的前100个数。
用一个100个元素大小的最小堆即可。
5.双层桶划分
适用范围:第k大,中位数,不重复或重复的数字
基本原理及要点:因为元素范围很大,不能利用直接寻址表,所以通过多次划分,逐步确定范围,然后在一个可以接受的范围内进行。可以通过多次缩小,双层只是一个例子。
扩展:
1).2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。
有点像鸽巢原理,整数个数为2^32,也就是,我们可以将这2^32个数,划分为2^8个区域(比如用单个文件代表一个区域),然后将数据分离到不同的区域,然后不同的区域在利用bitmap就可以直接解决了。也就是说只要有足够的磁盘空间,就可以很方便的解决。
2).5亿个int找它们的中位数。
这个例子比上面那个更明显。首先我们将int划分为2^16个区域,然后读取数据统计落到各个区域里的数的个数,之后我们根据统计结果就可以判断中位数落到那个区域,同时知道这个区域中的第几大数刚好是中位数。然后第二次扫描我们只统计落在这个区域中的那些数就可以了。
实际上,如果不是int是int64,我们可以经过3次这样的划分即可降低到可以接受的程度。即可以先将int64分成2^24个区域,然后确定区域的第几 大数,在将该区域分成2^20个子区域,然后确定是子区域的第几大数,然后子区域里的数的个数只有2^20,就可以直接利用direct addr table进行统计了。
6.数据库索引
适用范围:大数据量的增删改查
基本原理及要点:利用数据的设计实现方法,对海量数据的增删改查进行处理。
扩展:
一、选用的数据库工具7.倒排索引(Inverted index)
适用范围:搜索引擎,关键字查询
基本原理及要点:为何叫倒排索引?一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。
以英文为例,下面是要被索引的文本:
T0 = “it is what it is”
T1 = “what is it”
T2 = “it is a banana”
我们就能得到下面的反向文件索引:
“a”: {2}
“banana”: {2}
“is”: {0, 1, 2}
“it”: {0, 1, 2}
检索的条件”what”, “is” 和 “it” 将对应的交集。
正 向索引开发出来用来存储每个文档的单词的列表。正向索引的查询往往满足每个文档有序频繁的全文查询和每个单词在校验文档中的验证这样的查询。在正向索引中,文档占据了中心的位置,每个文档指向了一个它所包含的索引项的序列。也就是说文档指向了它包含的那些单词,而反向索引则是单词指向了包含它的文档,很 容易看到这个反向的关系。
扩展:
问题实例:文档检索系统,查询那些文件包含了某单词,比如常见的学术论文的关键字搜索。
8.外排序
适用范围:大数据的排序,去重
基本原理及要点:外排序的归并方法,置换选择 败者树原理,归并树
扩展:
1).有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16个字节,内存限制大小是1M。返回频数的100个词。
这个数据具有很明显的特点,词的大小为16个字节,但是内存只有1m做hash有些不够,所以可以用来排序。内存可以当输入缓冲区使用。
9.trie树
适用范围:数据量大,重复多,但是数据种类小可以放入内存
基本原理及要点:实现方式,孩子的表示方式
扩展:压缩实现。
1).有10个文件,每个文件1G, 每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。要你按照query的频度排序 。
2).1000万字符串,其中有些是相同的(重复),需要把重复的全部去掉,保留没有重复的字符串。请问怎么设计和实现?
3).寻找热门查询:查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个,每个不超过255字节。
10.分布式处理 mapreduce
适用范围:数据量大,但是数据种类小可以放入内存
基本原理及要点:将数据交给不同的机器去处理,数据划分,结果归约。
扩展:
1).The canonical example application of MapReduce is a process to count the appearances of
each different word in a set of documents:
void map(String name, String document):
// name: document name
// document: document contents
for each word w in document:
EmitIntermediate(w, 1);
void reduce(String word, Iterator partialCounts):
// key: a word
// values: a list of aggregated partial counts
int result = 0;
for each v in partialCounts:
result += ParseInt(v);
Emit(result);
Here, each document is split in words, and each word is counted initially with a “1″ value by
the Map function, using the word as the result key. The framework puts toger all the pairs
with the same key and feeds them to the same call to Reduce, thus this function just needs to
sum all of its input values to find the total appearances of that word.
2).海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。
3).一共有N个机器,每个机器上有N个数。每个机器最多存O(N)个数并对它们作。如何找到N^2个数的中数(median)?
经典问题分析
上千万or亿数据(有重复),统计其中出现次数最多的前N个数据,分两kudu相对于原有parquet和ORC格式主要还是做增量更新的。种情况:可一次读入内存,不可一次读入。
所 谓的是否能一次读入内存,实际上应该指去除重复后的数据量。如果去重后数据可以放入内存,我们可以为数据建立字典,比如通过 map,hashmap,trie,然后直接进行统计即可。当然在更新每条数据的出现次数的时候,我们可以利用一个堆来维护出现次数最多的前N个数据,当 然这样导致维护次数增加,不如完全统计后在求前N大效率高。
如果数据无法放入内存。一方面我们可以考虑上面的字典方法能否被改进以适应这种情形,可以做的改变就是将字典存放到硬盘上,而不是内存,这可以参考数据库的存储方法。
当然还有更好的方法,就是可以采用分布式计算,基本上就是map-reduce过程,首先可以根据数据值或者把数据hash(md5)后的值,将数据按照范围划分到不同的机子,可以让数据划分后可以一次读入内存,这样不同的机子负责处理各种的数值范围,实际上就是map。得到结果后,各个机子只需拿出各 自的出现次数最多的前N个数据,然后汇总,选出所有的数据中出现次数最多的前N个数据,这实际上就是reduce过程。
实际上可能想直接将数据均分到不同的机子上进行处理,这样是无法得到正确的解的。因为一个数据可能被均分到不同的机子上,而另一个则可能完全聚集到一个机子上,同时还可 能存在具有相同数目的数据。比如我们要找出现次数最多的前100个,我们将1000万的数据分布到10台机器上,找到每台出现次数最多的前 100个,归并之后这样不能保证找到真正的第100个,因为比如出现次数最多的第100个可能有1万个,但是它被分到了10台机子,这样在每台上只有1千个,设这些机子排名在1000个之前的那些都是单独分布在一台机子上的,比如有1001个,这样本来具有1万个的这个就会被淘汰,即使我们让每台机子选出出现次数最多的1000个再归并,仍然会出错,因为可能存在大量个数为1001个的发生聚集。因此不能将数据随便均分到不同机子上,而是要根据hash 后的值将它们映射到不同的机子上处理,让不同的机器处理一个数值范围。
而外排序的方消耗大量的IO,效率不会很高。而上面的分布式方法,也可以用于单机版本,也就是将总的数据根据值的范围,划分成多个不同的子文件,然后逐个处理。处理完毕之后再对这些单词的及其出现频率进行一个归并。实际上就可以利用一个外排序的归并过程。
另外还可以考虑近似计算,也就是我们可以通过结合自然语言属性,只将那些真正实际中出现最多的那些词作为一个字典,使得这个规模可以放入内存。
Oracle千万条记录插入与查询小结
Presto没有使用MapReduce,它是通过一个定制的查询和执行引擎来完成的。它的所有的查询处理是在内存中,这也是它的性能很高的一个主要原因。最近做了个项目 实现对存在千万条记录的库表进行插入 查询作 原以为对数据库的插入 查询是件很容易的事 可不知当数据达到百万甚至千万条级别的时候 这一切似乎变得相当困难 几经折腾 总算完成了任务
五、建立缓存机制Hibernate用起来虽然方便 但对于海量数据的作显得力不从心
关于插入
试过用Hibernate一次性进行 万条左右数据的插入 若ID使用sequence方式生成 Hibernate将分 万次从数据库取得 万个sequence 构造成相应对象后 再分五万次将数据保存到数据库 花了我十分钟时间 主要的时间不是花在插入上 而是花在 万次从数据库取sequence上 弄得我相当郁闷 虽然后来把ID生成方式改成increase解决了问题 但还是对那十分钟的等待心有余悸
关于查询
Hibernate对数据库查询的主要思想还是面向对象的 这将使许多我们不需要查询的数据占用了大量的系统资源(包括数据库资源和本地资源) 由于对Hibernate的偏爱 本着不抛弃 不放弃的作风 做了包括配SQL 改进SQL等等的相当多的尝试 可都以失败告终 不得不忍痛割爱了
写查询语句时 要把查询的字段一一列出
查询时不要使用类似select from x_table的语句 要尽量使用select id name from x_table 以避免查询出不需要的数据浪费资源 对于海量数据而言 一个字段所占用的资源和查询时间是相当可观的
减少不必要的查询条件
当我们在做查询时 常常是前台提交一个查询表单到后台 后台解析这个表单 而后进行查询作 在我们解析表单时 为了方便起见 常常喜欢将一些不需要查询的条件用永真的条件来代替(如 select count(id) from x_table where name like % ) 其实这样的SQL对资源的浪费是相当可怕的 我试过对于同样的近一千万条记录的查询来说 使用select count(id) from x_table 进行表查询需要 秒 而使用select count(id) from x_table where name like % 却花了 秒
避免在查询时使用表连接
在做海量数据查询时 应尽量避免表连接(特别是左 右连接) 万不得已要进行表连接时 被连接的另一张表数据量一定不能太大 若连接的另一张表也是数万条的话 那估计可以考虑重新设计库表了 因为那需要等待的时间决不是正常用户所能忍受的
在有多个select嵌套查询的时候 应尽量在最内层就把所要查询的范围缩到最小 能分页的先分页 很多时候 就是这样简单地把分页放到内问题实例:层查询里 对查询效率来说能形成质的变化
lishixinzhi/Article/program/Oracle/201311/17394