海量数据处理

海量数据处理

心已入冬 提交于 2020-03-04 00:37:21
海量数据处理,思路有hash、bitmap、merge、堆、Top K(BFPRT算法)、trie树、布隆过滤器。 hash:对很多数据进行hash,然后取余一个正整数n,可以分成n份不同的数据组,每份数据组中数据通过hash算法得到相同的下标,所以相同的数据一定会分在同一数据组中。 bitmap:为操作,如果为每个数据分配n个bit,那么每个数据可最多有2^n种情况,在很多数据的情况下,bitmap总长可设为很大并间隔n位分给一格数据。 merge:一个很大数据量数据排序,分成不同数据组,每组内进行排序,不同组之间进行merge排序。 堆排序:数据量大,而只需要知道最大或最小的几个,可以用堆排序。 Top K:https://blog.csdn.net/laojiu_/article/details/54986553 速度很快(类似快排选一个基准,不过这个基准选取方式为:n个数据5个一组,每个排序得到组内中位数,各组之间中位数排序得到组间中位数,该中位数为基准,大于该值一边,小于的另一边,则最终左边和右边都至少有3/10的数据量,递归下去最后得到想要的位置)。 trie数(字典树):用于去重字符串。字典树每个树枝(两个节点之间连线)一个字符,从根节点到叶子节点构成了不同的路径,每个路径唯一地表示了一个字符串。 布隆过滤器:使用了bitmap和hash,一个数据散列出n个特征点

海量数据处理(1):MapReduce

雨燕双飞 提交于 2020-01-10 03:48:35
海量数据处理(1):MapReduce 海量数据处理,就是基于海量数据的存储、删除、搜索等操作。由于数据量太大,导致要么无法在短时间内迅速处理,要么无法一次性装入内存。针对面试过程中的问题,主要有以下解决步骤 针对时间,可以采用更加迅速的数据结构和算法,比如BloomFilter、Hash、堆、Bitmap等 针对空间,无非就是大而化小,分而治之。 算法方面: 外排序算法(External Sorting) Map Reduce 非精确算法 概率算法 哈希算法与哈希函数(Hash Function) 数据结构方面: 哈希表(Hash Table) 堆(Heap) 布隆过滤器(BloomFilter) 位图(Bitmap) 一、MapReduce简介 给定一个有海量单词的集合,统计每个词的出现次数,最简单的就是for循环,放进map,一台机器这样做,明显是不合适的,所以我们想到了用两台机器for循环,两台服务器去处理数据,但是到了merge环节,还是一台机器啊,这也是个瓶颈。 合并时候也可以采用并行的方式,有两种选择 一是以机器来划分(比如第i台到第j台由某台机器合并) 二是根据key来划分(比如key由a、b、c、d,让一台机器合并key a和key b) 很显然以机器作为划分并不好,因为进行了第一轮合并了后,还要再进行合并…最后形成一个类似树状结构的

海量数据处理问题分析

喜欢而已 提交于 2019-12-08 19:20:56
哈希切割top K问题 给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 将 100 G的 log file 哈希切分成 1000 份,为什么不切成 100 份 因为 100 份中不一定每个文件大小都是 1 G,有的文件可能要 5 , 6 个G的,因为有哈希冲突,可能某个文件哈希冲突多 文件大小要 10 G左右了,因此哈希切分成 1000 份,每份 100 M 这样最多IP大小也就 1 到 2 个G,哈希表可以进行处理。 切分时:先把IP字符串转为整型,再取模Ip %1000 进行哈希切分存储。因为相同的IP一定会进入同一个文件 然后 1000 份中用哈希表KV模型进行统计每个IP的次数 用第一个文件中IP次数和第二个最多IP次数比较,大的保留 小的销毁,依次向后比较,直到统计完 1000 份中最大的IP次数。 如果某一个文件IP值过多,导致文件过大,可以用不同的哈希 算法进行切分来实现分流。 位图应用 给定100亿个整数,设计算法找到只出现一次的整数 要知道 100 亿个整数占多少空间, 10 亿个整数大概占一个G 100 亿大概占 10 个G,但是一百亿个整数,所以要大概占 40 个G 很明显内存中是存不下的,位图只需要用位来表示一个数在或者 不在,一个字节为 8 个比特,现在用 32 个比特位表示,则 40 G

海量数据处理-面试题

白昼怎懂夜的黑 提交于 2019-12-08 19:07:54
何谓海量数据处理? 所谓海量数据处理,就是基于海量数据上的存储、处理、操作。何谓海量,要么就是数据量太大导致无法在短时间内迅速解决。要么就是数据太大,导致无法一次性装入内存。 针对时间,我们可以采用恰当的算法搭配合适的数据结构,例如Bloom filter、Hash、bit-map、堆、数据库索引等。 针对空间,我们可以采用分治的思想,将大规模问题化为小规模问题,各个击破。 针对单机资源受限问题,可以考虑集群。 海量数据处理方法论 1、分治/hash映射+hashmap统计+堆/快速/归并排序 2.、桶划分 3.、Bloom filter/Bitmap 4、trie树、数据库索引 5、外排序 6、分布式处理hadoop/Mapreduce 海量数据 (有重复), 统计重复次数最多的一个? 海量日志数据,提取出某日访问百度次数最多的那个IP。 方案一:hash映射+hashmap统计 1、首先从日志文件中将这一天访问百度的所有IP取出来放入另一个大文件中。 2、分而治之/hash映射:IP是32位的,最多2^32个IP,我们可以通过哈希函数(IP%1024)将大文件映射为1024个小文件。 3、hashmap统计:对每一个小文件,我们直接在内存中通过hashmap统计IP的频率,并保存出现频率最高IP。 4、最后从这1024个频率最高IP中找到全局频率最高的那个IP。 海量数据

实战hadoop海量数据处理系列03 :数据仓库的设计

眉间皱痕 提交于 2019-12-08 18:59:26
实战hadoop海量数据处理系列03 :数据仓库的设计 鉴于我们之前两章提前预热的开发环境,我们现在来讨论数据仓库的设计,其实本章应该放到一个正式的项目的前端,不过好事总会要来的,准备好数据仓库,我们就可以实地验证sqoop等程序的逻辑。Let’s go! 本文假设读者已经按照范老师的书搭建好了eclipse环境,并且已经导入myBi文件夹下面的子工程。 在阅读本文前,强烈建议阅读原书“系统结构设计”章节。 本文的代码同步于 https://github.com/titer1/Play_HadoopFelix ps:由于图床网络问题,有时候本文的图显示不正常,所以请看不到图的小伙伴稍安勿躁,我会后续跟进处理,想了解原图的,可以在本文下面留言。 overview 原书ER图思考 本人对ER图细节的还原 数据库建立脚本的细节 利用存储过程快速填充数据库 小节 1 原书的ER图 这是一张典型的订单系统ER图,作者很耐心的给出数据表 不过,仅仅从这个版本的书,初学者往往不能得到 - ER图细节信息,两个实体之间是1:1或者1:N的关系 - 数据库建立的详细过程 - 订单系统运作的过程 关于订单系统,有兴趣的朋友可以详细参考这里 ( 点我 ),我将在下个小节讲述我对ER图的还原(仅从书上细节) 2 基于Mysql WorkBench的ER图 由于工作中对于数据库建模软件Mysql

实战hadoop海量数据处理系列 01:数据导入篇

六眼飞鱼酱① 提交于 2019-12-08 18:59:09
实战hadoop海量数据处理系列 01:数据导入篇 本文假设读者已经按照范老师的书搭建好了eclipse环境,并且已经导入myBi文件夹下面的子工程。 在阅读本文前,强烈建议阅读原书“实现数据导入导出模块”章节。 本文的代码同步于 https://github.com/titer1/Play_HadoopFelix 1 项目结构图 借用范老师的图,这是全篇的重要点,本文重要import, export的内容可以触类旁通。 原图 2 项目核心代码 这里是import.py的代码,作者已经详细注释,请认真阅读 # -*- coding:UTF-8 -*-s ''' Created on 2014-8-26 @author: Administrator ''' from com.util.pro_env import * from xml.etree import ElementTree from com.util.sqoop import SqoopUtil import sys #其中dt为昨天的日期,将由调度模块传入 def resolve_conf (dt) : #获得配置文件名 conf_file = PROJECT_CONF_DIR + "Import.xml" #解析配置文件 xml_tree = ElementTree.parse(conf_file) #获得pras元素

海量数据处理

两盒软妹~` 提交于 2019-12-08 18:58:11
1)给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 初步分析: 100G普通机器内存中肯定是放不下的,目前使用的IP地址相当于一个32位的字符串,所以我们考虑切分,假设有1G可用内存我们切分为100份,那我们需要把这100个文件全部遍历,每一次出现的IP地址进行统计,最后找出出现次数最多的IP地址,此办法可行但是效率不高。 优化: 把这32位的IP地址通过字符串哈希函数转化为对应的整形,模除1000后将文件分为1000份:从硬盘中读取这些IP,转化为整形后对文件个数取余,余数是多少就放进哪个文件,这样就保证了同一个ip地址在同一个文件里。这种方法叫做哈希分桶法(不均匀)。分好之后去统计每个文件里出现次数最多的IP地址,再转化为找1000个IP出现次数最多的一个。 2)与上题条件相同,如何找到top K的IP?如何直接用Linux系统命令实现? 初步分析:继上题可能很容易想到找出每个文件中出现次数最多的,在它们中再找出topK个,可是你怎么能保证一个文件中出现最多的次数就一定比另一个文件中出现最少的次数大。所以这种思路有问题。 优化:首先和第一题一样,先采用哈希分桶分好1000个文件,然后找出每个文件的Topk(在这里用优先级队列或者建小堆都可以),最后Topk进行汇总。 3)给定100亿个整数,设计算法找到只出现一次的整数!

常见海量数据处理问题的解决思路

我是研究僧i 提交于 2019-12-08 18:57:16
基本思路 哈希分片。计算每个数据的哈希码,再进行求模运算,这样相同的数据将进入相同的分片。 字典树/哈希表。对每个分片,统计数据出现的次数。 堆。利用堆求topK问题。 归并。由于每个分片之间不存在重复数据,归并过程就很简单。 常见题目 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?   分别对a、b两个文件进行哈希分片,方法是hash(s)%1000,这样将得到2000个文件,分别是a0,a1,...a999,b0,b1,...b999。分别对ai和bj进行处理,方法是将ai中的数据放入哈希表中,然后判断bj中的数据是否出现在该哈希表中,如果是,那么它就是公共数据。 在2.5亿个整数中找出不重复的整数,内存不足以容纳这2.5亿个整数。   利用2比特的BitMap。00表示不存在,01表示出现一次,11表示出现多次,依次将2.5亿个数放入BitMap中,需要的内存大约是2^32*2bit=1GB。 1000万字符串,其中有些是重复的,需要把重复的全部去掉,保留没有重复的字符串。请怎么设计和实现?   利用哈希分片,将1000万字符串分为100个小文件,然后对每个小文件去重,方法是利用字典树。最后将这100个结果合并起来。 一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行

海量数据处理面试题集锦

ぐ巨炮叔叔 提交于 2019-12-08 18:51:22
本文参考链接: https://blog.csdn.net/u013949069/article/details/78056102?utm_source=copy 问题1 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,给出时间复杂度分析。 之前在此文, 海量数据处理面试题集锦与Bit-map详解 中给出的参考答案:用Trie树统计每个词出现的次数,时间复杂度是O(n le)(le表示单词的平均长度),然后是找出出现最频繁的前10个词。也可以用堆来实现(具体的操作可参考第三章、寻找最小的k个数),时间复杂度是O(n lg10)。所以总的时间复杂度,是O(n le)与O(n lg10)中较大的哪一个。 2. 在链接 https://blog.csdn.net/v_july_v/article/details/6685962 中作者总结了各种解法,值得好好看看~~~ 来源: CSDN 作者: Allenlzcoder 链接: https://blog.csdn.net/Allenlzcoder/article/details/82839416

海量数据处理专题(八)——倒排索引(搜索引擎之基石)

懵懂的女人 提交于 2019-12-08 18:49:06
引言: 在信息大爆炸的今天,有了搜索引擎的帮助,使得我们能够快速,便捷的找到所求。提到搜索引擎,就不得不说VSM模型,说到VSM,就不得不聊倒排索引。可以毫不夸张的讲,倒排索引是搜索引擎的基石。 VSM检索模型 VSM全称是Vector Space Model(向量空间模型),是IR(Information Retrieval信息检索)模型中的一种,由于其简单,直观,高效,所以被广泛的应用到搜索引擎的架构中。98年的Google就是凭借这样的一个模型,开始了它的疯狂扩张之路。废话不多说,让我们来看看到底VSM是一个什么东东。 在开始之前,我默认大家对线性代数里面的向量(Vector)有一定了解的。向量是既有大小又有方向的量,通常用有向线段表示,向量有:加、减、倍数、内积、距离、模、夹角的运算。 文档(Document):一个完整的信息单元,对应的搜索引擎系统里,就是指一个个的网页。 标引项(Term):文档的基本构成单位,例如在英文中可以看做是一个单词,在中文中可以看作一个词语。 查询(Query):一个用户的输入,一般由多个Term构成。 那么用一句话概况搜索引擎所做的事情就是:对于用户输入的Query,找到最相似的Document返回给用户。而这正是IR模型所解决的问题: 信息检索模型是指如何对查询和文档进行表示,然后对它们进行相似度计算的框架和方法。 举个简单的例子: