(入门菜鸟请看)云计算之我思
本人日语专业,最近看着cpu等底层的东西,讲到兴头会联系自己对概念的理解,如有不妥,欢迎交流。
本文提到 thread、线程、内存等基本概念。
搞云计算的是用来做数据挖掘、大数据分析、机器学习之类的,然而并不知道这些有个什么卵用,因为我并没做过数据挖掘大数据分析和机器学习。
看的是google的三大论文,bigTable、MapReduce(并行处理)、文件系统GFS。
!!!!之后会对比一下 普通的执行流程和云计算的流程的差异,以此来了解云计算
(官方说明)一个具体流程如下:不感兴趣,没事,后头有精彩的
(1)输入文件分成M块,每块大概16M~64MB(可以通过参数决定),接着在集群的机器上执行分派处理程序
(2)M个Map任务和R个Reduce任务需要分派,Master选择空闲Worker来分配这些Map或Reduce任务
(3)Worker读取并处理相关输入块,Map函数产生的中间结果<key,value>对暂时缓冲到内存
(4)中间结果定时写到本地硬盘,分区函数将其分成R个区。中间结果在本地硬盘的位置信息将被发送回Master,然后Maste
(5)当Master通知执行Reduce的Worker关于中间<key,value>对的位置时,它调用远程过程,从MapWorker的本地硬盘上读取
缓冲的中间数据。当Reduce Worker读到所有的中间数据,它就使用中间key进行排序,这样可使相同key的值都在一起
(6)Reduce Worker根据每一个唯一中间key来遍历所有的排序后的中间数据,并且把key和相关的中间结果值集合传递给用户
定义的Reduce函数。Reduce函数的结果写到一个最终的输出文件
(图画表示)
我们由一个问题来导入云计算处理的思维::
模拟一个例子,有数组a[100] , b[100] ,c[100] ,a和b每个里头都有100个数据,c数组的对应位置存储着运算结果。
如果是普通的运算代码应该这么写哈:
for(int i = 0 ; i<a.length();i++){
c[i]=a[i]+b[i];
}
第一次跳跃--->线程并行处理及云计算的并行数据处理MapReduce
如果是用两个线程来做的话,是不是要面临数据有没有被处理的问题呢?
还是a[100] b[100] c[100]这三个数组,a,b两个数组全是数据,c是空的
这是后是不是要多加一个考虑就是这么多运算的任务不能重复执行不是?
class threadA{
public void run(){
for(int i = 0 ; i<a.length();i++)
{ //根据前面的代码可以看出,如果,判断一下,如果c数组对应位置的
if(c[i]==null)
{
c[i] = a[i]+b[i];
}
}
}
}
class threadB{
public void run(){
for(int i = 0 ; i<a.length();i++)
{ //同前面的
if(c[i]==null)
{
c[i] = a[i]+b[i];
}
}
}
}
第二次跳跃---->数据:------!Google Distributed File System,GFS
较上面不同的是:我们的数据是分散在不同的计算机上的,因为一台计算机的存储有限,加上其他的原因反正我们是 !接受了分布式存储!。。。。。
这个文件最终达到的目的是,一台电脑存放不了的数据,就给云计算集群里 其他的电脑;
这时候问题就来了,一是要知道都有哪些数据,二是知道这些数据都放在哪。
我感觉这个跟虚拟内存技术挺像的,这个是忽悠计算机搞的好像它有无数的内存一样,但其实是把原来内存里的数据暂存到硬盘里。
云计算跟它的相同之处在于同样是存储有限,区别是一个是内存不足、一个是硬盘不足,还有一个区别是:一个花时间来换取内存空间,另一个是扩展到别的计算机里。
第三次跳跃---->控制:------!分布式监控系统Dapper
我感觉就跟 操作系统 和 thread的关系一样类似
有一个个thread 和 他们的集合 threadGroup
threadGroup里面存放的是一个个thread,用于控制这些线程
class thread(){
String threadName;
void run();
}
class threadGroup{
thread[ ];
}
而云计算则是控制一台一台集群里的计算机。