Mapreduce的核心思想和基本架构
基本架构图:
核心思想:
Mapreduce意为分布式文件计算系统,其核心思想:分而治之
两个阶段:
map——拆分 ,可以进行拆分的前提是这些小任务可以并行计算,彼此间没有依赖关系
reduce——聚合,对map阶段的结果进行全局总汇
执行流程:
流程:
第一步:读取文件,解析成key,value对,这里是我们的K1,V1
第二步:接收我们的k1 v1,自定义我们的map逻辑,然后转换成新的key2 value2 往下发送 这里发送输出
第三步:分区,形同key的value发送到同一个reduce里面去,key合并,value形成一个集合
第四步:排序,默认按照字段顺序进行排序
第五步:规约
第六步:分组
第七步:接收我们的k2 v2 自定义我们的reduce逻辑 转换成k3 v3 进行输出
第八步:将我们的k3 v3 进行输出
其中appMaster:全权负责任务划分
执行流程图如下:
以单词统计为例,探讨简单的MapReduce代码实现:
单词统计,现在要统计,每一个单词在文本当中出现了多少次
hello world
hadoop hive
sqoop hive
hadoop hive
第一步:读取文件,解析成key,value对 key是我们的行偏移量 value是我们行文本内容
下一行是上一行的行偏移量
key1 value1
0 hello world
11 hadoop hive
22 sqoop hive
第二步:自定义map逻辑,接收我们的key1,value2 转换成新的key2 value2进行输出
获取我们的value1 ,按照空格进行切割 [hello,world] [hadoop ,hive] [sqoop,hive]
hello world
hadoop hive
sqoop hive
转换成新的key2 value2 往下发送
key2 value2
hello 1
world 1
hadoop 1
hive 1
sqoop 1
hive 1
第三步:分区 相同key的value发送到同一个reduce当中去,key进行合并,value形成一个集合
hive [1,1]
第四步:排序
第五步:规约
第六步:分组
第七步:reduce阶段,接收我们的key2 value2 转换成新的key3 value3进行输出
接收 key2 value2
hive 1
hive 1
key2 value2已经变成了一个集合
hive [1,1]
转换成新的key3 value3
hive 1+1 = 2
第八步:输出我们的key3 value3
hive 2
sqoop 1
hello 1
world 1
hadoop 1
首先在hadoop中:
cd /export/servers
vim wordcount.txt
hello,world,hadoop
hive,sqoop,flume,hello
kitty,tom,jerry,world
hadoop
hdfs dfs -mkdir /wordcount/
dfs ds -put wordcount.txt /wordcount/
八个步骤对应的都是不同的java类
八个类写完之后,通过job任务组装mapreduce程序,进行任务提交
JAVA源代码:
//MainCount Classs
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
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.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org