Skip to content

Debug Tips For EasyML

Xinjie Chen edited this page Sep 12, 2017 · 2 revisions

在Tomcat部署EasyML系统、通过IDE(Eclipse or IDEA)运行EasyML或测试新添加的功能时,会遇到一些未曾遇到的问题,那么如何更快速的运用一些工具定位问题对开发者而言显得尤为必要,了解一些开发调试的技巧对开发者的开发效率具有很大的提升。下面我们根据EasyML开发团队的一些开发经验,总结了针对EasyML进行调试的技巧。

注:以下的一些地址,仅针对使用Docker部署集群的开发者,若自己搭建集群,则需要根据自身软件安装情况而修改

Oozie查看提交的Job

  • 通过Oozie的web console页面http://hadoop-master:11000/oozie/可查看EasyML平台提交的job的详细信息。上面包含提交的Job id、Job名称、当前状态、提交的用户、创建时间、结束时间等信息。
  • 点击具体的要查看的某个job,页面会弹出job的详细信息页面,若弹出的界面不完整,请右键Chrome浏览器,在放大缩小中将页面缩小即可弹出完整页面
各个Tab含义如下:
  1. Job Info:显示Job基本信息,包括Job Id、Name、App Path、Status、User;显示Job包含的Actions信息

  2. Job Definition:Oozie job workflow定义,Oozie根据里面的流程定义进行调度相应的Action,里面可以看到从EasyML提交的job的各个Action最终的参数及执行脚本等信息

  3. Job Configuration:Oozie job相关的配置信息,包括Hadoop的jobtracker和hdfs地址等

  4. Job Log:Oozie运行该job的日志

  5. Job DAG: Job运行的DAG图,和Workflow流程一致,EasyML提交的job最终会解析成oozie 的DAG图

当图中某个节点出现错误时,可以点击Job Info中的状态为FAILED的action,此时会弹出该Action的详细信息,可从上面查询到部分的错误日志,同时还可以通过console url查看该节点在hadoop中运行的情况(具体在哪个节点运行、执行的状态等)。

  • 通过点击Action对应的Console url,链接会跳转到Job history server对应的job中,每个action的执行相当于是一个Hadoop Job。可以通过Hadoop history server查看其对应节点的相关日志信息。
  • 当然,还可以通过到Oozie的安装目录下查看Oozie的job运行日志。 通过docker exec -it hadoop-master /bin/bash进入hadoop-master容器,进入/usr/local/oozie/logs目录查看oozie.log日志。Oozie默认显示的日志级别为INFO,可以通过修改/usr/local/oozie/conf/oozie-log4j.properties文件的日志级别为DEBUG,查看调试日志。

Hadoop相关日志查看

各目录含义如下:
  1. Data:与EasyML平台中的Dataset数据一致,用户通过平台上传的数据保存在该目录中

  2. Program:与EasyML平台中的Program数据一致,用户通过平台上传的程序保存在该目录中

  3. Oozie:用户通过EasyML平台提交的任务会在Oozie目录下创建对应的目录(对应Oozie web console中任务的appPath),里面存储Oozie的workflow.xml任务描述文件及各个Action的结果文件,包括结果、STDOUT和STDERR

若上传文件出错可通过到HDFS上查看数据是否上传成功来定位具体的问题,若HDFS上没有对应的文件,则可能是HDFS写数据出了问题。

  • 除上述WEB UI之外,还可以通过进入hadoop-master容器的/usr/local/hadoop/logs目录中查看Console日志
 hadoop-root-namenode-hadoop-master.log  // namenode日志
 mapred--historyserver-hadoop-master.log  // hadoop-master的historyserver日志
 yarn--resourcemanager-hadoop-master.log  // hadoop-master的yarn日志

默认情况下日志的级别为INFO级别,可通过修改/usr/local/hadoop/sbin/hadoop-daemon.sh文件中的HADOOP_ROOT_LOGGER的日志级别为DEBUG来查看相关的调试日志。

Tomcat查看Job运行日志

  • 若将EasyML工程打包成war包部署在Docker的Tomcat中,则可通过Tomcat的日志查看相关的错误信息。 通过进入hadoop-master容器的/usr/local/tomcat/logs 目录查看tomcat的日志。

值得注意的是,Tomcat的日志信息不包括web app中包含的应用日志,若需要查看具体的应用日志,可以通过给Tomcat配置log4j日志替换默认日志的方式查看。

具体步骤可参考http://www.cnblogs.com/phoenix-smile/p/5923592.html 步骤,下载相关jar包:

  1. 将tomcat-juli.jar放置在tomcat/bin目录中,替换原来的。
  2. 将tomcat-juli-adapters.jar、log4j-1.2.17.jar、log4j.properties放置在tomcat/lib目录下。
  3. 删除tomcat/conf目录下的logging.properties文件。

EasyML平台查看Job日志

  • 在EasyML平台构建任务并提交之后,界面会自动进入监控状态,可以通过监控界面查看到各个Action的运行状态,若Action显示红色,则表示Action执行失败,此时可通过右键Action,选择Show Std Error查看程序运行错误日志。该错误日志只显示程序本身的错误日志,因Hadoop集群或Oozie本身提交任务失败而造成的错误无法显示。

Eclipse或IDEA查看运行日志

  • 通过Eclipse或IDEA本机运行EasyML系统时,系统会自动部署在gwt dev上,此时可通过IDE Console查看各个请求日志。 若要查看Hadoop相关日志,需要给EasyML配置log4j日志,EasyML默认使用java.util.log日志。

具体可修改如下:

  1. 将log4j.properties文件放置到src/main/java目录中
  2. 在pom.xml中添加log4j依赖包
  3. 在想查看的文件中,通过添加import org.apache.log4j.Logger将logger类引入即可

Chrome查看前端GWT运行日志

  • EasyML前端采用GWT技术,GWT可以使用 Java 编程语言编写 AJAX 前端,然后 GWT 会交叉编译到优化的JavaScript 中,而 JavaScript 可以自动在所有主要浏览器上运行。因此对于前端的日志查看,可以通过在EasyML网页上,右键浏览器选择检查,在显示的开发者界面中点击Console,在Console中会显示所有在EasyML工程client端显示的日志,通过引入import java.util.logging.Logger类即可。
  • 当然,你也可以通过在代码中关键点添加Window.alert来进行前端代码的调试。