通过 搭建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. [Phonegap+Sencha Touch] 移动开发36 Phonegap/Cordova项目的图标和启动画面(splashscreen)配置

    原文地址:http://blog.csdn.net/lovelyelfpop/article/details/40780111 Phonegap/Cordova项目中的config.xml文件.里面配 ...

  2. Fix The thread xxx has exited with code 259 (0×103)

    When run the test case in VS2013, you may encounter below problem After test case end, it will show ...

  3. GCD 的初步认识

    1.什么是 GCD? GCD为Grand Central Dispatch的缩写 (GCD)是Apple开发的一个多核编程的较新的解决方法.它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统 ...

  4. 20151203--filter

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/htm ...

  5. redis 错误。

    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Com ...

  6. [剖析Javascript原理]1.原生数据类型

    一.原生数据类型 JS共有5种原生数据类型: Boolean true或者false String 字符串,在单引号或者双引号之间(不存在字符类型) Number 整数或者浮点数 Null 空 und ...

  7. 关于AJAX+HTML5+ASHX进行全静态页面的数据交互

    及时总结项目中使用到的知识,知识在于积累. 1.HTML代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN ...

  8. 纯css3实现tab选项卡

    <!doctype html> <html> <head> <title>Welcome</title> <meta http-equ ...

  9. Viewing the Raw SQL Statement(xcode で)

    Thanks to Core Data. Even without learning SQL and database, you’re able to perform create, select, ...

  10. js关闭 window.open 打开的页面

    1.关闭 当前页面 window.opener = null; window.open('', '_self', ''); window.close(); 但是在FF中就是不行: 2.项目中情况是通过 ...