1.环境配置:
a.将map reduce所需架包全部加载到eclipse下,
b.将
键:HADOOP_USER_NAME
值:hadoop
配置到系统环境中,需要重新启动。
c.将架包hadoop-eclipse-plugin-2.7.1.jar放入eclipse安装目录的plugin下。
下载winutils.exe将下载下的hadoop.dll和winutils.exe放到hadoop-2.7.5/bin下
下载地址
d.配置eclipse。windows–>pref..–>hadoop map/reduce–>在路径下添加hadoop-2.7.1的路径
e pre…–>show –>mapreduce tool—>点击小象–>配置ip和端口(9000)
f hadoop.tmp.dir :/tmp/hadoop-hadoop
将hadoop下的上传的文件夹的权限修改为777
hadoop fs -chmod 777 /wcin
2.Java代码进行操做
——————————-map类的API操作——————–
package www.oeacle.wc;
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;
/*
* KEYIN:输入键的类型,者一行的开始的偏移量:long(每一行的第一个的字,位于第几个,就是此行的偏移量)
* VALUEIN, 输入的值的类型。在这里当前行的内容,String
* KEYOUT, 输出的键值对的类型,每一个单词,String
* VALUEOUT,输出的值的类型,表示单词标记一个1,int
* map干的事就是,将单词分隔出来,然后进行将每个单词标记1
* map的数据要网路传输,所以需要序列化,实现接口Serializabler,
* 但是这个方式的序列化太过冗余,所以Hadoop提供了自己的序列化方式
* 序列化接口叫:Writable,并且常用数据类型帮你序列化了。
* 常用数据烈性对应的序列化格式
* byte--ByteWritable
* short--ShortWirtable
* int IntWirtable
* long--同上
* double--同上
* String--Text
* null--同上
* 就String不一样
*
*/
public class WorldCountMap extends Mapper<LongWritable, Text, Text, IntWritable>{
/**
* 这个函数一行调用一次
* LongWritable key;输入键,偏移量
* Text value:输入的值,一行的内容
* Context:是上下文的对象,用育传输map的处理结果,提供Write方法
*/
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
//1.取到一行的内容
String line=value.toString();
//2.切分
String [] words=line.split(" ");
//3.循环遍历打标记并发送
for (String w : words) {
context.write(new Text(w), new IntWritable(1));
}
}
}
-----------------------reduce类的API操作------------------------------
package www.oeacle.wc;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
/*
* reduce的输入其实是map的输出
*
*/
public class WordCoountReduce extends Reducer<Text, IntWritable, Text, IntWritable>{
/**
* ruduce处理的最终结果保存在hdfs
* 多久调用一次这个方法:一组调用一次方法
* 啥是一组:把key相同一类就是一组
* Text arg0:这一组的第一个key
* Iterable<IntWritable> arg1,这一组所有key对应的value值封装在迭代器中
* Iterable<IntWritable> arg1,上下文对象,也是传输作用,往hdfs进行写
*
*/
@Override
protected void reduce(Text key, Iterable<IntWritable> values,
Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
//1.定义一个求和变量
int sum=0;
//循环遍历迭代器进行求和
for (IntWritable value : values) {
sum+=value.get();
}
context.write(key,new IntWritable(sum));
}
}
--------------------------------主函数的类--------------------
package www.oeacle.wc;
import java.io.IOException;
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 Driver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
//1.获取Configuration对象
Configuration conf=new Configuration();
//2.需要创建一个任务,启动一个job,一个程序就是一个作业
Job job=Job.getInstance(conf);
//3.设置job提交的jar包
job.setJarByClass(Driver.class);//内部是一个反射机制
//4.设置map和reduce对应的类
job.setMapperClass(WorldCountMap.class);
job.setReducerClass(WordCoountReduce.class);
//5.设置map输出的键和值的类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//6.最终结果输出的值
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//7.指顶输入路径和输出路径
FileInputFormat.addInputPath(job, new Path("/wcin"));//指定一个路径
//最终输出路径要求不能存在,怕覆盖原始文件
FileOutputFormat.setOutputPath(job, new Path("/wcout"));
// job.submit();
job.waitForCompletion(true);
}
}