前面已经体会到了hadoop的魅力,为了更深入的了解hadoop,不仅仅是为了写出运行hadoop的程序,而是更好的了解她,用她来解决我们需要解决的问题。
MapReduce是hadoop的核心,所以了解MapReduce是运用hadoop的首要任务。下面是翻译过来的MapReduce介绍,作为自己学习的一个借鉴。
Hadoop MapReduce 可以轻松的写应用程序在集群中并行,可靠,容错地处理大数据。一个MapReduce job 通常把输入的数据分切成独立的chunks,
并由map task 完全并行的方式来处理。Map task 处理完成后,将处理完成的结果排序,作为reduce task 的输入数据。整个MapReduce架构会自动的
分配task,监控task和重启失效的task。
MapReduce包含Jobtracker 和 TaskTracker。Jobtracker只有一个,Tasktracker存在于每一个slave节点上。Jobtracker分配任务给Tasktracker,
Tasktracker根据命令执行,监控和重启失败的task。
尽管Hadoop是用java实现的,但是MapReduce程序可以不用java编写。可以使用Hadoop Streaming (SHELL)
和 Pipes(C++)来编写。
Input和Output
Mapreduce 以键值对<key,value>的方式来处理数据。
Key和value类必须要序列化,需实现writable接口。Key类需要实现 writablecomparable接口支持排序。
MapReduce的Input和Output如下:
(input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> (output)
用workcount示例:
map-1:
< Hello, 1>
< World, 1>
< Bye, 1>
< World, 1>
map-2:
< Hello, 1>
< Hadoop, 1>
< Goodbye, 1>
< Hadoop, 1>
map-1的输出:
< Bye, 1>
< Hello, 1>
< World, 2>
map-2的输出:
< Goodbye, 1>
< Hadoop, 2>
< Hello, 1>
Reduce执行结果:
< Bye, 1>
< Goodbye, 1>
< Hadoop, 2>
< Hello, 2>
< World, 2>
MapReduce 用户接口
MapReduce程序通常需要实现 Mapper 和 Reducer 接口来提供map 和 reduce方法。这是整个工作的核心。
Mapper
Mapper maps 将输入的 key/value 处理成 中间形式的 key/value。中间数据不需要和输入数据一样的类型。Map将输入的数据处理输出零个
或多个 output键值对,output键值对被OutputCollector.collect(WritableComparable,Writable)类收集处理成中间数据 mapper output。
mapper output会被排序和分区交给reduce处理。分区数和reducer task的数量一致。用户可以通过实现自定义 Partitioner来控制哪些
keys 交给reducer 处理。
用户可以选择指定combiner,通过JobConf.setCombinerClass(Class)指定combiner类。Combiner类可计算本地的中间数据,
来减少Mapper数据转换工作量给Reducer。
Maps的数量通常取决于需要处理数据的分片数多少。每个slave节点通常可同时运行10-100个maps。如果在高性能CPU机器上最多可以
运行300maps。如果处理10TB的内容,blocks 128MB的话,需要82000个maps甚至更多。
Reducer
Reducer 将mapper output中间数据处理成想要的结果。
Reduce的数量可以通过JobConf.setNumReduceTasks(int)设置。
Reduce有三个阶段:shuffle,sort,reduce。
Shuffle
Reduce的输入数据是mapper处理和排过序的。在该阶段中通过HTTP协议来完成mapper相关结果的分区partition。
Sort
该阶段根据key来排序。Shuffle和Sort阶段在map output结果合并后。
Reduce
在reduce阶段,处理被分组后的每个<key,list<values>>键值对。
Reduce的处理结果会通过OutputCollector.collect(WritableComparable, Writable)写入FileSystem。
应用程序可以通过Reporter来报告进度,设置应用程序状态和更新计数器,或监听是否存活。
Reducer的处理结果是没有排序的。
How Many Reduce
Reduce的节点数一般是节点数nodes的0.95 – 1.75倍。0.95倍下maps阶段完成后reduces可以立即执行。在1.75倍下,性能好的
阶段优先完成第一轮reduce,然后开始第二轮reduce来提供更好的负载均衡。
不断增加reduces的数量会使整个架构负载,但是会提高负载均衡和降低失效成本。
Reducer NONE
当我们不需要 reduce-task时,把reduce task的数量设置为0是合法的。
Partioner
Pationer控制map-outputs的关键字分区。通常关键字被hash分区。Pationer的数量通常和reduce task的数量一致,并控制着哪些
key被哪一个reduce处理。Hash 分区是默认的partitioner。
Reporter
Reporter为MapReduce程序提供运行进度,应用等级状态信息和更新计数器。
OutoutCollector
OutputCollector是由MapReduce架构提供来专门收集mapper和reducer的处理结果的工具。
Hadoop MapReduce自带的library有很多有用的mappers,reducers和partitioners。
Job Configuration
JobConf 体现了MapReduce 的配置信息。
JobConf是用户用来描述MapReduce任务,hadoop根据该JobConf来执行任务。MapReduce会公平的根据JobConf的描述来执行任务。
JobConf是用来指定Mapper,combiner(如果需要),Partitioner,Reducer,InputFormat,OutputFormat和OutputCommitter类实现。
另外,JobConf也用来指定高级设置。比如:比较器Comparator,文件保存到分布式缓存DistributedCache,中间结果和处理完成的结果
的压缩,通过用户提供的脚本debug,最大尝试任次数attempts per task,最大容忍失败任务百分比等等。
资料来源:http://hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html