我想使用eclipse调试Map reduce作业(pig,hive)。也就是说,在hadoop源java文件中设置断点,并在运行map reduce作业时检查元素。为此,我使用eclipse启动了所有服务,并且可以调试一些类文件。但是我不能创建一个完整的调试环境。有人能告诉我怎么做吗?
我不知道有什么eclipse工具可以满足您的需求。如果您正在寻找一个可能的解决方案,以下将在java中工作。
import java.util.logging.Logger;
为了调试java映射reduce文件,您可以为每个类(驱动程序、映射程序、reducer)使用java记录器。
Logger log = Logger.getLogger(MyClass.class.getName());
要检查元素/变量,只需使用:
log.info( "varOne: " + varOne );
这些日志行将打印在您作业的管理页面中。
这里要记住的基本事项是,调试Hadoop MR作业将类似于Eclipse中任何远程调试的应用程序。
正如您所知,Hadoop可以在本地环境中以3种不同的模式运行:
- 本地模式
- 伪分布式模式
- 完全分布式模式(群集)
通常,您将在伪分布式模式下运行本地hadoop设置,以利用HDFS和Map Reduce(MR)。但是,您无法在此模式下调试MR程序,因为每个Map/Reduce任务都将在单独的JVM进程中运行,因此您需要切换回本地模式,在本地模式下,您可以在单个JVM进程中执行MR程序。
以下是在本地环境中调试它的快速而简单的步骤:
-
在本地模式下运行hadoop进行调试,以便映射器和reducer任务在单个JVM中运行,而不是在单独的JVM中运行。下面的步骤可以帮助你做到这一点。
-
配置HADOOP_OPTS以启用调试,这样当您运行HADOOP作业时,它将等待调试器连接。下面是在8080端口调试相同程序的命令。
(导出HADOOP_OPTS="-agentlib:jdwp=传输=dt_socket,服务器=y,挂起=y,地址=8008")
-
将core-site.xml中的fs.default.name值从hdfs://配置到文件///。您不会在本地模式下使用hdfs。
-
将mapred-site.xml中的mapred.job.tracker值配置为local。这将指示Hadoop在单个JVM中运行MR任务。
-
为Eclipse创建调试配置,并将端口设置为8008——这是典型的东西。为此,转到调试器配置,创建一个新的远程Java应用程序类型的配置,并在设置中将端口设置为8080。
-
运行hadoop作业(它将等待调试器连接),然后使用上面的配置在调试模式下启动Eclipse。一定要把破发点放在第一位。
就是这样。
我创建了一个eclipse项目来调试通用的mapreduce程序,例如WordCount.java,在eclipse中运行独立的hadoop。但我还没有尝试特定于蜂箱/猪的mapreduce工作。该项目位于https://github.com/drachenrio/hadoopmr,可以使用下载
git clone https://github.com/drachenrio/hadoopmr
该项目是在Ubuntu 16.04.2、Eclipse Neon.3 Release(4.6.3RC2)、jdk1.8.0_121、hadoop-2.7.3环境中创建的。
快速设置:
1) 项目导入Eclipse后,打开.classpath,
nbsp nbsp;用hadoop安装主路径替换/j01/srv/hadoop-2.7.3
2) mkdir-p/home/hardoop/input
nbsp nbsp;将src/main/resources/input.txt复制到/home/hadop/input/
它已准备好运行/调试WordCount.java mapreduce作业
阅读README.md了解更多详细信息
如果您更喜欢手动创建项目,请参阅我在stackoverflow 中的另一个答案