Hadoop开发实例 使用Eclipse实现WordCount

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

内容简介:在学习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

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

查看所有标签

猜你喜欢:

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

A Philosophy of Software Design

A Philosophy of Software Design

John Ousterhout / Yaknyam Press / 2018-4-6 / GBP 14.21

This book addresses the topic of software design: how to decompose complex software systems into modules (such as classes and methods) that can be implemented relatively independently. The book first ......一起来看看 《A Philosophy of Software Design》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

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

RGB CMYK 互转工具