ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
利用mapreduce做单词计数 ## 1. 开集群 Master保证NameNode,SecondNameNode,ResourceManager启动 Slave保证DateNode,NodeManager启动 ## 2. eclipse压缩包传到softerware,解压,安装 进入eclipse目录,打开eclipse nohup ./eclipse & ## 3. 创建工程 新建java工程,名字hadoop 在工程名hadoop上单击鼠标右键 点击Build Path 点击Configure Build Path 弹出窗口,在libraries中选择Add External Jars 开始导入jar包 1)Hadoop-softerware-hadoop2.7.3-share-common中的jar包+common-lib中的jar包导入 2)Hadoop-softerware-hadoop2.7.3-share-hafs中的jar包+hdfs-lib中的jar包导入 3)Hadoop-softerware-hadoop2.7.3-share-mapreduce中的jar包+mapreduce-lib中的jar包导入 4)Hadoop-softerware-hadoop2.7.3-share-yarn中的jar包+yarn-lib中的jar包导入 ## 5. 创建Wordcount的Mapper类 在工程src源码包上新建package,名字为wordcount 1) 在此wordcount中建立一个class名字WordMap, 在代码WordMap后加extends Mapper, 继承Mapper类,导包:Mapper-org.apache.hadoop.mapreduce 2) Mapper类的输入键值对中键是LongWritable(输入单词,可序列化)类型,值是Text类型,Text导包:Text-org.apache.hadoop.io 3) 输出键值对中键是Text类型,值是IntWritable(统计每个单词次数)类型 IntWritable导包:IntWritable-org.apache.hadoop.io ## 6. 覆写Mapper类中的map逻辑 右键-source-Overmde-勾选map-删除后两行 读取数据的每一行,将value转换成string类型,再按照字段之间的分隔符进行切分,得到一个字符串数组 String[] words = value.toString().split(“ ”);//Map切分,reduce计数,将切分的单词输出出去,用for循环// for(String word: words){ wordkey.set(word);//赋值// context.wirte(wordkey,countValue); } //set导包:set(byte[],utf8,int start,int lea):void, countValue导包:countValue-InWritable.WordMap // ## 7. 创建Wordcount的Reduce类 1)在名为wordcount的package中创建一个class名字是WordReduce, 在代码WordMap后加extends Reducer, 继承Reducer类 导包:Reducer-org.apache.hadoop.mapreduce 2) Reducer类的输入键值对中键是Text类型,值是IntWritable类型(与Mapper输出的键值对类型分别一致) 3) 输出键值对中键是Text类型,值是IntWritable类型 7.1覆写Reducer类中的reduce方法 右键-source-Overmde-勾选reduce-删除后两行 修改参数arg0-word,arg1-values,arg2-context value进行切分,用for循环对value进行计数 int sum = 0; for(IntWritable value:values){ sum += value.get();}//get导包get:int-IntWritable// context.write(word,new IntWritable(sum));//write导包:第一个// ## 8. 创建Wordcount中包含main方法的类 在名为wordcount的package中创建一个class,名字是WordMain,勾选public static void main 1)输入两个参数,一个表示输入文件,一个表示输出结果 If(args.length != 2 || args == null) { Systemout.out.println(“need two arguments: input path, output path”);//导包: syso第一个包 System.exit(0);//exit导包:System.exit:void-java.lang.System; } 2)生成job对象 Configuration conf = new Configuration();//导包:Configuration()-org.apache.hadoop.conf.Configuration Job job = Job.getInstance(conf);//导包: getInstance(Configuration conf)-org.apache.hadoop.conf.Configuration 把job对象抛掉 job.setJobNnames(WordMain.class.getSinpleName())//导包setJobNames(String Name):void – Job 3)设置job入口 job.setJarBycalss(WordMain.class) 4)设置输入输出格式 job.setInputFormatClass(TextInputFormat.class)// 导包:TextInputFormat-org.apache.hadoop.mapreduce lib,,,,,,,, job.setOutputFormatClass(TextOutputFormat.class) 5)设置输入输出路径 FileInputFormat.setInputPaths(job,new Path(args[0]));//导包setInputPaths(Job.arg0.Path,,,,,,)void,Path导第一个包,泛型删掉 FileOutputFormat.setOutputPaths(job,new Path(args[1])); 6)将设置的map,reduce逻辑提交进来 job.setMapperClass(wordMap.class) job.setReducerClass(wordReduce.class) 7)设置输出的键的类型,值的类型 Job.setOutputKeyClass(Text.calss) Job.setOutputValueClass(Intwritable.calss) 8)等待程序执行 job.waitForCompletion(true);将job抛出去 进入hadoop根目录 Hadoop fs -ls / 找到文件README.txt,此文件用来单词计数, 部分hadoop的README.txt在softerware里,将这个文件传到hadoop根目录下 在main类class的代码开头,选中void main,右键-run as-RunConfiguration-java application新建WordMain-Argument在上面的空白框中写路径,hdfs://master:9000/README.txt hdfs://master:9000/wordcount-out ## 9.进入hadoop的wordcount-out目录中 hadoop fs – ls /wordcount-out 打开相应的结果存储文档 hadoop fs – cat /wordcount-out/part-r-00000 查看计数结果 10.打包 回到eclipse,在工程名Hadoop点击右键-export-java-jar file-next- home-hadoop-名称写word count 11.在Main类的class的代码开头选定 WordMain右键copy name , 到Hadoop里 1)pwd 2)hadoop jar wordcount.jar+刚刚copy的name+ hdfs://master:9000/README.txt hdfs://master:9000/wordcount-out02 3)hadoop fs – cat /wordcount-out02/part-r-00000 查看计数结果 完成