Sqoop2远程调试,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 "$@"
;;

从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 "$@"这行脚本的中直接加入jpda,最终的脚本为:

$CATALINA_BIN/catalina.sh jpda $actionCmd"$@"

上边我们设置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就可以了。

 


怎:设置远程调试

-或 -从一个共享中远程运行远程调试监视器。从一个文件共享中运行远程调试监视器是启用远程调试的最容易的方法。在64 位平台上安装 Visual Studio??时,会将适用于所有三个体系结构的远程调试监视器版本复制到以下文件夹:安装路径\Microsoft Visual Studio 10.0\Common7\IDE\Remote Debugger若要安装其他远程调试组件,请按照本主题中的过程进行操作。如果共享 Visual Studio 计算机中的远程调试器目录,则可以在远程计算机中运行 msvsmon.exe。下列调试器方案要求您在远程计算机中安装远程调试组件:单步执行从 WCF 客户端调用的承载服务。自动调试 ASP.NET Web 应用程序。两种情况下,都可以进行手动附加,而无需在远程计算机中安装组件。除了从共享位置运行之外,还可以在远程计算机中安装必要的远程调试组件。此安装提供对所有远程调试功能的访问。在x86 平台上运行远程调试器安装时,仅安装 x86 远程调试组件。没有用于安装 64 位组件的选项。如果在 64 位平台上运行远程调试器安装,则会同时安装 x86 和 64 位组件。安装远程调试组件远程调试器可在 Visual Studio 安装 DVD 中找到。在Windows 资源管理器中,打开该 DVD,然后找到 vs/Remote Debugger。在vs/Remote Debugger 文件夹中,根据您的平台启动相应的 Microsoft Visual Studio 2010 远程调试器安装程序版本:rdbgsetup_x86、rdbgsetup_x64 或rdbgsetup_ia64。按照远程调试器安装程序向导中的说明完成安装。如果您愿意,可以通过手动复制文件来安装远程调试组件。有关所需组件及其安装位置的列表,请参见远程调试组件。针对32 位和 64 位平台,Visual Studio 包括不同版本的远程调试监视器。如果使用远程调试器安装程序,它会自动安装正确版本的远程调试监视器。然而,如果手动复制文件,则您必须确保所复制的版本正确无误。安装远程调试组件以后,必须确保具有所需的权限以便对远程计算机上的程序进行调试。请参见 远程调试权限 以获取所需权限的列表。配置Windows 防火墙必须配置 Windows 防火墙才能启用远程调试。在首次启动远程调试时,Visual Studio 会在 Visual Studio 主机上进行必要的配置。在远程计算机中首次运行远程调试监视器时,远程调试监视器会在远程计算机上配置 Windows 防火墙。在Windows XP 上,此配置是完全透明和自动的,但是在 Windows Vista 上,新的安全模型要求先授予权限,然后软件才能配置防火墙。此权限是通过“用户帐户控制”对话框授予的。有关新安全模型和用户访问控制的说明,请参见 Windows 安全模型。如果远程调试监视器必须在远程计算机上配置 Windows 防火墙,远程计算机上则会显示“用户访问控制”对话框。如果远程计算机不可见,您可能意识不到 UAC 对话框已显示在远程计算机的监视器上。在这种情况下,您可能会误认为远程调试已停止响应。实际上,远程调试监视器只是在等待有人在远程计算机上授予 UAC 权限。必须手动配置 Windows 防火墙的情况是很少见的。如果是手动配置,请参见如何:为远程调试手动配置 Windows 7 防火墙、如何:为远程调试手动配置 Windows Vista 防火墙......余下全文>>
 

监控的视频远程怎调试?

你的视频监控是采用什么设备组建的呢?如果是网络摄像机的话,就非常简单了,厂家会免费提供配套软件,通过其中的搜索工具,可以对网络摄像机配置IP地址和重设端口,然后将其填写到路由器的“虚拟服务器”里保持就可以。我有朋友在使用【网视无忧】这个品牌的网络摄像机,感觉还不错。
 

相关内容