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 "$@")
改动为:
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不会暂停等待。
Spark应用远程调试的更多相关文章
- hive,spark的远程调试设置
spark的远程调试 spark-env.sh文件里面,加上下面配置即可: if [ "$DEBUG_MODE" = "true" ]; then export ...
- spark开启远程调试
一.集群环境配置 #调试Master,在master节点的spark-env.sh中添加SPARK_MASTER_OPTS变量 export SPARK_MASTER_OPTS="-Xdeb ...
- sbt结合IDEA对Spark进行断点调试开发
笔者出于工作及学习的目的,经常与Spark源码打交道,也难免对Spark源码做修改及测试.本人一向讲究借助工具提升效率,开发Spark过程中也在摸索如何更加顺畅的对源码进行调试. Spark基于Sca ...
- spark JAVA 开发环境搭建及远程调试
spark JAVA 开发环境搭建及远程调试 以后要在项目中使用Spark 用户昵称文本做一下聚类分析,找出一些违规的昵称信息.以前折腾过Hadoop,于是看了下Spark官网的文档以及 github ...
- Spark远程调试参数
Spark远程调试脚本: #调试Master,在master节点的spark-env.sh中添加SPARK_MASTER_OPTS变量 export SPARK_MASTER_OPTS="- ...
- Spark代码Eclipse远程调试
我们在编写Spark Application或者是阅读源码的时候,我们很想知道代码的运行情况,比如参数设置的是否正确等等.用Logging方式来调试是一个可以选择的方式,但是,logging方式调试代 ...
- Spark学习笔记之-Spark远程调试
Spark远程调试 本例子介绍简单介绍spark一种远程调试方法,使用的IDE是IntelliJ IDEA. 1.了解jvm一些参数属性 -X ...
- Spark远程调试函数
Spark远程调试函数 1.sendInfo 该函数用于分布式程序的调试,非常方便,在spark的rdd操作中嵌入sendInfo,启动nc服务器后,可以收集到所有需要的运行时信息,该函数可以捕获ho ...
- Spark1.6 Idea下远程调试
使用的开发工具:scala2.10.4.Idea16.JDK8 1.导入依赖的包和源码 在下载Spark中到的导入spark的相关依赖了包和其源码.zip,相关源码的下载地址:https://gith ...
随机推荐
- 初见Vue
一.What 官方定义:是一套用于构建用户界面的渐进式框架.这,what?不明觉厉,我反正现在还是不知道,在这之前,就只知道Vue.js是用来渲染数据的,其实它的核心库只关注视图层.不多说,用多了就知 ...
- 【C语言项目】贪吃蛇游戏(上)
目录 00. 目录 01. 开发背景 02. 功能介绍 03. 欢迎界面设计 3.1 常用终端控制函数 3.2 设置文本颜色函数 3.3 设置光标位置函数 3.4 绘制字符画(蛇) 3.5 欢迎界面函 ...
- N皇后递归
问题: n皇后问题:输入整数n, 要求n个国际象棋的皇后,摆在 n*n的棋盘上,互相不能攻击,输出全部方案. #include <iostream> using namespace std ...
- xfs文件系统修复
1. 错误描述 启动CentOS7系统,发现进步了图形界面,并报如下错误: Error getting authority: Error initializing authority: Could n ...
- 洛谷 1196 [NOI2002]银河英雄传说【模板】带权并查集
[题解] 经典的带权并查集题目. 设cnt[i]表示i前面的点的数量,siz[i]表示第i个点(这个点是代表元)所处的联通块的大小:合并的时候更新siz.旧的代表元的cnt,路径压缩的时候维护cnt即 ...
- UVa 1354 天平难题 (枚举二叉树)
题意: 分析: 其实刚看到这题的时候觉得很难, 以至于结束了第七章然后去做了一遍第六章树的部分.现在再做这题觉得思路并不是太难,因为总共就只有六个结点,那么只要枚举二叉树然后算出天平然后再从叶子往上推 ...
- NOI模拟赛(3.15) sequence(序列)
Description 小A有N个正整数,紧接着,他打算依次在黑板上写下这N个数.对于每一个数,他可以决定将这个数写在当前数列的最左边或最右边.现在他想知道,他写下的数列的可能的最长严格上升子序列(可 ...
- hadoop格式化出错,提示IO异常
配置好hadoop之后,在进行格式化的时候出现异常,原因是由于在core-site.xml 配置文件中写的路径格式不对. 不需要加 file:/ 或者 file:// 直接写绝对路径就行. <c ...
- 用spring annotation声明的bean,当打包在jar中时,无法被扫描到
发现一个问题,十分蛋疼. 我们项目是由N个工程组成的,外围工程是web工程,内部的工程打包成jar,放入外围工程的WEB-INF/lib 内部的工程用到了spring的注解,例如@Service.@C ...
- 大数据学习——hive基本操作
1 建表 create table student(id int,name string ,age int) row format delimitedfields terminated by ','; ...