⼀起学Hadoop——使⽤IDEA编写第⼀个MapReduce程序(Java和Python)上⼀篇我们学习了MapReduce的原理,今天我们使⽤代码来加深对MapReduce原理的理解。
wordcount是Hadoop⼊门的经典例⼦,我们也不能免俗,也使⽤这个例⼦作为学习Hadoop的第⼀个程序。本⽂将介绍使⽤java和python编写第⼀个MapReduce程序。
本⽂使⽤Idea2018开发⼯具开发第⼀个Hadoop程序。使⽤的编程语⾔是Java。
打开idea,新建⼀个⼯程,如下图所⽰:
在弹出新建⼯程的界⾯选择Java,接着选择SDK,⼀般默认即可,点击“Next”按钮,如下图:
在弹出的选择创建项⽬的模板页⾯,不做任何操作,直接点击“Next”按钮。
输⼊项⽬名称,点击Finish,就完成了创建新项⽬的⼯作,我们的项⽬名称为:WordCount。如下图所⽰:
添加依赖jar包,和Eclipse⼀样,要给项⽬添加相关依赖包,否则会出错。
点击Idea的File菜单,然后点击“Project Structure”菜单,如下图所⽰:
依次点击Modules和Dependencies,然后选择“+”的符号,如下图所⽰:
选择hadoop的包,我⽤得是hadoop2.6.1。把下⾯的依赖包都加⼊到⼯程中,否则会出现某个类不到的错误。(1)”/usr/local/hadoop/share/hadoop/common”⽬录下的hadoop-common-2.6.1.jar和haoop-nfs-2.6.1.jar;(2)/usr/local/hadoop/share/hadoop/common/lib”⽬录下的所有JAR包;
(3)“/usr/local/hadoop/share/hadoop/hdfs”⽬录下的haoop-hdfs-2.6.1.jar和haoop-hdfs-nfs-2.7.1.jar;
(4)“/usr/local/hadoop/share/hadoop/hdfs/lib”⽬录下的所有JAR包。
⼯程已经创建好,我们开始编写Map类、Reduce类和运⾏MapReduce的⼊⼝类:
JAVA编写MarReduce代码
Map类如下:
1import org.apache.hadoop.io.IntWritable;
2
3import org.apache.hadoop.io.LongWritable;
4
5import org.apache.hadoop.io.Text;
6
7import org.apache.hadoop.mapreduce.Mapper;
memset时间复杂度
8
9import java.io.IOException;
10
11
12public class WordcountMap extends Mapper<LongWritable,Text,Text,IntWritable> {
13public void map(LongWritable key,Text value,Context context)throws IOException,InterruptedException{
14
15        String line = String();//读取⼀⾏数据
16
bootstrap table增删改查
17        String str[] = line.split("");//因为英⽂字母是以“ ”为间隔的,因此使⽤“ ”分隔符将⼀⾏数据切成多个单词并存在数组中
18
19for(String s :str){//循环迭代字符串,将⼀个单词变成<key,value>形式,及<"hello",1>
20            context.write(new Text(s),new IntWritable(1));
21        }
22    }
23 }
Reudce类:
1import org.apache.hadoop.io.IntWritable;
2import org.apache.hadoop.mapreduce.Reducer;
3import org.apache.hadoop.io.Text;
4import java.io.IOException;
5
6public class WordcountReduce extends Reducer<Text,IntWritable,Text,IntWritable> {
7public void reduce(Text key, Iterable<IntWritable> values,Context context)throws IOException,InterruptedException{
8int count = 0;
9for(IntWritable value: values) {
10            count++;
11        }
12        context.write(key,new IntWritable(count));
ppt模板下载免费版货架
13        }
14 }
⼊⼝类:
1import org.f.Configuration;
2import org.apache.hadoop.fs.Path;
3import org.apache.hadoop.mapreduce.Job;
4import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
5import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
6import org.apache.hadoop.util.GenericOptionsParser;
7import org.apache.hadoop.io.IntWritable;
8import org.apache.hadoop.io.Text;
9
10public class WordCount {
11
12public static void main(String[] args)throws Exception{
13        Configuration conf = new Configuration();
14//获取运⾏时输⼊的参数,⼀般是通过shell脚本⽂件传进来。
15        String [] otherArgs = new        GenericOptionsParser(conf,args).getRemainingArgs();
16if(otherArgs.length < 2){
17            println("必须输⼊读取⽂件路径和输出路径");
18            it(2);
19        }
20        Job job = new Job();
21        job.setJarByClass(WordCount.class);
22        job.setJobName("wordcount app");
23
24//设置读取⽂件的路径,都是从HDFS中读取。读取⽂件路径从脚本⽂件中传进来
25        FileInputFormat.addInputPath(job,new Path(args[0]));
26//设置mapreduce程序的输出路径,MapReduce的结果都是输⼊到⽂件中
27        FileOutputFormat.setOutputPath(job,new Path(args[1]));
28
29//设置实现了map函数的类
30        job.setMapperClass(WordcountMap.class);
31//设置实现了reduce函数的类
32        job.setReducerClass(WordcountReduce.class);idea配置artifacts
33
34//设置reduce函数的key值
35        job.setOutputKeyClass(Text.class);
36//设置reduce函数的value值
37        job.setOutputValueClass(IntWritable.class);
38        it(job.waitForCompletion(true) ? 0 :1);
39    }
40 }
代码写好之后,开始jar包,按照下图打包。点击“File”,然后点击“Project Structure”,弹出如下的界⾯,
依次点击"Artifacts" -> "+" -> "JAR" -> "From modules with dependencies",然后弹出⼀个选择⼊⼝类的界⾯,选择刚刚写好的WordCount类,如下图:
按照上⾯设置好之后,就开始打jar包,如下图:
点击上图的“Build”之后就会⽣成⼀个jar包。jar的位置看下图,依次点击File->Project Structure->Artifacts就会看到如下的界⾯:
将打好包的wordcount.jar⽂件上传到装有hadoop集的机器中,然后创建shell⽂件,shell⽂件内容如下,/usr/local/src/hadoop-2.6.1是hadoop集中hadoop的安装位置,1 /usr/local/src/hadoop-2.6.1/bin/hadoop jar wordcount.jar \ #执⾏jar⽂件的命令以及jar⽂件名,
2
3 hdfs://hadoop-master:8020/ \ #输⼊路径
4
5 hdfs://hadoop-master:8020/wordcount_output #输出路径
执⾏shell⽂件之后,会看到如下的信息,
驽马十驾翻译上图中数字1表⽰输⼊分⽚split的数量,数字2表⽰map和reduce的进度,数字3表⽰mapreduce执⾏成功,数字4表⽰启动多少个map任务,数字5表⽰启动多少个reduce任务。
⾃⾏成功后在hadoop集中的hdfs⽂件系统中会看到⼀个wordcount_output的⽂件夹。使⽤“hadoop fs -ls /”命令查看:
powerpoint2003提供了多种不同视图在wordcount_output⽂件夹中有两个⽂件,分别是_SUCCESS和part-r-00000,part-r-00000记录着mapreduce的执⾏结果,使⽤hadoop fs -cat /wordcount_output/part-r-00000查看part-r-00000的内容:
可以每个英⽂单词出现的次数。
⾄此,借助idea 2018⼯具开发第⼀个使⽤java语⾔编写的mapreduce程序已经成功执⾏。下⾯介绍使⽤python语⾔编写的第⼀个mapreduce程序,相对于java,python编写mapreduce会简单很多,因为hadoop提供streaming,streaming是使⽤Unix标准流作为Hadoop和应⽤程序之间的接⼝,所以可以使⽤任何语⾔通过标准输⼊输出来写MapReduce程序。
Python编写MapReduce程序
看代码:
实现了map函数的python程序,命名为map.py:
1#!/usr/local/bin/python
2
3import sys #导⼊sys包

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。