首页 » 大数据 » Hadoop » Hadoop学习笔记(5)--MapReduce计算模型

Hadoop学习笔记(5)--MapReduce计算模型

 
文章目录

执行MapReduce任务的有两个角色:

  • 一个是JobTracker,
  • 另一个是TaskTracker。

每个MapReduce任务都被初始化为一个Job。每个Job又可以分为两个阶段:
Map阶段和Reduce阶段,即对应Map函数和Reduce函数

Map函数接收一个<key, value>形式的输入,然后产生同样为<key, value>形式的中间输出,Hadoop会负责将所有具有相同中间key值的value集合到一起传递给Reduce函数,

Reduce函数接收一个如<key,(list of values)>形式的输入,然后对这个value集合进行处理并输出结果,Reduce的输出也是<key, value>形式的。

Hadoop流

Hadoop流提供了一个API,允许用户使用任何脚本语言写Map函数或Reduce函数。

Map和Reduce都是处理Linux内的可执行文件,更重要的是,它们接受的都是标准输入(stdin),输出的都是标准输出(stdout),这就是原理。

约束

MapReduce处理的数据集(或任务)必须具备这样的特点:
- 待处理的数据集可以分解成许多小的数据集。
- 每一个小数据集都可以完全并行地进行处理。

MapReduce工作流

Map和Reduce都继承自MapReduce自己定义好的Mapper和Reducer基类,MapReduce框架根据用户继承Mapper和Reducer后的衍生类和类中覆盖的核心函数来识别用户定义的Map处理阶段和Reduce处理阶段。

MapReduce基类中的其他函数:

  1. setup函数

    setup函数可以看做task上的一个全局处理,而不像在Map函数或Reduce函数中,处理只对当前输入分片中的正在处理数据产生作用。

/**
*Called once at the start of the task.
*/
protected void setup(Context context
)throws IOException, InterruptedException{
//NOTHING
}
  1. cleanup函数

    跟setup函数相似,不同之处在于cleanup函数是在task销毁之前执行的。

/**
*Called once at the end of the task.
*/
protected void cleanup(Context context
)throws IOException, InterruptedException{
//NOTHING
}
  1. run函数

    先执行一个task钟的setup函数,再处理每个key的内容,再处理cleanup内容。

/**
*Expert users can override this method for more complete control over the
*execution of the Mapper.
*@param context
*@throws IOException
*/
public void run(Context context)throws IOException, InterruptedException{
setup(context);
while(context.nextKeyValue()){
map(context.getCurrentKey(),context.getCurrentValue(),context);
}
cleanup(context);
}

其它

学习笔记初探的时候,学习过MapReduce的原型其实就是Lisp里面的Map/Reduce。

这里介绍一个Lisp中的MapReduce语言。

PigPen

号称,“如果你会 Clojure,你就已经会 PigPen 了”的语言。

;Map-Reduce
(require '[pigpen.core :as pig])

(defn word-count [lines]
  (->> lines
    (pig/mapcat #(-> % first
                   (clojure.string/lower-case)
                   (clojure.string/replace #"[^\w\s]" "")
                   (clojure.string/split #"\s+")))
    (pig/group-by identity)
    (pig/map (fn [[word occurrences]] [word (count occurrences)]))))
;Test
=> (def data (pig/return [["The fox jumped over the dog."]
                          ["The cow jumped over the moon."]]))

#'pigpen-demo/data

=> (pig/dump (word-count data))
[["moon" 1] ["jumped" 2] ["dog" 1] ["over" 2] ["cow" 1] ["fox" 1] ["the" 4]]



原文链接:Hadoop学习笔记(5)--MapReduce计算模型,转载请注明来源!

0