• 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不会暂停等待。


  • 相关阅读:
    CF 461B Appleman and Tree
    POJ 1821 Fence
    NOIP 2012 开车旅行
    CF 494B Obsessive String
    BZOJ2337 XOR和路径
    CF 24D Broken robot
    POJ 1952 BUY LOW, BUY LOWER
    SPOJ NAPTIME Naptime
    POJ 3585
    CF 453B Little Pony and Harmony Chest
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7189790.html
Copyright © 2020-2023  润新知