zoukankan      html  css  js  c++  java
  • 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("
    词: " + 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 "$@")
    改动为:

    done < <("$RUNNER" -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main $JAVA_OPTS "$@")
    这就要求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不会暂停等待。


  • 相关阅读:
    软件性能中几个主要的术语
    (转)性能测试指标
    不同角度关注的软件性能
    《跃迁:从技术到管理的硅谷路径》读书笔记
    Mysql基础知识—索引
    Python学习笔记系列——高阶函数(map/reduce)
    Python学习笔记系列——高阶函数(filter/sorted)
    (转)Python学习笔记系列——Python是一种纯粹的语言
    Python学习笔记系列——读写文件以及敏感词过滤器的实现
    双向链表(Double-Linked List)
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7189790.html
Copyright © 2011-2022 走看看