Spark应用远程调试

本来想用Eclipse的。然而在网上找了一圈,发现大家都在说IntelliJ怎样怎样好。我也受到了鼓励,遂决定在这台破机器上鼓捣一次IntelliJ吧。

Spark程序远程调试,就是将本地IDE连接到Spark集群中。让程序一边执行,一边通过debuger实时查看执行情况,配置好以后和本地debug差点儿相同。

之前有写过Spark集群的安装部署。http://blog.csdn.net/u013468917/article/details/50979184当时是在hadoop2.2.0平台部署的Spark1.0.2.后来对Spark熟悉了一点后。就想把集群升级下面。干脆一部到位升级到最新的1.6.1.详细的安装过程和原来的1.0.2一模一样,解压之后将原来安装文件里的conf目录下的配置文件直接复制过来就好了。只是用的是hadoop2.3.0的预编译包,眼下还没有出现什么问题。

所以这次的演示在Spark集群1.6.1上进行。

过程大致分为下面几步:

1、打开Intellij IDEA,File->New ->Project。选择Scala。

2、取名为TopK。然后如图选择Java和Scala的SDK/

3、导入Spark依赖包,这个依赖包在压缩包的lib文件夹下名为 spark-assembly-XXXXXXX.jar

点击File-project structure-Libraries 点击加号选择Java

然后选择依赖包路径就可以。导入依赖包后能够打开这个jar包,依次打开org-apache-spark,然后随便打开一个类,比方rdd文件夹中的RDD.class,展开这个类,点开一个属性。就会出现反编译的源代码。

这时源代码的右上角有一个attach file,点击它,然后选择自己的spark源代码的文件夹就可以绑定源代码。这时凝视什么的都会显示出来。

spark最新源代码下载地址:https://github.com/apache/spark能够用git直接克隆到本地。git
clone https://github.com/apache/spark(前提是在自己电脑中安装好git)

4、在src目录上右击-new-Scala Class。然后填上类名,选择object

5、在文件里填入下面内容

import org.apache.spark._
import org.apache.spark.SparkContext._
object TopK {
  def main(args: Array[String]){
    val conf = new SparkConf()
    val sc = new SparkContext(conf)

    val textRDD = sc.textFile(args(0),3)

    val count = textRDD.flatMap(line => line.split("[^a-zA-Z]+").map(word=> (word,1))).reduceByKey(_+_)

    val topk = count.mapPartitions(getTopk).collect()  

    val iter = topk.iterator
    val outiter = getTopk(iter)
    println("Topk的值:")
    while(outiter.hasNext){
      val tmp = outiter.next()
      println("\n词: " + tmp._1 + "词频: " + tmp._2)
    }
    sc.stop()
  }  

  def getTopk(iter: Iterator[(String, Int)]): Iterator[(String, Int)] = {
    val a = new Array[(String, Int)](10)
    while(iter.hasNext){
      val tmp = iter.next()
      var flag = true
      for(i <- 0 until a.length if flag){
        if(a(i) !=null && tmp._2 > a(i)._2){
          for(j <- ((i+1) until a.length).reverse){a(j) = a(j-1)}
          a(i) = tmp
          flag = false
        }else if(a(i) == null){
          a(i) = tmp
          flag = false
        }

      }
    }
    a.iterator
  }

}

这是一个TopK程序。目的是找出文本中词频最高的10个词。

6、导出jar包

可能是我还不熟悉的原因,个人感觉IntelliJ导jar包比eclipse繁琐非常多。

选择:File-Project Structure-Artifacts 然后点击加号,选择jar-From Modules with dependencies

然后选择Main Class为TopK,选择copy to the outputXXXXXXX点击OK。

接下来选择Build-Build Artifacts-选择build

build完毕后在out目录下就行看到TopK.jar了。

然后将TopK.jar上传到集群主节点中。

到这里。步骤和普通应用开发一样。接下来才是重点。

7、集群配置

改动spark-class脚本 。这个脚本在spark安装文件夹下的bin文件夹中。

改动最后两行:

done < <("$RUNNER" -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main "[email protected]")

改动为:

done < <("$RUNNER" -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main $JAVA_OPTS "[email protected]")

这就要求Spark在运行任务之前将JAVA_OPTS变量考虑进来。我们就能够为应用程序加入JVM參数啦。

改动完毕后。在命令行中运行下面命令:

export JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"

这就设置好了当前的暂时JVM变量。

8、远程调试開始了

首先,执行刚才上传的TopK.jar

/cloud/spark-1.6.1-bin-hadoop2.3/bin/spark-submit --class TopK --master yarn TopK.jar /Spark/Jane1.txt

这时能够看到:

说明spark正在监听5005port,这个port能够自己随便设,不冲突即可,可是IntelliJ默认监听这个port。

然后回到IDEA。选择run-Edit Configuration,点击左上角的加号,选择remote。自己取个名字Test_Remote_Debug,改动一下Host。我的集群master地址是192.168.1.131

点击ok

在刚才的TopK程序中设置一个断点。

然后按F9,选择Test_Remote_Debug。

这是假设不出意外。控制台会出现

Connected to the target VM, address: ‘192.168.1.131:5005‘, transport: ‘socket‘

表示连接成功。

接下来就能够和本地Debug一样了。

最后再啰嗦一下那个“JAVA_OPTS"字段是什么意思。

-Xdebug 启用调试特性

-Xrunjdwp 启用JDWP实现,包括若干子选项:

transport=dt_socket JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。

address=5005 JVM在5005port上监听请求,这个设定为一个不冲突的port就可以。

server=y y表示启动的JVM是被调试者。

假设为n。则表示启动的JVM是调试器。

suspend=y y表示启动的JVM会暂停等待,直到调试器连接上才继续运行。suspend=n,则JVM不会暂停等待。

时间: 2024-11-05 17:32:55

Spark应用远程调试的相关文章

大数据:Spark Standalone 集群调度(一)从远程调试开始说application创建

远程debug,特别是在集群方式时候,会很方便了解代码的运行方式,这也是码农比较喜欢的方式 虽然scala的语法和java不一样,但是scala是运行在JVM虚拟机上的,也就是scala最后编译成字节码运行在JVM上,那么远程调试方式就是JVM调试方式 在服务器端: -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=7001,suspend=y 客户端通过socket就能远程调试代码 1. 调试submit, master, worke

Spark远程调试参数

Spark远程调试脚本: #调试Master,在master节点的spark-env.sh中添加SPARK_MASTER_OPTS变量 export SPARK_MASTER_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=10000" #启动Master sbin/start-master.sh #调试Worker,在worker节点的spark-env.sh中添加SPARK_WORKER_

spark JAVA 开发环境搭建及远程调试

spark JAVA 开发环境搭建及远程调试 以后要在项目中使用Spark 用户昵称文本做一下聚类分析,找出一些违规的昵称信息.以前折腾过Hadoop,于是看了下Spark官网的文档以及 github 上 官方提供的examples,看完了之后决定动手跑一个文本聚类的demo,于是有了下文. 1. 环境介绍 本地开发环境是:IDEA2018.JDK8.windows 10.远程服务器 Ubuntu 16.04.3 LTS上安装了spark-2.3.1-bin-hadoop2.7 看spark官网

Spark1.6 Idea下远程调试

使用的开发工具:scala2.10.4.Idea16.JDK8 1.导入依赖的包和源码 在下载Spark中到的导入spark的相关依赖了包和其源码.zip,相关源码的下载地址:https://github.com/apache/spark/tree/v1.6.0 地址最后面是对应的版本号,下载源码便于看注释 2.使用官方求Pi的例子 [java] view plain copy import org.apache.spark.{SparkConf, SparkContext} object Fi

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应用,远程调试的意义我