使用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/(输出路径)
---------------------
作者:zxzLife
来源:优快云
原文:https://blog.youkuaiyun.com/weixin_41122339/article/details/82751539
版权声明:本文为博主原创文章,转载请附上博文链接!