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版本。选择好相应版本并点击后,进入详细的下载页面,如下图所示,选择图中红色标记进行下载。

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可以直接调试代码。

image

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

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”

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'

总结

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容