Hadoop第6周练习—在Eclipse中安装Hadoop插件及测试(Linux操作系统)
1 运行环境说明
1.1 硬软件环境
1.2 机器网络环境
2 :安装Eclipse并测试
2.1 内容
2.2 实现过程
2.2.1
2.2.2
2.2.3
2.2.4
2.2.5
2.2.6
2.2.7
2.2.8
2.2.9
2.2.10编写代码
2.2.11设置运行参数
2.2.12运行并查看结果
3 :传递参数问题
3.1 内容
3.2 程序代码
3.2.1
3.3 实现过程
3.3.1 编写代码
3.3.2 准备数据
3.3.3 配置运行参数
3.3.4 运行作业
4 :Setup函数的作用
4.1 内容
运行环境说明
1.1 硬软件环境
线程,主频2.2G,6G内存
l 虚拟软件:VMware® Workstation 9.0.0 build-812388
l 虚拟机操作系统:CentOS 64位,单核,1G内存
l JDK:1.7.0_55 64 bit
l Hadoop:1.1.2
1.2 机器网络环境
个namenode、2个datanode,其中节点之间可以相互ping通。节点IP地址和主机名分布如下:
| 
 序号  | 
 IP地址  | 
 机器名  | 
 类型  | 
 用户名  | 
 运行进程  | 
| 
 10.88.147.221  | 
 hadoop1  | 
 名称节点  | 
 hadoop  | 
 NN、SNN、JobTracer  | 
|
| 
 10.88.147.222  | 
 hadoop2  | 
 数据节点  | 
 hadoop  | 
 DN、TaskTracer  | 
|
| 
 10.88.147.223  | 
 hadoop3  | 
 数据节点  | 
 hadoop  | 
 DN、TaskTracer  | 
所有节点均是CentOS6.5 64bit系统,防火墙均禁用,所有节点上均创建了一个hadoop用户,用户主目录是/usr/hadoop。所有节点上均创建了一个目录/usr/local/hadoop,并且拥有者是hadoop用户。
书面作业1:安装Eclipse并测试
内容
在linux或win下安装eclipse,并且连接到Hadoop集群(关键步骤是编译插件),运行上周课里的求最高温度的map-reduce程序作为测试,抓图整个过程
2.2 实现过程
2.2.1下载Eclipse
可以以多种方式下载Eclipse,下面介绍直接从eplise官网下载和从中国镜像站点下载,下载把eclipse上传到Hadoop环境中。
第一种方式从elipse官网下载:
http://www.eclipse.org/downloads/?osType=linux
我们运行的环境为CentOS 64位系统,需要选择eclipse类型为linux,然后点击linux 64bit链接下载

会根据用户所在地,推荐最佳的下载地址

在该页面的下部分也可以根据自己的情况选择合适的镜像站点进行下载

第二种方式从镜像站点直接下载elipse:
http://mirror.bit.edu.cn/eclipse/technology/epp/downloads/release/luna/R/
在镜像站点选择 eclipse-jee-luna-R-linux-gtk-x86_64.tar.gz进行下载
(http://mirror.bit.edu.cn/eclipse/technology/epp/downloads/release/luna/R/eclipse-jee-luna-R-linux-gtk-x86_64.tar.gz)

2.2.2解压elipse
在/home/hadoop/Downloads/目录中,使用如下命令解压elipse并移动到/usr/local目录下:
cd /home/hadoop/Downloads
tar -zxvf eclipse-jee-luna-SR1-linux-gtk-x86_64.tar.gz
sudo mv eclipse /usr/local/
cd /usr/local
ls


2.2.3启动eclipse
登录到虚拟机桌面,进入/usr/local/eclipse目录,通过如下命令启动eclipse:
cd /usr/local/eclipse
./eclipse


为了方便操作,可以在虚拟机的桌面上建立elipse的快捷操作

2.2.4加载eclipse插件
将hadoop-eclipse-plugin-1.1.2.jar拷贝到 eclipse的plugins目录:
cd /home/hadoop/Downloads
mv hadoop-eclipse-plugin-1.1.2.jar /usr/local/eclipse/plugins
cd /usr/local/eclipse/plugins
ll hadoop-eclipse-plugin-1.1.2.jar

启动eclipse,打开窗口 window-->preferences ,配置Hadoop MapReduce的安装路径,在实验环境为/usr/local/hadoop-1.1.2,如下图所示:

2.2.5打开MapReduce视图
点击eclipse菜单Window-->Show View-->Other 窗口,选择 MapReducer Locations,如下图所示:

添加完毕后在视图区域中出现MapReduce视图,同时在视图区域右上方出现蓝色小象的添加按钮,如下图所示

2.2.6启动hadoop
使用如下命令启动Hadoop:
cd /usr/local/hadoop-1.1.2/bin
start-all.sh

2.2.7新建 Hadoop Location
点击蓝色小象新增按钮,提示输入MapReduce和HDFS Master相关信息,其中:
l Lacation Name:为该位置命名,能够识别该;
l MapReduce Master:与$HADOOP_DIRCONF/mapred-site.xml配置保持一致;
l HDFS Master:与$HADOOP_DIRCONF/core-site.xml配置保持一致
l User Name:登录hadoop用户名,可以随意填写

2.2.8使用elipse上传测试数据
配置完毕后,在eclipse的左侧DFS Locations出现CentOS HDFS的目录树,该目录为HDFS文件系统中的目录信息:

为运行求最高温度MapReduce,通过eclipse上传测试数据,可以在DFS Locations相对应目录点击右键,选择Upload file to DFS出现选择文件界面,如下图所示:

可以看到MaxTemperatureData.txt已经成功上传到HDFS文件系统中

2.2.9创建MapReduce项目
安装插件之后,可以在New Project页面建立Map/Reduce Project:

需要注意的是填写完项目名称Rock后,需要指定Hadoop MapReduce运行包的路径,填写完毕后点击完成即可

2.2.10 编写代码
在Rock项目中创建/src/chapter06包,在该包下创建上一周求每年最大温度的代码,分别为MaxTemperature.java、MaxTemperatureMapper.java和MaxTemperatureReducer.java

2.2.11 设置运行参数
打开MaxTemperature.java,点击Run-Run Configurations设置运行参数,需要在Arguments页签填写MaxTemperature运行的输入路径和输出路径参数,需要注意的是输入、输出路径参数路径需要全路径,否则运行会报错:
l 输入:运行数据路径,这里为hdfs://hadoop1:9000/usr/hadoop/in/MaxTemperatureData.txt
l 输出:运行结果路径,这里为hdfs://hadoop1:9000/usr/hadoop/out_ch6_eplipse

2.2.12 运行并查看结果
设置运行参数完毕后,点击运行按钮:

运行成功后,刷新CentOS HDFS中的输出路径out_ch6_eclipse目录,打开part-r-00000文件,可以看到运行结果:

书面作业2:传递参数问题
内容
(选作)请阅读Exercise_1.java,编译并且运行。该程序从Test_1改编而来,其主要差别在于能够让用户在结果文件中的每一行前面添加一个用户自定义的字符串,而这个字符串将由参数传递到程序中。例如,运行 $hadoop jar Exercise_1.jar input_path output_path hadoop 之后,第三个参数“hadoop”将会在结果文件中显示,例如附件“result_1”所显示的。
问题:着重考虑Exercise_1.java里面”需要注意的部分“,改写Test_2程序,得到的结果必须跟附件"resule_2"一致,并且其中hadoop必须由参数传递。
3.2 程序代码
3.2.1Test_2_Adjust.java
注意:红色字体为与Test_2.java不同之处
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
/**
* 有Reducer版本
*/
publicclass Test_2_Adjust extends Configured implements Tool {
/**
* 计数器用于计数各种异常数据
*/
enum Counter {
LINESKIP, // 出错的行
}
/**
* MAP任务
*/
publicstaticclass Map extends Mapper<LongWritable, Text, Text, Text> {
publicvoid map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString(); // 读取源数据
try {
// 数据处理
String[] lineSplit = line.split(" ");
String anum = lineSplit[0];
String bnum = lineSplit[1];
String name = context.getConfiguration().get("name");
context.write(new Text(bnum + "," + name), new Text(anum)); // 输出
} catch (java.lang.ArrayIndexOutOfBoundsException e) {
context.getCounter(Counter.LINESKIP).increment(1); // 出错令计数器+1
return;
}
}
}
/**
* REDUCE任务
*/
publicstaticclass Reduce extends Reducer<Text, Text, Text, Text> {
publicvoid reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
String valueString;
String out = "";
for (Text value : values) {
valueString = value.toString();
out += valueString + "|";
}
String[] keySplit = key.toString().split(",");
context.write(new Text(keySplit[0]), new Text(out + keySplit[1]));
}
}
@Override
publicint run(String[] args) throws Exception {
Configuration conf = getConf();
/** 获取传入的hadoop字符 **/
conf.set("name", args[2]);
Job job = new Job(conf, "Test_2_Adjust"); // 任务名
job.setJarByClass(Test_2_Adjust.class); // 指定Class
FileInputFormat.addInputPath(job, new Path(args[0])); // 输入路径
FileOutputFormat.setOutputPath(job, new Path(args[1])); // 输出路径
job.setMapperClass(Map.class); // 调用上面Map类作为Map任务代码
job.setReducerClass(Reduce.class); // 调用上面Reduce类作为Reduce任务代码
job.setOutputFormatClass(TextOutputFormat.class);
job.setOutputKeyClass(Text.class); // 指定输出的KEY的格式
job.setOutputValueClass(Text.class); // 指定输出的VALUE的格式
job.waitForCompletion(true);
// 输出任务完成情况
System.out.println("任务名称:" + job.getJobName());
System.out.println("任务成功:" + (job.isSuccessful() ? "是" : "否"));
System.out.println("输入行数:" + job.getCounters().findCounter("org.apache.hadoop.mapred.Task$Counter","MAP_INPUT_RECORDS").getValue());
System.out.println("输出行数:" + job.getCounters().findCounter("org.apache.hadoop.mapred.Task$Counter", "MAP_OUTPUT_RECORDS").getValue());
System.out.println("跳过的行:" + job.getCounters().findCounter(Counter.LINESKIP).getValue());
return job.isSuccessful() ? 0 : 1;
}
/**
* 设置系统说明设置MapReduce任务
*/
publicstaticvoid main(String[] args) throws Exception {
// 判断参数个数是否正确
// 如果无参数运行则显示以作程序说明
if (args.length != 3) {
System.err.println("");
System.err.println("Usage: Test_2_Adjust < input path > < output path > < name >");
System.err.println("Example: hadoop jar ~/Test_2_Adjust.jar hdfs://localhost:9000/usr/hadoop/Test_2_Data.txt hdfs://localhost:9000/usr/hadoop/out_ch6_test2_adjust");
System.err.println("Counter:");
System.err.println("\t" + "LINESKIP" + "\t"+ "Lines which are too short");
System.exit(-1);
}
// 记录开始时间
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date start = new Date();
// 运行任务
int res = ToolRunner.run(new Configuration(), new Test_2_Adjust(), args);
// 输出任务耗时
Date end = new Date();
float time = (float) ((end.getTime() - start.getTime()) / 60000.0);
System.out.println("任务开始:" + formatter.format(start));
System.out.println("任务结束:" + formatter.format(end));
System.out.println("任务耗时:" + String.valueOf(time) + " 分钟");
System.exit(res);
}
}
3.3 实现过程
3.3.1编写代码
打开eclipse,在Rock项目src/chapter6包下新建Test_2_Adjust.java:

3.3.2准备数据
、2周2.1.3.1Linux文件传输工具所描述)把提供的测试数据Test_2_Data.txt上传到本地目录/usr/local/hadoop-1.1.2/input中,然后使用eclipse的HDFS插件工具上传该文件到/usr/hadoop/in目录中,如下图所示:

3.3.3配置运行参数
新建一个Java应用运行程序,需要在Arguments页签填写Test_2_Adjust运行的输入路径、输出路径和输入字符三个参数,需要注意的是输入、输出路径参数路径需要全路径,否则运行会报错:
l 输入:运行数据路径,这里为hdfs://hadoop1:9000/usr/hadoop/in/Test_2_Data.txt
l 输出:运行结果路径,这里为hdfs://hadoop1:9000/usr/hadoop/out_ch6_test2_adjust
l 输入字符:为“hadoop”字符

3.3.4运行作业
配置完毕后,执行MapReduce作业,执行成功到eclipse的HDFS插件工具查看结果,下图显示在每行加入了传入参数:

书面作业3:Setup函数的作用
内容
(选作)阅读Exercise_2.java,这是一个与Exercise_1.java有相同效果的程序,自行搜索关于setup函数的资料,回答上述两个程序的不同。
4.2 回答
不同之处是:Exercise2中的name写成了reduce的成员变量,而且该变量在setup方法进行初始化。从第二题代码运行的console可以看出,不管运行多少次map和reduce方法,setup都只运行一次。setup方法是继承于父类,在Mapper类和Reducer类中都有setup,Mapper的setup方法会在map之前运行,Reducer的setup方法会在reduce之前运行。同样的Mapper类和Reducer类还有对应的cleanup方法,在整个过程中也只运行一次。而且Mapper的cleanup方法会在map之后运行,Reducer的cleanup方法会在reduce之后运行。
Hadoop第6周练习—在Eclipse中安装Hadoop插件及测试(Linux操作系统)的更多相关文章
- 总结eclipse中安装maven插件
		
当自己越来越多的接触到开源项目时,发现大多数的开源项目都是用maven来够建的.并且在开发应用时,也越来越意识到maven的确会解决很多问题,如果你要了解maven,可以参考:Maven入门指南(一) ...
 - SVN工具的使用 和在Eclipse中安装GPD插件:(多步审批流,因此选择使用工作流(JBPM)来实现)
		
前言 重点解说SVN工具的还原版本号. 1.提交svn之前.要先更新文件.假设更新之后有版本号冲突的话.就线下解决掉冲突,在把该文件标记为已经解决冲突. 正文 使用SVN还原历史版本号 water ...
 - 在Eclipse中安装spket插件
		
spket是一个开发JavaScript和Ext等的开发工具,它可以 是独立的IDE,也可以作为 Eclipse的插件使用,下面介绍如何在Eclipse中安装spket插件, 1.首先上 官网 htt ...
 - Eclipse中安装MemoryAnalyzer插件及使用
		
Eclipse中安装MemoryAnalyzer插件 一.简介 Eclipse作为JAVA非常好用的一款IDE,其自带的可扩展插件非常有利于JAVA程序员的工作效率提升. MemoryAnalyzer ...
 - eclipse中安装freemarker插件及ftl使用freemarker编辑器
		
http://www.07net01.com/2015/08/895212.html eclipse中安装freemarker插件及ftl使用freemarker编辑器 在线安装的方法是:Help – ...
 - 在eclipse中安装groovy插件
		
在eclipse中安装groovy插件详细步骤: step 1:检查自己的eclipse版本:在help->About Eclipse中查看: step 2:进入 https://github. ...
 - 在eclipse中安装properties插件PropertiesEditor及设置(附图),ASCII码转换成中文
		
在eclipse中安装properties插件PropertiesEditor及设置(附图),ASCII码转换成中文安装成功后ASCII还是不能转换成中文的,原因是设置里面没有把编码设置为utf8的, ...
 - eclipse中安装pydev插件出现duplicate location
		
eclipse中安装pydev插件出现duplicate location,主要是因为之前已经填写了该地址并且已经加载了,具体的解决办法见下链接: http://jingyan.baidu.com/a ...
 - 在Eclipse中安装python插件的方法
		
一个博士给了我一堆代码,原本以为是C++或者java写的,结果是python,我压根没学过呀,不过本着语言都是相通的原则,我硬着头皮开始学习Python,当然先学习安装IDE(以前学习一门新语言,我会 ...
 
随机推荐
- C#程序中注释过多的8条理由
			
程序中中的注释,一般是有益处的,可以知晓程序的一些逻辑说明,或是参数解释.但是有些程序,因为注释太多,反而引起维护上的不方便,删掉了怕以后不能出现问题不好查找原因,不删除留在代码中,对程序的维护人员, ...
 - PHP之負載均衡下的session共用
			
最近忙於開發台灣運動彩券第四版的程式,所以已經很久沒有上來寫東西了,今天隨便寫點東西和大家分享. 首先說一下負載均衡,相信大家都知道負載均衡可以很好地解決網站大流量的問題,負載均衡就是把用戶的請求分發 ...
 - 原创内容搬家到csdn博客啦~
			
以后原创的文章就发布在csdn博客啦: http://blog.csdn.net/aceyan0718 这里就用来当作一个网络笔记本吧,转载些优质的内容
 - mysql 优化配置参数详解
			
在 my.cnf 文件中 各设置参数的含义如下: innodb_data_home_dir 这是InnoDB表的目录共用设置.如果没有在 my.cnf 进行设置,InnoDB 将使用MySQL的 da ...
 - Java线程与Linux内核线程的映射关系[转]
			
Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是 ...
 - THEOS makefile
			
转自https://www.h4ck.org.cn/2013/07/theos-makefile/ theos的makefile写法与其他linux/unix环境下的makefile写法大同小异,但是 ...
 - 在DataTable中执行DataTable.Select("条件")返回DataTable;
			
转:http://blog.csdn.net/hcf_force/article/details/7779062 1.在DataTable中执行DataTable.Select("条件&qu ...
 - 每日英语:A New Way to Learn Chinese
			
Entrepreneur and author ShaoLan Hsueh thinks that English-speakers can start learning to read Chines ...
 - RabbitMQ学习笔记5-简单的RPC调用
			
利用空的queue名字("")让rabbitMQ生成一个唯一的队列名称,同时指定队列是:临时的(auto-delete).私有的(exclusive). 在发送的RPC调用消息里设 ...
 - 使用ueditor小结
			
1. 导入 js: ueditor.config.js ueditor.all.js css/images/plugin: themes lang dialog(可选) third-party(可选) ...