在单机模式下Hadoop不会使用HDFS,也不会开启任何Hadoop守护进程,所有程序将在一个JVM上运行并且最多只允许拥有一个reducer

在Eclipse中新创建一个hadoop-test的Java工程(特别要注意的是Hadoop需要1.6或1.6以上版本的JDK)

在Hadoop的官网http://www.apache.org/dyn/closer.cgi/hadoop/common/上选择合适的地址下载hadoop-1.2.1.tar.gz

解压hadoop-1.2.1.tar.gz得到hadoop-1.2.1目录

将hadoop-1.2.1目录下和hadoop-1.2.1\lib目录下的jar包导入到hadoop-test工程中

接下来编写MapReduce程序(该程序用来统计每月收支结余)

Map:

  1. import java.io.IOException;
  2. import org.apache.hadoop.io.LongWritable;
  3. import org.apache.hadoop.io.Text;
  4. import org.apache.hadoop.mapred.MapReduceBase;
  5. import org.apache.hadoop.mapred.Mapper;
  6. import org.apache.hadoop.mapred.OutputCollector;
  7. import org.apache.hadoop.mapred.Reporter;
  8.  
  9. public class MapBus extends MapReduceBase
  10. implements Mapper<LongWritable, Text, Text, LongWritable> {
  11. @Override
  12. public void map(LongWritable key, Text date,
  13. OutputCollector<Text, LongWritable> output,
  14. Reporter reporter) throws IOException {
  15. //2013-01-11,-200
  16. String line = date.toString();
  17. if(line.contains(",")){
  18. String[] tmp = line.split(",");
  19. String month = tmp[0].substring(5, 7);
  20. int money = Integer.valueOf(tmp[1]).intValue();
  21. output.collect(new Text(month), new LongWritable(money));
  22. }
  23. }
  24. }

Reduce:

  1. import java.io.IOException;
  2. import java.util.Iterator;
  3. import org.apache.hadoop.io.LongWritable;
  4. import org.apache.hadoop.io.Text;
  5. import org.apache.hadoop.mapred.MapReduceBase;
  6. import org.apache.hadoop.mapred.OutputCollector;
  7. import org.apache.hadoop.mapred.Reducer;
  8. import org.apache.hadoop.mapred.Reporter;
  9.  
  10. public class ReduceBus extends MapReduceBase
  11. implements Reducer<Text, LongWritable, Text, LongWritable> {
  12. @Override
  13. public void reduce(Text month, Iterator<LongWritable> money,
  14. OutputCollector<Text, LongWritable> output, Reporter reporter)
  15. throws IOException {
  16. int total_money = 0;
  17. while(money.hasNext()){
  18. total_money += money.next().get();
  19. }
  20. output.collect(month, new LongWritable(total_money));
  21. }
  22. }

Main:

  1. import org.apache.hadoop.fs.Path;
  2. import org.apache.hadoop.io.LongWritable;
  3. import org.apache.hadoop.io.Text;
  4. import org.apache.hadoop.mapred.FileInputFormat;
  5. import org.apache.hadoop.mapred.FileOutputFormat;
  6. import org.apache.hadoop.mapred.JobClient;
  7. import org.apache.hadoop.mapred.JobConf;
  8.  
  9. public class Wallet {
  10. public static void main(String[] args){
  11. if(args.length != 2){
  12. System.err.println("param error!");
  13. System.exit(-1);
  14. }
  15.  
  16. JobConf jobConf = new JobConf(Wallet.class);
  17. jobConf.setJobName("My Wallet");
  18.  
  19. FileInputFormat.addInputPath(jobConf, new Path(args[0]));
  20. FileOutputFormat.setOutputPath(jobConf, new Path(args[1]));
  21. jobConf.setMapperClass(MapBus.class);
  22. jobConf.setReducerClass(ReduceBus.class);
  23. jobConf.setOutputKeyClass(Text.class);
  24. jobConf.setOutputValueClass(LongWritable.class);
  25.  
  26. try{
  27. JobClient.runJob(jobConf);
  28. }catch(Exception e){
  29. e.printStackTrace();
  30. }
  31. }
  32. }

还需准备待分析的文件,在E:\cygwin_root\home\input路径下创建2个文件,一个文件名为:2013-01.txt,另一个文件名为:2013-02.txt

2013-01.txt:

  1. 2013-01-01,100
  2. 2013-01-02,-100
  3. 2013-01-07,100
  4. 2013-01-10,-100
  5. 2013-01-11,100
  6. 2013-01-21,-100
  7. 2013-01-22,100
  8. 2013-01-25,-100
  9. 2013-01-27,100
  10. 2013-01-18,-100
  11. 2013-01-09,500

2013-02.txt:

  1. 2013-02-01,100

设置好运行参数后,就可以通过Run As -> Java Application运行MapReduce程序了

  1. java.io.IOException: Failed to set permissions of path:
  2. \tmp\hadoop-linkage\mapred\staging\linkage1150562408\.staging to 0700

报这个错误的主要原因是后期的hadoop版本增加了对文件路径的校验,我的修改方式比较简单,将hadoop-core-1.2.1.jar替换为hadoop-0.20.2-core.jar即可正常运行

下面是MapReduce程序运行时打印的日志

  1. 14/02/11 10:54:16 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
  2. 14/02/11 10:54:16 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
  3. 14/02/11 10:54:16 WARN mapred.JobClient: No job jar file set. User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
  4. 14/02/11 10:54:16 INFO mapred.FileInputFormat: Total input paths to process : 2
  5. 14/02/11 10:54:17 INFO mapred.JobClient: Running job: job_local_0001
  6. 14/02/11 10:54:17 INFO mapred.FileInputFormat: Total input paths to process : 2
  7. 14/02/11 10:54:17 INFO mapred.MapTask: numReduceTasks: 1
  8. 14/02/11 10:54:17 INFO mapred.MapTask: io.sort.mb = 100
  9. 14/02/11 10:54:17 INFO mapred.MapTask: data buffer = 79691776/99614720
  10. 14/02/11 10:54:17 INFO mapred.MapTask: record buffer = 262144/327680
  11. 14/02/11 10:54:17 INFO mapred.MapTask: Starting flush of map output
  12. 14/02/11 10:54:18 INFO mapred.MapTask: Finished spill 0
  13. 14/02/11 10:54:18 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000000_0 is done. And is in the process of commiting
  14. 14/02/11 10:54:18 INFO mapred.LocalJobRunner: file:/E:/cygwin_root/home/input/2013-01.txt:0+179
  15. 14/02/11 10:54:18 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000000_0' done.
  16. 14/02/11 10:54:18 INFO mapred.MapTask: numReduceTasks: 1
  17. 14/02/11 10:54:18 INFO mapred.MapTask: io.sort.mb = 100
  18. 14/02/11 10:54:18 INFO mapred.MapTask: data buffer = 79691776/99614720
  19. 14/02/11 10:54:18 INFO mapred.MapTask: record buffer = 262144/327680
  20. 14/02/11 10:54:18 INFO mapred.MapTask: Starting flush of map output
  21. 14/02/11 10:54:18 INFO mapred.MapTask: Finished spill 0
  22. 14/02/11 10:54:18 INFO mapred.TaskRunner: Task:attempt_local_0001_m_000001_0 is done. And is in the process of commiting
  23. 14/02/11 10:54:18 INFO mapred.LocalJobRunner: file:/E:/cygwin_root/home/input/2013-02.txt:0+16
  24. 14/02/11 10:54:18 INFO mapred.TaskRunner: Task 'attempt_local_0001_m_000001_0' done.
  25. 14/02/11 10:54:18 INFO mapred.LocalJobRunner:
  26. 14/02/11 10:54:18 INFO mapred.Merger: Merging 2 sorted segments
  27. 14/02/11 10:54:18 INFO mapred.Merger: Down to the last merge-pass, with 2 segments left of total size: 160 bytes
  28. 14/02/11 10:54:18 INFO mapred.LocalJobRunner:
  29. 14/02/11 10:54:18 INFO mapred.TaskRunner: Task:attempt_local_0001_r_000000_0 is done. And is in the process of commiting
  30. 14/02/11 10:54:18 INFO mapred.LocalJobRunner:
  31. 14/02/11 10:54:18 INFO mapred.TaskRunner: Task attempt_local_0001_r_000000_0 is allowed to commit now
  32. 14/02/11 10:54:18 INFO mapred.FileOutputCommitter: Saved output of task 'attempt_local_0001_r_000000_0' to file:/E:/cygwin_root/home/output
  33. 14/02/11 10:54:18 INFO mapred.LocalJobRunner: reduce > reduce
  34. 14/02/11 10:54:18 INFO mapred.TaskRunner: Task 'attempt_local_0001_r_000000_0' done.
  35. 14/02/11 10:54:18 INFO mapred.JobClient: map 100% reduce 100%
  36. 14/02/11 10:54:18 INFO mapred.JobClient: Job complete: job_local_0001
  37. 14/02/11 10:54:18 INFO mapred.JobClient: Counters: 13
  38. 14/02/11 10:54:18 INFO mapred.JobClient: FileSystemCounters
  39. 14/02/11 10:54:18 INFO mapred.JobClient: FILE_BYTES_READ=39797
  40. 14/02/11 10:54:18 INFO mapred.JobClient: FILE_BYTES_WRITTEN=80473
  41. 14/02/11 10:54:18 INFO mapred.JobClient: Map-Reduce Framework
  42. 14/02/11 10:54:18 INFO mapred.JobClient: Reduce input groups=2
  43. 14/02/11 10:54:18 INFO mapred.JobClient: Combine output records=0
  44. 14/02/11 10:54:18 INFO mapred.JobClient: Map input records=12
  45. 14/02/11 10:54:18 INFO mapred.JobClient: Reduce shuffle bytes=0
  46. 14/02/11 10:54:18 INFO mapred.JobClient: Reduce output records=2
  47. 14/02/11 10:54:18 INFO mapred.JobClient: Spilled Records=24
  48. 14/02/11 10:54:18 INFO mapred.JobClient: Map output bytes=132
  49. 14/02/11 10:54:18 INFO mapred.JobClient: Map input bytes=195
  50. 14/02/11 10:54:18 INFO mapred.JobClient: Combine input records=0
  51. 14/02/11 10:54:18 INFO mapred.JobClient: Map output records=12
  52. 14/02/11 10:54:18 INFO mapred.JobClient: Reduce input records=12

运行完成后将在E:\cygwin_root\home\output路径下生成2个文件:.part-00000.crc和part-00000。.part-00000.crc为一二进制文件,是一个保存了part-00000文件校验和的内部文件;part-00000文件中保存了最终的统计结果

  1. 01 500
  2. 02 100

特别要注意的是每次运行前都需要先将输出路径删掉,否则会报

  1. org.apache.hadoop.mapred.FileAlreadyExistsException:
  2. Output directory file:/E:/cygwin_root/home/output already exists

Hadoop做这个校验的目的是为了避免上一次MapReduce程序没有完成时,再次执行MapReduce程序产生的中间文件会覆盖掉上一次的中间文件

Eclipse下使用Hadoop单机模式调试MapReduce程序的更多相关文章

  1. eclipse远程连接hadoop单机模式出现的问题

    按照http://tydldd.iteye.com/blog/2007938配置单机模式 主要是 (1)配置hadoop-env.sh,指定jdk的安装路径 添加jdk路径 # The java im ...

  2. Hadoop单机模式安装

    一.实验环境说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序: ...

  3. 3-1.Hadoop单机模式安装

    Hadoop单机模式安装 一.实验介绍 1.1 实验内容 hadoop三种安装模式介绍 hadoop单机模式安装 测试安装 1.2 实验知识点 下载解压/环境变量配置 Linux/shell 测试Wo ...

  4. centos7 hadoop 单机模式安装配置

    前言 由于现在要用spark,而学习spark会和hdfs和hive打交道,之前在公司服务器配的分布式集群,离开公司之后,自己就不能用了,后来用ambari搭的三台虚拟机的集群太卡了,所以就上网查了一 ...

  5. Hadoop单机模式的配置与安装

    Hadoop单机模式的配置与安装 单机hadoop集群正常启动后进程情况 ResourceManager NodeManager SecondaryNameNode NameNode DataNode ...

  6. windows下eclipse远程连接hadoop集群开发mapreduce

    转载请注明出处,谢谢 2017-10-22 17:14:09  之前都是用python开发maprduce程序的,今天试了在windows下通过eclipse java开发,在开发前先搭建开发环境.在 ...

  7. Hadoop单机模式/伪分布式模式/完全分布式模式

    一.Hadoop的三种运行模式(启动模式) 一.单机(非分布式)模式 这种模式在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统. 默认情况下,Hadoop即处于该模式,用于开发 ...

  8. Hadoop单机模式安装-(3)安装和配置Hadoop

    网络上关于如何单机模式安装Hadoop的文章很多,按照其步骤走下来多数都失败,按照其操作弯路走过了不少但终究还是把问题都解决了,所以顺便自己详细记录下完整的安装过程. 此篇主要介绍在Ubuntu安装完 ...

  9. Eclipse/MyEclipse下如何Maven管理多个Mapreduce程序?(企业级水平)

    不多说,直接上干货! 如何在Maven官网下载历史版本 Eclipse下Maven新建项目.自动打依赖jar包(包含普通项目和Web项目) Eclipse下Maven新建Web项目index.jsp报 ...

随机推荐

  1. bzoj1046

    首先这肯定是一道LIS的变形,这次求的是方案,还要求字典序最小 (注意这个字典序最小是指下标最小而不是数最小) 首先预处理以每个数为首,能组成多长的上升序列(这里我们用单调队列解决) 然后按照位置顺序 ...

  2. [转] ICPC2013 World Finals赛后感

    原文地址:http://blog.sina.com.cn/s/blog_6c7729450101lmll.html Orz... 26号考完最后一科计网,27号准备了一下各种材料,28号凌晨就踏上旅程 ...

  3. Android开发视频学习(1)

    S01E02_搭建Android开发环境 设置ANDROID_SDK_HOME环境变量,用于指定Android模拟器的目录,官方文档没有说要设置. S01E03_Android创世纪 Android根 ...

  4. Selenium IDE初探

    系列教程: http://www.cnblogs.com/hyddd/archive/2009/05/30/1492536.html 使用过程中,出现了一些问题.

  5. Content-Type伪装 - 将jsp伪装成css

    一.前期理论准备 1)目的:  在jsp中动态生成css语句,然后输出给浏览器解析.渲染. 2)浏览器解析文件的依据:  页面加载后,浏览器会发起各个请求去下载各种资源.  比如下载css文件,然后根 ...

  6. Cocos2d-x v3.3 lua绑定c++类方法总结

    网上有很多cocos2d-x lua绑定c++类的接口教程,这篇文章也是总结他们的经验. 其中重点参考了 http://cn.cocos2d-x.org/tutorial/show?id=1295, ...

  7. aix 文件大小相关查询

    一.aix中查看文件夹占用空间大小 du命令默认是显示当前目录下每个文件以及每个子目录以及下属文件的大小的 用du -sg 可看出当前文件夹的大小,包括文件夹下文件和文件夹(以G为单位):用du -s ...

  8. 微软Azure 存储管理器的简单介绍

    Windows Azure存储用户经常希望能够在“管理器”中查看他们的数据,管理器指的是一款可用于显示存储帐户数据的工具.我们之前提供了我们所知的存储管理器列表.在本文中,我们将对此列表进行更新,使其 ...

  9. redis命令之lrange

    LRANGE key start stop Related commands BLPOP BRPOP BRPOPLPUSH LINDEX LINSERT LLEN LPOP LPUSH LPUSHX ...

  10. Esper系列(十)NamedWindow语法delete、Select+Delete、Update

    On-Delete With Named Windows 功能:在Named Windows中删除事件. 格式: 1  ,   4  field_b = win.field_a,  5  field_ ...