Hadoop 3个核心组件:
分布式文件系统:Hdfs——实现将文件分布式存储在很多的服务器上(hdfs是一个基于Linux本地文件系统上的文件系统)点击查看(Hadoop原理之——HDFS原理)
分布式运算编程框架:Mapreduce——实现在很多机器上分布式并行运算
分布式资源调度平台:Yarn——帮用户调度大量的mapreduce程序,并合理分配运算资源
什么是MapReduce?
MapReduce是一种编程模型,其理论来自Google公司发表的三篇论文(MapReduce,BigTable,GFS)之一,主要应用于海量数据的并行计算。
1、MapReduce是一种分布式批处理(离线计算)计算框架,由Google提出,解决了海量数据的计算问题。
2、MapReducesh是由两个阶段组成:Map和Reduce,用户只需要实现两个函数:map()与reduce(),即可实现分布式计算,非常简单。这两个函数都是key、value对,表示函数的输入信息。
3.MapReduce输入数据来源于HDFS,输出数据到HDFS。
MapReduce原理
执行过程
1、Map任务处理
1)、按行读取输入文件的内容,解析成Key、Value对的形式,每一行调用一次map()函数。
2)、写自己的逻辑,对输入的key,value处理转化成新的key、value对输出。
3)、对输出的Key,value对ji进行分区,(默认分区方法为哈希值取模,key相同的数据会分到同一个Reduce区),分区是为了解决数据的不均衡,解决负载问题。
4)、对不同分区的数据进行排序。(key的字典排序)
2、Reduce任务处理
1)、对于多个不同Map任务的输出,按照不同的分区,通过网络copy到不同的Reduce节点。
2)、到达同一个分区的数据进行合并,排序,写Reduce自己的逻辑,将sh数据转化成新的key、value对。
3)、将新的数据上传到HDFS中。
MapReduce编程之基本数据类型
BooleanWritable 布尔型
ByteWritable bite型
DubleWritable 双精度浮点型
FloatWritable 单精度fu'd浮点型
IntWritable 整型
LongWritable 长整型
Text 字符串类型
NullWritable 空类型
自定义数据类型
MapReduce编程之环境配置
1、创建工程
2、引入依赖jar到classpath
3、修改YarnRunner.java($HADOOP_HOME\src\hadoop-mapreduce-project\hadoop-mapreduce-client\hadoop-mapreduce-client-jobclient\src\main\java\org\apache\hadoop\mapred) (在src下添加)
4、 替换本地执行文件($HADOOP_HOME/bin) (添加驱动文件)
(3、4需要的配置文件:链接:https://pan.baidu.com/s/1tl05sP0LxhWwLSvXm3-HiQ 密码:1iu8)
5、 修改本地配置文件($HADOOP_HOME/etc/hadoop) (修改配置文件,添加到src下,与HDFS配置相同)
6、配置本地环境变量
MapReduce编程之WordCount(默认)
1、MapReduce编程之Mapper实现
package cn.Vdata.CSDN.WordCount;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
/*
* MapReduce编程之Mapper实现
*/
public class WordCountMap extends Mapper<Object, Text, Text, IntWritable>{
/*
* 重写map()方法
* @see org.apache.hadoop.mapreduce.Mapper#map(KEYIN, VALUEIN, org.apache.hadoop.mapreduce.Mapper.Context)
*/
@Override
protected void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context)
throws IOException, InterruptedException {
IntWritable I = new IntWritable(1); //向下输出时用
//读取传进来的数据
String line = value.toString();
//按照逻辑处理数据
String[] words = line.split(" ",-1); /* 将数据以空格为分割符分割,-1代表无限制,即最大化 */
//对数据进行处理
if(words != null && words.length != 0) {
//遍历单词数组
for (String word : words) {
if(word != null){
context.write(new Text(word), I);
}
}
}
}
}
二、MapReduce编程之Reducer实现
package cn.Vdata.CSDN.WordCount;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
/*
* MapReduce编程之Reducer实现
*
* 在此过程前,Map中的数据已经进行分区(默认的哈希值取模,相同的数据一定到了相同的Reduce区), 并进行排序
*
* Shuffle过程(洗牌过程):把数据从Map的输出导入到负责Reduce的程序的过程,在这个过程中每 个Map将分好的数据溢写在硬盘中,
* 在硬盘中按照分区合并的数据(到达同一个分区,数据一定相同),将所有的Map所分的相同的数据到达一个分区,传给Reduce,然后合并
*
*/
public class WordCountReduce extends Reducer<Text, IntWritable, Text, IntWritable>{
@Override
protected void reduce(Text key, Iterable<IntWritable> value,
Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
int num = 0;
//统计,累计单词出现的次数
for (IntWritable tmpnum : value) {
num+=tmpnum.get(); /* 调用get()方法使得IntWritable对象转化成int数据类型 */
}
//利用context将数据写出去(HDFS上)
context.write(key, new IntWritable(num));
}
}
三、MapReduce编程之Driver实现
package cn.Vdata.test.WordCount;
import java.io.IOException;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.Job;
import com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider.Text;
public class WordCountDriver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
// 开启权限
System.getProperty("HADOOP_USER_NAME", "root");
// 输入路径
String InputPath = "/gyb/wordcount/input";
// 输出路径
String OutputPath = "/gyb/wordcount/output";
// 创建Job实例
Job job = Job.getInstance();
// 设置job名称
job.setJobName("WordCount");
// 生成jar包
job.setJar("C:\\Users\\lenovo\\Desktop\\wordcount.jar");
// 设置驱动类
job.setJarByClass(WordCountDrive.class);
// 设置Mapper类
job.setMapperClass(WordCountMap.class);
// 设置Reducer类
job.setReducerClass(WordCountReduce.class);
// 设置Reducer类的输出类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
// 设置Mapper类的输出类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
// 设置输入路径
FileInputFormat.addInputPath(job, new Path(InputPath));
FileOutputFormat.setOutputPath(job, new Path(OutputPath));
// 检测结束
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
四、执行
1)、直接在eclipse上执行
2)、生成jar包,在Linux下执行。执行命令:hadoop jar wordcount.jar
后续发布与MapRudece相关的大数据实验