基于上篇的方法介绍,开发很不方便 。[0007] windows 下 eclipse 开发 hdfs程序样例 

装上插件,方便后续直接在windows下的IDE开发调试。

环境:

  • Linux  Hadoop 2.6.4,参考文章 [0001]
  • Win 7 64  下的 Eclipse Version: Luna Service Release 1 (4.4.1)

    工具:

说明:

   以下整个步骤过程是在全部弄好后,才来填补的。中间修改多次,为了快速成文有些内容从其他地方复制。因此,如果完全照着步骤,可能需要一些小修改。整个思路是对的。

1.  准备Hadoop安装包

在windows下解压 Hadoop 2.6.4 安装程序包。  将Linux上的hadoop 安装目录下 etc/hadoop的所有配置文件

全部替换 windows下解压后的配置文件

2 . 安装HDFS eclipse 插件

  • eclipse关闭状态下, 将 hadoop-eclipse-plugin-2.6.4.jar 放到该目录下 eclipse安装目录\plugins\
  • 启动eclipse
  • 菜单栏->窗口windows->首选项preferences->Hadoop mapeduce ,指定hadoop路径为前面的解压路径
  • 菜单栏->窗口windows->Open Perspective->Other->选择Map/Reduce ok->Map/Reduce Location选项卡 ->右边蓝色小象 打开配置窗口如图,进行如下设置,点击ok

1位置为配置的名称,任意。

2位置为mapred-site.xml文件中的mapreduce.jobhistory.address配置,如果没有则默认是10020。

3位置为core-site.xml文件中的fs.defaultFS:hdfs://ssmaster:9000 。

这是网上找到图片,我的设置 

hadoop2.6伪分布式,ssmaster:10020,ssmaster:9000

 

 [b0008]  Windows 7 下 hadoop 2.6.4  eclipse 本地开发调试配置

 

设置成功后,在eclipse这里可以直接显示Linux Hadoop hdfs的文件目录

[b0008]  Windows 7 下 hadoop 2.6.4  eclipse 本地开发调试配置

 

可以直接在这里 下载、上传、 删除HDFS上的文件,很方便

[b0008]  Windows 7 下 hadoop 2.6.4  eclipse 本地开发调试配置

 

3  配置Mapreduce Windows 插件包

 3.1  下载hadoop 2.6 windows插件包包

没找到2.6.4的,用2.6的最后也成功了。

其中参考下载地址: http://download.csdn.net/detail/myamor/8393459,这个似乎是win8的, 本人的系统win7,不是从这里下的。 忘记哪里了。可以搜索 winutils.exe + win7 。 下载后的文件应该有 hadoop.dll hadoop.pdb hadoop.lib hadoop.exp winutils.exe winutils.pdb libwinutils.lib

 

 3.2   配置

      a  解压上面的插件包, 将文件全部拷贝到 G:\RSoftware\hadoop-2.6.4\hadoop-2.6.4\bin ,该路径为前面"2 . 安装HDFS eclipse 插件"的hadoop指定路径。  

      b  设置环境变量

         HADOOP_HOME =G:\RSoftware\hadoop-2.6.4\hadoop-2.6.4

         Path 中添加 G:\RSoftware\hadoop-2.6.4\hadoop-2.6.4\bin

         确保有 HADOOP_USER_NAME = hadoop   上一篇 [0007]中设置

      

      重启Eclipse ,读取新环境变量

 

4    测试Mapreduce

   4.1 新建mapreduce 工程      

  [b0008]  Windows 7 下 hadoop 2.6.4  eclipse 本地开发调试配置

[b0008]  Windows 7 下 hadoop 2.6.4  eclipse 本地开发调试配置

完成后项目会自动把Hadoop的所有jar包导入

 

4.2  项目配置log4j

 

在src目录下,创建log4j.properties文件 ,内容如下

log4j.rootLogger=debug,stdout,R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=mapreduce_test.log
log4j.appender.R.MaxFileSize=1MB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%
log4j.logger.com.codefutures=DEBUG

 

4.3 WordCount类中  添加代码

 

在WordCount项目里右键src新建class,包名com.xxm(请自行命明),类名为WordCount

[b0008]  Windows 7 下 hadoop 2.6.4  eclipse 本地开发调试配置

 

package mp.filetest;

import java.io.IOException;
import java.util.*;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

/**
 * 描述:WordCount explains by xxm
 * @author xxm
 */
public class WordCount2 {

 /**
 * Map类:自己定义map方法
 */
 public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
    /**
    * LongWritable, IntWritable, Text 均是 Hadoop 中实现的用于封装 Java 数据类型的类
    * 都能够被串行化从而便于在分布式环境中进行数据交换,可以将它们分别视为long,int,String 的替代品。
    */
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();
    /**
    * Mapper类中的map方法:
    * protected void map(KEYIN key, VALUEIN value, Context context)
    * 映射一个单个的输入k/v对到一个中间的k/v对
    * Context类:收集Mapper输出的<k,v>对。
    */
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String line = value.toString();
        StringTokenizer tokenizer = new StringTokenizer(line);
        while (tokenizer.hasMoreTokens()) {
            word.set(tokenizer.nextToken());
            context.write(word, one);
        }
    }
 } 

 /**
 * Reduce类:自己定义reduce方法
 */       
 public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {

    /**
    * Reducer类中的reduce方法:
    * protected void reduce(KEYIN key, Interable<VALUEIN> value, Context context)
    * 映射一个单个的输入k/v对到一个中间的k/v对
    * Context类:收集Reducer输出的<k,v>对。
    */
    public void reduce(Text key, Iterable<IntWritable> values, Context context) 
      throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        context.write(key, new IntWritable(sum));
    }
 }

 /**
 * main主函数
 */       
 public static void main(String[] args) throws Exception {

    Configuration conf = new Configuration();//创建一个配置对象,用来实现所有配置

    Job job = new Job(conf, "wordcount2");//新建一个job,并定义名称

    job.setOutputKeyClass(Text.class);//为job的输出数据设置Key类
    job.setOutputValueClass(IntWritable.class);//为job输出设置value类
    
    job.setMapperClass(Map.class); //为job设置Mapper类
    job.setReducerClass(Reduce.class);//为job设置Reduce类
    job.setJarByClass(WordCount2.class);

    job.setInputFormatClass(TextInputFormat.class);//为map-reduce任务设置InputFormat实现类
    job.setOutputFormatClass(TextOutputFormat.class);//为map-reduce任务设置OutputFormat实现类

    FileInputFormat.addInputPath(job, new Path(args[0]));//为map-reduce job设置输入路径
    FileOutputFormat.setOutputPath(job, new Path(args[1]));//为map-reduce job设置输出路径
    job.waitForCompletion(true); //运行一个job,并等待其结束
 }

}
View Code

相关文章: