Hadoop 高级程序设计(四)---组合式的MapReduce作业,hadoopmapreduce


在实际的应用中,很多的复杂任务都是不止一趟的mapreduce任务,需要查分成多个简单的mapreduce子任务去完后。

(1)迭代的计算任务。

(2)顺序组合MapReduce作业

(3)具有依赖关系的组合式mapreduce作业

(4)mapreduce前处理和后处理步骤的链式执行

迭代的计算任务:

PageRank算法。

顺序组合:

多个mapreduce子任务的逐一执行:

mapreduce1->mapreduce2->mapreduce3.....

需要注意的是,任务1的输出目录,将作为任务2的输入目录,任务2的输出目录将作为任务3的输入目录,.....。

Configuration conf = new Configuration();
	Job job1 = new Job(conf,"job1");
	job.setJarByClass(job1.class);
	FileInputFormat.addInputPath(job1,inputpath1);
	FileOutputFormat.setOutputPath(job, outputpath1);
	
	
	Configuration conf2 = new Configuration();
	Job job2 = new Job(conf2,"job2");
	job.setJarByClass(job2.class);
	FileInputFormat.addInputPath(job2,outputpath1);
	FileOutputFormat.setOutputPath(job2, outputpath2);
	
	Configuration conf3 = new Configuration();
	Job job3 = new Job(conf3,"job3");
	job.setJarByClass(job3.class);
	FileInputFormat.addInputPath(job3,outputpath2);
	FileOutputFormat.setOutputPath(job3, outputpath3);
	
(3)任务存在着依赖关系:

job除了维护子任务的配置信息之外,还可以维护任务之间的依赖关系,可以把所有任务都加入到JobControl中,在JobControl的run方法执行。

Configuration conf = new Configuration();
	Job job1 = new Job(conf,"job1");

	Configuration conf2 = new Configuration();
	Job job2 = new Job(conf2,"job2");
		
	Configuration conf3 = new Configuration();
	Job job3 = new Job(conf3,"job3");
	
	job3.addDependingJob(job1);
	job3.addDependingJob(job2);
	
	JobControl jc = new JobControl("job123");
	jc.addJob(job1);
	jc.addJob(job2);
	jc.addJob(job3);
	jc.run();
4)mapreduce前处理和后处理步骤的链式执行

hadoop提供了链式的mapper和链式的reducer,ChainMapper允许在一个map任务下添加多个map任务,而chainreducer可以允许在一个reducer处理之后,继续使用多个map任务,完成后续的处理。

Configuration conf = new Configuration();
	Job job1 = new Job(conf,"job1");
	job.setMapperClass(Map.class);
	job.setReducerClass(Reduce.class);
	job.setOutputKeyClass(Text.class);
	job.setOutputValueClass(Text.class);
	FileInputFormat.addInputPath(job,new Path(args[0]));
	FileOutputFormat.setOutputPath(job, new Path(args[1]));
	
	Configuration map1conf = new Configuration(false);
	/**
	 * addMapper(主作业,加入的mapclass,map输入class,map输入键值class,map输出键class,map输出键值class,
	 * 			true,配置对象)
	 * 
	 * */
	ChainMapper.addMapper(job1,Map1.class,LongWritable.class,Text.class,
							Text.class,Text.class,true,map1conf);
	Configuration map2conf = new Configuration(false);
	//根据上一个map输出class作为输入
	ChainMapper.addMapper(job1,Map2.class,Text.class,Text.class,
			LongWritable.class,Text.class,true,map2conf);
	
	Configuration reduceconf = new Configuration(false);
	/**
	 * setReducer(主作业,加入的reduceclass,map输入class,map输入键值class,map输出键class,map输出键值class,
	 * 			true,配置对象)
	 * 
	 * */
	ChainMapper.setReducer(job1,reduce.class,LongWritable.class,Text.class,
			Text.class,Text.class,true,reduceconf);
	//根据上一个map输出class作为输入
	Configuration map3conf = new Configuration(false);
	ChainMapper.addMapper(job1,map3.class,Text.class,Text.class,
			LongWritable.class,Text.class,true,map3conf);
	
	Configuration map4conf = new Configuration(false);
	ChainMapper.addMapper(job1,map4.class,LongWritable.class,Text.class,
			LongWritable.class,Text.class,true,map4conf);




hadoop的MapReduce程序运行操作问题

都可以,简单的直接用txt打开java文件,写好后打包成class文件,就可以运行了。你看他原来在哪里放class文件的,你就放在那里
 

MapReduce与Hadoop的理解

我的普通的电脑是主板上接一块或几块硬盘,分区后格式化成FAT32或是NTFS或是EXT3,这样操作系统就可以直接访问。
而这层逻辑就是文件系统,它负责处理管理分区中的数据,文件是如何放置,目录结构怎么处理,怎么由一个文件名找到它实际存放的数据的磁道。

然后,在Hadoop层面,由于它设计为以多台廉价的机器处理大数据,所以一台机器无法放置如此多的数据,把这些数据存放至多台机器的硬盘上。
为了存储这些文件,Hadoop在操作系统的文件系统层面上又虚拟了一层文件系统,叫HDFS。它的用途基本上与我们平时用的文件系统类型,只不过对多机环境做了特殊设置,比如将数据进行分块,默认存储多份等。但这些都是在文件系统层面做到,在Hadoop用户层面,人们看到的就是一个统一的文件系统,就像你看到C盘,直接用就好,不用关心数据是如何存在磁盘中的。
然后MapReduce是在Hadoop的基础上操作,或者说是以前你统计一个文件中的单词数,直接计算就好了。但是,在Hadoop的环境下,你的文件可能被分成块保存在了多台机器上,只在一台机器上计算无法取得正确的结果。
所以,MapReduce是在获得大数据计算能力前提上的妥协,它把你以前逻辑上一步就能完成的事拆成两步。比如wordcount的Map函数就是把可以多台机器并行操作的拆分单词并标记个数为1的操作拆出来,这样多台机器可以同时进行计算。完成后再进行Reduce步骤,把每个单词的总的个数计算出来。

瞎写了几句,不知道能不能看明白。
 

相关内容