您的位置:首页 > 运维架构

读书笔记--《hadoop实战》--第一章

2012-05-29 17:11 232 查看
1.2 什么是hadoop

Hadoop是一个开源的框架,可编写和运行分布式应用处理大规模数据。

不同的用户可以从独立的客户端提交计算“作业”到Hadoop,这些客户端可以是远离Hadoop集群的个人台式机。



1.3 了解分布式系统和hadoop

Hadoop强调把代码向数据迁移。Hadoop集群内部既包含数据又包含计算环境。客户端仅需发送待执行的MapReduce程序,而这些程序一般都很小。

数据被拆分后在集群中分布,并且尽可能让一段数据的计算发生在同一台机器上,即这段数据驻留的地方。

不如让数据不懂,而将可执行代码移动到数据所在的机器上去。

1.4 比较SQL数据库和hadoop

SQL(结构化查询语言)是针对结构化数据设计的,而hadoop最初的许多应用针对的是文本这种非非结构化数据。从这个角度看,Hadoop比SQL提供了一种更为通用的模式。

关系模型具有大量形式化的属性。但当前的应用所处理的许多数据类型并不能很好地适合这个模型。文本、图片和XML文件时最典型的例子。大型数据集往往是非结构化的或半结构化的。在Hadoop中,数据的来源可以有任何形式,但最终会转化为键/值对以供处理。

SQL从根本上是一个高级声明式语言。查询数据的手段是,声明想要的查询结果并让数据库引擎判断如何获取数据。在MapReduce中,实际的数据处理步骤是由你指定的,它很类似于SQL引擎的一个执行计划。SQL使用查询语句,而MapReduce则使用脚本和代码。

Hadoop是专为离线处理和大规模数据分析而设计的,它不适合那种对几个记录随机读写的在线事务处理模式。Hadoop最适合一次写入、多次读取的数据存储需求

1.5 理解MapReduce

管道有助于进程原语的重用,已有模块的简单链接即可组成一个新的模块;消息队列则有助于进程原语的同步。程序员将数据处理任务以生产者或消费者的形式编写为进程原语,有系统来管理它们何时执行。

在MapReduce模型中,数据处理原语被称为mapper和reducer。

1.5.1 动手扩展一个简单程序(文本中的单词出现频次统计)

如果文件都存在一个中央存储服务器上,那么瓶颈就是该服务器的带宽。

在数据密集型分布式应用中存储和处理不得不紧密的绑定在一起。

为了使它工作在一个分布式计算机上,发现需要添加以下功能:1.存储文件到许多台计算机上 2.编写一个基于磁盘的散列表,使得处理不受内存容量限制 3.划分来自于第一阶段的中间数据(即wordCount) 4.洗牌这些分区到第二阶段中合适的计算机上

1.5.2 相同程序在MapReduce中的扩展

MapReduce程序的执行分为两个主要阶段,为mapping和reducing。在mapping阶段,MapReduce获取输入数据并将数据单元装入mapper。在reducing阶段,reducer处理来自mapper的所有输出,并给出最终结果。

mapper意味着将输入进行过滤与转换,使reducer可以完全聚合。这样就需要编写partitioning和shuffling函数,并与mapping和reducing一起形成常见的设计模式。

为了使它们能够无缝的在一起工作,需要在数据的通用结构上达成一致。

map和reduce函数必须遵循以下键和值类型的约束。

 输入输出
map<k1,v1>list(<k2,v2>)
reduce<k2,list(v2)>list(<k3,v3>)
例如map中出现2个<"foo",1>表示在文本中foo出现了两次,然后在reduce中将所有的聚合,输入为<"foo",list(1,1)>,输出为<"foo",2>,

方法为emit((String)token,(Integer)sum)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息