分享

Hadoop1.X,Hadoop2.X源码编译与调试汇总

rsgg03 2014-1-11 00:38:28 发表于 总结型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 6 35578
本帖最后由 pig2 于 2014-5-6 04:28 编辑
   虽然在运行Hadoop的时候可以打印出大量的运行日志,但是很多时候只通过打印这些日志是不能很好地跟踪Hadoop各个模块的运行状况。这时候编译与调试Hadoop源码就得派上场了。这也就是今天本文需要讨论的。

  先说说怎么编译Hadoop源码,本文主要介绍在Linux环境下用Maven来编译Hadoop。在编译Hadoop之前,我们需要准备好编译环境:

1、安装好1.6或以上的JDK;
2、安装Maven,被做好相应的配置;
3、安装ProtocolBuffer 2.5.0,MapReduce和HDFS用google protocol buffer来压缩和交换数据;
4、如果你是第一次编译,则需要保证电脑能够网络连接,主要用于获取所有Maven和Hadoop依赖库;
5、如果你需要查找bug,则需要安装Findbugs;
6、如果要生成文档则需要安装Forrest 0.8;
7、如果编译native code则需要安装Autoto;
上面的前提条件1-4是必须的,5-7是可选的。编译的环境准备好之后,那我们就可以去编译Hadoop源码了。本文以编译Hadoop2.2.0源码为例,进行说明。从官方下载下来的Hadoop源码一般是包含以下几个Maven工程:
  1. hadoop-assemblies
  2. hadoop-client
  3. hadoop-common-project
  4. hadoop-dist
  5. hadoop-hdfs-project
  6. hadoop-mapreduce-project
  7. hadoop-maven-plugins
  8. hadoop-minicluster
  9. hadoop-project
  10. hadoop-project-dist
  11. hadoop-tools
  12. hadoop-yarn-project
复制代码
上面各个功能模块的含义已经超出本文的主题,所以我不打算介绍。将上面的源码放在一个地方,比如,我放在/home/wyp/hadoop文件夹中,下面提供几种Hadoop源码的编译方式及说明
  1. 如果不需要native code、忽略测试用例和文档,可以用下面的命令创建二进制分发版:
  2. [wyp@date52 /home/wyp/hadoop]$ mvn package -Pdist -DskipTests -Dtar
  3. 创建二进制分发版,带native code和文档:
  4. [wyp@date52 /home/wyp/hadoop]$ mvn package -Pdist,native,docs -DskipTests -Dtar
  5. 创建源码分发版
  6. [wyp@date52 /home/wyp/hadoop]$ mvn package -Psrc -DskipTests
  7. 创建二进制带源码分发版,带native code和文档:
  8. [wyp@date52 /home/wyp/hadoop]$ mvn package     \
  9.                                        -Pdist,native,docs,src -DskipTests -Dtar
  10. 创建本地版web页面,放在/tmp/hadoop-site
  11. [wyp@date52 /home/wyp/hadoop]$ mvn clean site; mvn      \
  12.                                   site:stage -DstagingDirectory=/tmp/hadoop-site
复制代码

上面提供了几种Hadoop源码的编译方式(参考文档:http://svn.apache.org/repos/asf/hadoop/common/trunk/BUILDING.txt),大家可以根据自己的需求选择不同的编译方式,但是这里我推荐第一种编译方式。我们可以将编译好的模块覆盖掉${HADOOP_HOME} /share/hadoop目录中对应模块里面的jar文件,然后重启Hadoop集群则新的编译包将生效。

  远程调试Hadoop

  远程调试对应用程序开发十分有用,那如何调试Hadoop源码?这里介绍如何用IDE远程调试Hadoop源码。本文以IntelliJ IDEA作为IDE,以调试Jobhistory WEB UI代码为例进行说明。
  第一步:在启动Hadoop历史服务器进程之前在终端加入以下环境配置:

  1. [wyp@date52 /home/wyp/hadoop]$ export HADOOP_OPTS="-Xdebug        \
  2.                    -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8888"
复制代码
这里对上面的几个参数进行说明:-Xdebug 启用调试特性-Xrunjdwp 启用JDWP实现,包含若干子选项:transport=dt_socket JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。address=8888 JVM在8888端口上监听请求,这个设定为一个不冲突的端口即可。server=y y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。suspend=y y表示启动的JVM会暂停等待,直到调试器连接上才继续执行。suspend=n,则JVM不会暂停等待。

第二步:启动Jobhistory进程
  1. [wyp@date52 /home/wyp/hadoop]$ ${HODOOP_HOME}/sbin/mr-jobhistory-daemon.sh  \ start historyserver
  2. starting historyserver, logging to /home/wyp/Downloads/\
  3.                               hadoop/logs/mapred-wyp-historyserver-master.out
  4. Listening for transport dt_socket at address: 8888
复制代码
上面的Listening for transport dt_socket at address: 8888表明jobhistory已经在端口为8888启动了远程调试。
  第三步:打开IntelliJ IDEA,找到hadoop-2.2.0-src\hadoop-mapreduce-project\hadoop-mapreduce-client\hadoop-mapreduce-client-hs\src\main\java\org\apache\hadoop\mapreduce\v2\hs\webapp\HsController.java类,在里面设置一些断点,然后依次选择菜单 Run->Run…->Edit Configurations…->选择左上角的+号->Remote,这时右边将会出现一个Configuration页面进行远程调试配置,请在Host和Port文本框里面输入jobhistory服务所在主机的IP及刚刚的8888端口,然后选择OK。这时候IDE进入了远程调试模式,你可以和普通的调试一样调试Hadoop源码。调试其他的Hadoop源码道理和上面的一样,这里就不一一列举了。



欢迎大家如about云官方群371358502,更新咨询,更新资源,随时关注

已有(6)人评论

跳转到指定楼层
howtodown 发表于 2014-1-16 17:45:06
本帖最后由 howtodown 于 2014-1-16 17:46 编辑

Hadoop2.2.0版本比Hadoop0.x或Hadoop1.x结构变化很大,而且也没有Eclipse-Hadoop插件支持.

本文就Eclipse如何整合Hadoop2.2.0与自己实际操作步骤方法分享给大家,希望对大家有所帮助.

JPDA 简介

Sun Microsystem 的 Java Platform Debugger Architecture (JPDA) 技术是一个多层架构,使您能够在各种环境中轻松调试 Java 应用程序。JPDA 由两个接口(分别是 JVM Tool Interface 和 JDI)、一个协议(Java Debug Wire Protocol)和两个用于合并它们的软件组件(后端和前端)组成。它的设计目的是让调试人员在任何环境中都可以进行调试。

JDWP 设置

JVM本身就支持远程调试,Eclipse也支持JDWP,只需要在各模块的JVM启动时加载以下参数:

-Xdebug -Xrunjdwp:transport=dt_socket, address=1221,server=y,suspend=y

各参数的含义:

-Xdebug
启用调试特性
-Xrunjdwp
启用JDWP实现,包含若干子选项:
transport=dt_socket
JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。
address=8000
JVM在8000端口上监听请求,这个设定为一个不冲突的端口即可。
server=y
y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。
suspend=y
y表示启动的JVM会暂停等待,直到调试器连接上才继续执行。suspend=n,则JVM不会暂停等待。

配置mapreduce远程调试

  1. <property>
  2. <name>mapred.child.java.opts</name>
  3. <value>-Xmx800m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=1221</value>
  4. </property>
  5. <!– 在一个TT,只能启动一个MT或一个RT,否则启动时会有端口冲突 –>
  6. <property>
  7. <name>mapred.tasktracker.map.tasks.maximum</name>
  8. <value>1</value>
  9. </property>
  10. <property>
  11. <name>mapred.tasktracker.reduce.tasks.maximum</name>
  12. <value>0</value>
  13. </property>
复制代码

配置yarn远程调试

  1. export YARN_RESOURCEMANAGER_OPTS=”$YARN_RESOURCEMANAGER_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1222″
  2. export YARN_NODEMANAGER_OPTS=”$YARN_RESOURCEMANAGER_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1223″
复制代码
回复

使用道具 举报

pig2 发表于 2014-1-16 17:26:41
本帖最后由 pig2 于 2014-1-16 17:42 编辑

在Eclipse中远程调试Hadoop
插件
话说Hadoop 1.0.2/src/contrib/eclipse-plugin只有插件的源代码,这里给出一个我打包好的对应的Eclipse插件:
下载地址
下载后扔到eclipse/dropins目录下即可,当然eclipse/plugins也是可以的,前者更为轻便,推荐;重启Eclipse,即可在透视图(Perspective)中看到Map/Reduce。
配置
点击蓝色的小象图标,新建一个Hadoop连接:
注意,一定要填写正确,修改了某些端口,以及默认运行的用户名等
具体的设置,可见
正常情况下,可以在项目区域可以看到
这样可以正常的进行HDFS分布式文件系统的管理:上传,删除等操作。
为下面测试做准备,需要先建了一个目录 user/root/input2,然后上传两个txt文件到此目录:
intput1.txt 对应内容:Hello Hadoop Goodbye Hadoop
intput2.txt 对应内容:Hello World Bye World
HDFS的准备工作好了,下面可以开始测试了。
Hadoop工程
新建一个Map/Reduce Project工程,设定好本地的hadoop目录
新建一个测试类WordCountTest:

  1. package com.hadoop.learn.test;
  2. import java.io.IOException;
  3. import java.util.StringTokenizer;
  4. import org.apache.hadoop.conf.Configuration;
  5. import org.apache.hadoop.fs.Path;
  6. import org.apache.hadoop.io.IntWritable;
  7. import org.apache.hadoop.io.Text;
  8. import org.apache.hadoop.mapreduce.Job;
  9. import org.apache.hadoop.mapreduce.Mapper;
  10. import org.apache.hadoop.mapreduce.Reducer;
  11. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  12. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  13. import org.apache.hadoop.util.GenericOptionsParser;
  14. import org.apache.log4j.Logger;
  15. /**
  16. * 运行测试程序
  17. *
  18. * @author yongboy
  19. * @date 2012-04-16
  20. */
  21. public class WordCountTest {
  22.         private static final Logger log = Logger.getLogger(WordCountTest.class);
  23.         public static class TokenizerMapper extends
  24.                         Mapper<Object, Text, Text, IntWritable> {
  25.                 private final static IntWritable one = new IntWritable(1);
  26.                 private Text word = new Text();
  27.                 public void map(Object key, Text value, Context context)
  28.                                 throws IOException, InterruptedException {
  29.                         log.info("Map key : " + key);
  30.                         log.info("Map value : " + value);
  31.                         StringTokenizer itr = new StringTokenizer(value.toString());
  32.                         while (itr.hasMoreTokens()) {
  33.                                 String wordStr = itr.nextToken();
  34.                                 word.set(wordStr);
  35.                                 log.info("Map word : " + wordStr);
  36.                                 context.write(word, one);
  37.                         }
  38.                 }
  39.         }
  40.         public static class IntSumReducer extends
  41.                         Reducer<Text, IntWritable, Text, IntWritable> {
  42.                 private IntWritable result = new IntWritable();
  43.                 public void reduce(Text key, Iterable<IntWritable> values,
  44.                                 Context context) throws IOException, InterruptedException {
  45.                         log.info("Reduce key : " + key);
  46.                         log.info("Reduce value : " + values);
  47.                         int sum = 0;
  48.                         for (IntWritable val : values) {
  49.                                 sum += val.get();
  50.                         }
  51.                         result.set(sum);
  52.                         log.info("Reduce sum : " + sum);
  53.                         context.write(key, result);
  54.                 }
  55.         }
  56.         public static void main(String[] args) throws Exception {
  57.                 Configuration conf = new Configuration();
  58.                 String[] otherArgs = new GenericOptionsParser(conf, args)
  59.                                 .getRemainingArgs();
  60.                 if (otherArgs.length != 2) {
  61.                         System.err.println("Usage: WordCountTest <in> <out>");
  62.                         System.exit(2);
  63.                 }
  64.                 Job job = new Job(conf, "word count");
  65.                 job.setJarByClass(WordCountTest.class);
  66.                 job.setMapperClass(TokenizerMapper.class);
  67.                 job.setCombinerClass(IntSumReducer.class);
  68.                 job.setReducerClass(IntSumReducer.class);
  69.                 job.setOutputKeyClass(Text.class);
  70.                 job.setOutputValueClass(IntWritable.class);
  71.                 FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
  72.                 FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
  73.                 System.exit(job.waitForCompletion(true) ? 0 : 1);
  74.         }
  75. }
复制代码
右键,选择“Run Configurations”,弹出窗口,点击“Arguments”选项卡,在“Program argumetns”处预先输入参数:

  1. hdfs://master:9000/user/root/input2 dfs://master:9000/user/root/output2
复制代码
备注:参数为了在本地调试使用,而非真实环境。然后,点击“Apply”,然后“Close”。现在可以右键,选择“Run on Hadoop”,运行。但此时会出现类似异常信息:
  1. 12/04/24 15:32:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
  2. 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
  3. Exception in thread "main" java.io.IOException: Failed to set permissions of path: \tmp\hadoop-Administrator\mapred\staging\Administrator-519341271\.staging to 0700
  4.     at org.apache.hadoop.fs.FileUtil.checkReturnValue(FileUtil.java:682)
  5.     at org.apache.hadoop.fs.FileUtil.setPermission(FileUtil.java:655)
  6.     at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:509)
  7.     at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:344)
  8.     at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:189)
  9.     at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:116)
  10.     at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:856)
  11.     at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:850)
  12.     at java.security.AccessController.doPrivileged(Native Method)
  13.     at javax.security.auth.Subject.doAs(Subject.java:396)
  14.     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1093)
  15.     at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:850)
  16.     at org.apache.hadoop.mapreduce.Job.submit(Job.java:500)
  17.     at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:530)
  18.     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下,可以不用检查):
  1. ......
  2.   private static void checkReturnValue(boolean rv, File p,
  3.                                        FsPermission permission
  4.                                        ) throws IOException {
  5.     /**
  6.         if (!rv) {
  7.       throw new IOException("Failed to set permissions of path: " + p +
  8.                             " to " +
  9.                             String.format("%04o", permission.toShort()));
  10.     }
  11.         **/
  12.   }
  13. ......
复制代码
重新编译打包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目录: 4.png 点击“ part-r-00000”文件,可以看到排序结果:
  1. Bye    1
  2. Goodbye    1
  3. Hadoop    2
  4. Hello    2
  5. World    2
复制代码
嗯,一样可以正常Debug调试该程序,设置断点(右键 –> Debug As – > Java Application),即可(每次运行之前,都需要收到删除输出目录)。另外,该插件会在eclipse对应的workspace\.metadata\.plugins\org.apache.hadoop.eclipse下,自动生成jar文件,以及其他文件,包括Haoop的一些具体配置等。嗯,更多细节,慢慢体验吧。遇到的异常
  1. 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.
  2. The ratio of reported blocks 0.5000 has not reached the threshold 0.9990. Safe mode will be turned off automatically.
  3.     at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirsInternal(FSNamesystem.java:2055)
  4.     at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.mkdirs(FSNamesystem.java:2029)
  5.     at org.apache.hadoop.hdfs.server.namenode.NameNode.mkdirs(NameNode.java:817)
  6.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  7.     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  8.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  9.     at java.lang.reflect.Method.invoke(Method.java:597)
  10.     at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:563)
  11.     at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1388)
  12.     at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1384)
  13.     at java.security.AccessController.doPrivileged(Native Method)
  14.     at javax.security.auth.Subject.doAs(Subject.java:396)
  15.     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1093)
  16.     at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1382)
复制代码
在主节点处,关闭掉安全模式:
  1. #bin/hadoop dfsadmin –safemode leave
复制代码
如何打包将创建的Map/Reduce项目打包成jar包,很简单的事情,无需多言。保证jar文件的META-INF/MANIFEST.MF文件中存在Main-Class映射:
  1. Main-Class: com.hadoop.learn.test.TestDriver
复制代码
若使用到第三方jar包,那么在MANIFEST.MF中增加Class-Path好了。另外可使用插件提供的MapReduce Driver向导,可以帮忙我们在Hadoop中运行,直接指定别名,尤其是包含多个Map/Reduce作业时,很有用。一个MapReduce Driver只要包含一个main函数,指定别名:
  1. package com.hadoop.learn.test;
  2. import org.apache.hadoop.util.ProgramDriver;
  3. /**
  4. *
  5. * @author yongboy
  6. * @time 2012-4-24
  7. * @version 1.0
  8. */
  9. public class TestDriver {
  10.         public static void main(String[] args) {
  11.                 int exitCode = -1;
  12.                 ProgramDriver pgd = new ProgramDriver();
  13.                 try {
  14.                         pgd.addClass("testcount", WordCountTest.class,
  15.                                         "A test map/reduce program that counts the words in the input files.");
  16.                         pgd.driver(args);
  17.                         exitCode = 0;
  18.                 } catch (Throwable e) {
  19.                         e.printStackTrace();
  20.                 }
  21.                 System.exit(exitCode);
  22.         }
  23. }
复制代码
这里有一个小技巧,MapReduce Driver类上面,右键运行,Run on Hadoop,会在Eclipse的workspace\.metadata\.plugins\org.apache.hadoop.eclipse目录下自动生成jar包,上传到HDFS,或者远程hadoop根目录下,运行它:
  1. # bin/hadoop jar LearnHadoop_TestDriver.java-460881982912511899.jar testcount input2 output3
复制代码
到此完毕


回复

使用道具 举报

howtodown 发表于 2014-1-16 17:35:47
本帖最后由 howtodown 于 2014-1-16 17:39 编辑

在eclipse下远程调试hadoop2.0


Hadoop是一个分布式系统基础架构,由apache基金会维护并更新。官网地址: http://hadoop.apache.org/

Hadoop项目主要包括以下4个模块:

  • Hadoop Common: 为其他Hadoop模块提供基础设施。
  • Hadoop HDFS: 一个高高靠、高吞吐量的分布式文件系统。
  • Hadoop MapReduce: 一个分布式的计算框架,包括任务调度和集群资源管理。
  • Hadoop YARN: 一个新的MapReduce框架。有兴趣的同学请参考: http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/

由于项目的需要,我只需要用到Hadoop中的前两个子模块,即Hadoop Common和Hadoop HDFS。

在编译源码之前,我先介绍一下我的开发环境:

  • Ubuntu 12.04 LTS
  • Eclipse 4.3
  • JDK1.6.0_45
  • Maven 3.0.4
  • SVN1.6.17
  • ProtocolBuffer(貌似Ubuntu自带了,如果没有,请自行下载安装)

最新的Hadoop采用maven作为项目构建工具,所以系统需要安装maven。下面正式开始Hadoop源码的编译之旅。

首先用svn签出Hadoop的最新版本(hadoop 2.*):

svn checkout http://svn.apache.org/repos/asf/hadoop/common/trunk/ hadoop-dev

打开hadoop-dev文件夹,目录结构如下图

5.png

这就是Hadoop的源代码目录,顺便统计了一下源代码行数,1231074(包含注释、空行)。本文主要关心两个子项目,分别是hadoop-common-project、hadoop-hdfs-project。

接下来就需要为导入Eclipse构建Hadoop项目,虽然我们只关心上面提到的两个子项目,但是为了防止后续出现依赖问题,在构建时请在项目根目录下执行命令:

cd ~/hadoop-devmvn install -DskipTestsmvn eclipse:eclipse -DdownloadSources=true -DdownloadJavadocs=true

在执行mvn(即maven)命令时,请保证网络连接正常,因为mvn可能会下载一些Jar包来解决依赖问题。这可能需要花一段时间,完成上面的命令后,导入eclipse的准备工作已经做好了。

在导入之前,我们还有一个工作,就是安装eclipse的maven插件。安装的方法这里不做介绍。

接下来的工作是导入Eclipse中进行编译,打开eclipse,步骤如下:

  • 菜单File->Import...
  • 选择"Existing Projects into workspace"
  • 选择hadoop-dev目录下的 hadoop-common-project 目录作为根目录
  • 选择hadoop-annotations, hadoop-auth, hadoop-auth-examples, hadoop-nfs 和 hadoop-common projects
  • 单击 "Finish"
  • 菜单File->Import...
  • 选择"Existing Projects into workspace"
  • 选择hadoop-dev目录下的hadoop-assemblies目录作为根目录
  • 选择hadoop-assemblies project
  • 单击"Finish"
  • 菜单File->Import...
  • 选择"Existing Projects into workspace"
  • 选择hadoop-dev目录下的hadoop-hdfs-project目录作为根目录
  • 选择hadoop-hdfs project
  • 单击"Finish"

由于我的项目只要用到hadoop的这几个模块,因此只导入了hadoop的部分模块,如果你们想导入其他的模块进行二次开发,可按上面相同的方式导入相应的子项目。

接下来就是利用eclipse编译hadoop,单击Run->Run Configuration...,会打开运行配置对话框,我们可以看到左侧有个Maven Build,双击Maven Build会新建一个配置页,按照下图的方式填写

6.png

注意,Base directory 填写的是hadoop项目的根目录,即 ~/hadoop-dev。单击Run,hadoop项目就开始编译了,这需要花一些时间,注意在这期间请保持网络连接正常。原因同上。

其实上面的过程也可以由命令行来完成,eclipse插件那一步都可以省了,命令行编译方法如下:

cd ~/hadoop-devmvn package -Pdist -DskipTests -Dtar

回到eclipse,编译成功后,eclipse的console窗口会输出BUILD SUCESS信息,这表示hadoop项目已经编译成功。

为了调试hadoop, 接下来的工作就是利用上面编译成功的hadoop构建hadoop环境。

前面编译的结果都保存在各个项目的target目录下,以hadoop-common为例,编译的结果在 ~/hadoop-dev/hadoop-common-project/hadoop-common/target/hadoop-common-3.0.0-SNAPSHOT/ 下。这个目录下面的结构如下图:

7.png

其他的比如hadoop-hdfs、hadoop-mapreduce等也在对应的target目录下,路径与上面的类似,里面的目录结构和上图是一样的。

我们首先在用户目录下建立一个hadoop目录(mkdir ~/hadoop),把上图的所在目录下的所有项拷贝到这个新建的目录下,由于我只用common和hdfs,因此我的拷贝过程只针对这两个子项目。(目前我们有找到很好的方法编译,只能编译好后再从各个子项目中去拷贝,有解决方案的童鞋请一定留言~)

由于上面的过程比较繁琐,我写成了一个脚本,稍后会发布到github上(附上github上脚本的地址:https://github.com/meibenjin/hadoop2.0-configuration),如果你等不及了,就先将就着拷贝一下吧。完成上面的操作以后,~/hadoop下的目录结构和上图一样。

现在,我简单介绍一下新版的hadoop的目录结构, 看着很像linux的目录结构吧。 bin和sbin目录下是一些hadoop命令,ect目录下就是配置文件了。share目录下是hadoop需要用的一些jar包。

hadoop的配置我就不在这里写了(如有必要,我另写一篇博客),具体的配置可上hadoop网站查看官方文档。也可以看这个博客:http://www.cnblogs.com/scotoma/archive/2012/09/18/2689902.html 其中提到的slaves和yarn-site.xml文件在hadoop-yarn-project下。 为了调试hadoop方便,请配置成伪分布模式。

配置成功以后,启动hadoop相关的进程,命令如下:

hadoop namenode -formatstart-dfs.sh

查看进程是否启动成功,输入命令,jps得到下图输出:

8.png

这表示,hadoop相关的进程已经成功启动。

回复

使用道具 举报

donyyang 发表于 2014-10-16 15:14:54
很好,学习一下。
回复

使用道具 举报

SkyGreen 发表于 2017-11-16 16:27:26
howtodown 发表于 2014-1-16 17:35
在eclipse下远程调试hadoop2.0
Hadoop是一个分布式系统基础架构,由apache基金会维护并更新。官网地址: ht ...

你好,
在ubantu64位环境下,编译hadoop源码时,可以仅仅通过Ant吗

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条