Sqoop2远程调试

Sqoop2是一个CS的架构,客户端包括sqoop-shell和sqoop-client,服务器端包括sqoop-server,sqoop-server就是一个部署在Tomcat下的web应用,由几个servlet组成。

调试sqoop-shell

调试sqoop-shell就是在启动sqoop client main方法时,加上调试参数。

sqoop-shell的启动方式为:sqoop.shclient,找到解决问题的起点,查找sqoop.sh脚本,在其中找到这样一段:

client)
    #Build class path with full path to each library
   for f in $CLIENT_LIB/*.jar; do
     CLASSPATH="${CLASSPATH}:${BASEDIR}/$f"
   done
    #We need to change current directory back to original as optional user sidescript
    #might be specified with relative path.
   cd ${OLD_DIR}
   EXEC_JAVA='java'
   if [ -n "${JAVA_HOME}" ] ; then
       EXEC_JAVA="${JAVA_HOME}/bin/java"
    fi
   ${EXEC_JAVA} -classpath ${CLASSPATH} org.apache.sqoop.shell.SqoopShell $2
   ;;
  *)
   echo "Command is not recognized."
;;

可以看到,${EXEC_JAVA} -classpath ${CLASSPATH} org.apache.sqoop.shell.SqoopShell $2,这行shell脚本就是启动sqoop客户端的main方法的地方了,在其中加入:

-Xdebug -Xnoagent-Xrunjdwp:transport=dt_socket,address=8199,server=y,suspend=n

这一行代码成了下面这样:

${EXEC_JAVA} -classpath ${CLASSPATH} -Xdebug-Xnoagent -Xrunjdwp:transport=dt_socket,address=8199,server=y,suspend=norg.apache.sqoop.shell.SqoopShell $2

注意,放到一行里,不要换行。Server不是指的IP。

参数具体的意义可以查看相关文档,IBM上有个系列的文章,是专门讲JAVA的调试体系的,叫做《深入 Java 调试体系深入 Java 调试体系深入JAVA调试体系》,讲的很细很好,相信对于很多人来说,会填补一块JAVA知识的空白。

这样就设置好了,当运行sqoop.sh client 启动sqoop shell的时候,会看到输出中包含下面的内容:

Listening for transport dt_socket ataddress: 8199

在IDE,比如Eclipse里,选择远程调试,在Eclipse中是Remote Java Application。主要是填程序所在机器的网络地址和端口号,在这个例子中,端口号就是8199。

Eclipse这端开始Debug之后,设置好断点,然后再Sqoop所在的机器启动的sqoopshell中进行操作,运行到断点,就会停住,在Eclipse这端跟调试本地程序一样。

调试sqoop-server

因为sqoop-server就是一个JavaWeb应用,所以设置sqoop-server远程调试,就是设置Tomcat为远程调试。运行Tomcat的catalina.sh命令可以看到,Tomcat已经为我们提供了jpda选项:

Usage: catalina.sh ( commands ... )
commands:
 debug             Start Catalinain a debugger
 debug -security   Debug Catalinawith a security manager
 jpda start        Start Catalinaunder JPDA debugger
 run               Start Catalinain the current window
  run-security     Start in the current windowwith security manager
  start             Start Catalina in a separatewindow
 start -security   Start in aseparate window with security manager
 stop              Stop Catalina,waiting up to 5 seconds for the process to end
 stop n            Stop Catalina,waiting up to n seconds for the process to end
 stop -force       Stop Catalina,wait up to 5 seconds and then use kill -KILL if still running
 stop n -force     Stop Catalina,wait up to n seconds and then use kill -KILL if still running
 version           What version oftomcat are you running?

由于这个内置的Tomcat的启动是由sqoop.sh脚本控制的,启动命令如下:

sqoop.sh server start

于是去查看sqoop.sh脚本的代码,找到如下部分:

   actionCmd=$2

   source ${BASEDIR}/bin/sqoop-sys.sh
   setup_catalina_opts

    #There seems to be a bug in catalina.sh whereby catalina.sh doesn't respect
    #CATALINA_OPTS when stopping the tomcat server. Consequently, we have to hackaround
    #by specifying the CATALINA_OPTS properties in JAVA_OPTS variable
   if [ "$actionCmd" == "stop" ]; then
     export JAVA_OPTS="$JAVA_OPTS $CATALINA_OPTS"
   fi

    #Remove the first 2 command line arguments (server and action command(start/stop)) so we can pass
    #the rest to catalina.sh script
   shift
   shift

   $CATALINA_BIN/catalina.sh $actionCmd "[email protected]"
;;

从sqoop.sh server start命令来看,actionCmd就是start了,也就是说,sqoop.sh server start命令最终执行catalina.sh命令时是传入的start,即catalina.sh start。我们想运行:

catalina.sh jpda start

于是把原来$CATALINA_BIN/catalina.sh $actionCmd "[email protected]"这行脚本的中直接加入jpda,最终的脚本为:

$CATALINA_BIN/catalina.sh jpda $actionCmd"[email protected]"

上边我们设置sqoop shell 的jpda的时候,是在JVM启动时加入参数,但是从catalina.sh打印出的帮助信息来看,没有传入参数的地方,想到可能是在配置文件或者脚本中有环境变量:

最后在catalina.sh中找到下面的配置:

if [ "$1" = "jpda" ] ;then
  if[ -z "$JPDA_TRANSPORT" ]; then
   JPDA_TRANSPORT="dt_socket"
  fi
  if[ -z "$JPDA_ADDRESS" ]; then
   JPDA_ADDRESS="8000"
  fi
  if[ -z "$JPDA_SUSPEND" ]; then
   JPDA_SUSPEND="n"
  fi
  if[ -z "$JPDA_OPTS" ]; then
   JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
  fi
 CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS"
 shift
fi

这是默认的配置,也可以自己更改。

完成上边的配置后,在Eclipse这端,调试sqoop-server项目,Remote Java Application,填上远程JVM地址,端口号,这个例子中是8000,点击debug就可以了。

时间: 2024-08-30 16:08:49

Sqoop2远程调试的相关文章

Tomcat配置远程调试端口(windows、Linux)

当我们需要定位生产环境问题,而日志又不清晰的情况下,我们可以借助Tomcat提供的远程调试,设置如下: // Linxu系统: apach/bin/startup.sh开始处中增加如下内容: declare -x CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8081" // Windows系统:

Tomcat使用MyEclipse远程调试Java代码配置详解

Tomcat使用MyEclipse远程调试Java代码总结如下:在做远程调试时,在windows系统和非windows系统下的配置,Tomcat中会有所差别,具体如下: 第一步.配置tomcat一.在windows系统中:打开%CATALINE_HOME%/bin下的文件catalina.bat,加入下面这行:set CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket

利用 Chrome 开发者工具远程调试 Android 中的原生 WebView

之前写过一篇关于 Android Studio 断点调试技巧 的文章,但都是针对 Native 代码的调试,对于 Hybrid 开发模式下的 WebView 却无从下手.幸运的是,PC 中的 Chrome 浏览器提供的开发者工具能够帮助我们远程调试 Android 中的 WebView 加载的网页. Android 4.4 (KitKat) 开始,使用 Chrome 开发者工具可以帮助我们在原生 Android 应用中远程调试 WebView 网页内容.一起来看看怎么操作吧. 第一步,设置 We

Atitit web remote远程调试的原理attilax总结

Jvm是vm打开一个debug port,然后ide先连接..然后执行url,就会vm会与ide沟通.. Php的xdebug port 9000是在phpstorem打开的...如果执行url,也会启动debug..必须要预先连接ide和apache才可..使用phpstorm打开debug page即可,预先连接好.然后就xdebug就可以与ide打开的9000 debug port连接调试了.. 连接建立 对于有静态IP.单个开发者 使用Xdebug的远程调试,Xdebug作为一个嵌入到P

使用Eclipse进行远程调试

转自:http://blog.csdn.net/sunyujia/article/details/2614614 今天决定做件有意义的事,写篇图文并茂的blog,为什么要图文并茂?因为很多事可能用语言也说不明白,从以前我发表的一篇文章可以看得出来,  我的朋友们普通反应看完后觉得不知所云,可能是我写的太简单,下面步入正题. 什么是远程调试,就是在A机器上利用Eclipse单步跟踪调试B机器上的Web应用,当然调试A机器上Web应用也是没有问题的,90%我都是调试本机的Web应用,远程调试的意义我

.NET C#微信公众号开发远程断点调试(本地远程调试生产环境)

最近在做微信公众号开发,由于之前没有接触过,突然发现调试不方便,不方便进行断点跟踪调试.因为微信那边绑定的服务器地址必须是公网地址,但是还是想进行断点调试(毕竟这样太方便了) 因此上网搜了一下,发现好多是使用软件之类的进行请求转发从生产环境转发请求到开发环境上,发现有的太麻烦了. 突然想到Vs有一个附加到进程的远程调试.于是玩了一把.我们直接开始(服务器上就不要使用发布版本代码了,代码和本地开发一样,不然是不能调试的) 本篇是以开发环境的Visual Studio2013旗舰版以及生产环境里阿里

myecplice和ecplice远程调试

myecplice和ecplice远程调试web#!/bin/shexport JPDA_ADDRESS=8012 ./catalina.sh jpda start 将此脚本保存为sh文件,  放在tomcat   bin  下  ,  以此脚本启动tomcat myecplice和ecplice远程调试java工程 java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=(自定义端口)8000 -jar    (java项目名称)

Linux下Debug模式启动Tomcat进行远程调试

J2EE开发各类资源下载清单,  史上最全IT资源,点击进入! 一.      应用场景 在实际的测试过程中,可能会遇到由于程序执行的不间断性,我们无法构造测试场景来验证某个功能的正确性,只有通过代码级的调试才能验证功能是否正确.然而开发本地调试的话,不具有说服力,这时我们测试人员必须连接到linux下的基线版本代码进行远程调试 二.调试步骤 1.部署服务工程到Linux系统下的Tomcat中,本文档重点是远程调式,为了防止文档篇幅累赘,这里就不介绍部署工程了. 2.更改tomcat远程调试端口

在gentoo中打开tomcat的远程调试开关

在一般象gentoo等发行版中,系统安装tomcat这类软件后会产生一些启动脚本, 例如是/etc/init.d/tomcat-7, 启动方式与原始的tomcat不太一样.在gentoo中,如果需要远程调试tomcat的web应用,可能将以下一行修改一下: 在开头大概10多行, 将以下 : ${TOMCAT_START:=start} 修改成 : ${TOMCAT_START:=jpda start} 即可. 版权声明:本文为博主原创文章,未经博主允许不得转载.