`
wuce7758
  • 浏览: 182276 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
  • YTT1121: 有网络拓扑发现的源代码么?能不能发我一份学习一下,现在我正要做 ...
    java拓扑图
  • YTT1121: 大神,有网络拓扑发现的源代码么?或者您会编写么?我需要做科研改 ...
    java拓扑图
  • YTT1121: 大神,有网络拓扑发现的源代码么?或者您会编写么?我需要做科研改 ...
    java拓扑图
  • poettang: 求代码分享学习,谢谢!膜拜大神!258026921@qq.co ...
    java拓扑图
  • oiqio: 87836238@qq.com,感谢楼主,来一份~
    java拓扑图

Hadoop学习笔记之在Eclipse中远程调试Hadoop

 
阅读更多

插件

话说Hadoop 1.0.2/src/contrib/eclipse-plugin只有插件的源代码,这里给出一个我打包好的对应的Eclipse插件:
下载地址

下载后扔到eclipse/dropins目录下即可,当然eclipse/plugins也是可以的,前者更为轻便,推荐;重启Eclipse,即可在透视图(Perspective)中看到Map/Reduce。

配置

点击蓝色的小象图标,新建一个Hadoop连接:

2

注意,一定要填写正确,修改了某些端口,以及默认运行的用户名等

具体的设置,可见

正常情况下,可以在项目区域可以看到

image

这样可以正常的进行HDFS分布式文件系统的管理:上传,删除等操作。

为下面测试做准备,需要先建了一个目录 user/root/input2,然后上传两个txt文件到此目录:

intput1.txt 对应内容:Hello Hadoop Goodbye Hadoop

intput2.txt 对应内容:Hello World Bye World

HDFS的准备工作好了,下面可以开始测试了。

Hadoop工程

新建一个Map/Reduce Project工程,设定好本地的hadoop目录

1

新建一个测试类WordCountTest:

<script src="https://gist.github.com/2477347.js?file=WordCountTest.java"></script>

package com.hadoop.learn.test;
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;
import org.apache.log4j.Logger;
/**
* 运行测试程序
*
* @author yongboy
* @date 2012-04-16
*/
public class WordCountTest {
private static final Logger log = Logger.getLogger(WordCountTest.class);
public static class TokenizerMapper extends
Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
log.info("Map key : " + key);
log.info("Map value : " + value);
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
String wordStr = itr.nextToken();
word.set(wordStr);
log.info("Map word : " + wordStr);
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 {
log.info("Reduce key : " + key);
log.info("Reduce value : " + values);
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
log.info("Reduce sum : " + sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args)
.getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: WordCountTest <in> <out>");
System.exit(2);
}
Job job = new Job(conf, "word count");
job.setJarByClass(WordCountTest.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}

右键,选择“Run Configurations”,弹出窗口,点击“Arguments”选项卡,在“Program argumetns”处预先输入参数:

hdfs://master:9000/user/root/input2 dfs://master:9000/user/root/output2

备注:参数为了在本地调试使用,而非真实环境。

然后,点击“Apply”,然后“Close”。现在可以右键,选择“Run on Hadoop”,运行。

但此时会出现类似异常信息:

12/04/24 15:32:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
12/04/24 15:32:44 ERROR security.UserGroupInformation: PriviledgedActionException as:Administrator cause:java.io.IOException: Failed to set permissions of path: \tmp\hadoop-Administrator\mapred\staging\Administrator-519341271\.staging to 0700
Exception in thread "main" java.io.IOException: Failed to set permissions of path: \tmp\hadoop-Administrator\mapred\staging\Administrator-519341271\.staging to 0700
    at org.apache.hadoop.fs.FileUtil.checkReturnValue(FileUtil.java:682)
    at org.apache.hadoop.fs.FileUtil.setPermission(FileUtil.java:655)
    at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:509)
    at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:344)
    at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:189)
    at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:116)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:856)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:850)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1093)
    at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:850)
    at org.apache.hadoop.mapreduce.Job.submit(Job.java:500)
    at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:530)
    at com.hadoop.learn.test.WordCountTest.main(WordCountTest.java:85)

这个是Windows下文件权限问题,在Linux下可以正常运行,不存在这样的问题。

解决方法是,修改/hadoop-1.0.2/src/core/org/apache/hadoop/fs/FileUtil.java里面的checkReturnValue,注释掉即可(有些粗暴,在Window下,可以不用检查):

<script src="https://gist.github.com/2477544.js?file=FileUtil.java"></script>

......
  private static void checkReturnValue(boolean rv, File p,
                                       FsPermission permission
                                       ) throws IOException {
    /**
if (!rv) {
throw new IOException("Failed to set permissions of path: " + p +
" to " +
String.format("%04o", permission.toShort()));
}
**/
  }
......
view raw FileUtil.java This Gist brought to you by GitHub.

重新编译打包hadoop-core-1.0.2.jar,替换掉hadoop-1.0.2根目录下的hadoop-core-1.0.2.jar即可。

这里提供一份修改版的hadoop-core-1.0.2-modified.jar文件,替换原hadoop-core-1.0.2.jar即可。

替换之后,刷新项目,设置好正确的jar包依赖,现在再运行WordCountTest,即可。

成功之后,在Eclipse下刷新HDFS目录,可以看到生成了ouput2目录:

image

点击“ part-r-00000”文件,可以看到排序结果:

Bye    1
Goodbye    1
Hadoop    2
Hello    2
World    2

嗯,一样可以正常Debug调试该程序,设置断点(右键 –> Debug As – > Java Application),即可(每次运行之前,都需要收到删除输出目录)。

另外,该插件会在eclipse对应的workspace\.metadata\.plugins\org.apache.hadoop.eclipse下,自动生成jar文件,以及其他文件,包括Haoop的一些具体配置等。

嗯,更多细节,慢慢体验吧。

遇到的异常

org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create directory /user/root/output2/_temporary. Name node is in safe mode.
The ratio of reported blocks 0.5000 has not reached the threshold 0.9990. Safe mode will be turned off automatically.
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirsInternal(FSNamesystem.java:2055)
    at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesystem.java:2029)
    at org.apache.hadoop.hdfs.server.namenode.NameNode.mkdirs(NameNode.java:817)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:563)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1388)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1384)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1093)
    at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1382)

在主节点处,关闭掉安全模式:

#bin/hadoop dfsadmin –safemode leave

如何打包

将创建的Map/Reduce项目打包成jar包,很简单的事情,无需多言。保证jar文件的META-INF/MANIFEST.MF文件中存在Main-Class映射:

Main-Class: com.hadoop.learn.test.TestDriver

若使用到第三方jar包,那么在MANIFEST.MF中增加Class-Path好了。

另外可使用插件提供的MapReduce Driver向导,可以帮忙我们在Hadoop中运行,直接指定别名,尤其是包含多个Map/Reduce作业时,很有用。

一个MapReduce Driver只要包含一个main函数,指定别名:

<script src="https://gist.github.com/2498401.js?file=TestDriver.java"></script>

package com.hadoop.learn.test;
import org.apache.hadoop.util.ProgramDriver;
/**
*
* @author yongboy
* @time 2012-4-24
* @version 1.0
*/
public class TestDriver {
public static void main(String[] args) {
int exitCode = -1;
ProgramDriver pgd = new ProgramDriver();
try {
pgd.addClass("testcount", WordCountTest.class,
"A test map/reduce program that counts the words in the input files.");
pgd.driver(args);
exitCode = 0;
} catch (Throwable e) {
e.printStackTrace();
}
System.exit(exitCode);
}
}

这里有一个小技巧,MapReduce Driver类上面,右键运行,Run on Hadoop,会在Eclipse的workspace\.metadata\.plugins\org.apache.hadoop.eclipse目录下自动生成jar包,上传到HDFS,或者远程hadoop根目录下,运行它:

# bin/hadoop jar LearnHadoop_TestDriver.java-460881982912511899.jar testcount input2 output3

OK,本文结束。

分享到:
评论

相关推荐

    hadoop学习笔记.rar

    二、Hadoop学习笔记之五:使用Eclipse插件 Eclipse插件是开发Hadoop应用的重要工具,它提供了集成的开发环境,使得开发者可以更方便地编写、调试和运行Hadoop程序。通过插件,用户可以创建Hadoop项目,编写MapReduce...

    hadoopeclipse学习笔记

    本篇学习笔记主要介绍了如何在Eclipse中配置和编译Hadoop项目。 首先,我们需要创建一个新的Java项目来导入Hadoop的源代码。在Eclipse的Package Explorer视图中,通过右键选择“New” -&gt; “Java Project”。在弹出...

    传智黑马赵星老师hadoop七天课程资料笔记-第三天(全)

    5. **hadoop远程调试.txt** - 文件名暗示了如何远程调试Hadoop程序,这对于开发者在分布式环境中解决问题至关重要,可能涵盖了使用IDE(如Eclipse)的远程调试配置和技巧。 6. **MR执行流程笔记.txt** - MapReduce...

    Hadoop深入浅出分享资料

    资料可能涵盖Zookeeper的选举算法、会话和观察者模式,以及在Hadoop中如何使用Zookeeper来保证服务的高可用性。 最后,"如何把hadoop源码关联到eclipse工程中"是针对开发者的内容,说明如何将Hadoop的源代码导入...

    Hadoop与HBase自学笔记

    Hadoop与HBase学习笔记 本文档记录了Hadoop和HBase的学习过程,包括Hadoop的安装、HBase的安装和在Eclipse下开发HBase的实践过程。这些记录旨在为初学者提供指导和帮助。 1. Hadoop安装 Hadoop的安装需要先安装...

    Hadoop的各种资源文件

    接下来,《Hadoop伪分布模式安装笔记成功版本在windows下的虚拟机但是里面没有windows下的eclipse的配置.pdf》这份文档详细记录了在Windows环境下使用虚拟机(如VMware或VirtualBox)安装Hadoop的步骤,特别是伪...

    Hadoop学习笔记(二)Hadoop 分布式文件系统 HDFS:1.HDFS基础

    maven的安装、路径配置、修改库文件路径和eclipse中的配置,解决Eclipse使用Maven下载慢的问题 1.3、创建一个maven工程HDFS 1.4、 导入相应的依赖坐标加日志添加 junit junit RELEASE org.apache.logging....

    Hadoop学习笔记

    开始学习Hadoop,首先搭建了一下开发环境,最开始是在单独编写Map-Reduce程序,然后在命令行编译,再通过hadoop命令运行打好的jar包,虽然也能够运行,但是总感觉这样用起来很麻烦,所以今晚又尝试了直接通过eclipse...

    scala的操作笔记

    - **Hadoop生态系统中的地位**:随着大数据处理的需求日益增长,Hadoop已成为大数据处理的标准平台之一。而Scala作为Spark的主要开发语言,不仅与Hadoop生态系统完美融合,而且在提供高效数据处理能力的同时还保持了...

    Infosys study

    【Infosys学习笔记】 Infosys是一家全球知名的咨询和技术服务公司,以其在信息技术领域的创新和解决方案而闻名。在本文中,我们将深入探讨Infosys的相关技术及其应用,同时结合“源码”和“工具”这两个标签,将...

    从0开始用Java做智慧物联网.zip

    5. 软件开发工具:Eclipse、IntelliJ IDEA等Java集成开发环境(IDE)提供了强大的物联网开发支持,包括硬件模拟器、物联网插件等,使得开发者可以在没有实际设备的情况下进行代码编写和测试。 "从0开始用Java做智慧...

    Java学习内容

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。..."Java学习笔记"这个压缩包文件应该包含了关于这些主题的详细教程和示例代码,是你学习Java的好资源。

    Note:笔记

    6. **数据分析**: 数据预处理、统计分析、数据可视化、机器学习算法(如线性回归、决策树、神经网络)等主题可能在笔记中出现。这部分内容对于理解和应用数据分析技术至关重要。 7. **开发工具**: 笔记可能还会涉及...

    个人笔记

    【Java编程语言基础】 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle收购)于1995年推出。...在实际开发过程中,还要关注社区动态,了解新技术和框架,以便不断提升自己的技能。

    laptop

    1. Eclipse:一个开源的IDE,支持多种语言,具有丰富的插件和强大的调试功能。 2. IntelliJ IDEA:JetBrains公司的旗舰产品,以其智能代码补全和高效的开发体验而闻名。 3. NetBeans:另一个开源IDE,特别适合初学者...

    IPC1A_2S_201212747

    因此,这个压缩包可能包含Manuel的学习笔记、代码示例、课件、测试文件或其他与Java编程相关的资源。 深入学习Java,我们需要掌握以下几个关键知识点: 1. **基础语法**:包括变量、数据类型、运算符、控制结构...

Global site tag (gtag.js) - Google Analytics