第一个Hadoop程序——WordCount

原创 2015年07月24日 19:22:55

概述:

  通过前面两篇博客的学习,我们学习了Hadoop的伪分布式部署和完全分布式部署。这一篇文章就来介绍一下Hadoop的第一个程序WordCount。以及在运行代码的过程中遇到的问题。


笔者开发环境:

  Linux:     CentOS 6.6(Final) x64

  Windows:   Win7 64位

  JDK:       java version "1.7.0_75"
             OpenJDK Runtime Environment (rhel-2.5.4.0.el6_6-x86_64 u75-b13)
             OpenJDK 64-Bit Server VM (build 24.75-b04, mixed mode)

  SSH:       OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013

  Hadoop:    hadoop-1.2.1

  Eclipse:   Release 4.2.0


  这边使用Linux和Window两个系统来开发的目的在于,我的Cygwin还没安装好。。。而Linux上的Hadoop安装和部署很方便,又感觉Winows上Eclipse比Linux上的Eclipse用着舒服。

  下面的代码和一些遇到的问题,以及对于这上问题的解决方案。


主代码(WordCount.java):

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();
		String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();

		if (otherArgs.length != 2) {
			System.err.println("Usage: wordcount <in> <out>");
			System.exit(2);
		}

		Job job = new Job(conf, "word count");
		job.setJarByClass(WordCount1.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(otherArgs[0]));
		FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
		System.exit(job.waitForCompletion(true) ? 0 : 1);
	}
}


运行过程及说明:

1.将我们在Windows上开发的Java程序打成jar包,上传到Linux上。


2.执行命令java -jar wordcount1.jar /home/moon/coding/tmp/wordcount /home/moon/coding/tmp/wordres

 


3.正常运行的情况下,会出现如下输出:

 


4.进行输出目录,查看结果:

  


5.输出文件的结果信息:

  


遇到的问题:

1.各种ClassNotFound异常

  这里对于ClassNotFound的异常比较好解决。只要导入一些相应的jar包就可以了。我在Eclipse中导入的jar如下:

  

  这些在你下载的Hadoop-x.x.x-bin的文件夹中都是有的。


2.Unable to load native-hadoop library for your platform

  经过一各种ClassNotFound异常的解决之后,出现了上面的这个异常。这个异常不是缺少jar包引起的。而是我们的系统环境没有把我们的jar和之前部署的Hadoop目录结合起来,只要在系统中配置一下hadoop的本地库的实际路径即可。如下:

  Hadoop本地库的实际路径:$HADOOP_HOME/lib/native/Linux-amd64-64/
  解决方法一:
  在启动JVM时,在java命令中添加java.library.path属性即可,如下:
  -Djava.library.path=$HADOOP_HOME/lib/native/Linux-amd64-64/

  解决方法二:
  使用LD_LIBRARY_PATH系统变量也能解决此问题,如下:

  export HADOOP_HOME = /home/moon/hadoop-1.2.1
  export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native/Linux-amd64-64/

版权声明:本文为博主原创文章,未经博主允许不得转载。

大数据——从零开始写MapReduce程序

大数据—从零开始写MapReduce程序 brycezou@163.com 1、在Mac上配置Hadoop 1)安装 JAVA 1.7.0_79,用 java -version 检验是否安装...
  • gnehcuoz
  • gnehcuoz
  • 2016年11月08日 21:49
  • 862

第一个Hadoop程序

hadoop资料之前倒是有看过,只是工作一直没涉及,自己也没有动手过。之前尝试高版本的apache版本机编译,居然都不成功。初衷只是要搭建环境,却由于都放在业余时间搞,时间不连续,尝试的方法不同(中间...
  • jollyjumper
  • jollyjumper
  • 2013年10月19日 23:30
  • 4187

第一个hadoop程序(java程序访问hadoop的hdfs文件系统中的文件)

1:hadoop2.7.3环境 2:阿里云服务器centos6.5,ip是:47.88.14.190 3:hadoop在伪分布式下运行的。 4:具体配置文件如下: 1)core-site.xm...
  • u010523770
  • u010523770
  • 2017年02月22日 16:48
  • 1838

Hadoop--两个简单的MapReduce程序

本文地址: 源代码下载: 这周在学习Hadoop编程,以前看过《Hadoop权威指南》这本书,但是看完了HDFS这一章之后,后面的内容就难以再看懂了,说实话,之前一直对MapReduce程序敬而远之,...
  • huhui_bj
  • huhui_bj
  • 2013年08月12日 01:05
  • 12921

Hadoop(四)——编程核心MapReduce(上)

上篇讲述了Hadoop的核心内容之一HDFS,是Hhadoop分布式的平台基础,而这讲的MapReduce则是充分利用Hdfs分布式,提高运行效率的算法模型 ,Map(映射)和Reduce(归约)两个...
  • liujiahan629629
  • liujiahan629629
  • 2015年09月09日 00:07
  • 3573

hadoop上的两种运行mapreduce程序的方法

之前学习了一段时间的hadoop的相关知识 ,学习理论基础的时候要同时实际操作才能对它更熟练,废话不多说来说说在hadoop上运行一个最简单的words count的程序 首先我先贴上这个程序的源...
  • YQlakers
  • YQlakers
  • 2017年04月13日 19:22
  • 2276

hadoop入门教程-程序小实例

无论是在微信还是QQ,我们经常看到好友推荐这样的功能,其实这个功能是在大数据的基础上实现的,下面来看具体的代码实现: 在src下添加三个类:JobRun.java: package com.lft...
  • u010158267
  • u010158267
  • 2016年03月31日 22:09
  • 855

Hadoop自带的一些程序示例

一、PiEstimator.java 位置:E:\Hadoop\hadoop-0.20.1\src\examples\org\apache\hadoop\examples /** * Lic...
  • GarfieldEr007
  • GarfieldEr007
  • 2016年03月14日 19:44
  • 2020

Hadoop示例程序手动编译

首先确保hadoop已经正确安装、配置以及运行。 拷贝WordCount.java到我们的文件夹,下载的hadoop里带有WordCount.java,路径为: hadoop-0.20.2...
  • turkeyzhou
  • turkeyzhou
  • 2012年10月28日 18:36
  • 3132

Hadoop学习---第三篇Hadoop的第一个Mapreduce程序

Mapreducer程序写了好几个了,但是之前一直都没有仔细的测试过本地运行和集群上运行的区别,今天写了一个Mapreduce程序,在此记录下来。  本地运行注意事项有以下几点: 1、本地必须配置好H...
  • zxl333
  • zxl333
  • 2015年05月30日 21:50
  • 818
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第一个Hadoop程序——WordCount
举报原因:
原因补充:

(最多只允许输入30个字)