虚拟机Hadoop实战(六)用java编写…

来源:互联网 发布:世界人工智能大会 北京 编辑:程序博客网 时间:2024/06/18 18:35
【结果图】将file1.txt和file2.txt中的项目去重
虚拟机Hadoop实战(六)用java编写MapReduce程序【运行期间bug修复】

同样在Netbeans环境下,新建一个基本的Java SE工程
这个Dedup程序,总感觉似乎仅仅是把本地的文件给传到Hadoop去做Map-Reduce了。
工程类库的导入,Hadoop的环境,简要参考前一章《虚拟机Hadoop实战(五)用java编写远程hadoop文件上传下载程序》中的设置:
hadoop-2.7.3\share\hadoop\common\lib\ 下的所有jar包
hadoop-2.7.3\share\hadoop\common\     下的hadoop-common-2.7.3.jar
hadoop-2.7.3\share\hadoop\mapreduce\ 下的hadoop-mapreduce-client-core-2.7.3.jar
                      和hadoop-mapreduce-client-common-2.7.3.jar
hadoop-2.7.3\share\hadoop\hdfs\           下的hadoop-hdfs-2.7.3.jar
并添加如下设置:
hadoop-2.7.3\share\hadoop\yarn\    下的hadoop-yarn-common-2.7.3.jar
hadoop-2.7.3\share\hadoop\yarn\    下的hadoop-yarn-api-2.7.3.jar
同时记得到 https://github.com/SweetInk/hadoop-common-2.7.1-bin下载并做如下准备:
winutils.exe     拷贝到%HADOOP_HOME%\bin目录
libwinutils.lib    拷贝到%HADOOP_HOME%\bin目录
hadoop.dll      拷贝到c:\windows\system32目录


程序Dedup.java
//Java系统原配的包
importjava.io.IOException;
// hadoop-2.7.3\share\hadoop\common\hadoop-common-2.7.3.jar包含下列包:
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.io.Text;
importorg.apache.hadoop.util.GenericOptionsParser;
// hadoop-2.7.3\share\hadoop\mapreduce\hadoop-mapreduce-client-core-2.7.3.jar包含下列类:
importorg.apache.hadoop.mapreduce.Job;
importorg.apache.hadoop.mapreduce.Mapper;
importorg.apache.hadoop.mapreduce.Reducer;

//以下的包无法自动解析,得手动添加
// hadoop-2.7.3\share\hadoop\mapreduce\hadoop-mapreduce-client-core-2.7.3.jar包含下列类:
importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;
importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
// hadoop-2.7.3\share\hadoop\common\hadoop-common-2.7.3.jar包含下列包:
importorg.apache.hadoop.fs.Path;


public class Dedup{
   //map将输入中的value复制到输出数据的key上,并直接输出
   public static class Map extendsMapper<Object,Text,Text,Text>{
       privatestatic Text line=new Text();//每行数据
       //实现map函数
      @Override
       publicvoid map(Object key,Text value,Context context)
             throwsIOException,InterruptedException{
          line=value;
          context.write(line, newText(""));
      }
   }

   //reduce将输入中的key复制到输出数据的key上,并直接输出
   public static class Reduce extendsReducer<Text,Text,Text,Text>{
      //实现reduce函数
      @Override
       publicvoid reduce(Text key,Iterable<Text>values,Context context)
             throwsIOException,InterruptedException{
          context.write(key, newText(""));
      }
   }

   public static void main2() throws Exception{
      
      System.setProperty("hadoop.home.dir","D:/迅雷下载/hadoop-2.7.3");
      
      Configuration conf = new Configuration();
       //设置远程job跑在哪个Hadoop地址
      conf.set("mapred.job.tracker","10.100.78.101:9001");
       String[]ioArgs = newString[]{"D:/!虚拟机/!待上传文件/dedup_in","D:/!虚拟机/!待上传文件/dedup_out"};
       String[]otherArgs = new GenericOptionsParser(conf,ioArgs).getRemainingArgs();
       if(otherArgs.length != 2) {
         System.err.println("Usage: Data Deduplication<in><out>");
          System.exit(2);
      }
       Job job =new Job(conf, "DataDeduplication");
      job.setJarByClass(Dedup.class);
       //设置Map、Combine和Reduce处理类
      job.setMapperClass(Map.class);
      job.setCombinerClass(Reduce.class);
      job.setReducerClass(Reduce.class);
       //设置输出类型
      job.setOutputKeyClass(Text.class);
      job.setOutputValueClass(Text.class);
       //设置输入和输出目录
      FileInputFormat.addInputPath(job, newPath(otherArgs[0]));
      FileOutputFormat.setOutputPath(job, newPath(otherArgs[1]));
      System.exit(job.waitForCompletion(true) ? 0 : 1);
   }
}

在另外一个类的main函数中运行(这里方便管理,当然也可以把main放在Dedup里)
    public static voidmain(String[] args) {
       try{
          Dedup.main2();
       } catch(Exception ex) {
         Logger.getLogger(UploadHadoop.class.getName()).log(Level.SEVERE,null, ex);
      }
   }


【异常】java.lang.NoClassDefFoundError:org/apache/hadoop/yarn/util/Apps
【原因】相比上传文件,MapReduce程序需要Yarn进行管理,因此需要导入相应的包
【解决】添加hadoop-2.7.3\share\hadoop\yarn\hadoop-yarn-common-2.7.3.jar、
hadoop-2.7.3\share\hadoop\yarn\hadoop-yarn-api-2.7.3.jar


【异常】(null) entry in command string: null chmod 0700
【原因】还是文件系统的问题,windows系统实在没法。如何解决?
【解决】得下载几个插件和类库进行Linux系统模拟:
在https://github.com/SweetInk/hadoop-common-2.7.1-bin中下载winutils.exe,libwinutils.lib拷贝到%HADOOP_HOME%\bin目录 。
  然后!一定记得设置环境变量    HADOOP_HOME        Path: C:\hadoop\
  办法二:对于不想设置环境变量的,你可以选择在java程序里写上环境变量。
      System.setProperty("hadoop.home.dir","C:\hadoop");
参考:http://stackoverflow.com/questions/40764807/null-entry-in-command-string-exception-in-saveastextfile-on-pyspark


【异常】java.lang.UnsatisfiedLinkError:org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(LZ
【原因】http://blog.csdn.net/congcong68/article/details/42043093
【解决】在https://github.com/SweetInk/hadoop-common-2.7.1-bin中下载hadoop.dll,并拷贝到c:\windows\system32目录中


【异常】org.apache.hadoop.mapred.FileAlreadyExistsException:Output directory file:/D:/!虚拟机/!待上传文件/dedup_out2 alreadyexists
【原因】暂时还不允许覆盖windows已经建好的目录。
【解决】因此可以选择删除此目录,或者指定输出的结果存储到一个新的目录里面。







0 0
原创粉丝点击