编写可扩展、分布式的数据密集型程序的基础知识程序员
为何数据量很大?数据库
在当今社会,咱们正在被数据包围,人们上传视频、用手机照相、发短信给朋友、更新Facebook、网上留言以及点击广告等,都产生大量的数据。重要的是,服务提供者不能不这些数据随便的删除,如何存储这些数据就成为了难题。编程
数据以指数级的增加!~也就是U的右半边安全
数据的增加首先对像谷歌、雅虎、亚马逊、微软、Facebook、腾讯、百度、阿里等等公司提出了挑战。如何存储、如何分析,他咩的。服务器
存储这些数据是有必要的,可是干吗要进行分析呢?网络
你可能有这样的需求,遍历全部的数据发现哪些网站更受欢迎,哪些书籍有需求,哪一种广告吸引人。若是知道了以上这些,对公司的商业发展会有很大帮助,会产生不少利润。可是数据的量级倒是TB或者PB级别(1TB=1024GB、 1PB=1024TB),你须要在这么大的数据上进行遍历。数据结构
他们怎么作了?架构
谷歌率先推出了MapReduce计算模型,针对本身公司的业务需求。app
Doug Cutting看到机会,参考Google的论文,领导开发了一个开源版本的MapReduce,称为Hadoop框架
雅虎等公司纷纷响应,为其提供支持。
如今Hadoop已经成为许多互联网公司的基础计算平台的一个核心部分,如雅虎、Facebook、LinkedIn和Twitter。
许多传统行业、传媒业和电信业也开始采用这个系统,如《纽约时报》、中国移动和IBM等公司
做为程序员我感受鸭梨好大呀!~
Hadoop及大规模分布式数据处理,正在迅速成为许多程序员的一项重要技能,传统的关系数据库、网络和安全也须要掌握,做为一个高效的程序员的必修课。
斯坦福和卡内基-梅隆等一流的大学已经开始将Hadoop引入他们的计算机科学课程。
什么是Hadoop?
Hadoop是一个开源框架,可编写和运行分布式应用处理大规模数据。
Hadoop不同凡响之处是?
方便:通常商用机器构成的大型集群或者其余云计算服务,俗称:一群屌丝顶个高富帅
健壮:容错机制,由于是通常的商用机器,因此硬件故障不能保证。Hadoop认为一台主机故障是常态,但不会影响集群的运行。
可扩展:经过增长集群的节点,能够线性的扩展以处理更大的数据集。
简单:Hadoop容许用户快速、高效的编写出并行代码,而不须要关注具体并行的实现,只要按她的模式走便可。
亚马逊的弹性计算云(EC2)等云计算服务是啥?
Hadoop集群是什么?
同一地点用网络互联的一组通用机器,由于有不少机器,因此也称为"机器云" "云"
另外:一般在一个Hadoop集群中的机器都是相对同构的X86 Linux服务器,并且它们集合老是位于同一个数据中心,并一般在同一组机架里。
什么是机架?
搭载计算机的架子,一个机架里面有不少计算机。
什么是摩尔定律?
摩尔定律是由英特尔(Intel)创始人之一戈登·摩尔(Gordon Moore)提出来的。其内容为:当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增长一倍,性能也将提高一倍。换言之,每一美圆所能买到的电脑性能,将每隔18个月翻一倍以上。
摩尔定律说明硬件性能的提高,就能够解决大规模计算的问题吗?
固然能够,但不能全靠超级计算机,由于这种难度会很大,古代的中国人在使用牛拉木头的时候,会使用多个牛来拉木头,而不是培养出更强壮的牛。
有一种替代方案已经得到普及,即把许多低端、商用的机器组织在一块儿,造成一个功能专注的分布式系统。
分布式系统(俗称向外扩展)与大型单机服务器(俗称向上扩展)之间的对比?
一台拥有4个I/O通道的高端机,即便每一个通道的吞吐量各位100MB/s,读取4TB数据也须要3个小时。
利用Hadoop,一样的数据集会被划分为较小的块 (一般64MB),经过Hadoop分布式文件系统(HDFS)分布在集群内多台机器上。集群能够并行读取数据,进而提供很高的吞吐量。
而这样一组通用机器比一台高端服务器更加便宜。
SETI@home 是什么?
SETI@home 是一项利用全球联网的计算机共同搜索外星生命的科学实践计划。
在世界各地计算机屏保的时候协助寻找外星生命,这样不会影响用户的使用。
在SETI@home ,一台中央服务器存储来自太空的无线电信号,并在上网发布给世界各地的客户端台式机去寻找异常的迹象。通过客户端的计算后,再将返回的数据结果存储起来。
什么是CPU bound(计算密集型)?
CPU bound与I/O密集型相反
什么是I/O bound(I/O密集型)?
I/O bound指的是系统的CPU效能相对硬盘/内存的效能要好不少,此时,大部分的情况是CPU在等待I/O的读写
Hadoop与其余分布式系统架构进行比较?
SETI@home 须要客户端和服务器之间重复传输数据,但因为数据规模太大,数据迁移变得十分困难。
Hadoop是代码向数据迁移的理念,Hadoop集群内部既包含数据又包含计算环境,客户端仅须要发送待执行的MapReduce程序,而这些程序通常很小。而且,数据被拆分后再集群中分布,而且尽量让一段数据的计算发生在同一台机器上。
代码向数据迁移的优点?
让数据不动(数据很大),让代码移动到数据所在的机器上。
传统SQL数据库与Hadoop比较一下?
关于设计理念
SQL(结构化查询语言)是针对结构化数据设计的。
Hadoop是针对文本这种非结构化数据设计的。
这样看来Hadoop提供了一种更为通用的模式。
更加详细的比较:
1、用向外扩张代替向上扩展
扩展商用关系型数据库的代价很是昂贵,性能4倍于标准的PC的机器,成本将大大超过一样的4台PC放在一个集群中。一个Hadoop集群的标配是十至数百台计算机。
2、用键/值对代替关系表
关系型数据库的一个基本原则是按某种模式存放具备关系型数据结构的表中,可是不能很好的适合文本、图片、和XML文件等数据类型。
大型数据集每每是非结构化或半结构化的,在Hadoop中数据的来源能够是任何形式,但最终会转化为键/值对。
3、用函数式编程(MapReduce)代替声明式查询(SQL)
SQL使用查询语句,声明想要查询的结果,让数据库引擎断定如何获取数据。
MapReduce使用脚本和代码,比SQL查询更为通常化的数据处理方式,例如,你能够创建复杂的数据统计模型,或者改变图像数据的格式。而SQL就不能很好的适应这些任务。
4、用离线批量处理代替在线处理
Hadoop是专为离线处理和大规模数据分析而设计的,它并不适合那种对几个记录随机读写的在线事务处理模式。
Hadoop最适合一次写入,屡次读取的数据存储需求,在这方面它就像SQL的数据仓库。
什么是管道数据处理模型,什么是消息队列数据处理模型?
什么是MapReduce数据处理模型?
这种模型最大的优势是容易扩展到多个计算节点上处理数据。在MapReduce模型中,数据的处理原语被称为mapper和reducer
练习,统计一组文档中的每一个单词出现的次数?
考虑这样一种场景:一个文件,文件里只有一句话 Do as I say, not as do. ,统计单词出现的次数。
define wordCount as Multiset;
for each document in documentSet {
T = tokenize (document);
for each token in T {
wordCount[token]++;
}
}
display(wordCount);
单词 |
计数 |
as |
2 |
Do |
2 |
i |
1 |
not |
1 |
say |
1 |
改程序循环遍历全部文档。对于每一个文档,使用分词过程逐个地提取单词。对于每一个单词,在多重集合wordCount中的相应项上加1.最后display()函数打印出wordCount中的全部条目。
这个程序只适合少许的文档,使用单台计算机反复遍历全部文档将会很是费时。
那么,如何解决该问题?
可让工做分布到多台机器上,每台机器处理这些文档的不一样部分,当全部的机器都完成时,将合并这些结果。
第一阶段分布到多台机器:
// 伪代码
define wordCount as Multiset;
for each document in documentSet {
T = tokenize (document);
for each token in T {
wordCount[token]++;
}
}
sendToSecondPhase(wordCount);
第二阶段合并这些结果
// 伪代码
for each wordCount received from firstPhase {
multisetAdd (totalWordCount, wordCount);
}
上边的代码不是很难对么?可是忽略了一些细节。
缺陷1:咱们忽略了文档读取的性能要求,若是文件存在一个中央存储服务器上,那么瓶颈就是该服务器的带宽。所以,你须要将文档分开存放,使每台机器能够仅处理本身所存储的文档。(这也呼应了数据密集型分布式应用中存储和处理不得不紧密地绑定在一块儿)
缺陷2:忽略了wordCount被存储在内存中,当处理大型文档集时,一个特定单词的数量就会超过一台机器的内存。因此咱们不得不改写程序,以便在磁盘上存储该散列表。这意味着咱们将实现一个基于磁盘的散列表,其中设计大量的编码。
缺陷3: 第二阶段只有一台计算机,它将处理来自全部计算机在第一个阶段计算的wordCount的结果。wordCount的处理任务本来就至关繁重,第二阶段的单台计算机将成为瓶颈。
那么,针对以上缺陷将如何应对?
解决缺陷3,咱们可否按分布模式重写第二阶段,以便它能够经过增长更多的计算机来实现扩展?
须要在第一阶段以后将wordCount分区,使得第二阶段的每台计算机仅需处理一个分区。
举个例子,假设咱们在第二阶段有26台计算机。咱们让每台计算机上的wordCount只处理以特定字母开头的单词。例如,计算机A在第二阶段统计以字母a开头的单词。为了在第二阶段中实现这种划分,咱们须要对第一阶段稍微修改。再也不采用基于磁盘的散列表实现wordCount,而是划分出26个表:wordCount-a、wordCount-b等。每一个表统计以特定字母开头的单词。通过第一阶段,来自该阶段全部计算机的wordCount-a结果将被发送到第二阶段的计算机A上,全部wordCount-b的结果将被发送到计算机B上,依次类推。第一阶段中的每台计算机都会将结果洗牌到第二阶段计算机上。
如今单词统计程序正变得复杂,为了使它工做在一个分布式计算机集群上,咱们发现须要添加如下功能:
存储文件到许多台计算机上 (第一阶段)
编写一个基于磁盘的散列表,使得处理不受内存容量限制
划分来自第一阶段的中间数据 (即wordCount)
洗牌这些分区到第二阶段中合适的计算机上
为何使用Hadoop?
即便对于单词统计这样简单的程序,这都是繁重的工做,而咱们甚至尚未涉及容错的问题。
(若是在任务执行过程当中一个计算机失效该怎么办?)这就是咱们须要一个像Hadoop同样的框架。当你用MapReduce模型来写应用程序,Hadoop将替你管理全部与可扩展性相关的底层问题。