一、Hadoop MapReduce 构思体现在如下的三个方面:
1.如何对付大数据处理:分而治之
2.构建抽象模型:Map 和 Reduce
Map: 对一组数据元素进行某种重复式的处理;
Reduce: 对 Map 的中间结果进行某种进一步的结果整理。
MapReduce 处理的数据类型是
3.统一构架,隐藏系统层细节
MapReduce 最大的亮点在于通过抽象模型和计算框架把需要做什么(what
need to do)与具体怎么做(how to do)分开了,为程序员提供一个抽象和高层的编
程接口和框架。
二、Mapreduce 框架结构:
一个完整的mapreduce 框架由三个实例进程:
1.MRAppMaster :负责整个程序的过程调度以及状态协调。
2.MapTask :负责map阶段的整个数据的处理。
3.ReduceTask :负责reduce阶段的整个数据的处理。
三、Mapreduce 的编写规范:
(1)用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行 mr 程
序的客户端)
Mapper 的输入数据是 KV 对的形式(KV 的类型可自定义)
(3)Mapper 的输出数据是 KV 对的形式(KV 的类型可自定义)
(4)Mapper 中的业务逻辑写在 map()方法中
(5)map()方法(maptask 进程)对每一个
(6)Reducer 的输入数据类型对应 Mapper 的输出数据类型,也是 KV
(7)Reducer 的业务逻辑写在 reduce()方法中
(8)Reducetask 进程对每一组相同 k 的
(9)用户自定义的 Mapper 和 Reducer 都要继承各自的父类
(10)整个程序需要一个 Drvier 来进行提交,提交的是一个描述了各种必要信
息的 job 对象
Mapreduce 的wrodcount 小程序:
1.创建maven工程 引入 pom.xml
org.apache.hadoop
hadoop-common
2.7.4
org.apache.hadoop
hadoop-hdfs
2.7.4
org.apache.hadoop
hadoop-client
2.7.4
org.apache.hadoop
hadoop-mapreduce-client-core
2.7.4
org.apache.maven.plugins
maven-jar-plugin
2.4
true
lib/
cn.itcast.mapreduce.WordCountDriver
org.apache.maven.plugins
maven-compiler-plugin
3.0
1.8
UTF-8
2.创建一个wrodCountMapper 类 继承Mapper
KEYIN:map输入中的key
在默认读取数据的组件下textInputFormat(一行一行读)
Key:表示是该行的起始偏移量(就是光标所在的位置值)longwritable
Value:表示该行的内容
VALUEIN:map输入kv中的value
在默认读取数据的组件下TextInputFormat(一行一行读)
表明的是内容 (string—>text)
KEYOUT:map输出的kv中的key
在我们的需求中 把单词作为输出的key (string -->text)
VALUEOUT:map输出kv中的value
在我们的需求中 把单词的次数1作为输出的value (int–>intwritable)
简而言之:keyin 读取文本光标的偏移量,valuein:读取文本时该行文本的内容 相当于map输入中的key.keyout:map输出时的key ;valueout:map输出时的value:数值 intwritable
核心命令:
hadoop fs -mkdir -p /wordcount/input
hadoop fs -put -p /root/wenben/a.txt /wordcount/input
hadoop fs -ls /
hadoop fs -cat /wordcount/input/a.txt
hadoop fs -rm -r /wordcont/output
hadoop jar jar报 ;//hadoop 执行jar包
hdfs: 监控端口 note1:50070
yarn :监控端口 note1:8088
Mapreduce 统计单词数 案例:
创建maven 工程
1.* key:偏移量 没啥用
public class WrodCountMapper extends Mapper
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line=value.toString();
String[] words = line.split(" ");
for (String word:words
) {
context.write(new Text(word),new IntWritable(1));
}
}
}
2./*
public class wordCountReduce extends Reducer
@Override
protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
int count=0;
for (IntWritable value :
values) {
count +=value.get();
}
context.write(key,new IntWritable(count));
}
3.public class WordCountDirver {
public static void main(String[] args) throws Exception {
Configuration conf= new Configuration();
conf.set(“mapreduce.framework.name”,“yarn”);
Job job = Job.getInstance(conf);
//指定本次mr程序运行的主类
job.setJarByClass(WordCountDirver.class);
//指定本次mr运行程序的mapper 和reducer
job.setMapperClass(WrodCountMapper.class);
//指定本次Mr程序的reducer
job.setReducerClass(wordCountReduce.class);
//指定本次mr程序map阶段的输出类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//指定本次mr程序reducer阶段的输出类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//指定要处理的数据所在位置
FileInputFormat.setInputPaths(job,new Path("hdfs://note1:9000/wordcount/input"));//此目录hdfs上必须存在
FileOutputFormat.setOutputPath(job,new Path("hdfs://note1:9000/wordcount/output"));注意此目录必须不存在
//想yarn 集群提交job job.submit(); 这个我们看不到日志 一般不用 用下面job.waitForCompletion(true) true:代表监控并打印输出
job.waitForCompletion(true);
}
}
遇到的问题:
Yarn 网页端口: note1:8088 监控不到 原因:
修改集群配置文件yarn-site.xml,加上如下几句:
mapreduce.framework.name
yarn
遇到的问题二:结果成功输出 但报 inter… thread wait jion 等问题?
解决:在driver类中 添加 就是将mapreduce 提交到哪里去 也是yarn-site.xml 配置的 《property》
conf.set(“mapreduce.framework.name”,“yarn”);
同时这是指在yarn集群上运行
但是如果代码有问题,我们有需要重新打包 等一系列操作 太麻烦。
我们可以现在本地上运行,测试有没有bug
本地运行:只需要将conf.set(“mareduce.framework.name”,”local”)
还需要将 读取的文件路径和输出的路径改成windows本地地址即可。
主意输出的目录必须不存在。