大数据学习——MapReduce配置及java代码实现wordcount算法

---恢复内容开始---

配置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;
    }

}

---恢复内容结束---

猜你喜欢

转载自www.cnblogs.com/yuezhihao/p/9329246.html