实训5 单词计数_第1页
实训5 单词计数_第2页
实训5 单词计数_第3页
实训5 单词计数_第4页
实训5 单词计数_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实训3.2单词计数1.实训目的基于MapReduce编程思想,编写WordCount程序。2.实训内容理解MapReduce编程思想,掌握编写MapReduce版本WordCount,了解该程序的执行流程,结合执行过程与结果,理解MapReduce的原理。3.实训要求以小组为单元进行实训,每小组5人,小组自协商选一位组长,由组长安排和分配实训任务,具体参考实训操作环节。小组成员需要具备HDFS分布式存储基础相关知识,并确保具备前面的实训环境。4.准备知识(1)MapReduce编程编写在Hadoop中依赖YARN框架执行的MapReduce程序,大部分情况下只需要编写相应的Map处理和Reduce处理过程的业务程序即可,因为大部分的代码,Hadoop已经帮我们写好了。所以编写一个MapReduce程序并不复杂,关键点在于掌握分布式的编程思想和方法,主要将计算过程分为以下五个步骤:①迭代。遍历输入数据,并将之解析成<Key,Value>键值对。②将输入的<Key,Value>键值对映射(map)成新的<Key,Value>键值对。③依据Key对中间数据进行分组。④以组为单位对数据进行Reduce。⑤迭代。将最终产生的<Key,Value>键值对保存到输出文件中。(2)JavaAPI解析①InputFormat:用于描述输入数据的格式,常用为TextInputFormat,其提供如下两个功能:数据切分:按照某种策略将输入数据切分成若干个数据块,以便确定MapTask个数以及对应的数据分片。为Map任务提供数据:给定某个数据分片,能将其解析成一个个的<Key,Value>键值对。②OutputFormat:用于描述输出数据的格式,它能够将用户提供的<Key,Value>键值对写入特定格式的文件中。③Mapper/Reducer:封装了应用程序的数据处理逻辑。④Writable:Hadoop自定义的序列化接口,实现该类的接口可以用作MapReduce过程中的Value数据使用。⑤WritableComparable:在Writable基础上继承了Comparable接口,实现该类的接口可以用作MapReduce过程中的Key数据使用。因为Key包含了比较和排序的操作。5.实训步骤本实训包含四大步骤:准备运行环境、准备统计数据、编写MapReduce程序、打包并运行代码。查看运行结果这几个步骤,详细如下:(1)准备运行环境启动三台节点,然后在master中启动HDFS和YARN:start-dfs.shstart-yarn.sh(2)准备统计数据新建待统计文件word.txt,并上传数据到HDFS上vim/root/datas/word.txt内容如下:hellohdfshadoophivehellomapreducehellosparksparkaibigdata将word.txt文件上传到HDFS集群hdfsdfs-put/root/datas/word.txt/查看是否上传成功,如图3-所示则表示上传成功。图3-查看上传结果(3)引入编写MapReduce程序相关的jar包本次实训继续使用实训2.3的环境,但编写MapReduce程序需要引入相关的jar包,此时继续引入hadoop-mapreduce-client-core.jar包。如图3-所示。图3-导入MapReduce依赖包(4)编写MapReduce程序编写MapReduce程序主要是编写Map类和Reduce类,其中Map过程需要继承org.apache.hadoop.mapreduce包中Mapper类,并重写其map方法;Reduce过程需要继承org.apache.hadoop.mapreduce包中Reducer类,并重写其reduce方法。在com.bigdata包(没有则新建)下新建WordCount类,添加以下代码:packagecom.bigdata;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.Mapper;importorg.apache.hadoop.mapreduce.Reducer;importorg.apache.hadoop.mapreduce.lib.input.TextInputFormat;importorg.apache.hadoop.mapreduce.lib.output.TextOutputFormat;importorg.apache.hadoop.mapreduce.lib.partition.HashPartitioner;importjava.io.IOException;importjava.util.StringTokenizer;publicclassWordCount{publicstaticclassTokenizerMapperextendsMapper<Object,Text,Text,IntWritable>{privatefinalstaticIntWritableone=newIntWritable(1);privateTextword=newText();//map方法,划分一行文本,读一个单词写出一个<单词,1>publicvoidmap(ObjectKey,Textvalue,Contextcontext)throwsIOException,InterruptedException{StringTokenizeritr=newStringTokenizer(value.toString());while(itr.hasMoreTokens()){word.set(itr.nextToken());context.write(word,one);//写出<单词,1>}}}//定义reduce类,对相同的单词,把它们<K,VList>中的VList值全部相加publicstaticclassIntSumReducerextendsReducer<Text,IntWritable,Text,IntWritable>{privateIntWritableresult=newIntWritable();publicvoidreduce(TextKey,Iterable<IntWritable>values,Contextcontext)throwsIOException,InterruptedException{intsum=0;for(IntWritableval:values){sum+=val.get();//相当于<Hello,1><Hello,1>,将两个1相加}result.set(sum);context.write(Key,result);//写出这个单词,和这个单词出现次数<单词,单词出现次数>}} publicstaticvoidmain(String[]args)throwsException{//主方法,函数入口 //TODOAuto-generatedmethodstub Configurationconf=newConfiguration();//实例化配置文件类Jobjob=newJob(conf,"WordCount");//实例化Job类job.setInputFormatClass(TextInputFormat.class);//指定使用默认输入格式类TextInputFormat.setInputPaths(job,args[0]);//设置待处理文件的位置job.setJarByClass(WordCount.class);//设置主类名job.setMapperClass(TokenizerMapper.class);//指定使用上述自定义Map类job.setCombinerClass(IntSumReducer.class);//指定开启Combiner函数job.setMapOutputKeyClass(Text.class);//指定Map类输出的<K,V>,K类型job.setMapOutputValueClass(IntWritable.class);//指定Map类输出的<K,V>,V类型job.setPartitionerClass(HashPartitioner.class);//指定使用默认的HashPartitioner类job.setReducerClass(IntSumReducer.class);//指定使用上述自定义Reduce类job.setNumReduceTasks(Integer.parseInt(args[2]));//指定Reduce个数job.setOutputKeyClass(Text.class);//指定Reduce类输出的<K,V>,K类型job.setOutputValueClass(Text.class);//指定Reduce类输出的<K,V>,V类型job.setOutputFormatClass(TextOutputFormat.class);//指定使用默认输出格式类TextOutputFormat.setOutputPath(job,newPath(args[1]));//设置输出结果文件位置System.exit(job.waitForCompletion(true)?0:1);//提交任务并监控任务状态 }}(5)打包并运行代码打包后的文件名为hadoop-project.jar,上传到master节点的/root/jars目录。主类WordCount位于包com.bigdata下,则可使用如下命令向YARN集群提交本应用。yarnjarhadoop-project.jarcom.bigdata.WordCount/word.txt/wc_output1其中“yarn”为命令,“jar”为命令参数,后面紧跟打包后的代码地址,“com.bigdata”为包名,“WordCount”为主类名,第一个参数“/word.txt”为输入文件在HDFS中的位置,第二个参数“/wc_output”为输出文件在HDFS中的位置,第三个参数“1”表示需要统计成Reduce文件的个数。注意:“/word.txt”、“/wc_output”、“1”之间都有一个空格。同时需要启动HDFS和YARN。(6)实训结果程序运行成功控制台上的显示内容如图3-15、图3-16所示。图3-15向YARN集群提交应用图3-16程序运行结果在HDFS上查看结果,如图3-17、图3-18所示。hdfsdfs-ls/wc_output图3-17查看/wc_output目录下的目录和文件hdfsdfs-cat/wc_output/part-r-00000图3-18HDFS上显示结果6.实训总结实训基于MapReduce编程思想,编写MRJava版

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论