• 大数据学习——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;
        }
    
    }

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

  • 相关阅读:
    spring security如何添加无需鉴权的接口?
    框架——切面框架——aop——weave timing
    框架——切面框架——aop——@Aspect
    框架——切面框架——aop——集成Spring
    ffmpeg q:v 2 表示输出的图片质量,一般是1到5之间(1 为质量最高)
    衡量机器学习模型的三大指标:准确率、精度和召回率。
    Pytorch的permute函数,将tensor的维度换位
    深度学习模型评价指标(准确率、精确率、召回率、F1、ROC、AUC)
    【项目】项目155
    【项目】项目154
  • 原文地址:https://www.cnblogs.com/yuezhihao/p/9329246.html
Copyright © 2020-2023  润新知