Hadoop计划


MapReduce概念 – 我的学习成长日记 – 博客频道 – CSDN.NET
http://blog.csdn.net/onlyqi/article/details/50477899

Hadoop的灵感来源于Google的两篇论文——MapReduce和Google File
System(GFS),由Doug Cutting
带领团队进行开发,Hadoop的命名和图标是他儿子的小象玩具。

hadoop概述

hadoop是 Doug
Cutting

Lucene
之后的一个项目
主要用于 计算
是一个 开源,可靠,可扩展 的分布式计算框架
主要有

  • hdfs
    • 也就是 hadoop 的 dfs(Distributed File System)
  • MapReduce
    • 也就是核心想法(先Map,再reduce)
    • java8
      里面也看见对应的方法,感觉如果数据量小,现在用别的也可以实现,只是时间会长很多
  • yarn
    • 分布式资源调度

当然,hadoop1 和 hadoop2 的一些名词有变化
但是,对应的实现,是没有太大区别的
好处是,可以多台机器同时处理,通过心跳去及时获取计算结果


参考原文:
http://code.google.com/intl/zh-CN/edu/parallel/mapreduce-tutorial.html
MapReduce其实是两个分离的阶段:map和reduce。首先看一个简单的例子:
现需要计算1w篇文章中字母‘w’的数量。这些文章以键值对(key/value)的形式存储(表一):
DocumentID(key)
DocumentContent(Value)

Hadoop是Apache Sofeware Foundation的顶级项目(top-level
project),在Hadoop下有许多子项目,如Hadoop MapReduce,Hadoop
Distributed File System,HBase,ZooKeeper和Hive等。其中Hadoop
MapReduce如同Google MapReduce,提供分布式运算环境;Hadoop Distributed
File System如同Google File System,提供大量存储空间;HBase是一个类似Big
Table的分布式资料库(如表一)。还有其他部分可用来将这三个主要部分连接在一起,方便提供整合的云端服务。

hadoop的场景

一般可以用于

  • 日志分析
  • 海量数据的计算
  • 复杂算法
  • 搜索引擎
  • dsp获取的个人数据以及为行为分析提供数据

对应的hadoop生态圈

必发娱乐官方网站 1

hadoop生态图

  • Zookeeper
    • 分布式协作服务
  • HBase
    • 一个实时的nosql
    • sql(关系型数据库) 和 nosql(非关系型数据库)
      • mysql, Oracle、SQLServer、DB2
        都是关系型数据库(当数据量不是太大的时候,有又是)
      • MongoDB(很常见的nosql),
        Redis(很常见的内存数据库),Vertica(很少人用,原来公司用过,很强大),HBase
  • Hive
    • 数据仓库
    • 存储数据用
  • Pig
    • 数据流处理
  • Mahout
    • 数据挖掘库
    • 哎,超级难
    • 感觉数学要好,算法要好
  • MapReduce
    • 计算的核心
  • HDFS
    • hadoop的 dfs(Distributed File System)分布式文件系统
    • 感觉记住几个命令就行了
  • Flume
    • 日志收集
  • Sqoop
    • 数据库ETL,转换数据(Hive -> HBase, HBase -> Hive 等)
    • 没了解过

1
“This is an article”//假设这篇文章中含有“w”字母5个

表一   
Hadoop与Google架构比较

Hadoop核心

Hadoop Common

  • 很多项目都有common模块
  • 常用的基础,都放在里面
    Hadoop HDFS
  • hadoop的 dfs(Distributed File System)分布式文件系统
    Hadoop MapReduce
  • 分布式离线并行计算框架
  • 也就是核心想法(先Map,再reduce)
    Hadoop YARN
  • 新的MapReduce框架, 任务调度,资源管理

2
“This is another article”// 含有“w”字母8个

Google

Hadoop

MapReduce

Hadoop MapReduce

GFS

HDFS

Big Table

HBase

 

hdfs相关

namenode

  • Metadata存储一些信息
    • 比如, name名字, replicas备份数,路径等等
    • 记得,android的apk也有META-INF, html一般头部也有 meta 信息
  • 分开块处理信息
    • hadoop2, 默认128m一个块
    • hadoop1, 默认64m一个块

datanode

  • 存储信息
  • namenode分块后,信息分别会存储在datanode中

secondnamenode

  • namenode的副手吧
  • 最好和namenode不在一个服务器上,当namenode倒掉后,secondnamenode会跟上

.
“…”

MapReduce

yarn Architecture构架图

yarn (Yet Another Resource Negotiator,另一种资源协调者)
整个集群的资源调度,同时监控
比如,一个任务需要的cpu,内存等
这里ResourceManager是总的管理者,所有nodemanager的都由它管理
nodemanager一般都在不同的机器上

必发娱乐官方网站 2

一般流程

  • client 给 ResourceManager 一个请求
  • 会转换成一个Task(上图有, MapTask, ReduceTask,MPI Task)
  • Task会交给AppMaster,创建一个进程,获取信息,做对应的操作
  • 同时, AppMaster会给 ResourceManager 对应的信息返回,告诉需要的资源
  • ResourceManager 会根据对应的情况,分配资源
  • 外部所有的Container,由AppMaster统一管理

.
“…”

MapReduce是一个分布式的程序框架,【让服务开发者可以很方便地撰写程序(?)尝试过后再讨论这点:-)】,利用大量的运算资源,加速处理庞大的资料量。一个MapReduce的运算工作可以分为两部分——Map和Reduce,大量的数据在运算开始的时候,会被系统转换为一组组(key,value)的序对并自动切割成许多部分,分别传给不同的Mapper来处理。这里的每一个mapping操作都是相对独立的,所有的mapper都是并行运行的。Mapper处理完成也要将运算结果整理成一组组(key,value)的序对,再传给Reducer整合所有Mapper的结果(这里用一个reducer集合来执行reduction操作,所有带有相同key的mapper输出会聚集到同一个
reducer),最后才能将整体的结果输出。

hadoop核心 MapReduce

Map任务

  • 读取输入内存, 解析成 key,value 键值对
  • 重写map方法, 编写业务输出的key, value
  • 对 key,value 进行分区 (Partitioner类)
  • 将键值对排序,分组。相同key放入同一个集合

Reduce任务

  • 多个map输入, 按照不同的分区,copy到不同的 reduce节点
  • 对多个map任务进行合并,排序。根据逻辑,得到新的 key,value输出
  • 把reduce的输出,保存在文件中

10000
“This is the last article” //含有“w”字母9个

必发娱乐官方网站 3

下面是一段伪代码:
map(String key, String value): // key: document ID // value: document
contents for each word w in value: EmitIntermediate(w, “1”);

Figure1:MapReduce程序流程

map函数将被应用到每一个键值对。因此第一次调用为map(1, “This is a
article”),最后一次是map(10000, “This is the last
article”)。全部map函数运行完毕后,将输出一个中间结果集(表二):
字母
次数

必发娱乐官方网站 4

w
“5” //第一次调用的结果

Figure2:MapReduce程序流程(简化)

w
“8” //第二次调用的结果

MapReduce的Map和Reduce过程都定义了数据结构(key,value)对,Map操作在一个数据域中用一种类型表达一个数据对,然后在另一个不同的域中返回一个数据队列:

.
.

Map(key1,value1)—>list(key2,value2)

.
.

Map过程并行(parallel)应用于每一个输入的数据集,每一次调用都会产生一个(key2,value2)的队列,然后MapReduce架构收集输出队列中有相同key的数据对,把它们聚集在一起,因此构建了一个不同key
的数据对集合。

w
“9” //第1w次

Reduce方法应用于上面产生的每一个数据集合,从而产生相同域中的数据集合:

该结果集接下来交给reduce函数:
reduce(String key, Iterator values): // key: a word,”W” // values: a
list of counts int result = 0; for each v in values: result +=
ParseInt(v); Emit(AsString(result));

Reduce(key2,list(value2))—>list(v3)

reduce函数将被应用到每一个要查询的字母上。在此例中只有一个,”w”。此时只调用一次,
reduce(“w”, [“5”,
“8”…..”9”])。reduce做的仅仅是将数列中的所有数字相加,就得到了1w篇文章中w字母的个数。处理完成。
从上例我们可以总结出MapReduce的过程:
Map
首先,因为map是对每一个键值对分别进行计算(即,map函数用来分别统计每一篇文章中w的个数),而文章与文章之间没有什么关联。因此map函数可以实现很高的并行度,map函数的调用可以被灵活分散到多个服务器。
map的输入一般是:(k1, v1)。如上例为(int DocumentID, string
ArticleContent),输出是(k2, v2)。如上例是(“W”, 次数).
因此输出结果的key:k2通常不再是k1。k1的信息在大部分情况下并不需要,所以会被丢弃。例如我们通常不再需要DocumentID了。
Reduce
reduce函数实际的作用是汇总。此时对于字母w,reduce函数的工作已不能再被划分(只有一次调用),因此reduce的并行度并不高。但想象一下,现在的工作是统计1w篇文章中“word“,
”hello“,
”good“….”no“等1w个单词出现的次数,就会需要1w次reduce调用。因此reduce在执行大量复杂任务时,仍然能实现很高的并行度。
reduce的输入一般是(k2, list(v2))。上例中即为(string Word, list count).
输出为(k3, v3)。在上例中reduce函数就是将list
sum了一下,所以k2=k3。但并非所有的应用都是这样的。

每一个被调用的Reduce方法产生一个v3数据集或者一个空集,这里也可以返回多个value。所有返回的调用结果组成一个结果队列。

至此,对map和reduce给出概念
MapReduce是一种批处理计算范型。它可以简单的分为Map和reduce阶段。该范型特别适合在分布式集群上执行计算任务。
Map 函数,由用户编写,处理输入的键值对,输出一系列键值对形式的中间结果。
Reduce函数,也由用户编写,将键值对形式的中间结果作为输入参数。它按key将value
merge到一起(可以是求和,求平均值等多种操作),形成一个较小的结果集。
注意在实际应用中,map函数和reduce函数都可以有多个,被称为mapper和reducer。
在实际的MapReduce分布式计算系统(以Hadoop为例)中,为了加快大数据处理,会经过如下更复杂的过程。需要注意的是,用户必须定义的只有Map和reduce函数,其他的步骤(函数)都是分布式计算系统自动完成的。

必发娱乐官方网站 5

必发娱乐官方网站 6

这里写图片描述

数据分片阶段Splitting:The MapReduce library in the user program first
shards the input files into M pieces of typically 16MB to 64 MB per
piece. It then starts up many copies of the program on a clusterof
machines. 上图中数据被分成3份,并分配给3个Mapper处理。 One of the copies
of the program is special: the master. The rest are workers that are
assigned workby the master. There are M map tasks and R reduce tasks
to assign.
The master picks idle workers and assigns each one a map
task or a reduce task.
注意数据处理开始前,Mapper和Reducer的数量就已经决定了,且可以由系统自动产生,也可以用户自行指定数量。
Mapping阶段:A worker who is assigned a map task reads the contents of
the corresponding input shard. It parses key/value pairs out of the
input data and passes each pair to the user-defined Map function. The
intermediate key/value pairs produced by the Map function are buffered
in memory.
Combiner函数:Map阶段后,可以对每个mapper的中间结果做一个简单的合并。例如将一个map
worker的输入(表二)汇总成(w,“567”)这样的形式,进而提高后续步骤的效率。当一个node的mapper函数输出后,就会调用Combiner将mapper的输出结果整合且合并仅仅发生在单个Mapper的中间结果内部。
Shuffle和Partition阶段:该阶段的目的是将中间结果分区,且分区的数量是由reducer(记为R)决定的。也就是说,如果有4个reducer,那么就一定会将数据分成4个partition,以便很容易的将partition分配给reducer做进一步处理。分区一般采取的是哈希取模法,即根据key计算哈希值,然后对R取模。由此可知相同的key会被分到一个partition中(如果数据量太大则可能跨多个分区),因此该阶段也有shuffle的效果,既将相同key的数据整个到一起。由示意图可知这个过程由多个Mapper交互完成。
Reducer开始数据拉取:When a reduce worker is notified by the master
about these locations, it uses remote procedure calls to read the
buffered data from the local disks of the map workers
.
拉取完成后,每个reducer对自己负责的数据排序。
必发娱乐官方网站,The reduce worker iterates over the sorted intermediate data and for
each unique intermediate key encountered,it passes the key and the
corresponding set of intermediate values to the user’s Reduce
function.The output of the Reduce function is appended to a final output
file for this reduce partition.
When all map tasks and reduce tasks have been completed, the master
wakes up the user program.At this point, the MapReduce call in the user
program returns back to the user code.
需要注意的是,Mapper和reducer并非是一个机器一个。在一台机器上运行多个虚拟机就可以同时运行多个mapper和reducer。主控服务器决定有多少个mapper和reducer(也可由用户指定个数),以及如何给它们分配计算task。

MapReduce的缺点
MapReduce更适合非结构化数据的ETL处理类操作,且其可扩展性及容错性好,但是单机处理效率较低。
在系统从传统项目转换为MapReduce项目时,所有的数据操作逻辑都必须转换为Mapper和Reducer函数。尽管MapReduce提供了简洁的编程接口及完善的处理机制,使得大规模并发处理海量数据成为可能,但从发展趋势看,相对复杂的任务转换为MapReduce任务的开发效率还是不够高,所以其有逐步被封装到下层的趋势,即在上层系统提供更为简洁方便的开发接口,在底层由系统自动转换为大量MapReduce任务。
MapReduce本质上是由Map和Reduce序列两阶段构成。尽管Map和Reduce都支持大规模并发,但是由于在Map完成后有任务同步过程(例如
shuffle和partition),因此只有所有Map任务执行完成后才能开始Reduce过程。MapReduce对子任务间复杂的交互和依赖关系缺乏表达能力。

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注