main方法主要包括input/output路径、key/Value类型,input/output格式等 i n p u t / o u t p u t 路 径 、 k e y / V a l u e 类 型 , i n p u t / o u t p u t 格 式 等 ,job.waitForCompletion j o b . w a i t F o r C o m p l e t i o n 为了提交job和监控它的进程。
MapReduce -User Interfaces
Mapper
Maps 是将各个独立的任务转移输入文件到中间文件,被转移的中间文件不需要和输入文件的类型是一样。一个输入的<KeyValue> < K e y V a l u e > 对可能有Map 0个或 多个<Key,value> < K e y , v a l u e > 对输出。
Mapper 的实现经过job的 job.setMapperClass j o b . s e t M a p p e r C l a s s 方法,然后框架为在inputSplit的每个键值对调用map(WritableComparable,Writable,Context) m a p ( W r i t a b l e C o m p a r a b l e , W r i t a b l e , C o n t e x t ) ,然后,程序可以调用cleanuo(Context)方法 c l e a n u o ( C o n t e x t ) 方 法 。
程序可以通过使用Counter C o u n t e r 报告 其统计信息。
Mapper M a p p e r 输出被排序,然后分给每个Reducer,总的划分数量和REducer的任务数量是一致的。可以通过Partitioner P a r t i t i o n e r 控制Keys 到哪个Reducer。
可以使用combiner(通常Job.setCombinerClass(Class)) c o m b i n e r ( 通 常 J o b . s e t C o m b i n e r C l a s s ( C l a s s ) ) 使中间的输出合并,可以减少Maper到Reducer的数据量。
Reducer 被执行通过Job.setReducerClass方法 J o b . s e t R e d u c e r C l a s s 方 法 ,通过重新来实例化他们,框架中的inputs组中的每个键值对然后调用reduce(WritableComparable,Iterable<Writable>,Context) r e d u c e ( W r i t a b l e C o m p a r a b l e , I t e r a b l e < W r i t a b l e > , C o n t e x t )
在reducer之前,中间的键 在等规则情况下,需要进行不同的组合,然后可以通过Job.setSortComparatorClass(Class). J o b . s e t S o r t C o m p a r a t o r C l a s s ( C l a s s ) . , Job.setGroupingComparatorClass(Class) J o b . s e t G r o u p i n g C o m p a r a t o r C l a s s ( C l a s s ) 可以被用来控制中间keys的组合。
Reduce
在这个阶段中,在组合的inputs 的每个键值对调用reduce(WritableComparable,Iterable<Writable>,Context) r e d u c e ( W r i t a b l e C o m p a r a b l e , I t e r a b l e < W r i t a b l e > , C o n t e x t ) 方法。
reduce的输出任务通常写入FileSystem F i l e S y s t e m 使用Context.write(WritableComparable,Writable) C o n t e x t . w r i t e ( W r i t a b l e C o m p a r a b l e , W r i t a b l e )
在这种情况下,maps任务的输出直接进入FileSystem,也就是FileOutputFormat.setOutputPath(Job,Path) F i l e O u t p u t F o r m a t . s e t O u t p u t P a t h ( J o b , P a t h ) 所设置的路径, 写入FileSystem之前,框架没有排序map−outputs m a p − o u t p u t s 。
一些job参数是比较直接设置Job.setNumReduceTasks(int)) J o b . s e t N u m R e d u c e T a s k s ( i n t ) ) ,其他参数也巧妙的相互联系参与框架的其余部分,还有更复杂的Configuration.set(JobContext.NUMMAPS,int)) C o n f i g u r a t i o n . s e t ( J o b C o n t e x t . N U M M A P S , i n t ) ) .
Job通常用来指定Mapper、Combiner、Partitioner、Reducer、InputFormat、OutputFormat的实现 M a p p e r 、 C o m b i n e r 、 P a r t i t i o n e r 、 R e d u c e r 、 I n p u t F o r m a t 、 O u t p u t F o r m a t 的 实 现 , FileInputFormat 表明设置输入的路径(FileInputFormat.setInputPaths(Job,Path…)、FileInputFormat.addInputPath(Job,Path))and(FileInputFormat.setInputPaths(Job,String…)、FileInputFormat.addInputPaths(Job,String)) ( F i l e I n p u t F o r m a t . s e t I n p u t P a t h s ( J o b , P a t h … ) 、 F i l e I n p u t F o r m a t . a d d I n p u t P a t h ( J o b , P a t h ) ) a n d ( F i l e I n p u t F o r m a t . s e t I n p u t P a t h s ( J o b , S t r i n g … ) 、 F i l e I n p u t F o r m a t . a d d I n p u t P a t h s ( J o b , S t r i n g ) ) ,输出文件路径通过(FileOutputFormat.setOutputPath(Path)) ( F i l e O u t p u t F o r m a t . s e t O u t p u t P a t h ( P a t h ) ) 设置。
使用者可以通过程序把Configuration.set(String,String)/Configuration.get(String) C o n f i g u r a t i o n . s e t ( S t r i n g , S t r i n g ) / C o n f i g u r a t i o n . g e t ( S t r i n g ) 设置任意参数,可视,DistributedCache D i s t r i b u t e d C a c h e 仅被用来读巨大的数据。
Job Submission and Monitoring
Job 是用户作业与ResourceManager交互的主要接口。
Job 提交进程包括:
检查job指定的input、output
计算job inputSplit的值。
如果有必要,设置DistributeCache的数量信息。
将作业的jar 和 配置复制到MapReduce 系统文件目录。
提交job 到REsourceManager,并且监控它的信息。
使用者,使用job创建程序, 描述作业的各个方面,提交作业并且监控它的进展。
Job Control
使用者可能需要链接MapReduce jobs 来完成复杂的不可以通过单节点MapReduce完成的任务。这是很容易的,因为,job的输出通常被写进文件系统,并且输出,可以转为下一个作业的输入文件。
可是,这也意味着确保上一个作业的完成。在这种情况下,各种控制job的选项是:
Job.submit(),提交job到集群,立即返回。
Job.waitForCompletion(boolean) :提交作业到集群并且等待它完成。
Job Input
MapReduce 框架依赖于作业的InputFormat:
验证作业的输入规范
拆分输入文件到逻辑的InputSplit实例,他们中的每个都分配给单独的Mapper
提供RecordReader实现 提 供 R e c o r d R e a d e r 实 现 ,用于搜集来自逻辑的INputSplit输入文件以供Mapper处理。
InputFormat 实现的默认行为,通常是 FileInputFormat 的子类,以用bytes为单位的总大小的输入文件,拆分input到逻辑的InputSplit实例化。输入文件的总大小被作为input Splits 的上限,分割的下限可以通过mapreduce.input.fileinputformat.split.minsize. m a p r e d u c e . i n p u t . f i l e i n p u t f o r m a t . s p l i t . m i n s i z e . 被设置.
#include<iostream>
#include<cassert>
using namespace std;
template<class T, int SIZE = 50>
class Stack{
private:
T list[SIZE];//数组存放栈的元素
int top;//栈顶位置
public:
Stack(
Gson提供了丰富的预定义类型适配器,在对象和JSON串之间进行序列化和反序列化时,指定对象和字符串之间的转换方式,
DateTypeAdapter
public final class DateTypeAdapter extends TypeAdapter<Date> {
public static final TypeAdapterFacto