• Java+大数据开发——Hadoop集群环境搭建(二)


    1. MAPREDUCE使用

    mapreducehadoop中的分布式运算编程框架,只要按照其编程规范,只需要编写少量的业务逻辑代码即可实现一个强大的海量数据并发处理程序

    2. Demo开发——wordcount

    2.1需求

    从大量(比如T级别)文本文件中,统计出每一个单词出现的总次数。

    2.2mapreduce 实现思路

    Map阶段:

    a) HDFS的源数据文件中逐行读取数据

    b) 将每一行数据切分出单词

    c) 为每一个单词构造一个键值对(单词,1)

    d) 将键值对发送给reduce

    Reduce阶段

    a) 接收map阶段输出的单词键值对

    b) 将相同单词的键值对汇聚成一组

    c) 对每一组,遍历组中的所有“值”,累加求和,即得到每一个单词的总次数

    d) (单词,总次数)输出到HDFS的文件中

     

    2.3具体编码实现

    (1)定义一个mapper

    //首先要定义四个泛型的类型
    //keyin:  LongWritable    valuein: Text
    //keyout: Text            valueout:IntWritable
    
    public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
        //map方法的生命周期:  框架每传一行数据就被调用一次
        //key :  这一行的起始点在文件中的偏移量
        //value: 这一行的内容
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            //拿到一行数据转换为string
            String line = value.toString();
    //将这一行切分出各个单词
            String[] words = line.split(" ");
            //遍历数组,输出<单词,1>
            for(String word:words){
                context.write(new Text(word), new IntWritable(1));
            }
        }
    }

    (2)定义一个reducer

    //生命周期:框架每传递进来一个kv 组,reduce方法被调用一次
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            //定义一个计数器
            int count = 0;
            //遍历这一组kv的所有v,累加到count中
            for(IntWritable value:values){
                count += value.get();
            }
            context.write(key, new IntWritable(count));
        }
    }

    (3)定义一个主类,用来描述job并提交job

    public class WordCountRunner {
        //把业务逻辑相关的信息(哪个是mapper,哪个是reducer,要处理的数据在哪里,输出的结果放哪里。。。。。。)描述成一个job对象
        //把这个描述好的job提交给集群去运行
        public static void main(String[] args) throws Exception {
            Configuration conf = new Configuration();
            Job wcjob = Job.getInstance(conf);
            //指定我这个job所在的jar包
    //        wcjob.setJar("/home/hadoop/wordcount.jar");
            wcjob.setJarByClass(WordCountRunner.class);
            
            wcjob.setMapperClass(WordCountMapper.class);
            wcjob.setReducerClass(WordCountReducer.class);
            //设置我们的业务逻辑Mapper类的输出key和value的数据类型
            wcjob.setMapOutputKeyClass(Text.class);
            wcjob.setMapOutputValueClass(IntWritable.class);
            //设置我们的业务逻辑Reducer类的输出key和value的数据类型
            wcjob.setOutputKeyClass(Text.class);
            wcjob.setOutputValueClass(IntWritable.class);
    //指定要处理的数据所在的位置
            FileInputFormat.setInputPaths(wcjob, "hdfs://hdp-server01:9000/wordcount/data/big.txt");
            //指定处理完成之后的结果所保存的位置
            FileOutputFormat.setOutputPath(wcjob, new Path("hdfs://hdp-server01:9000/wordcount/output/"));
            
            //向yarn集群提交这个job
            boolean res = wcjob.waitForCompletion(true);
            System.exit(res?0:1);
        }
    3.程序打包运行

     1. 将程序打包

     2. 准备输入数据

    vi  /home/hadoop/test.txt

    Hello tom
    Hello jim
    Hello ketty
    Hello world
    Ketty tom

    hdfs上创建输入数据文件夹

    hadoop   fs  mkdir  -p  /wordcount/input

    words.txt上传到hdfs

    hadoop  fs  –put  /home/hadoop/words.txt  /wordcount/input

    3. 将程序jar包上传到集群的任意一台服务器上

    4. 使用命令启动执行wordcount程序jar

    $ hadoop jar wordcount.jar cn.itcast.bigdata.mrsimple.WordCountDriver /wordcount/input /wordcount/out

    5. 查看执行结果

    $ hadoop fs –cat /wordcount/out/part-r-00000

    作者:杰瑞教育
    出处:http://www.cnblogs.com/jerehedu/ 
    版权声明:本文版权归杰瑞教育技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    技术咨询:JRedu技术交流
  • 相关阅读:
    [uboot] (番外篇)uboot relocation介绍(转)
    [uboot] (番外篇)global_data介绍(转)
    [uboot] (第三章)uboot流程——uboot-spl代码流程 后续2018版本分析
    AddressUtils
    ruoyi HttpUtils
    ruoyi IpUtils
    ruoyi StringUtils
    JSONObject
    jackson解析处理JSON
    spring boot pom demo
  • 原文地址:https://www.cnblogs.com/jerehedu/p/7508751.html
Copyright © 2020-2023  润新知