Eclipse:Version: Mars.2 Release (4.5.2)
Hadoop: 2.7.1
Ubuntu:16.04
版本情况:软件资源一、基于Hadoop平台的eclipse开发环境搭建?二、countword案例实现
1.任务要求2.MapReduce程序编写方法 报错解决
软件资源
网盘地址
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软件
一、 安装jdk1.8,配置系统变量JAVA_HOME
安装完jdk后 右击此电脑点击属性 点击高级系统设置
环境变量
在系统变量 新建JAVA_HOME 路径写相对路径或者绝对路径都可
新建CLASSPATH
变量值写入: .;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar;
(注意前面的.不要丢,和后面的;号)
在path变量中新建
新建HADOOP_HOME,修改path
在这里插入图片描述
新建HADOOP_USER_NAME
验证
jak环境安装成功
查看Hadoop是否安装成功
把windows相关依赖文件拷贝到解压好的hadoop文件夹中的bin目录下
下载地址:https://github.com/4ttty/winutils
并把其中的hadoop.dll文件拷贝到C:windowssystem32中
把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
统计指定文件中的词频,并输出到指定目录(该目录不能存在)
在hdfs中的当前用户家目录建input文件夹,现有helloworld.txt文本文件,请把这个文件上传到input目录下,并统计这个文件中单词出现的次数。
程序结构:
代码如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2.MapReduce程序编写方法
(1)创建maven工程
(2)Eclipse导入相关jar包
创建一个文件夹
点击Add JARs 选择我们所要的jar包把jar包导入
(3)在pom.xml文件中添加如下依赖
org.apache.logging.log4j log4j-core 2.8.2 org.apache.hadoop hadoop-common 2.7.1 org.apache.hadoop hadoop-client 2.7.1 org.apache.hadoop hadoop-hdfs 2.7.1 junit junit 4.12 test jdk.tools jdk.tools 1.8 system ${JAVA_HOME}/lib/tools.jar
(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{ @Override protected void map(LongWritable key, Text value, Mapper .Context context) throws IOException, InterruptedException { // 拿到传入进来的一行内容,把数据类型转换为String String valueString = value.toString(); // 将这行内容按照分隔符切割 String wArr[] = valueString.split(" "); // 遍历数组,每出现一个单词就标记一个数组1 例如:<单词,1> for(int i=0;i } } }
(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{ @Override protected void reduce(Text key, Iterable v2s, Reducer .Context context) throws IOException, InterruptedException { Iterator 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)本地测试
在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:Usersxxx.m2repositorycommons-langcommons-lang2.6’ cannot be read or load in project xxxx
解决:
在经过eclipse的alt+F5强制更新无效后,根据提示找到maven仓库报错的目录,回到目录找到地址 C:Usersxxx.m2repositorycommons-langcommons-lang2.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



