通过 搭建Hadoop集群 (二), 我们已经可以顺利运行自带的wordcount程序.

下面学习如何创建自己的Java应用, 放到Hadoop集群上运行, 并且可以通过debug来调试.

有多少种Debug方式

Hadoop在Eclipse上的Debug方式

一般来说, Debug最多的应用场景是调试MR中的代码逻辑, 还有部分是调试main方法中的某些代码逻辑.

无论是Standalone, Pesudo-Distributed, 还是Fully-Distributed Mode, 都可以debug.

特别值得一提的是, 如果仅仅为了验证代码逻辑, 即使没安装hadoop, 也可以在Eclipse中Debug, 姑且称为免安装Debug.

几种Debug方式的比较:

  • 免安装Debug(推荐)

最简单的Debug方式, 可以随意选择需要的hadoop版本.

优势: 完全独立于你的hadoop安装环境, 无需对现在的hadoop安装环境做任何更改.

在Windows主机上, 可以Remote Debug, 但Windows无法正确运行HDFS相关的代码, 会导致debug失败.

  • Standalone

几乎和免安装debug方式一模一样. 也是使用本地文件系统, 所有的进程都在本地JVM中. Eclipse可以直接Remote Debug.

不同之处:

1. Standalone使用安装路径下的hadoop jar包, 而免安装模式是从外部下载导入需要的hadoop jar包.

2. Standalone需要修改hadoop启动脚本.

  • Pesudo-Distributed

和Standalone一样, 此时所有的daemon也都运行在一个JVM中.

不同之处:

1. 使用hdfs而非本地文件系统

2. 必须修改hadoop启动脚本才能debug进main函数. 如果要debug MR, 必须在mapred-site.xml中添加 "mapred.child.java.opts" property.

  • Fully-Distributed

这种模式下要debug是比较棘手的.

Debug到main函数没有问题, 但是要进入MR代码就比较吃力. 因为Job会被分到NameNode的JVM上运行, 所以Remote Debug需要知道/猜测哪个NameNode会运行task. 操作难度很大, 除非很必要, 不然不建议在这种模式下debug.

  • Hadoop-Eclipse-Plugin

原理还是一样的, 只是把修改伪分布式配置的步骤, 改成配置插件来解决, 避免了对安装环境的修改.

根据你的安装设置, 把插件配好:

Map/Reduce Master Host: localhost , Post: 9001
DFS Master Host: localhost, Post: 9000
User name: hm
对号入座, 参考core-site.xml等文件填写dfs.data.dir, dfs.name.dir, dfs.tmp.dir 等等.
mapred.child.java.opts也一定要设置好.

下载地址: https://github.com/winghc/hadoop2x-eclipse-plugin

图文攻略: http://www.powerxing.com/hadoop-build-project-using-eclipse/

下面分别讲讲各中debug方式下如何具体操作.

为了方便调用现有的hadoop jar包, 我选择在安装有hadoop的虚拟机上安装Eclipse并debug.

搭建Linux开发环境

安装Eclipse 4.4

下载Eclipse Luna安装包, 解压到/opt目录

[hm@master ~]$ sudo tar -zxvf eclipse-jee-luna-SR2-linux-gtk-x86_64.tar.gz -C /opt

建立符号链接, 方便命令行启动

[hm@master ~]$ sudo ln -s /opt/eclipse/eclipse /usr/bin/eclipse

添加快捷方式到Applications

vi /usr/share/applications/eclipse.desktop

[Desktop Entry]
Encoding
=UTF-8
Name=Eclipse 4.4.1
Comment=Eclipse Luna
Exec=/usr/bin/eclipse
Icon=/opt/eclipse/icon.xpm
Categories=Application;Development;Java;IDE
Version=1.0
Type=Application
Terminal=0

也可以通过桌面右键create launcher来创建.

此时快捷栏里可以看到:

在Terminal中输入eclipse或者通过上面的快捷方式启动Eclipse.

如果下载安装非JEE版本, 则通过Marketplaces自行安装配置Egit, Maven等等必要插件.

获取MapReduce Example代码

可以通过多种途径获得Hadoop MapReduce Examples的source code

1. 直接在hadoop安装目录下找: ~/hadoop/share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-2.6.2-sources.jar

2. SVN http://svn.apache.org/viewvc/hadoop/common/trunk/hadoop-mapreduce-project/hadoop-mapreduce-examples/src/

免安装Debug

这个是重点, 大部分时候我们只需要这种debug就好. 这里以自带的wordcount为例:

新建Java Project.

从Example拷贝WordCount.java的内容, 放到自己的Java Project中以便debug.

创建input文件夹, 随意放入一些文本文件.

在debug选项中设置input output

对于Hadoop 1, Project上右键property->java build path->libraries->add external jars, 添加:

如果是hadoop 2.x版本, 则添加:

区别在于2.x版本不再用hadoop-core这个jar包, 分拆成hadoop-common和hadoop-mapreduce-client-core等等jar包.

可以在Map和Reduce函数中设置断点, 点击debug即可进入断点调试.

Standalone Mode Debug

和免安装模式一样. 在Eclipse Debug Configuration中, 选择"Remote Java Application", 而非"Java Application"进行debug.

此外需要修改安装目录下bin/hadoop文件, 添加: (端口自己随意设置, 不冲突即可)

HADOOP_OPTS="$HADOOP_OPTS -agentlib:jdwp=transport=dt_socket,address=8883,server=y,suspend=y"

在本地设置好input(e.g. 安装目路下新建input文件夹, 放入几个txt文件), 运行命令:

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.2.jar wordcount input/wordcount output

在Eclipse上启动remote debug (端口和bin/hadoop中设置一致, 如果不是在虚拟机本机debug, 把localhost替换成ip或者hostname即可):

此时即可debug到main和MR代码.

Pesudo-Distributed Mode Debug

首先格式化NameNode.

如果要debug main函数, 和Standalone一样修改bin/hadoop, 运行即可.

如果要debug MapReduce代码, 必须修改mapred-site.xml, 添加:

<property>
<name>mapred.child.java.opts</name>
<value>-agentlib:jdwp=transport=dt_socket,address=8887,server=y,suspend=y</value>
</property>

新建一个Remote Debug configuration, 把端口设置为8887.

然后启动sbin/start-dfs.sh, 可以看到log中提示8887端口已被监听.

再启动sbin/start-yarn.sh. 运行命令:

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.2.jar wordcount input/wordcount output

依次启动两个Remote Debug, 即可对相应代码进行调试.

一点小技巧

如果觉得经常修改hadoop启动命令不方便, 可以考虑在最后加一个自定义参数, 比如取名叫"debug":

debug=${!#}
#eval "debug=\$$#" #这样写也可以
if [ "$debug" = "debug" ]; then
HADOOP_OPTS="$HADOOP_OPTS -agentlib:jdwp=transport=dt_socket,address=8887,server=y,suspend=y"
fi

这样只有启动命令输成

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6..jar wordcount input/wordcount output debug

才会进入debug模式. 否则正常启动.

但是, 对于像wordcount这样的程序, 会自动把最后一个参数当场output, 其他参数全部当作input. 这样就没法正常运行了.

这时需要去修改main函数的逻辑, 或者可以复制一个hadoop启动文件, 命名为hadoop-debug, 要运行debug, 就从这里启动.

搭建Hadoop集群 (三)的更多相关文章

  1. 搭建Hadoop集群 (二)

    前面的步骤请看  搭建Hadoop集群 (一) 安装Hadoop 解压安装 登录master, 下载解压hadoop 2.6.2压缩包到/home/hm/文件夹. (也可以从主机拖拽或者psftp压缩 ...

  2. Hadoop集群(三) Hbase搭建

    前面已经完成Zookeeper和HDFS的安装,本文会详细介绍Hbase的安装步骤.以及安装过程中遇到问题的汇总. 系列文章:   Hadoop集群(一) Zookeeper搭建 Hadoop集群(二 ...

  3. virtualbox 虚拟3台虚拟机搭建hadoop集群

    用了这么久的hadoop,只会使用streaming接口跑任务,各种调优还不熟练,自定义inputformat , outputformat, partitioner 还不会写,于是干脆从头开始,自己 ...

  4. Linux下搭建Hadoop集群

    本文地址: 1.前言 本文描述的是如何使用3台Hadoop节点搭建一个集群.本文中,使用的是三个Ubuntu虚拟机,并没有使用三台物理机.在使用物理机搭建Hadoop集群的时候,也可以参考本文.首先这 ...

  5. 虚拟机搭建Hadoop集群

    安装包准备 操作系统:ubuntu-16.04.3-desktop-amd64.iso 软件包:VirtualBox 安装包:hadoop-3.0.0.tar.gz,jdk-8u161-linux-x ...

  6. 使用Docker搭建Hadoop集群(伪分布式与完全分布式)

    之前用虚拟机搭建Hadoop集群(包括伪分布式和完全分布式:Hadoop之伪分布式安装),但是这样太消耗资源了,自学了Docker也来操练一把,用Docker来构建Hadoop集群,这里搭建的Hado ...

  7. 使用Windows Azure的VM安装和配置CDH搭建Hadoop集群

    本文主要内容是使用Windows Azure的VIRTUAL MACHINES和NETWORKS服务安装CDH (Cloudera Distribution Including Apache Hado ...

  8. 搭建Hadoop集群 (一)

    上面讲了如何搭建Hadoop的Standalone和Pseudo-Distributed Mode(搭建单节点Hadoop应用环境), 现在我们来搭建一个Fully-Distributed Mode的 ...

  9. Hadoop入门进阶步步高(五)-搭建Hadoop集群

    五.搭建Hadoop集群 上面的步骤,确认了单机能够运行Hadoop的伪分布运行,真正的分布式运行无非也就是多几台slave机器而已,配置方面的有一点点差别,配置起来就很easy了. 1.准备三台se ...

随机推荐

  1. awk 的使用

    awk [-F field-separator] 'commands' input-file(s) 其中,commands 是真正awk命令,[-F域分隔符]是可选的.input-file(s) 是待 ...

  2. AngularJS基础概念

    作用域.控制器.指令 作用域 应用的作用域是和应用的数据模型相关联的,同时作用域也是表达式执行的上下文.$scope对象是定义应用业务逻辑.控制器方法和视图属性的地方. 作用域是应用状态的基础.基于动 ...

  3. 【HDU】2147 kiki&#39;s game

    http://acm.hdu.edu.cn/showproblem.php?pid=2147 题意:n×m的棋盘,每次可以向左走.向下走.向左下走,初始在(1, m),n,m<=2000,问先手 ...

  4. Linux性能监控的几个工具(转)

    转载于:http://blog.csdn.net/tianlesoftware/article/details/6198780 Linux系能监控主要涉及系统4个方面资源的监控: CPU Memory ...

  5. 跟我学android-Activity介绍

    Activity是android四大组件之一,activity 可以看成是一个屏幕,用户可以在这里做一些操作.activity通常都是满屏的,但也可以小于屏幕而浮于其它窗口之上,比如把activity ...

  6. Java多线程:线程同步与关键字synchronized

    一.同步的特性1. 不必同步类中所有的方法, 类可以同时拥有同步和非同步方法.2. 如果线程拥有同步和非同步方法, 则非同步方法可以被多个线程自由访问而不受锁的限制. 参见实验1:http://blo ...

  7. Java经典编程题50道之七

    输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. public class Example07 {    public static void main(String[] args) ...

  8. css浮动(float)及清除浮动的几种实用方法

    CSS浮动是现在网页布局中使用最频繁的效果之一,而浮动可以帮我们解决很多问题,那么就让我们一起来看一看如何使用浮动. 一.css浮动(float) (1)html文档流 自窗体自上而下分成一行一行,并 ...

  9. dba工作内容

    一.数据库管理员的工作内容 关键词:dba工作内容 转自:http://blog.sina.com.cn/s/blog_44e0d0490102won1.html 1.规划与建设: 1.数据库服务器环 ...

  10. java 获取当前日期和特殊日期格式转换

     1.获取当前日期: package com.infomorrow.dao; import java.sql.Timestamp; import java.util.Calendar; import ...