Hadoop 高级程序设计(四)---组合式的MapReduce作业,hadoopmapreduce
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);
都可以,简单的直接用txt打开java文件,写好后打包成class文件,就可以运行了。你看他原来在哪里放class文件的,你就放在那里
我的普通的电脑是主板上接一块或几块硬盘,分区后格式化成FAT32或是NTFS或是EXT3,这样操作系统就可以直接访问。
而这层逻辑就是文件系统,它负责处理管理分区中的数据,文件是如何放置,目录结构怎么处理,怎么由一个文件名找到它实际存放的数据的磁道。
然后,在Hadoop层面,由于它设计为以多台廉价的机器处理大数据,所以一台机器无法放置如此多的数据,把这些数据存放至多台机器的硬盘上。
为了存储这些文件,Hadoop在操作系统的文件系统层面上又虚拟了一层文件系统,叫HDFS。它的用途基本上与我们平时用的文件系统类型,只不过对多机环境做了特殊设置,比如将数据进行分块,默认存储多份等。但这些都是在文件系统层面做到,在Hadoop用户层面,人们看到的就是一个统一的文件系统,就像你看到C盘,直接用就好,不用关心数据是如何存在磁盘中的。
然后MapReduce是在Hadoop的基础上操作,或者说是以前你统计一个文件中的单词数,直接计算就好了。但是,在Hadoop的环境下,你的文件可能被分成块保存在了多台机器上,只在一台机器上计算无法取得正确的结果。
所以,MapReduce是在获得大数据计算能力前提上的妥协,它把你以前逻辑上一步就能完成的事拆成两步。比如wordcount的Map函数就是把可以多台机器并行操作的拆分单词并标记个数为1的操作拆出来,这样多台机器可以同时进行计算。完成后再进行Reduce步骤,把每个单词的总的个数计算出来。
瞎写了几句,不知道能不能看明白。
评论暂时关闭