• 浅谈mapreduce程序部署


    尽管我们在虚拟机client上能非常快通过shell命令,进行运行一些已经封装好实例程序,可是在应用中还是是自己敲代码,然后部署到server中去,以下,我通过程序进行浅谈一个程序的部署过程。

    在启动Hadoop之后,然后把程序达成可运行的jar包,并把对应的第三方jar包 包括进去。运行hadoop    jar   XXX. +驱动名称。

    package com.mapred;
    
    import java.io.IOException;
    import java.io.PrintStream;
    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.Mapper.Context;
    import org.apache.hadoop.mapreduce.Reducer;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    import org.apache.hadoop.util.GenericOptionsParser;
    
    public class WordCount
    {
      public static void main(String[] args)
        throws Exception
      {
        Configuration conf = new Configuration();
      /*  String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
        if (otherArgs.length != 2) {
          System.err.println("Usage: wordcount <in> <out>");
          System.exit(2);
        }*/
        Job job = new Job(conf, "word count");
        job.setJarByClass(WordCount.class);
        FileInputFormat.addInputPath(job, new Path("hdfs://ubuntu:9000/Input"));
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        job.setMapOutputKeyClass(Text.class);
    	job.setMapOutputValueClass(IntWritable.class);
       
        FileOutputFormat.setOutputPath(job, new Path("hdfs://ubuntu:9000/output09"));
        job.waitForCompletion(true);
      }
    
      public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable>
      {
        private IntWritable result;
    
        public IntSumReducer()
        {
          this.result = new IntWritable();
        }
    
        public void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException
        {
          int sum = 0;
          for (IntWritable val : values) {
            sum += val.get();
          }
          this.result.set(sum);
          context.write(key, this.result);
        }
      }
    
      public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>
      {
        private static final IntWritable one = new IntWritable(1);
        private Text word;
    
        public TokenizerMapper()
        {
          this.word = new Text();
        }
    
        public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
          StringTokenizer itr = new StringTokenizer(value.toString());
          while (itr.hasMoreTokens()) {
            this.word.set(itr.nextToken());
            context.write(this.word, one);
          }
        }
      }
    }
    在运行的过程中要注意下面几个事项:

    首先要注意的就是,文件在hdfs上的位置是否正确,记住仅仅须要指定目录名称就可以,里面有多少详细文件,Hadoop都一并给你处理,注意观察在运行过程中所出现的异常。

    由于我在运行和调试过程中也出现非常多异常,我觉得这些异常是情况非常多的,希望有兴趣的同学和我一起交流,共同分析和研究它。

    1:注意观察虚拟机终端中报的错误,依据错误进行对应改进,由于关联jar较多,所以当提示你少对应的某一个包时,你要注意引进过来。

    2:这里我是部署到虚拟机中运行的,只是在网上看过非常多资料说,通过Eclipse也能够直接进行数据的处理,可是我没有调试成功,希望大家谁成功了,告知我一声。我感觉我是版本号和虚拟机可能没有绑定好。

    3:用Java命令(Java -jar   XXX.jar)也能够执行。并且在这样的情况下不须要安装和部署Hadoop环境。可是由于我的Java虚拟机在执行时,老是提示内存不足。没有成功,我还是在Hadoop环境和总成功的。大家能够尝试并交流着去做一下。这个东西,处理数据有点意思。

  • 相关阅读:
    Pandas的高级操作
    Pandas的拼接操作
    Matplotlib基础使用
    股票分析案例
    Pandas处理缺失的数据
    Pandas的基础使用
    python前端之CSS基础--常用样式
    python前端之CSS介绍--选择器
    python实现网站用户名密码自动登录
    Python前端HTML介绍
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3905761.html
Copyright © 2020-2023  润新知