配置MapReduce需要在之前配置的基础上配置两个xml文件一个是yarn-site.xml一个是mapred-site.xml,在之前配置的hadoop的etc目录下可以找到
下边进行配置过程首先
1、配置yarn-site.xml
<configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.resourcemanager.hostname</name> <value>192.168.98.141</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
这里需要解释一下,yarn的基本思想是将JobTracker的两个主要功能(资源管理和作业调度/监控)分离,主要方法是创建一个全局的ResourceManager(RM)和若干个针对应用程序的ApplicationMaster(AM)。这里的应用程序是指传统的MapReduce作业或作业的DAG,其实yarn类似理解成tomcat, 在web项目上有tomcat这个平台。yarn也是这样的,YARN 分层结构的本质是 ResourceManager。这个实体控制整个集群并管理应用程序向基础计算资源的分配。ResourceMannager将这些资源分配给NodeManager(yarn代理结点)。
上图第一个value配置属性是对应自己系统配置ip的主机号
配置mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
这样就是配置完成了
打开虚拟机,开启yarn服务,输入jps查看是否具有ResourceManager NodeManager两部分。有则配置成功。
虚拟机下运行wordcount算法
进入hadoop——>share——>hadoop——mapreduce——>执行 hadoop-mapreduce-examples-2.7.3.jar中的wordcount算法
这里需要注意,wordcount后的目录 第一个为统计字符文件的目录,第二个为输出目录,输出的目录必须是之前不存在的否则会报错
介绍下MapReduce的工作流程,粗略划分可以分为以下几个步骤
1、代码编写
2、作业配置
3、提交作业
4、初始化作业
5、分配任务
6、执行任务
7、更新任务和状态
MapReduce在处理数据时都是通过键值对的形式进行处理数据
1、MapReduce框架是通过Map读取文件内容,解析成key、value对文件的每一行,解析成key、value对<key,value>每一个键值对调用一次map函数,写自己的逻辑,对输入的key、value处理转换成新的key、value输出,将输出的中间键值对传给Reduce;
2、在Reduce之前,有一个shuffle的过程对多个map任务的输出进行合并、排序
3、写Reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出
4、把Reduce的输出保存到文件中
上述内容是我学完之后对MapReduce的工作流程的一个理解,下边通过java代码实现wordcount算法。
首先建立一个maven项目,在pom.xml中引入以下依赖
</dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> <version>1.8</version> <scope>system</scope> <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath> </dependency>
建立Map类
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 MyMap extends Mapper<LongWritable, Text, Text, IntWritable> { @Override /* * 其中KEYIN(字节偏移量) VLAUE (获取的数据类型)KEYOUT(输出数据类型)VALUE(输出数据值类型) */ protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException { // TODO Auto-generated method stub String line=value.toString();//按行获取文件内容 String[] words=line.split(" ");//通过空格将每行内容进行分片 for (String word : words) { context.write(new Text(word.trim()), new IntWritable(1));//将map函数的输出溢写到内存中的环形缓冲区 } } }
建立Reduce类
import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class MyReduce extends Reducer<Text, IntWritable, Text, IntWritable> { @Override /* * Key 为map输出Key的类型 ,迭代器类型对应map传来的value值 * 迭代器的使用是为了实现map中每个值都进行一次处理 * */ protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException { // TODO Auto-generated method stub int sum=0; //数据处理 for (IntWritable intWritable : values) { sum+=intWritable.get(); } context.write(key, new IntWritable(sum)); } }
建立Job类
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.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; public class MyJob extends Configured implements Tool{ public static void main(String[] args) throws Exception { MyJob myJob=new MyJob(); ToolRunner.run(myJob, null); } @Override public int run(String[] args) throws Exception { // TODO Auto-generated method stub Configuration conf=new Configuration();//创建配置对象 conf.set("fs.defaultFS", "hdfs://192.168.80.142:9000"); //分配任务 Job job=Job.getInstance(conf); job.setJarByClass(MyJob.class); job.setMapperClass(MyMap.class); job.setReducerClass(MyReduce.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); //建立文件输入输出流 FileInputFormat.addInputPath(job, new Path("/hadoop/hadoop.txt")); FileOutputFormat.setOutputPath(job, new Path("/hadoop/out")); job.waitForCompletion(true); return 0; } }
---恢复内容结束---