Spark应用程序调试方法详解

简介

Spark是基于内存计算的开源分布式大数据计算框架。为了更好、更快地开发Spark应用程序,开发者不仅要掌握Spark的理论基础和实现原理,更需要掌握Spark应用程序调试方式。

Spark应用程序调试方式有:本地调试模式、服务器调试模式、远程调试模式。接下来本文会一一介绍这几种调试方式的使用。

本地调试模式

1.

Spark本地开发工具推荐使用IntelliJ IDEA。编译工具推荐使用Maven或者IntelliJ IDEA自身编译。IntelliJ IDEA开发Spark应用程序和开发其他应用程序一样,可以进行debug调试,输出日志等等。

2.

安装JDK和Scala。安装版本请参考Spark官方网站说明。如2.0.2版本官网描述Spark runs on Java 7+, Python2.6+/3.4+ and R 3.1+. For the Scala API, Spark 2.0.2 uses Scala 2.11. You willneed to use a compatible Scala version (2.11.x).

3.

安装Spark,直接去Download Apache Spark。有两个步骤:

  • 选择好对应Hadoop版本的Spark版本,如下图中所示;

  • 然后点击下图中箭头所指的spark-2.0.2-bin-hadoop2.7.tgz,等待下载结束即可。

这里使用的是Pre-built的版本,意思就是已经编译了好了,下载来直接用就好。Spark也有源码可以下载,但是得自己去手动编译之后才能使用。下载完成后将文件进行解压(可能需要解压两次),最好解压到一个盘的根目录下,并重命名为Spark,简单不易出错。并且需要注意的是,在Spark的文件目录路径名中,不要出现空格,类似于“Program Files”这样的文件夹名是不被允许的。

解压后基本上就可以到cmd命令行下运行了。但这个时候每次运行spark-shell(Spark的命令行交互窗口)的时候,都需要先cd到Spark的安装目录下,比较麻烦,因此可以将Spark的bin目录添加到系统变量PATH中。例如我这里的Spark的bin目录路径为D:Sparkbin,那么就把这个路径名添加到系统变量的PATH中即可,方法和JDK安装过程中的环境变量设置一致。设置完系统变量后,在任意目录下的cmd命令行中,直接执行spark-shell命令,即可开启Spark的交互式命令行模式。

4.

IntelliJ IDEA添加Spark发布的依赖包或者通过Maven配置Spark相关依赖。

5.

安装Hadoop,系统变量设置后,就可以在任意当前目录下的cmd中运行spark-shell,但这个时候很有可能会碰到各种错误,这里主要是因为Spark是基于Hadoop的,所以这里也有必要配置一个Hadoop的运行环境。在HadoopReleases里可以看到Hadoop的各个历史版本,这里下载的Spark是基于Hadoop 2.6的(在Spark安装的第一个步骤中,我们选择的是Pre-built for Hadoop2.6),所以这里选择2.6.4版本。选择好相应版本并点击后,进入详细的下载页面,如下图所示,选择图中红色标记进行下载。

Spark应用程序调试方法详解_第1张图片
image

这里下载的是已经编译好的版本。下载并解压到指定目录,然后到环境变量部分设置HADOOP_HOME为Hadoop的解压目录,我这里是F:Program Fileshadoop,然后再设置该目录下的bin目录到系统变量的PATH下,我这里也就是F:Program Fileshadoopbin,如果已经添加了HADOOP_HOME系统变量,也可以用%HADOOP_HOME%bin来指定bin文件夹路径名。这两个系统变量设置好后,开启一个新的cmd,然后直接输入spark-shell命令。

正常情况下是可以运行成功并进入到Spark的命令行环境下的,但是对于有些用户可能会遇到空指针的错误。这个时候,主要是因为Hadoop的bin目录下没有winutils.exe文件的原因造成的。这里的解决办法是:

  • 去https://github.com/steveloughran/winutils选择你安装的Hadoop版本号,然后进入到bin目录下,找到winutils.exe文件,下载方法是点击winutils.exe文件,进入之后在页面的右上方部分有一个Download按钮,点击下载即可。

  • 下载好winutils.exe后,将这个文件放入到Hadoop的bin目录下,我这里是F:Program Fileshadoopbin。在打开的cmd中输入F:ProgramFileshadoopbinwinutils.exe chmod 777 /tmp/Hive

    这个操作是用来修改权限的。注意前面的F:Program Fileshadoopbin部分要对应的替换成实际你所安装的bin目录所在位置。经过这几个步骤之后,然后再次开启一个新的cmd窗口,如果正常的话,应该就可以通过直接输入spark-shell来运行Spark了。

6.

熟练掌握Spark的API。Spark的API支持Scala、Java、R和Python语言。API包括常见的变化操作算子和行动操作算子。

Spark 服务器调试模式

spark-submit提交jar包。

将本地应用程序打成jar包放在服务器上,在该服务器上执行spark-submit--class com.zte.spark.example.WordCount --executor-memory 1G --total-executor-cores 3 /home/mr/SparkTest.jar /tmp/test.txt

spark-shell可以直接调试代码。

Spark应用程序调试方法详解_第2张图片
image

spark-sql可以直接调试SQL语句。

Spark应用程序调试方法详解_第3张图片
image

远程调试模式

Spark远程调试模式实际上利用的是JVM的远程debug调试。有时候Spark集群环境出现问题,当查看日志和WEB UI无法解决问题的时候,利用远程debug进行调试是一个十分快捷和有效的方式。

-Xdebug -Xrunjdwp:transport=dt_socket,address=5006,server=y,suspend=y

参数含义

  • -Xdebug:告诉JVM运行在debug模式下

  • -Xrunjdwp:transport=dt_socket:指定连接方式(包括socket传输和内存传输两种,其中内存传输只支持Windows,而且内存传输不支持远程调试)

  • address=5006:JVM在5006端口上监听请求。

  • server=y:y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。

  • suspend=y:y表示启动的JVM会暂停等待,服务端被挂起,直到调试器连接上。n表示JVM不会暂停等待。

客户端设置:

  • 打开IntelliJIDEA工作台

  • 选择“Run->Debug Configurations”菜单项

  • 选择“Remote”,在右键弹出菜单中选择“New”

Spark应用程序调试方法详解_第4张图片
image
  • 点击OK即可,就可以用本地的Spark代码调试Spark集群的功能。

服务器设置:

SPARK_MASTER_OPTS=-Xdebug-Xrunjdwp:transport=dt_socket,address=5006,server=y,suspend=n:调试Master的功能代码。

SPARK_WORKER_OPTS=-Xdebug-Xrunjdwp:transport=dt_socket,address=5006,server=y,suspend=n:调试Worker的功能代码。

SPARK_HISTORY_OPTS=-Xdebug-Xrunjdwp:transport=dt_socket,address=5006,server=y,suspend=n:调试History Server的功能代码。

spark-submit、spark-sql,spark-shell调试设置:

spark-submit、spark-sql,spark-shell配合spark.driver.extraJavaOptions和spark.executor.extraJavaOptions参数使用,可以远程调试Spark应用程序和GUI命令程序。如下:

spark-submit --classcom.zte.spark.example.WordCount --driver-java-options'-Xdebug -Xrunjdwp:transport=dt_socket,address=5006,server=y,suspend=n'--executor-memory 1G --total-executor-cores 3 /home/mr/SparkTest.jar /tmp/test.txt

spark-sql --executor-memory 1Gexecutor-cores 1 --driver-java-options '-Xdebug-Xrunjdwp:transport=dt_socket,address=5006,server=y,suspend=n'

spark-shell --executor-memory 1Gexecutor-cores 1--driver-java-options '-Xdebug-Xrunjdwp:transport=dt_socket,address=5006,server=y,suspend=n'

总结

我们在日常开发中,上述几种调试模式均需要熟练掌握并且合理使用。本地调试方式适合日常开发人员在本地开发,无需占用紧张的集群服务器环境,多个开发人员互不影响,本地调试在开发效率上也是最优的。服务器调试模式适合多个应用联调测试和集成测试,适合做性能测试。远程调试模式主要是解决难以定位的故障,实际证明,该方式也是定位问题最有效的手段之一

你可能感兴趣的:(Spark应用程序调试方法详解)