海量数据

海量数据存储技术与解决方案

一世执手 提交于 2019-12-08 18:57:48
海量数据存储难点 :数据量过大,数据中什么情况都可能存在;软硬件要求高,系统资源占用率高;要求很高的处理方法和技巧。 海量数据存储处理经验 : 一、选用优秀的数据库工具 现在的数据库工具厂家比较多,对海量数据的处理对所使用的数据库工具要求比较高,一般使用Oracle或者DB2,微软公司最近发布的SQL Server 2005性能也不错。另外在BI领域:数据库,数据仓库,多维数据库,数据挖掘等相关工具也要进行选择,象好的ETL工具和好的OLAP工具都十分必要,例如Informatic,Eassbase等。笔者在实际数据分析项目中,对每天6000万条的日志数据进行处理,使用SQL Server 2000需要花费6小时,而使用SQL Server 2005则只需要花费3小时。 二、对海量数据进行分区操作 对海量数据进行分区操作十分必要,例如针对按年份存取的数据,我们可以按年进行分区,不同的数据库有不同的分区方式,不过处理机制大体相同。例如SQL Server的数据库分区是将不同的数据存于不同的文件组下,而不同的文件组存于不同的磁盘分区下,这样将数据分散开,减小磁盘I/O,减小了系统负荷,而且还可以将日志,索引等放于不同的分区下。 三、编写优良的程序代码 处理数据离不开优秀的程序代码,尤其在进行复杂数据处理时,必须使用程序。好的程序代码对数据的处理至关重要,这不仅仅是数据处理准确度的问题

大数据时代的海量数据存储、和高并发解决方案总结

六月ゝ 毕业季﹏ 提交于 2019-12-08 18:56:18
结构化数据的存储 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。 水平 切分数据库 ,可以降低单台机器的负载,同时最大限度的降低了了宕机造成的损失。通过 负载均衡策略 ,有效的降低了单台机器的访问负载,降低了宕机的可能性;通过 集群方案 ,解决了数据库宕机带来的单点数据库不能访问的问题;通过 读写分离 策略更是最大限度了提高了应用中读取(Read)数据的速度和并发量。 1/什么是数据切分 通过一系列的切分规则将数据水平分布到不同的DB或table中,在通过相应的DB路由 或者 table路由规则找到需要查询的具体的DB或者table,以进行Query操作。这里所说的“sharding”通常是指“水平切分”, 这也是本文讨论的重点。具体将有什么样的切分方式呢和路由方式呢?行文至此,读者难免有所疑问,接下来举个简单的例子:我们针对一个Blog应用中的日志来说明,比如日志文章(article)表有如下字段: article_id(int), title(varchar(128)), content(varchar(1024)), user_id(int) 我们可以这样做,将user_id为 1

Java海量数据处理算法

谁都会走 提交于 2019-12-08 18:51:51
文章目录 Hash法 Bit-map法 Bloom filter法 数据库优化法 倒排索引法 正向索引 外部排序法 trie树 兄弟单词 求解兄弟单词的经典例子 堆 双层桶法 MapReduce法 经典实例 top K问题 BFPRT算法(TOP-K问题必会) 重复问题 排序问题 Hash法 在处理海量数据的过程中,使用hash法一般可以快速存取,统计某些数据,将大量数据进行分类,例如提取某日访问网站次数最多的IP地址等. 常用散列函数的构建方法如下: 直接寻址法 取关键字或关键字的某个线性函数值为散列地址,即h(key)=key或h(key)=a*key+b.直接寻址法不会产生冲突,时间复杂度为o(1),空间复杂度为o(n),但由于它没有压缩映像,因此,当关键字集合很大时,使用这种hash函数是不可能实现地址编码的散列的(因为key集合必须有穷且不能超出物理存储大小). 取模法 选择一个合适的正整数p,令h(key)=key mod p.p如果选择的是比较大的素数,则效果比较好,一般选取p为tablesize,即散列表的长度. 数学分析法 根据关键字的个数n和r进制,通过统计在各个位上数符出现频率找出各个位上出现出现次数最接近n/r的数符作为不变的散列地址位. 折叠法 将关键字分成位数为t的几个部分(最后一部分可能小于t),然后把各部分按位对齐进行相加,将所得的和舍弃进位

海量数据解决方案~

社会主义新天地 提交于 2019-12-08 18:51:34
题目 问题一:现有海量日志数据,要提取出某日访问百度次数最多的那个IP(可以将题干简化,假设日志中仅包含IP数据,也就是说待处理的文件中包含且仅包含全部的访问IP,但内存空间有限,不能全部加载,假设只有512MB) 解决方案: 这是一道典型的分治思想的题目,这种问题处理起来套路比较固定,对于大部分的数据量比较大的前提的问题而言,分治都是一个可选的解决方案,但不一定是最优的,解决方法基本划分为三步走: 第一:如何有效的划分数据 第二:如何在子集上解决问题 第三:如何合并结果 那么对于本问题就显得比较明显了: 首先解决如何划分,由于IP地地址范围从000.000.000.000~255.255.255.255共有2^32个大约4GB,那么我们可以通过取模的方式进行划分,直接将四段数据相连就得到一个IP对应的数字A,再对A模1024(模数取多少可以自己指定,保证每个小文件能被放到内存就好),这样大文件被划分成小文件了,并且相同的IP一定被划分到相同的文件中。 其次解决每个小文件中TOP1的问题: 这里可以用很多方式进行处理,比如你可以构造自己的HashMap,key为IP,value为当前出现次数,最后找到value最大的Key即为当前文件中出现次数最多的IP。 最后要解决结果合并问题: 这里直接将1024个子文件的统计结果进行比较就好,不用排序,直接选择最大的一个就好。 注意

十道海量数据处理面试题与十个方法大总结

陌路散爱 提交于 2019-12-08 18:50:30
第一部分、十道海量数据处理面试题 1 、海量日志数据,提取出某日访问百度次数最多的那个 IP 。 首先是这一天,并且是访问百度的日志中的 IP 取出来,逐个写入到一个大文件中。注意到 IP 是 32 位的,最多有个 2^32 个 IP 。同样可以采用映射的方法,比如模 1000 ,把整个大文件映射为 1000 个小文件,再找出每个小文中出现频率最大的 IP (可以采用 hash_map 进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这 1000 个最大的 IP 中,找出那个频率最大的 IP ,即为所求。 或者如下阐述(雪域之鹰): 算法思想:分而治之 +Hash 1.IP 地址最多有 2^32=4G 种取值情况,所以不能完全加载到内存中处理; 2. 可以考虑采用 “ 分而治之 ” 的思想,按照 IP 地址的 Hash(IP)%1024 值,把海量 IP 日志分别存储到 1024 个小文件中。这样,每个小文件最多包含 4MB 个 IP 地址; 3. 对于每一个小文件,可以构建一个 IP 为 key ,出现次数为 value 的 Hash map ,同时记录当前出现次数最多的那个 IP 地址; 4. 可以得到 1024 个小文件中的出现次数最多的 IP ,再依据常规的排序算法得到总体上出现次数最多的 IP ; 2

17道经典海量数据面试题整理

余生长醉 提交于 2019-12-08 18:49:53
1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url? 方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 s 遍历文件a,对每个url求取 ,然后根据所取得的值将url分别存储到1000个小文件(记为 )中。这样每个小文件的大约为300M。 s 遍历文件b,采取和a相同的方式将url分别存储到1000各小文件(记为 )。这样处理后,所有可能相同的url都在对应的小文件( )中,不对应的小文件不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。 s 求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。 方案2:如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url(注意会有一定的错误率)。 2. 有10个文件,每个文件1G

海量数据处理方法总结

大憨熊 提交于 2019-12-08 18:47:03
大数据量的问题是很多面试笔试中经常出现的问题,比如baidu google 腾讯 这样的一些涉及到海量数据的公司经常会问到。 下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题。下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定最优,如果你有更好的处理方法,欢迎与我讨论。 1.Bloom filter 适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集 基本原理及要点: 对于原理来说很简单,位数组+k个独立hash函数。将hash函数对应的值的位数组置1,查找时如果发现所有hash函数对应位都是1说明存在,很明显这个过程并不保证查找的结果是100%正确的。同时也不支持删除一个已经插入的关键字,因为该关键字对应的位会牵动到其他的关键字。所以一个简单的改进就是 counting Bloom filter,用一个counter数组代替位数组,就可以支持删除了。 还有一个比较重要的问题,如何根据输入元素个数n,确定位数组m的大小及hash函数个数。当hash函数个数k=(ln2)*(m/n)时错误率最小。在错误率不大于E的情况下,m至少要等于n*lg(1/E)才能表示任意n个元素的集合。但m还应该更大些,因为还要保证bit数组里至少一半为0,则m应该>=nlg(1/E)

海量数据处理专题(一)——开篇

喜欢而已 提交于 2019-12-08 18:46:43
大数据量的问题是很多面试笔试中经常出现的问题,比如baidu google 腾讯 这样的一些涉及到海量数据的公司经常会问到。   下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题。下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定最优,如果你有更好的处理方法,欢迎与我讨论。   本贴从解决这类问题的方法入手,开辟一系列专题来解决海量数据问题。拟包含 以下几个方面。 Bloom Filter Hash Bit-Map 堆 双层桶划分 数据库索引 倒排索引(Inverted Index) 外排序 Trie树 MapReduce   在这些解决方案之上,再借助一定的例子来剖析海量数据处理问题的解决方案。欢迎大家关注。 转至: http://blog.redfox66.com 来源: CSDN 作者: ganhongxia 链接: https://blog.csdn.net/ganhongxia/article/details/5912666

海量数据处理~

删除回忆录丶 提交于 2019-12-08 18:44:39
海量数据,意思就是数据数量大,一般来说呢,就可以考虑哈希算法~ 那么,哈希算法是什么嘞?它也叫做散列函数,顾名思义,把一组数据散列开,常用的方法就是模值取余法,例如,一组数据{0,1,2,3,4,5,6,7},可以散列成两组,模2得0的和模2得1的{0,2,4,6},{1,3,5,7}; OK,言归正传,说海量数据的事~ 一、经典思路: 分而治之/hash映射 + hash统计 + 堆/快速/归并排序 举个例子叭~ 例1 、海量日志数据,提取出某日访问百度次数最多的那个 IP 。 简单粗暴的方案1:众所周知,IP是32位的,那也就是说,IP一共会有2^32种情况,直接分配一个2^32的内存,然后进行模上2^32,再进行哈希统计。 心思缜密的方案2: 很多问题都可以套路方案2呢,总之记住一点,分组一定得保证相同的在一个组里,不然没办法统计。还有一个小点,如果不是整型,而是字符串呢,总不好直接模整型吧,解决办法: (1)字符串的ASCII值相加。 例如呢, "abc" = 97 + 98+ 99; (2)字符串的ASCII值乘以系数相加,例如呢, "abc" = 97*( 2^2 )+ 98*(2^1)+ 99*(2^0); 例2: 给定 a 、 b 两个文件,各存放 50 亿个 url ,每个 url 各占 64 字节,内存限制是 4G ,让你找出 a 、 b 文件共同的 url ?

海量数据处理常用思路和方法

六眼飞鱼酱① 提交于 2019-12-08 18:44:06
转载 http://blog.chinaunix.net/uid-26565142-id-3127581.html 《海量数据处理常用思路和方法》 (2012-03-09 18:53) 标签 : class 数据 normal style 分类: 算法 1.Bloom filter 适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集 基本原理及要点: 对于原理来说很简单,位数组+k个独立hash函数。将hash函数对应的值的位数组置1,查找时如果发现所有hash函数对应位都是1说明存在,很明显这个过程并不保证查找的结果是100%正确的。同时也不支持删除一个已经插入的关键字,因为该关键字对应的位会牵动到其他的关键字。所以一个简单的改进就是 counting Bloom filter,用一个counter数组代替位数组,就可以支持删除了。 还有一个比较重要的问题,如何根据输入元素个数n,确定位数组m的大小及hash函数个数。当hash函数个数k=(ln2)*(m/n)时错误率最小。在错误率不大于E的情况下,m至少要等于n*lg(1/E)才能表示任意n个元素的集合。但m还应该更大些,因为还要保证bit数组里至少一半为0,则m应该>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2为底的对数)。 举个例子我们假设错误率为0.01