使用hadoop2.7.4
1,首先准备数据,在网上随便抄了一段文章
有一天, 一个外来的僧人要到对面村庄去, 临行前村民反复叮嘱他说: 路途中如若看到路标被风刮倒或被掩埋, 要重新树立起来,以免后面的人迷失方向。 僧人刚上路时, 牢牢记着村民嘱咐, 丝毫不敢马虎, 只要看到有路牌倒地或有歪斜就马上扶好, 深怕不牢固有时还用脚踹踹四周的沙土。 但当走了一段路后, 僧人就揣摩着距离目的地不会太远了, 而且一路上风平浪静, 根本没有村民们说得那样玄乎, 况且, 自己只走一次, 路标对自己也没有什么意义了。 有了这种想法后,他便只管前行, 遇到倒地的路标, 也视而不见。 正应了一句老话: 天有不测风云, 人有旦夕祸福。 没想到刚刚还晴空万里, 但突然间就风沙骤起。 前方倒地的路标被风刮走大部分, 致使僧人不敢贸然前行, 他便想着原路返回, 日后再做打算。 但由于他刚才没有往回走的思想淮备, 加上萌发私心, 没有按照村民吩咐行事, 回去的路也被他堵死。 结果他前进不能, 后退不得, 在茫茫沙海中转悠了半天, 最后筋疲力尽, 被困死沙漠。 现实生活中又何尝不是如此呢? 当我们只图自己方便, 没有认真替别人考虑时, 回头时却发现反而自己没有了退路。 可见, 方便自己的同时, 又时刻不忘想着别人的人, 才能一生顺遂, 前进路上畅通无阻。
2,在eclipse创建maven项目,导入依赖
<dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.4</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> </dependencies>
3,编写map端(需要继承Mapper类,重写map方法)
import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; public class MyMap extends Mapper<LongWritable, Text, Text, IntWritable> { protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException { //转成String类型 String line = value.toString(); //把每行的字段拆成一个个字符在转成Text类型,每个单词统计为一个 for (int i = 0; i < line.length(); i++) { context.write(new Text(line.charAt(i)+""), new IntWritable(1)); } } }
4,编写reduce端
import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class MyReduce extends Reducer<Text, IntWritable, Text, IntWritable>{ protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException { //首先创建一个统计变量为0 int count=0; //遍历value,把每个值相加给count for (IntWritable i : values) { count=count+i.get(); } //把统计好的count写入提交 context.write(key, new IntWritable(count)); } }
5.编写执行job类
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class APP { public static void main(String[] args) throws Exception { 判断给出的参数必须的2个,如果不是直接退出 if(args.length<2) { System.out.println("your param error"); System.exit(0); } //创建Configuration对象,来设置属性给他 Configuration conf=new Configuration(); //利用反射输入configuration对象来创建Job对象 Job job=Job.getInstance(conf); //设置作业名 job.setJobName("world count"); //设置搜索jar包的类 job.setJarByClass(APP.class); //添加输入路径,可多个 FileInputFormat.addInputPath(job, new Path(args[0])); //设置输出路径 FileOutputFormat.setOutputPath(job, new Path(args[1])); //设置输出类型的key job.setOutputKeyClass(Text.class); //设置输入类型的value job.setOutputValueClass(IntWritable.class); //设置Map类 job.setMapperClass(MyMap.class); //设置reduce类 job.setReducerClass(MyReduce.class); //等待提交 System.exit(job.waitForCompletion(true) ? 0:1); } }
6,点击项目右键选择run里面有一个maven install 进行打包
7,把上图打包后的jar包放到你的集群中
8,开启hadoop (start-all.sh)
9,把之前的数据上传到hdfs上(hdfs dfs -put data.txt /user/had/hadoop/)
10,找到你jar包的位置进行如下操作
hadoop jar myMapReduce_day01-0.0.1-SNAPSHOT.jar com.zxz.wc.APP /user/had/hadoop/data.txt hadoop/out2/
hadoop jar (hadoop执行jar包命令) myMapReduce_day01-0.0.1-SNAPSHOT.jar(刚才打包的jar包) com.zxz.wc.APP(job类的完整类名) /user/had/hadoop/data.txt(输入路径) hadoop/out2/(输出路径)