由于在写这篇博客之前,已经接触一些Hadoop的基础知识,我先把之前所学的一些基本概念和理解分享到这里,导图如下。
遵从着学习新知识的三大入手点(Why What How)出发。首先认识大数据先要理解 什么是 大的数据,为什么会有这项技术的诞生,有那些基本的思想,哪些具体的实现技术以及如何去部署实现的呢。
今天先从Why开始:
- 单机处理大数据能力有限
处于一个海量数据的时代,IT工作接触最多的事就是去提取有效数据进行分析,然后为人们所用,我这边先引入一个小案例:
有一个非常大的文本文件,里面有n行,但是只有两行完全一样,出现在了未知的位置,请问你如何去找到它们。
一般人碰到这种问题,这还不简单,写一个for循环依次针对每一行去比较,最终总会比较出结果的。然而,当你真正接触这个问题时,远没你想的那么简单。
首先,你得理解什么是非常大的文件,可能连你那电脑1T的磁盘都不够存的,这边比如说是4个T的数据,你说我用一台服务器存,好吧,存是够了,你还要去计算呢,你还要写函数去筛选出重复行呢。现在好点的服务器有256G的内存也算是高配置了,咱们就以这个配置为例。
先要把这4T的数据存进服务器吧,先不考虑机器带宽的限制,10G网卡吧,传输理论上可以达到1.25GB/s ,普通服务器都是7200R机械硬盘。
- 1、网络开销
- 4T数据10G网络传输时间:(4*1024*1024)/(10000/8)/60=55.9分钟
- 2、磁盘开销
- 单盘raid0:机械硬盘最大读写速度200MB/s
- (4*1024*1024)/200/60=350分钟 靠近6小时
- 写入磁盘,读取靠近12小时
发现网络IO上并不构成瓶颈,真正的IO瓶颈是磁盘IO
内存寻址比Io寻址快10万倍
注:
1、网络开销计算
宽带速率的计量单位通常以bps或者bit/s(比特/秒)来表示,即每秒可传输的位数,8bit(比特)=1B(字节),而存储单位通常是以 B字节 来进行表示,1024B=1KB,1024KB=1MB,1024MB=1GB,所以理论上10Gbps的带宽最大传输速率是10000Mbps/8=1250MB/s;
2、磁盘开销计算
固态硬盘和机械硬盘最大的体验差距在于4k小文件随机读取和寻道时间(可以理解为响应延时),固态硬盘读取速度一般为500MB/s,机械硬盘读写速度大概是100-200MB/s。这里的读取速度是指连续读取速度,固态硬盘在传输速度上有很大的优势,最高可达500M/秒,其中读取速度达到400-600M每秒,写入速度同样可以高达200M每秒。对于1G的文件只需几秒就可搞定,而传统的IDE硬盘读取速度极限是无法超越200M每秒,写入速度也很难突破100M每秒。
常见硬盘接口标准
各种raid比较
链接:https://pan.baidu.com/s/1ps-X693xIidQbaFn6uhGTg
提取码:yo5m
- 分治思想
首先引入一个案例,想想你会怎么做?
需求:
我有一万个元素(比如数字或单词)需要存储?
如果查找某一个元素,最简单的遍历方式复杂的是多少?
如果我期望复杂度是O(4)呢?
会不会让你想起了之前数据结构所学习的排序算法,以及那一连串的复杂度。其中有一种很优秀的算法让我记忆犹新,归并排序,最后的快排也是引用了归并的一些思想。
归并排序也很完美地诠释了 什么是分治思想,实现算法从步行到上树的质变。
归并排序动态图解
链接:https://pan.baidu.com/s/11buPz8glBVcdVxFbewvhBA
提取码:71ne
回到正题,如何从10000个数里查找并还要保证O(4)的复杂度呢。
按照正常的逻辑链表存储这些数字,如果运气不好需要遍历所有数字。
首先利用hash算法,把所有的元素进行归一化统一长度,所有的数被2500取模后,有0-2499种结果。(前提说明一下 这个案例说的并不严谨,假设排序是平均分布的,刚好有2500个数组,则每个数组长度不会超过4)。首先计算你要查找值对应取模的结果,然后去这个结果对应的数组去找,最大复杂度只有O(4),这个案例中成功的利用取模函数进行分组,达成分治目的。
从上面的案例可以看出,面对大批量的数据处理和分析,分治思想的重要性。
- 分布式处理
分布式处理,巧妙地利用分治思想,避开了单机的磁盘IO瓶颈。
1、每台机器只进行两次小数据量的磁盘IO,速度很快,然后各自读入内存进行计算,形成以0-1999为索引的2000个数组。
2、每台机器留一种索引,将其余的索引内容传输至其他的节点,网络开销也很小,每台节点分别进入内存判断有没有重复的行内容。
3、处理数据的全程,两次磁盘IO+一次网络IO+两次磁盘IO 都在秒级,完全不用像单机那样每次IO都十几个小时。是一种利用空间换时间的策略。