1.初识HDFS—大数据启蒙

大数据启蒙

分治思想

分而治之的思想很重要,出现在了很多地方。
1. Redis集群
2. ElasticSearch
3. Hbase
4. HADOOP生态无处不在!
需求:
我有一万个元素(比如数字或单词)需要存储。
如果查找某一个元素,最简单的遍历方式复杂的是多少?
普通思想
顺序查找,复杂度o(n)
查找x
a
c
f
r
x
分治思想
每个元素的hash值分别模2500。
x.hashCode % 2500

这样就会有2500组元素,组名分别是1,2,3,...
之后想查找x,就可以用x的hash值模2500
得到的值就是x所在的组名
0
1
2
...

需求:
有一个1T的文本文件,里面有很多很多的行,只有两行一样,它们出现在未知的位置,需要查找到它们。
运行环境为单机,而且可用的内存很少,也就几十兆。

假设io速度是500MB每秒
1T文件读取一遍需要约30分钟

如何让时间变为分钟、秒级别
普通思想
先读取第一行数据,之后依次读取文件中的每行进行比较。
再读取第二行数据,再依次和文件中的每行进行比较。
直到整个文件所有行都比较过。
1T文件读取一遍30分钟,读取N遍为30分钟*N。
过于耗时,几乎无法完成。
分治思想
每读取一行计算当前行文本的hash值再模2000
readLine().hashCode % 2000

得到一个数字,将这行文本写入到这个数字对应的文件里
整体操作一遍后,会得到2000个小文件
每一个小文件内的hash值模2000得到的数字,应该都是一样的
所以如果两个相同的文本,必定会在相同的一个小文件内
之后只需要查看每一个小文件里有没有重复的文本就可以了

具体模上多少,以内存一次性能将小文件完全读取为准。

需求
有一个1T的文本文件,里面有很多很多的行,每一行都是一个数字,要求对整个文件的数字进行全局排序。
运行环境为单机,而且可用的内存很少,也就几十兆。
普通思想
网络上有很多著名排序算法,都是针对有限长度的数组排序。
对于这种非常庞大的数据量,普通思想无法完成。
分治思想1
依次读取每行数据。
如果 0<=数字<=100 就放在0号文件内。
如果 101<=数字<=200 就放在1号文件内。
如果 201<=数字<=300 就放在2号文件内。
...

然后就会得到N个小文件。
并且小文件的特征为内部无序,外部有序。

随后我们再依次把每个小文件都进行排序。

再将n个小文件组合成一个大文件,就排序好了。

数字具体设置为多少,以内存一次性能将小文件完全读取为准。
分治思想2
每次读取固定大小文件,例如每次读取50M。
随后将这50M数据进行排序,放到一个小文件内。

依次进行以上步骤,就会得到n个大小为50M,并且内部已经被排好序的小文件。

并且文件的特征为内部有序,外部无序。

既然特征为内部有序,外部无序,就可以使用分治排序。

每有一个文件就维护一个变量,依次取出每个文件的数字进行比较。

例如下图:
维护三个变量,依次对其进行赋值比较:1,2,4
1最小,写入文件内,再取出3进行比较:3,2,4
2最小,写入文件内,再取出值进行比较。
...

到最后所有值都比较完成并写入文件内。
1
3
4
2
4
5
4
6
7

需求:
有一个1T的文本文件,里面有很多很多的行,只有两行一样,它们出现在未知的位置,需要查找到它们。

运行环境为集群。

假设每台机器参数:
   io速度是500MB每秒
   空余内存为1G
   千兆网卡,传输速度为100MB
分治思想 - 集群
因为每台主机io速度为500MB/S
将1T文件分为500MB每份,等于2000
所以想要处理1T文件,配置2000台主机最合适

将1T数据分为2000份的500MB小文件,发送到每台主机中。

500MB文件每读取一行计算当前行文本的hash值再模2000
readLine().hashCode % 2000

2000台机器都进行如上操作。
结果就是2000台机器上,每台机器上都有2000个小文件。

再将这些文件归类组合:
	每台主机将0号文件都发送给主机0。
	每台主机将1号文件都发送给主机1。
	每台主机将2号文件都发送给主机2。
	...
	
每台主机都将自己的2000个同号文件合并成一个500MB的大文件
并且分别计算自己的500MB文件内是否有重复行。
主机网卡io为100MB/S,要将1T文件分发至2000主机内,相当于以100MB/S的速度遍历一遍1T文件。
1T=1000000Mb
1000000/100=10000
也就是说将1T文件分发至2000台主机需要10000秒,约等于2.8小时。

每台主机io为500MB/S,处理500MB数据需要1秒时间。

而后2000台主机互相发送拉取数据,归纳整理所需要的时间不可预估,可能会出现网络拥塞等现象。
每台主机都去对应主机拉取指定文件,每台主机每次拉取250KB,多次拉取,共500MB。
也就是一台主机同时向2000台主机拉取属于自己的小文件需要5秒。
我们算上网络拥塞等不可预估问题,将他算为1分钟。

也就是集群操作1T文件需要2.7小时,时间都花费在分配文件上了。
所以2000台真的比一台速度快吗?
然而如果考虑每天都有1T数据的产生呢?
如果增量了一年,最后一天计算数据呢?
情况又是怎样呢?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值