Hadoop

https://hadoop.apache.org

Hadoop安装的方式——单节点集群

  1. Local(Standalone) Mode 本地模式
  2. Pseudeo-Distributed Mode 伪分布式模式

集群
全分布式模式

Hadoop中比较重要的几个模块:

  1. HDFS:Hadoop的分布式文件系统,是一个对用户透明的硬盘
  2. MapReduce:用于Map和Reduce两个阶段,通常用于对数据进行分析和处理
  3. Yarn:Apache Hadoop YARN(Yet Another):一种新的Hadoop资源管理器。可以理解为一种分布式的操作系统平台。而MapReduce可以理解为在Yarn上的一组程序。
org.apache.hadoop hadoop-core 1.2.1 org.apache.hadoop hadoop-common 3.3.0 org.apache.maven.plugins maven-compiler-plugin 3.8.1 11 11

当有了上面的依赖之后,已经有了一个本地模式的Hadoop,即便不下载Hadoop,也是可以独立运行Hadoop程序的

package com.example.hadoop;

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {

/*继承了Mapper父类,实现了其中的map方法。这个类承担了MapReduce中Map的角色
 * 至于Map这个角色到底做了什么事情呢?这是完全由map方法决定的。
 * map方法一般都是把数据做成k-v的形式供reduce使用*/
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
    /*Mapper的四个泛型参数:
     * 1. 第一个参数表示map函数输入(指从原始数据中的输入,此处就是file01和02)键的类型
     * 2. 第二个参数表示map函数输入(指从原始数据中的输入,此处就是file01和02)值的类型
     * 3. 第三个参数表示Map函数输出(输出到reduce阶段)键的类型
     * 4. 第四个参数表示Map函数输出(输出到reduce阶段)值的类型*/

    //Text当作是Java中的String类型,IntWritable当作Java中的Integer类型

    private final static IntWritable one = new IntWritable(1);  //Integer one = new Integer(1);
    private Text word = new Text(); //String word = new String("");

    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        System.out.println(key.toString());
        /*map方法的三个参数:
         * 1. key:键,即等于四个范型中的第一个
         * 2. value:值,即等于四个范型中的第二个
         * 3. context:上下文,这里的上下文指map-reduce这个上下文*/
        StringTokenizer itr = new StringTokenizer(value.toString());//此处的value就是文件内容
        //StringTokenizer主要用于分割字符串,默认情况下,空格,\t \n 等都是分割符。当然也可以自己指定分割符。
        while (itr.hasMoreTokens()) {
            word.set(itr.nextToken()); //word类似于String,set方法就类似于给字符串赋值,即word = "Hello";
            context.write(word, one); //map阶段的结果写出给reduce阶段
        }
    }
    /*实际上,Map的结果是类似于下面:
    Hello 1
    World 1
    Bye 1
    World 1
    Hello 1
    Hadoop 1
    Goodbye 1
    Hadoop 1
     */
}

/*继承了Reducer父类,这个类承担了MapReducer中reduce的角色
 * 至于reduce这个角色到底做了什么事情呢?这是完全由reduce方法决定的。*/
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    /*Reducer的四个泛型参数:
     * 1. 第一个参数表示reduce函数输入(此处的输入是来自于map阶段的键)键的类型
     * 2. 第二个参数表示reduce函数输入(此处的输入是来自于map阶段的值)值的类型
     * 3. 第三个参数表示reduce函数输出(输出到最终结果)键的类型
     * 4. 第四个参数表示reduce函数输出(输出到最终结果)值的类型*/
    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        /* 1. key指map阶段输出的key
        *  2. values指所有map阶段输出相同key的值的集合,整个的结果类似:
        *  Text key      Iterable<IntWritable> values
        *  Hello         {1, 1}
        *  World         {1, 1}
        *  Bye           {1}
        *  Hadoop        {1, 1}
        *  Goodbye       {1}
        * */
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        result.set(sum);
        context.write(key, result);
    }
}

//当程序运行时,首先执行Map阶段,之后再来执行Reduce阶段
public static void main(String[] args) throws Exception {
//Configuratio 用来做配置的,默认配置
    Configuration conf = new Configuration();

//job任务。在hadoop上跑的一个任务/程序
    Job job = Job.getInstance(conf, "word count");

// 打jar包,打jar包主类是(xxxx.class)
    job.setJarByClass(WordCount.class);
    
//Mapper这个类是()
    job.setMapperClass(TokenizerMapper.class);
//Combiner是一个优化
    job.setCombinerClass(IntSumReducer.class);
    
//Reducer这个类是谁()
    job.setReducerClass(IntSumReducer.class);
//设置一下输出键的类型
    job.setOutputKeyClass(Text.class);
//设置一下输出值的类型
    job.setOutputValueClass(IntWritable.class);
//文件输入格式:指定文件的输入
    FileInputFormat.addInputPath(job, new Path(args[0]));
//文件输出格式:指定文件的输出
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
//退出,  阻塞方法:等待任务完成。
    System.exit(job.waitForCompletion(true) ? 0 : 1);
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值