Mapreduce环境详细搭建和案例实现

版本情况:

Eclipse:Version: Mars.2 Release (4.5.2)
Hadoop: 2.7.1
Ubuntu:16.04


软件资源

网盘地址
mapreduce配置相关软件
链接:https://pan.baidu.com/s/1MyoC7LN8RRWvHgtEGOL_hA
提取码:0830
(三十天有效)
软件作用解释:
hadoop-eclipse插件(把hadoop-eclipse-plugin-2.6.0.jar拷到eclipse目录的plugins目录中)
依赖包2.7.1(导入相关依赖时用到)
Hadoop2.7.1
winutils-master (把windows相关依赖文件拷贝到解压好的hadoop文件夹中的bin目录下)
eclipse软件

一、基于Hadoop平台的eclipse开发环境搭建?

一、 安装jdk1.8,配置系统变量JAVA_HOME
安装完jdk后 右击此电脑点击属性 点击高级系统设置
环境变量
在这里插入图片描述
在这里插入图片描述在系统变量 新建JAVA_HOME 路径写相对路径或者绝对路径都可
在这里插入图片描述
新建CLASSPATH
变量值写入: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
(注意前面的.不要丢,和后面的;号)
在这里插入图片描述
在path变量中新建
(jdk安装时的两个路径)
在这里插入图片描述
新建HADOOP_HOME,修改path
在这里插入图片描述
在这里插入图片描述
新建HADOOP_USER_NAME

在这里插入图片描述
在这里插入图片描述

验证
jdk环境安装成功
在这里插入图片描述
查看Hadoop是否安装成功
在这里插入图片描述
把windows相关依赖文件拷贝到解压好的hadoop文件夹中的bin目录下
下载地址:https://github.com/4ttty/winutils

在这里插入图片描述
并把其中的hadoop.dll文件拷贝到C:\windows\system32中
把hadoop-eclipse-plugin-2.6.0.jar拷到eclipse目录的plugins目录中

启动eclipse,配置hadoop安装路径
在这里插入图片描述在这里插入图片描述
增加Map/Reduce功能区
Eclipse窗口,菜单中选择:windows—>Perspective—>Open Perspective
—>Other
在这里插入图片描述
单击界面右下方的蓝色小象图标(其上方有+号)
在这里插入图片描述
Location name:命名新建的hadoop连接
Map/Reduce(V2) Master:填写ResourceManager的IP地址和端口
DFS Master:填写NameNode的IP地址和端口

*浏览HDFS上的目录及文件*
在这里插入图片描述
注明:要让windows下的java程序能访问hdfs文件,ubuntu的9866端口要打开
sudo ufw allow 9866
在这里插入图片描述

二、countword案例实现

1.任务要求

统计指定文件中的词频,并输出到指定目录(该目录不能存在)
在hdfs中的当前用户家目录建input文件夹,现有helloworld.txt文本文件,请把这个文件上传到input目录下,并统计这个文件中单词出现的次数。
在这里插入图片描述
程序结构:
在这里插入图片描述

2.MapReduce程序编写方法

(1)创建maven工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)Eclipse导入相关jar包
创建一个文件夹
在这里插入图片描述
在这里插入图片描述
点击Add JARs 选择我们所要的jar包把jar包导入
在这里插入图片描述

(3)在pom.xml文件中添加如下依赖

<dependencies>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.8.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-common</artifactId>
			<version>2.7.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-client</artifactId>
			<version>2.7.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-hdfs</artifactId>
			<version>2.7.1</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/junit/junit -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		<!-- hadoop-common依赖系统上的tools.jar -->
		<dependency>
			<groupId>jdk.tools</groupId>
			<artifactId>jdk.tools</artifactId>
			<version>1.8</version>
			<scope>system</scope>
			<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
		</dependency>
	</dependencies>

(3)在项目的src/main/resources目录下,新建一个文件,命名为“log4j.properties”,在文件中填入。

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

2.编写程序
(1)编写Map处理逻辑- WordCountMapper.java

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class WordCountMapper extends Mapper<LongWritable, Text, Text, LongWritable>{
	@Override
	protected void map(LongWritable key, Text value,
			Mapper<LongWritable, Text, Text, LongWritable>.Context context)
			throws IOException, InterruptedException {
		// 拿到传入进来的一行内容,把数据类型转换为String
		String valueString = value.toString();
		// 将这行内容按照分隔符切割
		String wArr[] = valueString.split(" ");
		// 遍历数组,每出现一个单词就标记一个数组1 例如:<单词,1>
		for(int i=0;i<wArr.length;i++){
			// 使用MR上下文context,把Map阶段处理的数据发送给Reduce阶段作为输入数据
			context.write(new Text(wArr[i]), new LongWritable(1));
			//第一行Hello Hello World. 发送出去的是<Hello,1><Hello,1><World.,1>
		}
	}
}

(2)Reduce处理逻辑- WordCountReducer.java

import java.io.IOException;
import java.util.Iterator;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.util.IdGenerator;

public class WordCountReducer extends Reducer<Text, LongWritable, Text, LongWritable>{
	@Override
	protected void reduce(Text key, Iterable<LongWritable> v2s,
			Reducer<Text, LongWritable, Text, LongWritable>.Context context)
			throws IOException, InterruptedException {
		Iterator<LongWritable> it = v2s.iterator();
		//定义一个计数器
		long sum = 0;
		//遍历一组迭代器,把每一个数量1累加起来就构成了单词的总次数
		while(it.hasNext()){
			sum += it.next().get();
		}
		context.write(key, new LongWritable(sum));
	}

}

(3)驱动模块TestMapReducer.java

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.junit.Test;

public class TestMapReducer {
	public static void main(String[] args) throws Exception{
		// 通过如下的方式进行客户端身份的设置,可访问hadoop的用户
		System.setProperty("HADOOP_USER_NAME", "hadoop");
		
		Configuration conf = new Configuration();
		// 这里指定使用的是HDFS文件系统
		conf.set("fs.default.name", "hdfs://192.168.80.140:9000");
		//conf.set("fs.defaultFS", "hdfs://192.168.80.140:9000"); //在有设置地址映射情况下可用机器名代替IP地址		
		// 这里指定使用的是本地文件系统
		//conf.set("mapreduce.framework.name", "local");

		//通过Job来封装本次MR的相关信息
		Job job = Job.getInstance(conf);
		// 指定MR Job jar包运行主类
		job.setJarByClass(TestMapReducer.class);
		
		// 指定本次MR所有的Mapper Reducer类
		job.setMapperClass(WordCountMapper.class);
		job.setReducerClass(WordCountReducer.class);
		
		// 设置我们的业务逻辑 Mapper类的输出 key和 value的数据类型
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(LongWritable.class);
		
		// 设置我们的业务逻辑 Reducer类的输出 key和 value的数据类型
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(LongWritable.class);
		
		// 指定要处理的数据所在的位置
		FileInputFormat.setInputPaths(job, new Path("/user/hadoop/input/helloworld.txt")); //可以是目录或文件
		//FileInputFormat.setInputPaths(job, "D:/mr/input"); 
		
		// 指定处理完成之后的结果所保存的位置
		FileOutputFormat.setOutputPath(job, new Path("/user/hadoop/output"));
		//FileOutputFormat.setOutputPath(job, new Path("D:/mr/output"));

		// 提交程序并且监控打印程序执行情况
		boolean res = job.waitForCompletion(true);
		System.exit(res ? 0 : 1);		
		
	}

}

3、测试
(1)本地测试
在这里插入图片描述
如果在控制台出现权限不够,就在虚拟机用shell命令修改报错路径文件的权限 -chmod 777
在eclipse中查看执行结果
在这里插入图片描述
在这里插入图片描述
在集群上查看结果
在这里插入图片描述


报错解决

问题:xml出现红色波浪号
解决:拼写检查忽视去掉红色下划波浪线的方法:
Windows->Preferences->General->Editors->Text Editors->Spelling将Enable spell checking取消即可.
问题:导入项目的时候,运行时出现了 Bug – 错误: 找不到或无法加载主类 xxxx
解决:通过 eclipse 上的 Problem 描述 ,找到对应项目的 errors 描述发现错误描述为

Description Resource Path Location TypeArchive for required library: ‘C:\Users\xxx.m2\repository\commons-lang\commons-lang\2.6’ cannot be read or load in project xxxx

解决
在经过eclipse的alt+F5强制更新无效后,根据提示找到maven仓库报错的目录,回到目录找到地址 C:\Users\xxx.m2\repository\commons-lang\commons-lang\2.6 并删除 commons-lang 将该目录下的所有文件删除,重新更新项目,会自动重新下载对应的 maven 文件
(如果你显示的不是这个文件,就删除你显示的那个文件然后再更新项目)
问题:org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security .AccessControlException: Permission denied: user=Administrator, access=WRITE, inode=“hadoop”: hadoop:supergroup:rwxr-xr-x
其实这个错误的原因很容易看出来,用户Administator在hadoop上执行写操作时被权限系统拒绝.

解决

1、在hdfs的配置文件中,将dfs.permissions修改为False

2、执行这样的操作 hadoop fs -chmod 777 /user/hadoop
(指定的处理的数据所在的位置要根据自身情况修改,不能直接抄上面的代码)
问题:hadoopt 在cmd的时候显示java_home路径没有设置正确
解决:可能是安装jdk的时候路径实在prom file 下 出现了空间
可以改成PROGRA~1
在这里插入图片描述

  • 14
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是搭建MapReduce环境的步骤: 1. 安装Hadoop:首先,您需要安装Hadoop。您可以从Hadoop官方网站下载适合您操作系统的二进制文件,并按照官方文档中的说明进行安装。 2. 配置Hadoop:安装完成后,您需要进行一些配置。主要的配置文件是`core-site.xml`、`hdfs-site.xml`和`mapred-site.xml`。您可以根据您的需求进行相应的配置,例如设置Hadoop的工作目录、数据存储目录、日志目录等。 3. 启动Hadoop集群:在配置完成后,您可以使用以下命令启动Hadoop集群: ```shell start-dfs.sh # 启动HDFS start-yarn.sh # 启动YARN ``` 4. 准备输入数据:在运行MapReduce作业之前,您需要准备输入数据。您可以将数据上传到HDFS中的某个目录中,例如: ```shell hdfs dfs -mkdir -p /input # 创建输入目录 hdfs dfs -put <本地文件路径> /input # 将本地文件上传到输入目录 ``` 5. 编写MapReduce程序:接下来,您需要编写MapReduce程序。您可以使用Java、Python等编程语言来编写程序。在程序中,您需要定义Mapper和Reducer函数,并实现相应的逻辑。 6. 打包和上传程序:完成程序编写后,您需要将程序打包成JAR文件,并上传到Hadoop集群中。您可以使用以下命令将JAR文件上传到HDFS中的某个目录: ```shell hdfs dfs -mkdir -p /mapreduce # 创建程序目录 hdfs dfs -put <本地JAR文件路径> /mapreduce # 将JAR文件上传到程序目录 ``` 7. 运行MapReduce作业:最后,您可以使用以下命令来运行MapReduce作业: ```shell yarn jar /mapreduce/<JAR文件名>.jar <主类名> <输入目录> <输出目录> ``` 以上是搭建MapReduce环境的基本步骤。根据您的需求和具体情况,可能还需要进行其他配置和操作。请参考Hadoop官方文档以获取更详细的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值