Hadoop开发实例 使用Eclipse实现WordCount

栏目: 编程工具 · 发布时间: 5年前

内容简介:在学习Hadoop中,WordCount是许多人接触的第一个MapReduce程序,我也不例外。通过在网络上学习找到了不少帖子,但大多数是使用终端运行新安装的Eclipse通常是无法直接新建MapReduce程序,需要添加此处以macOS为例。

在学习Hadoop中,WordCount是许多人接触的第一个MapReduce程序,我也不例外。通过在网络上学习找到了不少帖子,但大多数是使用终端运行 hadoop jar WordCount.jar 实现的。本文将介绍如何使用Eclipse开发并运行WordCount。

开发环境

  • 系统:MacOS 10.14.1
  • Hadoop:2.7.0
  • Java:1.8.0
  • Eclipse:4.6.2

配置Eclipse

添加hadoop-eclipse-plugin插件

新安装的Eclipse通常是无法直接新建MapReduce程序,需要添加 hadoop-eclipse-plugin 插件, 下载地址

此处以macOS为例。

  1. 先下载hadoop_eclipse_plugin插件
  2. 进入到eclipse的dropins目录
    在Finder中找到应用程序,然后找到eclipse.这时eclipse显示的是一个app,而不是一个目录。右键点击后,打开选择显示包内容,就可以找到eclipse的应用程序目录了
  3. 把hadoop_eclipse_plugin.jar放进dropins文件夹内。
  4. 重启eclipse,打开window-> show view-> other-> MapReduce Tools,选择Map/Reduce Locations

与Hadoop集群建立连接

点击Eclipse的Map/Reduce Locations面板在面板中单击右键,选择New Hadoop Location。

Hadoop开发实例 使用Eclipse实现WordCount

在弹出来的General选项面板中,General 的设置要与 Hadoop 的配置一致。一般两个 Host值是一样的。如果是在本机搭建hadoop伪分布式,填写 localhost 即可,这里使用的是Hadoop伪分布,DFS Master 的 Port 改为 9000。Map/Reduce(V2) Master 的 Port 用默认的即可,Location Name 随意填写。

Hadoop开发实例 使用Eclipse实现WordCount

操作HDFS文件

配置好后,点击Project Explorer 中的DFS Location就能直接查看 HDFS 中的文件列表,双击可以查看内容,右键点击可以上传、下载、删除 HDFS 中的文件。

Hadoop开发实例 使用Eclipse实现WordCount Hadoop开发实例 使用Eclipse实现WordCount

当程序运行完成后,会生成一个output文件夹,通常运行完成后不能马上看到,此时可以尝试,右键点击DFS Locations后Reconnect或重启Eclipse。

使用Eclipse实现WordCount

Create Project

点击File菜单,选择New->Project

Hadoop开发实例 使用Eclipse实现WordCount

选择MapReduce wizard,后点击next。

Hadoop开发实例 使用Eclipse实现WordCount

Project Name随意填写,然后点finish。

Hadoop开发实例 使用Eclipse实现WordCount

Create WordCount.java

如普通Project一样,创建一个 java 程序后,复制如下代码。

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;
import org.apache.hadoop.util.GenericOptionsParser;

public class WordCount {

	public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {

		/**
		 * LongWritable, IntWritable, Text 均是 Hadoop 中实现的用于封装 Java
		 * 数据类型的类,这些类实现了WritableComparable接口,
		 * 都能够被串行化从而便于在分布式环境中进行数据交换,你可以将它们分别视为long,int,String 的替代品。
		 */
		private final static IntWritable one = new IntWritable(1);  // 值为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();
		String[] otherArgs = {"/input", "/output"};
		if (otherArgs.length != 2) {
			System.err.println("Usage: wordcount <in> <out>");
			System.exit(2);
		}
		Job job = new Job(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.setInputDirRecursive(job, true);
		FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
		FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
		System.exit(job.waitForCompletion(true) ? 0 : 1);
	}

}

在Eclipse运行WordCount.java

如前文所说,若要在hadoop上运行此project需要封装成jar包。若需要直接在Eclipse右键运行的话还需要做一下配置。

运行 MapReduce 程序前,务必将 /usr/local/Cellar/hadoop/2.7.0/libexec/etc/hadoop 中将有修改过的配置文件(如伪分布式需要core-site.xml 和 hdfs-site.xml),以及log4j.properties复制到WordCount 项目下的src文件夹(~/workspace/WordCount/src)中。如下图

Hadoop开发实例 使用Eclipse实现WordCount

这是因为在使用 Eclipse 运行 MapReduce 程序时,会读取 Hadoop-Eclipse-Plugin 的Advanced parameters作为 Hadoop 运行参数,如果未进行修改,则默认的参数其实就是单机(非分布式)参数,因此程序运行时是读取本地目录而不是HDFS目录,就会提示Input路径不存在。报如下图错误

Hadoop开发实例 使用Eclipse实现WordCount

配置好以上文件后,就可以运行普通java程序一样右键run了,不同的是所输出的结果会出现的HDFS上,而输出路径及输入数据集的路径在在源代码中 String[] otherArgs 指定。

Hadoop开发实例 使用Eclipse实现WordCount

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

XMPP

XMPP

Peter Saint-Andre、Kevin Smith、Remko TronCon / O'Reilly Media / 2009-5-4 / USD 39.99

This practical book provides everything you need to know about the Extensible Messaging and Presence Protocol (XMPP). This open technology for real-time communication is used in many diverse applicati......一起来看看 《XMPP》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具