mapreduce
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)“和"Reduce(归约)”,是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。
MapReduce 的优势
1、MapReduce易于理解:简单地实现一些接口,就可以完成一个分布式程序,而且这个分布式程序还可以分布到大量廉价的PC机器运行。也就是说,写一个分布式程序,跟写一个简单的串行程序是一模一样的。MapReduce易于编程的背后是MapReduce通过抽象模型和计算框架把需要做什么(What need to do)与具体怎么做(How to do)分开了,为程序员提供了一个抽象和高层的编程接口和框架,程序员仅需关心其应用层的具体计算问题,仅需要编写少量的应用本身计算问题的程序代码;如何具体完成这个并行计算任务所相关的诸多系统层细节被隐藏起来,交给计算框架去处理-----从分布代码的执行到大到数千、小到输几个节点集群的自动调度使用。
2、良好的扩展性
当计算机资源不能得到满足的时候,可以通过简单的增加机器来扩展它的计算能力。多项研究发现,基于MapReduce的计算性可以随节点数目增长保持近似于线性的增长,这个特点是MapReduce处理海量数据的关键,通过将计算节点增至几百或者几千可以很容易地处理数百TB甚至PB级别的离线数据。
3、高容错性
MapReduce设计的初衷就是使程序能部署在廉价的PC机器上,这就要求它具有很高的容错性。比如,其中一台机器宕机了,它可以把上面的计算任务转移到另一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,完全是由Hadoop内部完成的。
MapReduce也是采用Master/Slave的主从架构,MapReduce包含4个组成部分,分别为Client、JobTracker、TaskTracker和Task,其架构图如下:
Mapreduce是Hadoop的核心框架之一
Mapreduce是分布式处理的框架
HDFS与MApreduce最大的特点就是分布式
简单的说一个庞大的数据 用一台计算机完成不了的计算数据 交给了多台计算机一起计算 最后合并各个计算机的结果 输出结果
mapreduce可以分成两大部分 map 和 reduce
map 是将数据切片
reduce 就是将数据合并
利用mapreduce 做wordcount步骤
1.首先需要在给HDFS上传一个文件 其中还有单词的文件
在linux中启动hadoop start-dfs.sh
启动完成后 上传你在linux中创建的文件 hdfs dfs -put 目标文件 目标路径 ----上传
2.在eclipse中穿件Mapreduce project 文件 如图
然后导入需要的jar
3.我们需要三个类
mapper 拆分文件
reduce 合并数据
job 负责启动mapper 和reduce 这两个进程
MyMapper类
package com.zhangtao.word;
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 Mapper01 extends Mapper<LongWritable, Text, Text, IntWritable> {
private Text word = new Text();
private static final IntWritable one = new IntWritable(1);
public void map(LongWritable ikey, Text ivalue, Context context) throws IOException, InterruptedException {
String[] sp = ivalue.toString().split(" ");
for(int i=0;i<sp.length;i++){
context.write(word, one);
}
}
}
Myreducer类
package com.zhangtao.word;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class Reducer01 extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text _key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable i : values) {
int j = i.get();
sum+=j;
}
context.write(_key, new IntWritable(sum));
}
}
JOb类
public class Job1 {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.3.140:9000");
Job job = Job.getInstance(conf);
job.setJarByClass(Job1.class);
job.setMapperClass(Mapper01.class);
job.setReducerClass(Reducer01.class);
job.setMapOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.setInputPaths(job, new Path("/user/abc.txt"));
FileOutputFormat.setOutputPath(job, new Path("/user/haha"));
boolean zt=job.waitForCompletion(true);
if(zt){
System.out.println("执行成功");
}
}
}
HDFS中的一些命令
hdfs dfs -mkdir 目录 -----创建目录
hdfs dfs -put 目标文件 目标路径 ----上传
hdsf dfs -get 目标文件 目标路径 -----下载
hdfs dfs -ls 目录 ------查看目录下的文件
hdfs dfs -cat 文件 --查看文件内容
hdfs dfs -rmr 文件 --删除文件
hdfs dfs -mv 改名称的文件路径 要改成的文件路径