001大数据之分治思想

 

说说大数据

大数据从字面上讲就是大,而大又是一个相对概念,相对的是谁呢?相对的是之前IT处理数据的大小(之前硬件的内存、硬盘、cpu等限制以及业务数据量小)、相对的是单机能处理的数据大小(一定时间内)即在规定时间内,一台机器无法满足用户的要求,把这种一台机器无法解决的矛盾,让需要处理的数据背锅,起其名为大数据。

分治思想

就是把原来由一台机器处理的大数据按照某种规则/算法拆分为小数据,然后小数据交给N个机器去处理即分治。

本质上还是因为单机IO、cpu、内存等硬件的限制,才想出使用多台设备进行计算。

例子讲解

问题1

问题描述

面试一家公司,被问到有一个2T的文本文件,其中有2行是一样的,如何快速找出该行?

问题分析

如果把2T的文件读取到内存,然后在内存做对比,内存无法承受(16G)。怎么办呢?

解决办法

使用分治思想之方法总结:先外部排序,后内部比较(排序)

  1. 使用atop规则,找出内存最大值,算出空闲内存大小,比如8G。2T=2000(约,举例而已) 2000/8=250
  2. 使用hash取模算法(readLine().hashCode %2000)把可能相等的行放在一个文件种,把2T文件拆分250份小文件,部署250台机器上,然后由250台机器分别处理,找出重复行结束
  3. 然后250台机器分别计算,找出重复行

 

网上解说:

传统做法是将第一行与其他行比较,第二行与其他行比较,这样的话需要遍历最多N*N次

我们现在花费30min将该文件进行拆分操作,让可能相等行放在疫情

 

假设Io速度是500MB每秒 2T文件读取一遍需要约60分钟 循环遍历需要N次Io时间 分治思想可以使时间为2次io

此方法存在问题

如何hashCode散列的不均匀,导致2T文件80%都散列到一个文件是不是又挂了啊

优化方法2

外无序,内有序,然后再比较即先定义固定区块取出来,然后内部排序,然后再进行定义指针,进行外部排序。

我们还使用10000台机器,2000G/10000=200M

  1. 把2T文件直接拆分10000份,每份200M(还是按行读取到1000份小文件中)
  2. 然后10000台机器分别读取自己的小文件并按顺序存入队列中(数字按大小,字符串按hash之)
  3. 然后分别从10000个队列取出数据进行排序比较并保留此比较中最小值或最大值并判断是否有相等,有结束
  4. 找到最小或最大值的队列再此弹出一行数据进行比较(进入第3步骤)

问题2

问题描述

分布式计算一定比单机快吗?

问题分析

不一定(有单机先找到概率),内存寻址要比IO10万倍

单机方案

 

单机面对的问题:大文件拆分为小文件、对每个小文件串行或小并发处理(避免内存耗尽)

 

大数据方案1(外有序、内无序)散列均匀

按逻辑拆分(readLine().hashCode%2000)+ 上传各台服务器 +一台服务器处理时间

 

大数据方案2 (外无序,内有序) 散列均匀

 

split -b 400M logdata + 上传各服务器 + 各服务把1个小文件再拆分2000个小文件然后合并hashCode%2000相同的文件 +计算时间

 

注意hashCode散列是否均匀避免大文件产生,以上都是散列均匀

如果散列不均匀:

大数据方法3(外无序,内有序) 散列不均匀

split -b 400M logdata + 上传各台服务器 + 各服务把1个小文件直接排序存入队列,第1次从每个队列取出1个数据,进行排序,比较,找出是否有相同,有相同结束程序。

不同找出最小值并记录其所属队列,移除该变量并从其队列再取出一个值并保留和最小值hashCode相等所有值然后继续进行比较

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章