1、编辑代码
object WordCount {
def main(args: Array[String]): Unit = {
val sc = new SparkContext(new SparkConf().setAppName("WordCount "))
val rdd: RDD[String] = sc.makeRDD(List(
"spark hello", "hive", "hadoop hbase", "spark hadoop", "hbase"
))
val value: RDD[String] = rdd.flatMap(_.split(" "))
val mapRDD: RDD[(String, Int)] = value.map((_, 1))
val result: RDD[(String, Int)] = mapRDD.reduceByKey(_ + _)
result.collect().foreach(println)
}
}
2、打开IDEA配置,配置远程连接
其中主要配置的有两项,一个是host,一个是port。不过图中我圈出来了三处,最后一处仔细阅读其英文描述可以知道,那一串命令是需要我们拷贝添加到spark-submit提交命令的参数中的。
3、修改spark-submit,添加远程连接的参数
spark-submit \
--master spark://bigdata.node2:7077 \
--class test.wordcount.WordCount \
--num-executors 1 \
--driver-memory 499m \
--driver-cores 1 \
--executor-memory 499m \
--executor-cores 1 \
--driver-java-options -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8888 \
/opt/spark-jar/wyt01bigdata-1.0-SNAPSHOT.jar
可以看到,我们将IDEA中生成的远程命令-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8888 添加在了spark提交命令中。这里有个参数要特别留意下,对于debug很有用,那就是suspend=y,y表示启动的JVM会暂停等待,直到IDEA调试器连接上才继续执行。如果设置suspend=n,那么远程服务不会等待IDEA连接。
另外这里还有一个需要留意的点是,因为上一步我们远程debug指定了host和port,所以这里我们尽量不要配置deploy-mode为cluster集群模式。因为集群模式是随便找个机器启动应用,很有可能不在我们监听的那台服务器启动,此时我们还要重新配置idea中监听的服务器host,除此外,我们使用的所有资源比如jar也要提前放入到hdfs文件系统中,因为只有在hdfs文件系统中,才能在任意一台worker启动driver时读取到我们需要的资源信息。所以远程debug的部署模式通常选用client(我们不配置部署模式时默认则是client)