海量数据

海量结构化日志分析系统

爱⌒轻易说出口 提交于 2019-12-08 18:43:51
背景 日志,角色不同,出发点和认识的角度也不同 RD使用日志,首先是为了调试程序,当程序上线后,日志是为了记录err和trace。 PM可以通过日志分析,可以得出业务指标相关的统计情况。 日志的作用大致有三:异常、trace、统计。 日志使用的痛点 使用日志时大部分的场景或特点如下: 1.日志为纯文本,即可读。 2.日志分散在各个机器上,或者同步到某一台机器。 3.某某发现一个问题,让某某去查log。 这里有几个问题,或者说提高点 1.文本冗余度太大,浪费资源,如果转换为二进制,预估有5倍的收益。 2.日志分散,查找效率低,即使集中,在没有具体时间点情况下,扫描日志会很慢。 3.日志分析难度大,谁写的日志谁来查,查到和肉眼找到还差一步... 目标 所以,我们可以设计这样一个日志系统 1.支持海量数据的日志存储(TB二进制) 2.日志二进制、结构化 3.查询速度快,难度低 设计 读写日志 日志查询过程经分解和总结共性后,几乎是下边三种情况 1.K-V查询,比如基于某个消息ID,查询一条记录。 2.集合查询,比如查询某个用户的消息记录。 3.集合range查询,比如查询某个用户0点到1点消息记录。 那么,ssdb是非常适合这三个需求的。 日志系统具有写多读少的特定,再基于磁盘存储的业界主流方案,LSM是适合的, 而SSDB的存储依赖的leveldb正好属于LSM系。 日志二进制

海量数据库(详解缓存处理方法)

孤者浪人 提交于 2019-12-08 18:42:50
缓存处理大数据 缓存就是将从数据库中获取的结果暂时保存起来在下次使用的时候无需重新到数据库中获取,从而降低数据库的压力。 缓存的使用方式可以分为通过程序直接将数据库数据保存到内存中和使用缓存框架两种方式 它主要用于数据变化不是很频繁的情况。而且如果是定期失效( 数据修改时不失效)的失效机制,实时性要求也不能太高,因为这样缓存中的数据和真实数据可能会不一致。而memcache就是提供缓存的一种缓存框架,可适用多台服务器,也可单服务器 Memcache介绍 MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。 MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的key-value存储,数据可以来自数据库调用、API调用,或者页面渲染的结果。 大概框架如下图: 同时基于这张图,理一下MemCache一次写缓存的流程: 1、应用程序输入需要写缓存的数据 2、API将Key输入路由算法模块,路由算法根据Key和MemCache集群服务器列表得到一台服务器编号 3、由服务器编号得到MemCache及其的ip地址和端口号 4、API调用通信模块和指定编号的服务器通信,将数据写入该服务器

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

戏子无情 提交于 2019-12-08 18:41:27
海量数据处理:十道面试题与十个海量数据处理方法总结 作者:July、youwang、yanxionglu。 时间:二零一一年三月二十六日 说明:本文分为俩部分,第一部分为10道海量数据处理的面试题,第二部分为10个海量数据处理的方法总结。有任何问题,欢迎交流、指正。 出处: http://blog.csdn.net/v_JULY_v 。 ------------------------------------------ 第一部分、十道海量数据处理面试题 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地址;

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

一曲冷凌霜 提交于 2019-12-08 18:39:56
来源: blog.csdn.net 发布时间: 2011-03-30 13:23 阅读: 60 次 原文链接 全屏阅读   [收藏] 编辑点评: 本文将向您讲述诸多数据处理面试题以及方法的总结。   第一部分、十道海量数据处理面试题    1、海量日志数据,提取出某日访问百度次数最多的那个IP。   此题,在我之前的一篇文章 算法里头有所提到,当时给出的方案是:IP的数目还是有限的,最多2^32个,所以可以考虑使用hash将ip直接存入内存,然后进行统计。   再详细介绍下此方案:首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。   2、搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。   假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G

海量数据topk问题

拜拜、爱过 提交于 2019-12-08 18:39:01
常见问题: ①Top K问题:分治+Trie树/Hash_map+小顶堆。采用Hash(x)%M将原文件分割成小文件,如果小文件太大则继续Hash分割,直至可以放入内存。 ②重复问题:BitMap位图 或 Bloom Filter布隆过滤器 或 Hash_set集合。每个元素对应一个bit处理。 ③排序问题:外排序 或 BitMap位图。分割文件+文件内排序+文件之间归并。 Top K问题: 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。 ①分治:顺序读文件,对每个词x取Hash(x)%2000,按照该值存到2000个小文件中。每个文件是500k左右。如果有文件超过了1M则继续分割。O(N) ②Trie树/Hash_map:字符串用Trie树最好。对每个小文件,统计其中出现的词频。O(N)*(平均字符长度),长度一般是常数,也就是O(N). ③小顶堆:用容量为100的小顶堆,以频率为value值插入,取每个文件现频率最大的100个词,把这100个词及相应的频率存入文件。最差O(N) lg(100),也就是O(N).注:2,3步骤合起来需要一轮磁盘存取过程。存入文件的个数可以缩减一下,因为主要开销在磁盘读取上,减少文件读取次数,可以在每个文件存取最大容量的字符数量,比如这道题1 (M/16字节字符串长度+频率

海量数据Top K算法(C实现)

蹲街弑〆低调 提交于 2019-12-08 18:38:26
最近2天受到 http://blog.csdn.net/v_JULY_v/archive/2011/05/08/6403777.aspx 的影响,从头开始实现了这个算法。收获还是挺大的:(1)实现了Hash链表(2)实现了堆;(3)熟悉了C语言的文件操作; 海量数据处理的Top K 算法就是在很大的文件中找出重复出现次数最多的前K个字符串; 如果数据可以一次读入内存,那么可以按照如下思路来解决: (1)首先遍历文件,将其加入Hash链表;Hash链表的节点定义为: typedef struct node { char *word; int count; struct node *next; }node,*node_ptr; word指向字符串,count为出现的次数; (2)建立一个容量为K的最小堆,然后遍历Hash表中剩下的元素;如果找到了一个元素的count值比这个元素值大,那么交换这个节点和堆顶节点; 完整全部代码如下:在Eclipse + CDT + mingw 下调试通过 程序有待完善的地方: (1)存在一个位置bug:改变HASHLEN的值,程序崩溃; (2)HASH链表的遍历不正确,应该遍历到每一个节点的时候,在判断该节点的next是否为空; # include <stdio.h> # include <string.h> # include <malloc.h> #

海量数据topK算法

旧时模样 提交于 2019-12-08 18:35:42
背景: 由于内存限制,长度为一亿的某类型的数组无法全部放入内存进行排序,进而无法取出前 100 的元素 , 多见于搜索排名,更恶劣的情况是这一亿条数据还分布在多台机器上 原理与简化: 遍历长度为 N 的数组的前 K 个元素构建小顶堆,对于剩余的 N-K 的元素:小于其根节点的过滤掉,大于根节点则替换之并 heapify 该小顶堆,时间复杂度近似为 N*O(logK) ,因此只要实现一个定制版的 heapify 函数即可! 关键代码如下 : /* * @param arr 某数组,不考虑根节点,构成一小顶堆,length为K * @param startIndex 被替换后的根节点,应为0 */ public void heapify4topK(int[] arr,int startIndex){ int n=arr.length; int startValue=arr[startIndex];//要沉下去的数 int leftSon=2*startIndex+1; int minIndex=0; while (leftSon<n){ if (leftSon==n-1||arr[leftSon]<=arr[leftSon+1]){ minIndex=leftSon; }else if(arr[leftSon]>arr[leftSon+1]){ minIndex=leftSon+1;

海量数据的TopK问题

夙愿已清 提交于 2019-12-08 18:35:28
从海量数据中找出最大的前K个数 一个基本的是思想是分治法,将1亿个数据分成100份,每份100万个数据,找出每份中最大的100个,最终可以在这100*100个数据中找出最大的100个。 快速排序法 我们知道,快排一次的结果是分界点前面的数据比他小,分界点后的比他大,我们可以做如下的讨论 如果分界点后面的数据个数大于k个,那么可以在后面的数据中重复上述过程 如果分界点后面的数据个数小于k个,其个数为m个,那么可以在前面的数据中找到k-m个最大的 因此,我们总可以在这一堆数据中找到前k个比较大的 基于小顶堆来实现TopK 容易证明,小顶堆的堆顶元素是最小的,维护一个K个数据的小顶堆,依次读入一个元素,若元素大于堆顶元素,则将堆顶元素移除,当前元素插入堆顶,并进行调整。 基于优先级队列来实现 维护一个K长的优先级队列,不断把优先级低的数组出队,最终剩下来的就是前k个最大的 在海量数据中找出出现频率最高的前K个数 在这个问题中,我们需要构造一个map来统计频率,然后问题转化为计算value值属于钱k大的问题,这时可以套用基本的TopK问题 参考文献: 十道海量数据处理面试题与十个方法大总结 来源: CSDN 作者: Anstrue 链接: https://blog.csdn.net/beautiful_face/article/details/77506260

海量数据中的TopK问题

青春壹個敷衍的年華 提交于 2019-12-08 18:34:14
1. 抛出问题 在大规模数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题。例如,在搜索引擎中,统计搜索最热门的10个查询词;在歌曲库中统计下载最高的前10首歌等。 针对top K类问题,通常比较好的方案是分治+Trie树/hash+小顶堆(就是上面提到的最小堆),即先将数据集按照Hash方法分解成多个小数据集,然后使用Trie树活着Hash统计每个小数据集中的query词频,之后用小顶堆求出每个数据集中出现频率最高的前K个数,最后在所有top K中求出最终的top K。 eg:有1亿个浮点数,如何找出其中最大的10000个? 2. 如何解决 1)全局排序法 这是最容易想到的方法,将数据全部排序,然后在排序后的集合中进行查找,最快的排序算法的时间复杂度一般为O(nlogn),如快速排序。 但是在32位的机器上,每个float类型占4个字节,1亿个浮点数就要占用400MB的存储空间,对于一些可用内存小于400M的计算机而言,很显然是不能一次将全部数据读入内存进行排序的。其实即使内存能够满足要求(我机器内存都是8GB),该方法也并不高效,因为题目的目的是寻找出最大的10000个数即可,而排序却是将所有的元素都排序了,做了很多的无用功。 2)局部淘汰法 该方法与全局排序法类似

海量数据的topK问题

折月煮酒 提交于 2019-12-08 18:33:59
问题描述: 有N(N>>10000)个整数,求出其中的前K个最大的数。(称作Top k或者Top 10) 问题分析: 由于(1)输入的大量数据;(2)只要前K个,对整个输入数据的保存和排序是相当的不可取的。   可以利用数据结构的 最小堆 来处理该问题。   最小堆如图所示,对于每个非叶子节点的数值,一定 不大于 孩子节点的数值。这样可用含有K个节点的最小堆来保存K个目前的最大值(当然 根节点 是其中的最小数值)。  每次有数据输入的时候可以先与根节点比较。若不大于根节点,则舍弃;否则用新数值替换根节点数值。并进行最小堆的调整。如下图: import java.util.Scanner; /** * @author 浩 * @version 创建时间:2016年5月17日 上午8:46:03 */ public class TopK { public static final int K =10; public static void main(String[] args) { Scanner in = new Scanner(System.in); int []max = new int[10]; for(int i=0;i<10;i++){ max[i] = in.nextInt(); } buildHeap(max); while(in.hasNextInt()){