hadoop学习之二:mac下hadoop+eclipse环境搭建

来源:互联网 发布:cf手游版刷枪软件下载 编辑:程序博客网 时间:2024/05/21 10:11

这篇文章主要讲单机模式下的eclipse集成hadoop配置以及第一个mapreduce程序

在安装好hadoop后肯定是希望能直观地看看它可以干什么,我选择的切入点是MapReduce,之所以先学习MapReduce,是因为经过MRv1到MRv2的变化,hadoop的编程模型和处理引擎是被重用了,从共性的部分入手总是好的。

一些零碎的前置问题

命令行

 在安装好hadoop后就可以通过形如以下的代码进行一系列操作了。命令挺多的,参考官网。下面会用到一些命令,但是详细的还是看官方文档。

hadoop [--config confdir] [--loglevel loglevel] [COMMAND] [GENERIC_OPTIONS] [COMMAND_OPTIONS]`

启动模式

 hadoop有三种启动模式:
* 单机模式(Standalone): 这是hadoop的默认模式,上一篇文章中我们也将其配置成了默认模式。此时hadoop完全在本地运行,因此不需要与其他节点交互,单机模式不使用HDFS,也不加载任何hadoop的守护进程。该模式主要用于开发调试MapReduce程序的应用。
* 伪分布模式(Pseudo-Distributed): 伪分布模式在”单节点集群”上运行hadoop,其中所有的守护进程都运行在同一台机器上。该模式在单机模式之上增加了代码调试功能,允许你检查内存使用情况、HDFS输入输出以及其他的守护进程交互。
* 全分布模式(Fully-Distributed): 这个没得说的,单机和伪分布式都是用于开发和调试,实际运行中hadoop是在这种模式下。

 由于当前学习重点是mapreduce,配置节点什么的先放在后面,现在就使用单机模式(*-site.xml都没有配置)即可。

MapReduce Tutorial

 在官网的指导教程中,给出了第一个MapReduce程序,是一个计算单词数的程序,官网给了源码,可以自行通过命令行编译然后运行,但是觉得有一个集成开发环境更好一点,既然是java,首选eclipse。

eclipse+hadoop环境搭建

 现在假设你已经安装好了hadoop和eclipse。

  1. 下载hadoop2x-eclipse-plugin

  2. hadoop2x-eclipse-plugin/release/下找选一个*.jar拷贝到eclipse安装目录的plugin目录下。这里说两点:

    • mac下如果eclipse被拖到了application中,那么辅助点按finder/application下的eclipse图标,选择”显示包内容”即可进入安装目录。
    • 我的hadoop版本是2.7.2,兼容版本号是2.6.0的插件。
  3. 进入eclipse,首先要配置就是library pth,在Preferences(可以通过quick access找到) 中可以看到有一个Hadoop Map/Reduce栏,将自己的hadoop安装路径写下,比如我的是/usr/local/Cellar/hadoop/2.7.2/libexec

mapreduce-plugin

 现在新建工程,可以看到有一个”Map/Reduce Project”可供选择,没什么好说的,按照创建一般工程的方法创建下去,我在这里创建了一个wordcount工程,里面有一个类WordCount,然后把MapReduce Tutorial中的实例代码复制过去,这里大概是如下的样子

package wordcount;import java.io.IOException;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.Reducer;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class WordCount {  public static class TokenizerMapper       extends Mapper<Object, Text, Text, IntWritable>{    private final static IntWritable one = new IntWritable(1);    private Text word = new Text();    public void map(Object key, Text value, Context context                    ) throws IOException, InterruptedException {      StringTokenizer itr = new StringTokenizer(value.toString());      while (itr.hasMoreTokens()) {        word.set(itr.nextToken());        context.write(word, one);      }    }  }  public static class IntSumReducer       extends Reducer<Text,IntWritable,Text,IntWritable> {    private IntWritable result = new IntWritable();    public void reduce(Text key, Iterable<IntWritable> values,                       Context context                       ) throws IOException, InterruptedException {      int sum = 0;      for (IntWritable val : values) {        sum += val.get();      }      result.set(sum);      context.write(key, result);    }  }  public static void main(String[] args) throws Exception {    Configuration conf = new Configuration();    Job job = Job.getInstance(conf, "word count");    job.setJarByClass(WordCount.class);    job.setMapperClass(TokenizerMapper.class);    job.setCombinerClass(IntSumReducer.class);    job.setReducerClass(IntSumReducer.class);    job.setOutputKeyClass(Text.class);    job.setOutputValueClass(IntWritable.class);    FileInputFormat.addInputPath(job, new Path(args[0]));    FileOutputFormat.setOutputPath(job, new Path(args[1]));    System.exit(job.waitForCompletion(true) ? 0 : 1);  }}

以上,各种import包没有报错,那么ok,至少说明可以编译通过了。

第一个MapReduce程序

  1. 将上面的程序打包成jar包导出,这里为了方便我直接放到了跟目录下
  2. 设置输入目录,这时候我们看源程序的主函数,其中有两行:
FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));

说明之行这个WordCount类需要两个参数,一个输入目录一个输出目录,输出目录实现不能被创建。这里我还是在跟目录中创建了一个输入目录,并随便扔了一个README.md进去。

    #这条命令用于在本地文件系统创建目录    hadoop fs -mkdir input
  1. 启动命令行运行程序
    #这个命令是 jar <jar> [class] [args]的形式    #注意:    #1.这里之所以是wordcount.jar是因为我把它放到跟目录在,如果不再跟目录,则需要给出路径。    #2.[class]中是全局命名,即写出了包名    hadoop jar wordcount.jar wordcount.WordCount input output
  1. 最后可以在output中看到_SUCCESSpart-r-00000两个文件,其中打开part-r-00000可以看到如下结果:

output

说明这个程序完成了”字数统计”的工作。说明环境搭建完成并且你也运行了第一个mapreduce程序。

一些想法

 在深入到MapReduce之前我们直观地通过示例程序看看MapReduce可以为我们干什么,可以看到我们定义了一个继承继承MapperTokenizerMapper类,一个实现ReducerIntSumReducer类,并且在主函数中通过一个Job类的实例进行某种顺序执行的过程。通过以上这些,很直观的感受到使用MapReduce进行数据分析,既是通过继承这些类,并按照一个特定的流程提交Job。更多的至于如何处理,就是细节实现部分了。

0 0
原创粉丝点击