1、工具介绍
Eclipse Idigo、JDK1.7-32bit、hadoop1.2.1、hadoop-eclipse-plugin-1.2.1.jar(自己网上下载)
2、插件安装步骤
1)将hadoop-eclipse-plugin-1.2.1.jar放到eclipse安装目录的plugins文件夹中,重新启动eclipse。
2)打开Window-->Preferens,发现Hadoop Map/Reduce选项,说明插件安装成功,配置Hadoop installation directory为本地Hadoop 安装解压的目录。此处选择是hadoop1.2.1软件包在windows中的文件夹,其中的各种文件可以都不用配置,与Linux中的hadoop没有什么特殊的联系,原生态的hadoop1.2.1.tar.gz解压的就行。
3)选择window -> open perspective -> Other... , 选择有大象图标的 Map/Reduce,打开Map/Reduce的开发环境,右下角多了一个Map/Reduce Locations的框。
4)选择Map/Reduce Locations 标签,点击标签最右边的大象图标,即齿轮状图标右侧的大象图标,打开参数设置页面。
Location Name : 参数设置名称
Map/Reduce Master :Hadoop集群的Map/Reduce地址,应与mapredsite.xml中的mapred.job.tracker设置相同
Host: hadoop-master.dragon.org
port: 9001
DFS Master :Hadoop的master服务器地址,应与core-site.xml中的 fs.default.name 设置相同
Host: hadoop-master.dragon.org
Port: 9000
设置完成后,点击Finish
5)接着点击 【Advanced parameters】从中找见【hadoop.tmp.dir】,修改为Hadoop集群【core-site.xml】中配置的值
6)重启hadoop配置一下两步(若不重启能找到的话也可以直接配置,本次测试时重启了,否则找不到)
配置【dfs.permissions】,修改为Hadoop集群【hdfs-site.xml】中配置的值【false】
配置【dfs.replication】,修改为Hadoop集群【hdfs-site.xml】中配置的值【1】
3、跑wordcount程序测试
因为本人已经测试完成,这个是后期整理,借用几张梦琪老师的图用一下,不影响运行,节省时间;
1)使用Eclipse 创建MapReduce工程,你会发现多了好多配置的jar文件,自动导入到项目中了。
2)将wordcount程序拷贝到该工程目录src文件夹下;程序同上一篇博客的wordcount程序。
1 package org.dragon.hadoop.mr; 2 3 import java.io.IOException; 4 import java.util.StringTokenizer; 5 6 import org.apache.hadoop.conf.Configuration; 7 import org.apache.hadoop.fs.Path; 8 import org.apache.hadoop.io.IntWritable; 9 import org.apache.hadoop.io.LongWritable; 10 import org.apache.hadoop.io.Text; 11 import org.apache.hadoop.mapreduce.Job; 12 import org.apache.hadoop.mapreduce.Mapper; 13 import org.apache.hadoop.mapreduce.Reducer; 14 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 15 16 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 17 import org.apache.hadoop.util.GenericOptionsParser; 18 19 import com.sun.accessibility.internal.resources.accessibility; 20 import com.sun.org.apache.xpath.internal.Arg; 21 22 /** 23 * 24 * @author ZhuXY 25 * @time 2016-3-7 下午3:37:54 26 * 27 * MapReduce 初级案例 wordcount程序 28 */ 29 public class MyWorldCount { 30 31 //Mapper 区域 32 /** 33 * <KEYIN, VALUEIN, KEYOUT, VALUEOUT> 34 * 输入key类型 输入value类型 输出key类型 输出value类型 35 * 36 */ 37 38 /** 39 * WordCount程序map类 40 * 41 */ 42 static class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable>{ 43 44 private Text word=new Text(); 45 private final static IntWritable one=new IntWritable(1); 46 47 //快捷键alt+shift+s 48 //map方法每次只读取一行数据,换句话说就是每行启动一个map函数 49 @Override 50 protected void map(LongWritable key, Text value, Context context) 51 throws IOException, InterruptedException { 52 53 //获取每行数据的值 54 String lineValue=value.toString(); 55 56 //进行分割 57 StringTokenizer stringTokenizer=new StringTokenizer(lineValue); 58 59 //遍历 60 while (stringTokenizer.hasMoreElements()) { 61 62 //获取每个值 63 String worldValue=stringTokenizer.nextToken(); 64 65 //设置map, 输入的key值 66 word.set(worldValue); 67 context.write(word, one); //如果出现就出现一次,存在每行出现几次,这时候键的值一样,多个键值对 68 } 69 } 70 } 71 72 //Reducer 区域 73 /** 74 * <KEYIN, VALUEIN, KEYOUT, VALUEOUT> 75 * KEYIN key, Iterable<VALUEIN> values, Context context 76 */ 77 78 /** 79 * WordCount程序reduce类 80 * 81 */ 82 static class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable>{ 83 84 private IntWritable resultIntWritable=new IntWritable(); 85 //这里key还是key。但是value变成了values 86 @Override 87 protected void reduce(Text key, Iterable<IntWritable> values, 88 Context context) 89 throws IOException, InterruptedException { 90 //用于累加的变量 91 92 int sum=0; 93 //循环遍历Interable 94 for(IntWritable value:values) 95 { 96 //累加 97 sum+=value.get(); 98 } 99 100 //设置总次数 101 resultIntWritable.set(sum); 102 context.write(key, resultIntWritable); 103 } 104 } 105 106 //Client 区域 107 public static void main(String[] args) throws Exception { 108 109 //方便起见直接在此处写死了,可以在run as的配置中配置参数 110 args=new String[]{ 111 "hdfs://hadoop-master.dragon.org:9000/wc/wcinput/", 112 "hdfs://hadoop-master.dragon.org:9000/wc/wcoutput/" 113 }; 114 115 //获取配置文件信息 116 Configuration configuration=new Configuration(); 117 118 //当命令格式不正确的时候,提示,类似于shell中的命令提示 119 // String[] otherArgs = new GenericOptionsParser(configuration, 120 // args).getRemainingArgs(); 121 // if (otherArgs.length != 2) { 122 // System.err.println("Usage: wordcount <in> <out>"); 123 // System.exit(2); 124 // } 125 126 //创建job。设置配置文件信息和Job名称 127 Job job=new Job(configuration,"wc"); 128 129 //1、设置Job运行的类 130 job.setJarByClass(MyWorldCount.class); 131 132 //2、设置Mapper类和Reducer类 133 job.setMapperClass(MyMapper.class); 134 job.setReducerClass(MyReducer.class); 135 136 //3、设置输入文件的目录和输出文件目录 137 FileInputFormat.addInputPath(job, new Path(args[0])); 138 FileOutputFormat.setOutputPath(job, new Path(args[1])); 139 140 //4、设置输出结果的key和value的类型 141 job.setOutputKeyClass(Text.class); 142 job.setOutputValueClass(IntWritable.class); 143 144 //5、提交Job等待运行结果,并在客户端显示运行信息 145 boolean isSuccess=job.waitForCompletion(true); 146 147 //6、结束程序 148 System.exit(isSuccess?0:1); 149 } 150 }
3)直接在类中右击-->Run on hadoop
4)报错如下;Hadoop PriviledgedActionException
解决方案:
a、简称“修改源码”——找到hadoop1.2.1的源码,就是你第二步添加的源码,
修改%HADOOP_HOME%/src/core/org/apache/hadoop/fs/FileUtil.java里面checkReturnValue方法,注释掉方法内容:
b、简称“导入包修改”。显然第一种办法不是很合适。
到源码中找到该java文件,在该项目中建立与该文件所在的packet相同的packet,然后将FileUtils.java拷贝到该packet下面,注释掉上述注释掉的内容。
原因:Eclipse对packet的加载规则是先用本项目下面的,在用库中的。
5)再次运行wordcount程序没有问题了。
6)备注:如还有问题参考下面一张图片:
到此结束,以后插件就可以用了