现在的位置: 首页 > 综合 > 正文

如何应对海量数据时代的挑战

2013年10月12日 ⁄ 综合 ⁄ 共 17616字 ⁄ 字号 评论关闭

如何应对海量数据时代的挑战?


大数据的浪潮有多迅猛?IDC在2006年估计全世界产生的数据量是0.18ZB(1ZB=100万PB),而今年这个数字已经提升了一个数量级,达到1.8ZB,差不多对应全世界每个人一块100多GB的硬盘。这种增长还在加速,预计2015年将达到近8ZB。目前IT系统的存储能力远远不足,就更不用说深入地挖掘和分析了。
在本文中,百度首席科学家威廉•张、Teradata首席客户官周俊凌、Yahoo!北京全球软件研发中心架构师韩轶平、SAP中国区企业信息管理咨询资深顾问杜韬等四位业内专家,将分享他们在应对海量数据挑战方面的见解和经验。

Teradata首席客户官周俊凌 百度首席科学家威廉•张 Yahoo!北京全球软件研发中心架构师韩轶平 SAP中国区企业信息管理咨询资深顾问杜韬

您所在企业的数据量现在达到了什么规模?
威廉•张:
这个问题比较容易回答。百度不是一个产品,不仅有搜索引擎,还包括很多社区产品和媒体产品,所以这个数字大概是数百个PB,每天处理的数据大约有几十个PB。我是差不多四年半前加入百度的,所以我比较清楚地记得那时候的规模。与那时相比,现在的数据规模成长比较惊人,大概是那时的500~1000倍。
数据量大并不可怕,问题是要实时处理数据,因为任何的时延都会使服务失去一些优势,从而导致商业经济的下降。我们所做的策略都是针对实时性的,而且今天互联网用户的需求更加实时化,比如说微博、团购、秒杀。
周俊凌:从IDC的数据统计报告来看,数据增长是非常快的。相对于具体的数据量,Teradata更关注数据发展的趋势,并大量投入研究这种发展趋势,包括BI方面的变化和增长模式,这个模式对于我们非常有价值,通过研究这种模式,包括每分钟、每秒钟交易量有多大等这些数据的发掘和建模,数据科学家进行研究和探讨,把这些技术应用到生产系统里面,对企业发挥作用。
韩轶平:Yahoo!的主要云计算平台Hadoop现在有34个集群,总数超过3万台机器,最大的集群是4000台左右,总存储容量超过100PB。这个数量级可以说并不大,主要原因在于我们最近将很多精力放在处理用户隐私性和数据安全性上,因为按照欧盟的规定,Yahoo!不能存储超过一年的数据,所以我们的应对措施就是:不保存原始数据,但做很深入的数据挖掘,挖掘出真正蕴含的有价值的信息,把这些信息保存下来。
杜韬:SAP作为企业级应用提供商,更关注客户的数据量,而我们的客户有许多数据密集型企业,比如电信、金融、政府、零售等,数据量级从几个TB到数百TB。SAP在德国总部的数据中心有3万台服务器,数据量大概是15PB,主要为客户提供服务。我们正在帮助客户将内部应用迁移到我们的数据中心服务平台,这也意味着越来越多的客户数据会存在我们这儿。

面对大数据,您是怎样进行处理分析的?
杜韬:
一方面在数据中心,我们使用了标准的虚拟化以及分布式存储;另一方面,我们推出了内存计算技术,用以应对数据应用和分析的挑战。传统的架构存在很大的瓶颈,磁盘读取是以毫秒,而内存读取则是纳秒。因此,我们将以前需要在应用层做的计算分析,比如预测分析或者大量运算,都放到内存里操作,从而实现性能提升,帮助用户充分利用数据。
韩轶平:对Yahoo!的情况,我想分三个部分来说明:数据采集、数据存储和数据处理。
在数据采集方面,我们建立了一个遍布Yahoo!几个数据中心、几十万台机器的实时搜集数据系统,该系统特点是一个主干道负责把数据经过过滤、清理以后,进行整合,并且在高可靠性的情况下,把它放到Hadoop平台。虽然相对来说精度很高、效果很好,但速度会慢一些。为了满足威廉•张所说实时性的需求,还有一个旁路系统,旁路系统在秒级能够把数据汇到主干道上,这是数据采集的部分。
在数据存储方面,基本上以HDFS为核心。在数据处理方面,主要技术是Hadoop、MapReduce以及我们自己开发的Pig。目前,我们有超过一半数据处理引擎是用Pig完成的。
周俊凌:Teradata一直在持续创新传统的企业级数据仓库产品线,在对接大数据时代的同时,继续传统的BI领域,包括提高数据处理的能力,从而更容易适应大数据管理。例如,通过数据访问频率高低确认数据温度,进行数据压缩,适应大数据的分析要求,使数据管理更容易。
我们有适应超高规模数据容量要求的硬件平台产品Teradata 1000,可以压缩35PB的数据。特别适用一些结构性数据和非结构性数据的分析,同时开发了很多能够进行数据统计和分析的软件包,包括将Hadoop等架构整合到Teradata数据仓库之中,可以基于目前的Teradata企业级数据仓库接口使用。
我们提供基于云的架构,能够使用Amazon EC2,为客户提供安全的存储产品,用来存储公司防火墙以外的、存储在云端的数据。我们刚刚收购了Aster Data公司,它有一些非常好的工具,适用于Hadoop、MapReduce的一些应用。
威廉•张:各互联网企业在云计算技术方面的应用都差不多,比如说百度也用了Hadoop,我提几个比较有特点的地方。
第一个是大搜索,即不仅是把网页抓过来,建立极其庞大的索引,而且为了使数据做到准实时或者更快速的更新,进行一些优化,比如根据地域分布和重要性分布,放在南方或者北方的机房里,主要还是根据数据应用制订的策略。另外就是采用数据流技术。
第二个是机器学习算法。在科技领域里,机器学习以前更多的是对一台服务器内存里的数据进行高复杂的计算,可能要跑很长时间。而在百度,机器学习应用于所有地方,比如判断用户需求,从用户行为反馈中得到我们应该推荐什么样的内容、匹配什么样的广告等,时效性非常高。可以称得上是增量型、大规模的机器学习方法。
此外,互联网应用要继续发展,最关键还是找到更有价值的数据,即不管数据来自何方,都要按照价值来决定如何处理它。
您怎样看待层出不穷的NoSQL技术?
杜韬:
我一直认为,存在的就是合理的,NoSQL的产生和演进也是因为我们现有的应用需求所导致。当前在大并发量、海量数据的高效读写等方面,对关系型数据库提出了更高的要求,而NoSQL在这方面有独特的价值和优势。
当然,这并不是说NoSQL的出现就代表着关系型数据库的世界末日,因为对于一些应用,特别是企业级应用,对于事务的一致性以及读写的实时性等各方面有很高的要求,而关系型数据库在这些年的发展中积累了自己的优势。
因此,我很认同NoSQL是“Not Only SQL”的说法,相信在未来关系型数据库和NoSQL会并存甚至是相互融合。
韩轶平:NoSQL是一个很宽泛的概念。在Yahoo!,虽然NoSQL说得不多,但用的NoSQL工具非常多,我们的Key-Value数据库等各种各样的系统,都属于NoSQL框架。至于说NoSQL和SQL之间的关系,因为很多场合需要ACID,也就需要NoSQL的东西,而NoSQL之所以会出现,就像我经常说的“上帝是公平的”,当有一个需求出现时必须放弃另一个东西。我们的很多需求,比如大数据量、高分布性,当有了这些需求以后另一个需求可能成为新的瓶颈。事实上,对我们来说,互联网行业在很多应用中并不需要一致性。当把需求放宽时,自然能够满足另一些需求。

怎样挖掘数据中的价值?
威廉•张:
我举一个直观的匹配广告的例子,它包括两类数据:一类是广告库,即广告内容信息和广告客户信息,这类信息很适合于传统数据库;另一类信息是用户看到广告之后的一切行为,经历了日积月累,可能会有几百万亿的用户行为。这两种数据可以相结合,经过机器学习算法就能产生价值。显然,第二种信息更重要,因为它能给用户提供想要的信息,比如搜索一个词,可以利用所有用户在他之前、在他之后的群体智能、群体行为,判定哪一类的信息最重要、最优质,哪一类信息可能是作弊信息,然后经过反馈机制,把最好的内容提供给用户,甚至推荐相关的一些搜索、查询信息。总而言之,对任何企业来说,数据是命根子;对云计算来说,数据处理就是云数据中心或者云计算存在的理由。
韩轶平:我们工作之余经常开玩笑说:从数据中能挖出的东西,不一定是钱,更重要的是用户体验,对互联网公司来说,数据就是一切。
Yahoo!不仅仅是搜索引擎,也有很多在美国各领域中排名第一的网站。我们做的很多工作,比如新闻网站信息,都是根据新闻的相关性和大家的兴趣推荐的,我们希望根据每一个用户自己的兴趣,甚至每一个用户此时此刻的兴趣,进行推荐。Yahoo!新闻的推荐系统,是把Yahoo!所有的数据搜集起来,用户在Yahoo!搜索上的所有行为都搜集到一起,做深度挖掘和个性化,对每一个用户都进行分析和推荐,没有这些数据我们不可能为客户提供体验,数据对我们来说就是一切。
杜韬:既然各位是从互联网的角度来看数据的价值,那么我就从企业的角度来分享一下。
智能电网现在欧洲已经做到了终端,也就是所谓的智能电表。在德国,为了鼓励利用太阳能,会在家庭安装太阳能,除了卖电给你,当你的太阳能有多余电的时候还可以买回来。通过电网收集每隔五分钟或十分钟收集一次数据,收集来的这些数据可以用来预测客户的用电习惯等,从而推断出在未来2~3个月时间里,整个电网大概需要多少电。有了这个预测后,就可以向发电或者供电企业购买一定数量的电。因为电有点像期货一样,如果提前买就会比较便宜,买现货就比较贵。通过这个预测后,可以降低采购成本。
另一个例子更偏我个人的兴趣。丹•布朗的《失落的秘符》一书讲到,如果把很多人的精神集中在一个点,能够移动物体。当然这个我们无从考证,但我们在网上搜索关键词、敏感词时,就可以判断出某件事情的公众态度。有一些新的业务模式,比如做一个网络广告投放评估公司,利用这样的技术评估网络广告的效果,我觉得也许是未来的业务价值产生点。
海量数据时代对企业和技术人员带来了哪些挑战?
韩轶平:
以前我们都说自己是软件工程师,我们这个行业也经常被叫做软件行业,但我认为我们是真正的Information Technology行业。对大多数人来说,现在最重要的一点是转变观念,从Code/Program观念转变成Data观念,在做任何设计和开发时,要把Data放在第一位。
杜韬:海量数据一直在增长,但是我们应该想办法控制下来,未来的趋势应该放在怎样缩小海量数据上,而不是任凭它扩张。此外,海量数据时代对中国来说是一次引领世界IT业的机会。
周俊凌:在云计算时代,业务数据与云紧密结合在一起,提供业务开发的能力,我们从中学到了很多新的东西,有一些东西不再是自己去存储和开发,而是都放在云里面存储。技术产品推向市场的方式与以往相比,发生了很大变化。云的这样一种环境也给数据库提供商带来很多技术上的挑战,例如如何保证存储的安全性,包括身份识别的健全。这关系到数据的存储地方,例如现在发货的数据都是放在全球任何一个地方,不是放在某一个国家里面,这就带来关于数据主权的问题,可能有一些国家和政府不允许把数据放在国家某些地方,这都是一些挑战,需要从技术上解决安全等问题。

威廉•张:这里我浅谈一下两点感受。
首先,数据管理是DBA的一项重要本领,而高校的计算机专业教育里没有特别重视数据程序员,并没有数据管理员;其次,MapReduce并不是一个新概念,早在30~40年前当计算机能力还超小的时候,函数式编程语言就出现了,但至今大学里还没有开设MapReduce或者类似数据处理的课程,也基本上没有人听过这些东西。

未来将所有人的生活经验数据放在云里,这个大概可以实现,但如果解决不好数据安全性问题的话,那么距离最终的实现就会很远。我期待云计算变成云知识、云智能,而不仅仅是计算的工具。建立数据整合分享是云计算成功的必要和充分条件。

前言

    本博客内曾经整理过有关海量数据处理的10道面试题(十道海量数据处理面试题与十个方法大总结),此次除了重复了之前的10道面试题之后,重新多整理了7道。仅作各位参考,不作它用。
    同时,程序员编程艺术系列将重新开始创作,第十一章以后的部分题目来源将取自下文中的17道海量数据处理的面试题。因为,我们觉得,下文的每一道面试题都值得重新思考,重新深究与学习。再者,编程艺术系列的前十章也是这么来的。若您有任何问题或建议,欢迎不吝指正。谢谢。
第一部分、十五道海量数据处理面试题
1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
    方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。

  1. 遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个小文件(记为)中。这样每个小文件的大约为300M。
  2. 遍历文件b,采取和a相同的方式将url分别存储到1000小文件中(记为)。这样处理后,所有可能相同的url都在对应的小文件()中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。
  3. 求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。

    方案2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。
    读者反馈@crowgns:

  1. hash后要判断每个文件大小,如果hash分的不均衡有文件较大,还应继续hash分文件,换个hash算法第二次再分较大的文件,一直分到没有较大的文件为止。这样文件标号可以用A1-2表示(第一次hash编号为1,文件较大所以参加第二次hash,编号为2)
  2. 由于1存在,第一次hash如果有大文件,不能用直接set的方法。建议对每个文件都先用字符串自然顺序排序,然后具有相同hash编号的(如都是1-3,而不能a编号是1,b编号是1-1和1-2),可以直接从头到尾比较一遍。对于层级不一致的,如a1,b有1-1,1-2-1,1-2-2,层级浅的要和层级深的每个文件都比较一次,才能确认每个相同的uri。

2. 有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。
方案1:

  1. 顺序读取10个文件,按照hash(query)%10的结果将query写入到另外10个文件(记为)中。这样新生成的文件每个的大小大约也1G(假设hash函数是随机的)。
  2. 找一台内存在2G左右的机器,依次对用hash_map(query, query_count)来统计每个query出现的次数。利用快速/堆/归并排序按照出现次数进行排序。将排序好的query和对应的query_cout输出到文件中。这样得到了10个排好序的文件(记为)。
  3. 这10个文件进行归并排序(内排序与外排序相结合)。

方案2:
    一般query的总量是有限的,只是重复的次数比较多而已,可能对于所有的query,一次性就可以加入到内存了。这样,我们就可以采用trie树/hash_map等直接来统计每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了。
方案3:
    与方案1类似,但在做完hash,分成多个文件后,可以交给多个文件来处理,采用分布式的架构来处理(比如MapReduce),最后再进行合并。
3. 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。
    方案1:顺序读文件中,对于每个词x,取,然后按照该值存到5000个小文件(记为)中。这样每个文件大概是200k左右。如果其中的有的文件超过了1M大小,还可以按照类似的方法继续往下分,知道分解得到的小文件的大小都不超过1M。对每个小文件,统计每个文件中出现的词以及相应的频率(可以采用trie树/hash_map等),并取出出现频率最大的100个词(可以用含100个结点的最小堆),并把100词及相应的频率存入文件,这样又得到了5000个文件。下一步就是把这5000个文件进行归并(类似与归并排序)的过程了。
4. 海量日志数据,提取出某日访问百度次数最多的那个IP。
    方案1:首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。
5. 在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.5亿个整数。
    方案1:采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义)进行,共需内存2^32*2bit=1GB内存,还可以接受。然后扫描这2.5亿个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完事后,查看bitmap,把对应位是01的整数输出即可。
    方案2:也可采用上题类似的方法,进行划分小文件的方法。然后在小文件中找出不重复的整数,并排序。然后再进行归并,注意去除重复的元素。
6. 海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10。
方案1:

  1. 在每台电脑上求出TOP10,可以采用包含10个元素的堆完成(TOP10小,用最大堆,TOP10大,用最小堆)。比如求TOP10大,我们首先取前10个元素调整成最小堆,如果发现,然后扫描后面的数据,并与堆顶元素比较,如果比堆顶元素大,那么用该元素替换堆顶,然后再调整为最小堆。最后堆中的元素就是TOP10大。
  2. 求出每台电脑上的TOP10后,然后把这100台电脑上的TOP10组合起来,共1000个数据,再利用上面类似的方法求出TOP10就可以了。

(更多可以参考:第三章、寻找最小的k个数,以及第三章续、Top K算法问题的实现
7. 怎么在海量数据中找出重复次数最多的一个?
    方案1:先做hash,然后求模映射为小文件,求出每个小文件中重复次数最多的一个,并记录重复次数。然后找出上一步求出的数据中重复次数最多的一个就是所求(具体参考前面的题)。
8. 上千万或上亿数据(有重复),统计其中出现次数最多的钱N个数据。
    方案1:上千万或上亿的数据,现在的机器的内存应该能存下。所以考虑采用hash_map/搜索二叉树/红黑树等来进行统计次数。然后就是取出前N个出现次数最多的数据了,可以用第6题提到的堆机制完成。
9. 1000万字符串,其中有些是重复的,需要把重复的全部去掉,保留没有重复的字符串。请怎么设计和实现?
    方案1:这题用trie树比较合适,hash_map也应该能行。
10. 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。
    方案1:这题是考虑时间效率。用trie树统计每个词出现的次数,时间复杂度是O(n*le)(le表示单词的平准长度)。然后是找出出现最频繁的前10个词,可以用堆来实现,前面的题中已经讲到了,时间复杂度是O(n*lg10)。所以总的时间复杂度,是O(n*le)与O(n*lg10)中较大的哪一个。
11. 一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入内存,问最优解。
    方案1:首先根据用hash并求模,将文件分解为多个小文件,对于单个文件利用上题的方法求出每个文件件中10个最常出现的词。然后再进行归并处理,找出最终的10个最常出现的词。
12. 100w个数中找出最大的100个数。

  •     方案1:在前面的题中,我们已经提到了,用一个含100个元素的最小堆完成。复杂度为O(100w*lg100)。
  •     方案2:采用快速排序的思想,每次分割之后只考虑比轴大的一部分,知道比轴大的一部分在比100多的时候,采用传统排序算法排序,取前100个。复杂度为O(100w*100)。
  •     方案3:采用局部淘汰法。选取前100个元素,并排序,记为序列L。然后一次扫描剩余的元素x,与排好序的100个元素中最小的元素比,如果比这个最小的要大,那么把这个最小的元素删除,并把x利用插入排序的思想,插入到序列L中。依次循环,知道扫描了所有的元素。复杂度为O(100w*100)。

13. 寻找热门查询:
搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录,这些查询串的重复读比较高,虽然总数是1千万,但是如果去除重复和,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。
(1) 请描述你解决这个问题的思路;
(2) 请给出主要的处理流程,算法,以及算法的复杂度。
    方案1:采用trie树,关键字域存该查询串出现的次数,没有出现为0。最后用10个元素的最小推来对出现频率进行排序。
14. 一共有N个机器,每个机器上有N个数。每个机器最多存O(N)个数并对它们操作。如何找到N^2个数中的中数?
    方案1:先大体估计一下这些数的范围,比如这里假设这些数都是32位无符号整数(共有2^32个)。我们把0到2^32-1的整数划分为N个范围段,每个段包含(2^32)/N个整数。比如,第一个段位0到2^32/N-1,第二段为(2^32)/N到(2^32)/N-1,…,第N个段为(2^32)(N-1)/N到2^32-1。然后,扫描每个机器上的N个数,把属于第一个区段的数放到第一个机器上,属于第二个区段的数放到第二个机器上,…,属于第N个区段的数放到第N个机器上。注意这个过程每个机器上存储的数应该是O(N)的。下面我们依次统计每个机器上数的个数,一次累加,直到找到第k个机器,在该机器上累加的数大于或等于(N^2)/2,而在第k-1个机器上的累加数小于(N^2)/2,并把这个数记为x。那么我们要找的中位数在第k个机器中,排在第(N^2)/2-x位。然后我们对第k个机器的数排序,并找出第(N^2)/2-x个数,即为所求的中位数的复杂度是O(N^2)的。
    方案2:先对每台机器上的数进行排序。排好序后,我们采用归并排序的思想,将这N个机器上的数归并起来得到最终的排序。找到第(N^2)/2个便是所求。复杂度是O(N^2*lgN^2)的。
15. 最大间隙问题
给定n个实数,求着n个实数在实轴上向量2个数之间的最大差值,要求线性的时间算法。
方案1:最先想到的方法就是先对这n个数据进行排序,然后一遍扫描即可确定相邻的最大间隙。但该方法不能满足线性时间的要求。故采取如下方法:

  1. 找到n个数据中最大和最小数据max和min。
  2. 用n-2个点等分区间[min, max],即将[min, max]等分为n-1个区间(前闭后开区间),将这些区间看作桶,编号为,且桶i 的上界和桶i+1的下届相同,即每个桶的大小相同。每个桶的大小为:。实际上,这些桶的边界构成了一个等差数列(首项为min,公差为),且认为将min放入第一个桶,将max放入第n-1个桶。
  3. 将n个数放入n-1个桶中:将每个元素x 分配到某个桶(编号为index),其中,并求出分到每个桶的最大最小数据。
  4. 最大间隙:除最大最小数据max和min以外的n-2个数据放入n-1个桶中,由抽屉原理可知至少有一个桶是空的,又因为每个桶的大小相同,所以最大间隙不会在同一桶中出现,一定是某个桶的上界和气候某个桶的下界之间隙,且该量筒之间的桶(即便好在该连个便好之间的桶)一定是空桶。也就是说,最大间隙在桶i的上界和桶j的下界之间产生j>=i+1。一遍扫描即可完成。

16. 将多个集合合并成没有交集的集合
    给定一个字符串的集合,格式如:。要求将其中交集不为空的集合合并,要求合并完成的集合之间无交集,例如上例应输出

(1) 请描述你解决这个问题的思路;
(2) 给出主要的处理流程,算法,以及算法的复杂度;
(3) 请描述可能的改进。

    方案1:采用并查集。首先所有的字符串都在单独的并查集中。然后依扫描每个集合,顺序合并将两个相邻元素合并。例如,对于,首先查看aaa和bbb是否在同一个并查集中,如果不在,那么把它们所在的并查集合并,然后再看bbb和ccc是否在同一个并查集中,如果不在,那么也把它们所在的并查集合并。接下来再扫描其他的集合,当所有的集合都扫描完了,并查集代表的集合便是所求。复杂度应该是O(NlgN)的。改进的话,首先可以记录每个节点的根结点,改进查询。合并的时候,可以把大的和小的进行合,这样也减少复杂度。
17. 最大子序列与最大子矩阵问题
数组的最大子序列问题:给定一个数组,其中元素有正,也有负,找出其中一个连续子序列,使和最大。
    方案1:这个问题可以动态规划的思想解决。设b表示以第i个元素a结尾的最大子序列,那么显然。基于这一点可以很快用代码实现。
最大子矩阵问题:给定一个矩阵(二维数组),其中数据有大有小,请找一个子矩阵,使得子矩阵的和最大,并输出这个和。
    方案2:可以采用与最大子序列类似的思想来解决。如果我们确定了选择第i列和第j列之间的元素,那么在这个范围内,其实就是一个最大子序列问题。如何确定第i列和第j列可以词用暴搜的方法进行。

第二部分、海量数据处理之Bti-map详解

    Bloom Filter已在上一篇文章海量数据处理之Bloom Filter详解中予以详细阐述,本文接下来着重阐述Bit-map。有任何问题,欢迎不吝指正。

什么是Bit-map
    所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。
    如果说了这么多还没明白什么是Bit-map,那么我们来看一个具体的例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采用Bit-map的方法来达到排序的目的。要表示8个数,我们就只需要8个Bit(1Bytes),首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0(如下图:)

    然后遍历这5个元素,首先第一个元素是4,那么就把4对应的位置为1(可以这样操作 p+(i/8)|(0×01<<(i%8)) 当然了这里的操作涉及到Big-ending和Little-ending的情况,这里默认为Big-ending),因为是从零开始的,所以要把第五位置为一(如下图):

      

然后再处理第二个元素7,将第八位置为1,,接着再处理第三个元素,一直到最后处理完所有的元素,将相应的位置为1,这时候的内存的Bit位的状态如下:

然后我们现在遍历一遍Bit区域,将该位是一的位的编号输出(2,3,4,5,7),这样就达到了排序的目的。下面的代码给出了一个BitMap的用法:排序。
view plain

    //定义每个Byte中有8个Bit位  #include
    <memory.h>
      
    #define
    BYTESIZE 8
      
    void
    SetBit(
    char *p,
    int posi)  
    {      for(int
    i=0; i < (posi/BYTESIZE); i++)  
        {          p++;      }        *p
    = *p|(0x01<<(posi%BYTESIZE));//将该Bit位赋值1  
        return;  }    void
    BitMapSortDemo()  
    {      //为了简单起见,我们不考虑负数      int
    num[] = {3,5,2,10,6,12,8,14,9};  
          //BufferLen这个值是根据待排序的数据中最大值确定的      //待排序中的最大值是14,因此只需要2个Bytes(16个Bit)      //就可以了。      const
    int BufferLen = 2;  
        char
    *pBuffer =
    new
    char[BufferLen];  
          //要将所有的Bit位置为0,否则结果不可预知。      memset(pBuffer,0,BufferLen);      for(int
    i=0;i<9;i++)  
        {          //首先将相应Bit位上置为1          SetBit(pBuffer,num);      }        //输出排序结果      for(int
    i=0;i<BufferLen;i++)
    //每次处理一个字节(Byte)  
        {          for(int
    j=0;j<BYTESIZE;j++)
    //处理该字节中的每个Bit位  
            {              //判断该位上是否是1,进行输出,这里的判断比较笨。              //首先得到该第j位的掩码(0x01<<j),将内存区中的              //位和此掩码作与操作。最后判断掩码是否和处理后的              //结果相同              if((*pBuffer&(0x01<<j))
    == (0x01<<j))  
                {                  printf("%d
    "
    ,i*BYTESIZE + j);  
                }          }          pBuffer++;      }  }    int
    _tmain(
    int argc, _TCHAR* argv[])  
    {      BitMapSortDemo();      return
    0;  
    }  

可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下
基本原理及要点
使用bit数组来表示某些元素是否存在,比如8位电话号码
扩展
Bloom filter可以看做是对bit-map的扩展(关于Bloom filter,请参见:海量数据处理之Bloom filter详解)。
问题实例
1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。
    8位最多99 999 999,大概需要99m个bit,大概10几m字节的内存即可。 (可以理解为从0-99 999 999的数字,每个数字对应一个Bit位,所以只需要99M个Bit==1.2MBytes,这样,就用了小小的1.2M左右的内存表示了所有的8位数的电话)
2)2.5亿个整数中找出不重复的整数的个数,内存空间不足以容纳这2.5亿个整数。
    将bit-map扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上,在遍历这些数的时候,如果对应位置的值是0,则将其置为1;如果是1,将其置为2;如果是2,则保持不变。或者我们不用2bit来进行表示,我们用两个bit-map即可模拟实现这个2bit-map,都是一样的道理。

整理自:

  1. http://www.cnblogs.com/youwang/archive/2010/07/20/1781431.html
  2. http://blog.redfox66.com/post/2010/09/26/mass-data-4-bitmap.aspx

usidc5 2011-08-20 22:59

导读:Yahoo CTO Raymie Stata是领导海量数据分析引擎的关键人物。IBM和Hadoop将更多的精力专注在海量数据上,海量数据正在潜移默化的改变企业和IT部门。

越来越多的大企业的数据集以及创建需要的一切技术,包括存储、网络、分析、归档和检索等,这些被认为是海量数据。这些大量信息直接推动了存储、服务器以及安全的发展。同时也是给IT部门带来了一系列必须解决的问题。
信息技术研究和分析的公司Gartner认为海量数据处理应该是将大量的不同种类以及结构化和非结构化的数据通过网络汇集到处理器和存储设备之中,并伴随着将这些数据转换为企业的商业报告。
海量数据处理的三个主要因素:大容量数据、多格式数据和速度
大容量数据(TB级、PB级甚至EB级):人们和机器制造的越来越多的业务数据对IT系统带来了更大的挑战,数据的存储和安全以及在未来访问和使用这些数据已成为难点。
多格式数据:海量数据包括了越来越多不同格式的数据,这些不同格式的数据也需要不同的处理方法。从简单的电子邮件、数据日志和信用卡记录,再到仪器收集到的科学研究数据、医疗数据、财务数据以及丰富的媒体数据(包括照片、音乐、视频等)。
速度:速度是指数据从端点移动到处理器和存储的速度。

Kusnetzky集团的分析师Dan Kusnetzky在其博客表示“简单的说,大数据是指允许组织创建、操作和管理的庞大的数据集和存储设施工具”。这是否意味着将来将会出现比TB和PB更大的数据集吗?供应商给出的回应是“会出现”。
他们也许会说“你需要我们的产品来管理和组织利用大规模的数据,只是想想繁杂大量的维护动态数据集带来的麻烦就使人们头疼“。此外海量数据的另外一个价值是它可以帮助企业在适当的时机作出正确决策。

从历史上看,数据分析软件面对当今的海量数据已显得力不从心,这种局面正在悄然转变。新的海量数据分析引擎已经出现。如Apache的Hadoop、LexisNexis的HPCC系统和1010data(托管、海量数据分析的平台供应商)的以云计算为基础的分析服务。
101data的高级副总裁Tim Negris表示海量数据的收集以及存放和利用海量数据实际上完全是两回事。在做任何事前需要大量(准备数据)的工作是像Oracle和大多数数据库厂商所面临的难题之一。我们正是要消除这个难题,并把数据直接交到分析师的手中。Hadoop和HPCC系统做到了这一点。这三个平台都着眼于海量数据并提供支持。
开源的Hadoop已经在过去5年之中证明了自己是市场中最成功的数据处理平台。目前Cloudera的首席执行官和Apache基金会的Doug Cutting是Hadoop的创始人,他曾在Yahoo工作过。
Hadoop将海量数据分解成较小的更易访问的批量数据并分发到多台服务器来分析(敏捷是一个重要的属性,就像你更容易消化被切成小块的食物)Hadoop再处理查询。
“Gartner和IDC的分析师认为海量数据的处理速度和处理各种数据的能力都是Hadoop吸引人们的地方”。Cloudera的产品副总裁Charles Zedlewski说到。
在Cutting和他的Yahoo团队提出Hadoop项目之后,在Yahoo IT系统测试并广泛使用了很多年。随后他们将Hadoop发布到开源社区,这使得Hadoop逐渐产品化。
在Cutting和Yahoo在开发、测试并内部运行代码时,他们了解到使用起来还是很复杂的。这导致他们马上意识到如果在未来提供周边服务(例如提供直观的用户界面、定制部署和附加功能软件)可赚取更多的资金。

在2009年Cloudera作为一家独立公司开始运营,公司产品采用开源并产品化Hadoop分析引擎和Cloudera企业版(Cloudera Enterprise整合了更多的工具,包括Hive、HBase、Sqoop、Oozie、Flume、Avro、Zookeeper、Pig和Cloudera Desktop)。
Cloudera得到了大量投资者的青睐,这其中包括VMware的创始人和前首席执行官Diane Greene、Flickr的联合创始人Caterina Fake、MySQL前首席执行官Marten Mickos、Linkedln总裁Jeff Weiner和Facebook CFO Gideon Yu。
自从Cloudera成立以来,只有少数的顶级公司和初创公司免费提供他们基于Hadoop开放源代码架构制作的自己的版本。
这是一场真正的企业科技的竞争。就像在一场接力赛中,所有选手都必须使用同一种类型的接力棒(Hadoop的代码)。企业竞争主要集中在处理数据的速度、敏捷性和创造性上。这场竞争是迫使大多数企业在海量数据分析市场有所作为最有效的方法。
IBM提供了基于Hadoop的InfoSphere BigInsights(IBM InfoSphere BigInsights 是用于分析和虚拟化海量数据的软件和服务,这款新产品由 Apache Hadoop 提供技术支持。)基本版和企业版。但公司有更大的计划。
IBM CEO Sam Palmisano表示IBM正在将新一代数据分析作为公司的研发重点,IBM在此项目上投资了1亿美元。IBM院士和计算机科学研究室主任Laura Haas表示IBM实验室的研究远远超出了海量数据的范围,并已经着手”Exadata“分析研究。Watson就是IBM在数据海量数据研究的成果,Watson将用于更多用途,包括卫生保健、科学研究等。
其他Hadoop版本
MapR发布了一个分布式文件系统和MapReduce引擎,MapR还与存储和安全的领导厂商EMC合作向客户提供了Greenplum HD企业版Hadoop存储组件 。EMC Hadoop的另一个独特之处在于它没有采用官方版本的Apache代码,而是采用Facebook的Hadoop代码,后者在可扩展性和多站点部署上进行了优化。
另一家厂商 Platform Computing,Platform提供了与Apache Hadoop MapReduce编程模型完全兼容的分布式分析平台,并支持多种分布式文件系统。

SGI(Silicon Graphics International )提供基于SGI Rackable和CloudRack服务器产品实施服务的Hadoop优化解决方案。
戴尔也开始出售预装该开源数据处理平台的服务器。 该产品成本随支持选项不同而异,基础配置价格在11.8万美元至12.4万美元之间,包含为期一年的Cloudera支持和更新,6个PowerEdge C2100服务器(2个管理节点,1个边缘节点和3个从站节点,以及6个戴尔PowerConnect 6248交换机)。
替代品浮出水面。包括1010data的云服务、LexusNexis公司的Risk,该系统在10年间帮助LexusNexis公司分析大量的客户数据,并在金融业和其他重要的行业中应用。LexusNexis最近还宣布要在开源社区分享其核心技术以替代Hadoop。LexisNexis公司发布一款开源的数据处理方案,该技术被称为HPCC系统。
HPCC可以管理、排序并可在几秒钟内分上亿条记录。HPCC提供两种数据处理和服务的方式——Thor Data Refinery Cluster和Roxy Rapid Data Delivery Cluster。Escalante表示如此命名是因为其能像Thor(北欧神话中司雷、战争及农业的神)一样解决困难的问题,Thor主要用来分析和索引大量的Hadoop数据。而Roxy则更像一个传统的关系型数据库或数据仓库,甚至还可以处理Web前端的服务。
LexisNexis CEO James Peck表示我们认为在当下这样的举动是对的,同时我们相信HPCC系统会将海量数据处理提升到更高高度。

在2011年6月Yahoo和硅谷风险投资公司Benchmark Capital周二联合宣布,他们将联合成立一家名为Hortonworks的新公司,接管被广泛应用的数据分析软件Hadoop的开发工作。
据一些前Yahoo员工透露,从商业角度来看Hortonworks将保持独立运营,并发展其自身的商业版。
在转型时期,Yahoo CTO Raymie Stata成为关键人物,他将负责公司所有IT项目的发展。Stata表示相对于Yahoo,在Hortonworks我们会投入更多的精力在Hadoop的工作和相关技术上,我们认为应加大对Hadoop的投资。我们会将一些关键人员指派到Hortonworks公司,但这既不是裁员也不是分拆。这是在加大对Hadoop的投入。Yahoo将继续为Hadoop的发展做出更大的贡献。
Stata解释说,Yahoo一直有一个梦想,就是将Hadoop变为大数据分析软件的行业标准。但是这必须将Hadoop商业化。Stata表示创建Hortonworks的主要原因是因为Yahoo已经看到了未来企业分析(感谢Hadoop 6年以来的发展)的未来,并知道该怎样去做。我们看到海量数据分析将很快成为企业非常普遍的需求。
我们将Hadoop部署在企业之中,我不认为所有人都否定这样的解决方案。我们要通过Hadoop为我们的股东创造价值。如果某一天Hadoop成为海量数据处理的行业标准,这将是对我们最好的奖赏。(李智/译)

usidc5 2011-10-25 09:21

毫无疑问,世界上所有关注开发技术的人都意识到“大数据”对企业商务所蕴含的潜在价值,其目的都在于解决在企业发展过程中各种业务数据增长所带来的痛苦。
现实是,许多问题阻碍了大数据技术的发展和实际应用。
因为一种成功的技术,需要一些衡量的标准。现在我们可以通过几个基本要素来衡量一下大数据技术,这就是——流处理、并行性、摘要索引和可视化。
谁会用到大数据呢?
一年前,大数据技术的一些主要用户是大型Web企业,例如Facebook和雅虎,它们需要分析点击流数据。但是今天,“大数据技术已经超出了Web,是要是有大量数据需要处理的企业都有可能用到它。”例如银行、公用事业机构、情报部门等都在搭乘大数据这辆车。
实际上,一些大数据技术已经被一些拥有很前卫技术的企业在使用了,比如受社交媒体推动而需要创建相应Web服务的企业。它们对于大数据项目的贡献非常重要。
而在其他垂直行业中,有些企业正在意识到,它们基于信息服务的价值定位要比它们先前想象的要大得多,所以大数据技术很快就吸引了这些企业的注意。再加上硬件和软件成本的下降,这些企业发现它们已经处在了一场企业大转型机遇的完美风暴中。
大数据处理的应对三大挑战:大容量数据、多格式数据和速度
大容量数据(TB级、PB级甚至EB级):人们和机器制造的越来越多的业务数据对IT系统带来了更大的挑战,数据的存储和安全以及在未来访问和使用这些数据已成为难点。
多格式数据:海量数据包括了越来越多不同格式的数据,这些不同格式的数据也需要不同的处理方法。从简单的电子邮件、数据日志和信用卡记录,再到仪器收集到的科学研究数据、医疗数据、财务数据以及丰富的媒体数据(包括照片、音乐、视频等)。
速度:速度是指数据从端点移动到处理器和存储的速度。
大数据技术涵盖哪些内容?
一、流处理

伴随着业务发展的步调,以及业务流程的复杂化,我们的注意力越来越集中在“数据流

抱歉!评论已关闭.