第5周 Map-Reduce编程实战,eclipse与Hadoop集群连接

Eclipse的Hadoop插件

win7下安装hadoop完成后,接下来就是eclipse hadoop开发环境配置了。具体的操作如下:

一、在eclipse下安装开发hadoop程序的插件
安装这个插件很简单,haoop-0.20.2自带一个eclipse的插件,在hadoop目录下的 contrib\eclipse-plugin\hadoop-0.20.2-eclipse-plugin.jar,把这个文件copy到eclipse的eclipse\plugins

目录下,然后启动eclipse就算完成安装了。
这里说明一下,haoop-0.20.2自带的eclipse的插件只能安装在eclipse 3.3上才有反应,而在eclipse 3.7上运行hadoop程序是没有反应的,所以要针对eclipse 3.7重新编译插件。
另外简单的解决办法是下载第三方编译的eclipse插件,下载地址为:
http://code.google.com/p/hadoop-eclipse-plugin/downloads/list
由于我用的是Hadoop-0.20.2,所以下载hadoop-0.20.3-dev-eclipse-plugin.jar.
然后将hadoop-0.20.3-dev-eclipse-plugin.jar重命名为hadoop-0.20.2-eclipse-plugin.jar,把它copy到eclipse的eclipse\plugins目录下,然后启动eclipse完成安装。

1、在左边的 project explorer 上头会有一个 DFS locations的标志
2、在 windows -> preferences里面会多一个hadoop map/reduce的选项,选中这个选项,然后右边,把下载的hadoop根目录选中(windows上的hadoop只是为了调用里面的jar包)

如果能看到以上两点说明安装成功了。


二、在windows的“C:\Windows\System32\drivers\etc\hosts”路径下加入以下内容:

192.168.136.128 hadoop1

192.168.136.129 hadoop2

192.168.136.130 hadoop3


三、插件安装后,配置连接参数
插件装完了,启动hadoop,然后就可以建一个hadoop连接了,就相当于eclipse里配置一个 weblogic的连接。 
第一步,打开Map/Reduce Locations 视图,在右上角有个大象的标志点击
第二步,在点击大象后弹出的对话框进行进行参数的添加:

location name: 这个随便填写,我填写的是:hadoop
Map/Reduce Master 这个框里
Host:就是jobtracker 所在的集群机器,这里写hadoop1(这里可以写主机名,因为前面已经加了主机映射。)
Hort:就是jobtracker 的port,这里写的是9001
这两个参数就是mapred-site.xml里面mapred.job.tracker里面的ip和port  
DFS Master 这个框里
Host:就是namenode所在的集群机器,这里写hadoop1
Port:就是namenode的port,这里写9000
这两个参数就是core-site.xml里面fs.default.name里面的ip和port
(Use M/R master host,这个复选框如果选上,就默认和Map/Reduce Master这个框里的host一样,如果不选择,就可以自己定义输入,这里jobtracker 和namenode在一个机器上,所以是一样的,就勾选上)

 user name:这个是连接hadoop的用户名,因为我是用root用户安装的hadoop,而且没建立其他的用户,所以就用root。
下面的不用填写。然后点击finish按钮,此时,这个视图中就有多了一条记录。


第三步,重启eclipse并重新编辑刚才建立的那个连接记录,如图现在我们编辑advance parameters tab页
(重启编辑advance parameters tab页原因:在新建连接的时候,这个advance paramters  tab页面的一些属性会显示不出来,显示不出来也就没法设置,所以必须重启一下eclipse再进来编辑才能看到)
这里大部分的属性都已经自动填写上了,其实就是把core-defaulte.xml、hdfs-defaulte.xml、mapred-defaulte.xml里面的一些配置属性展示出来。因为在安装hadoop的时候,其site系列配置文件里有改动,所以这里也要弄成一样的设置。主要关注的有以下属性:
fs.defualt.name:这个在General tab页已经设置了
mapred.job.tracker:这个在General tab页也设置了
dfs.replication:这个这里默认是3,因为我在hdfs-site.xml里面设置成了2,所以这里也要设置成2 
hadoop.job.ugi:刚才说看不见的那个,就是这个属性,这里要填写:root,Tardis,逗号前面的是连接的hadoop的用户,逗号后面就写死Tardis
dfs.data.dir 改为 /nosql/hadoop/data
hadoop.tmp.dri 改为 /tmp/hadoop-root
然后点击finish, DFS Locations下面会有一只大象,下面会有一个文件夹,即 hdfs的根目录,这里就是展示的分布式文件系统的目录结构了。

第四步 查看HDFS文件系统,并尝试建立文件夹和上传文件
点击Eclipse软件左侧的"DFS Locations"下面的"hadoop",就会展示出HDFS上的文件结构。
右击"hadoop à user à root "可以尝试建立一个"文件夹--test",然后右击刷新就能查看我们刚才建立的文件夹。
用SecureCRT远程登录"192.168.136.128"服务器,用下面命令查看是否已经建立一个"test"的文件夹。
[root@hadoop1 bin]# ./hadoop dfs -ls
Found 3 items
drwxr-xr-x - root supergroup 0 2014-01-09 07:57 /user/root/in
drwxr-xr-x - root supergroup 0 2014-01-09 07:58 /user/root/out
drwxr-xr-x - root supergroup 0 2014-01-10 07:54 /user/root/test
到此为止,我们的Hadoop Eclipse开发环境已经配置完毕,不尽兴的同学可以上传点本地文件到HDFS分布式文件上,可以互相对比意见文件是否已经上传成功。
[root@hadoop1 bin]# ./hadoop dfs -ls ./test
Found 1 items
-rw-r--r-- 2 root supergroup 3965 2014-01-10 07:56 /user/root/test/m.sql

倒排索引

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
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.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
/*
 * 倒排索引
 * 现有一批电话通信清单,记录了用户A拨打用户B的记录
 * 需要做一个倒排索引,记录拨打给用户B的所有用户A
 * 13599999999 10086
 * 13599999999 120
 * 13999999999 13800138000
 * 13722222222 13800138000
 * 18800000000 120
 * 13722222222 10086
 * 18966666666 10086
 * 18966666666|110
 * 任务输出必须如下所示,主叫以‘|’分割
 * hdfs://192.168.136.128:9000/user/root/test
 * hdfs://192.168.136.128:9000/user/root/out
 */
public class Test extends Configured implements Tool {
 /* 计数器 Counter 是一个计数器 可以记录这个程序一些数据用于统计 */
 enum Counter {
  LINESKIP, // 出错的行
 }
 public static class Map extends Mapper<LongWritable, Text, Text, Text> {
  public void map(LongWritable key, Text value, Context context)
    throws IOException, InterruptedException {
   // 读取源文件,line得到的就是输入文件的一行数据
   String line = value.toString();
   try {
    // 数据处理
    String[] lineSplit = line.split(" "); // 对源数据进行分割重组
    String anum = lineSplit[0]; // 主叫
    String bnum = lineSplit[1]; // 被叫
    context.write(new Text(bnum), new Text(anum)); // 输出
   } catch (ArrayIndexOutOfBoundsException e) {
    context.getCounter(Counter.LINESKIP).increment(1); // 出错令计数器加1
   }
  }
 }
 public static class Reduce extends Reducer<Text, Text, Text, Text> {
  public void reduce(Text key, Iterable<Text> values, Context context)
    throws IOException, InterruptedException {
   String valueString;
   String out = "";
   // 每个value代表Map函数发送的一个value
   // 在这里代表拨打了这个被叫号码的一个主叫
   for (Text value : values) {
    valueString = value.toString();
    out += valueString + "|";
   }
   context.write(key, new Text(out));
  }
 }
 public int run(String[] args) throws Exception {
  Configuration conf = getConf();
  Job job = new Job(conf, "test_job"); // 任务名
  job.setJarByClass(Test.class); // 执行class
  FileInputFormat.addInputPath(job, new Path(args[0])); // 输入路径
  FileOutputFormat.setOutputPath(job, new Path(args[1])); // 输出路径
  job.setMapperClass(Map.class); // 指定上面Map类作为MAP任务代码
  job.setReducerClass(Reduce.class); // 指定上面Reduce类作为REDUCE任务代码
  job.setOutputFormatClass(TextOutputFormat.class);
  job.setOutputKeyClass(Text.class); // 指定输出KEY的格式
  job.setOutputValueClass(Text.class); // 指定输出VALUE的格式等哈
  job.waitForCompletion(true);
  return job.isSuccessful() ? 0 : 1;
 }
 public static void main(String[] args) throws Exception {
  int res = ToolRunner.run(new Configuration(), new Test(), args );
  System.exit(res);
 }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值