IDEA调试SPARK程序

时间:2022-04-08 09:21:17

IDEA调试SPARK程序

为SPARK部署好HDFS后,就可以部署SPARK环境了。如何部署HDFS参考HDFS

IDEA for Scala

在Scala官网,就有IDE的说明,IDEA中比较方便的编写和调试Scala程序。步骤如下:

  1. 下载IDEA社区版,注意你的版本,譬如是IDEA 14.0.3,特别是Build #IC-139.1117。Scala插件要求IDEA的指定版本。
  2. 下载Scala Plugin for IDEA,选择你的IDEA对应的版本,譬如139.1117对应的是1.4,它适配的范围是139.791 - 140
  3. 安装好IDEA后,启动后选择configure => plugins,然后从硬盘安装,选择下载的Scala Plugin的zip文件,就可以安装好了。
  4. 重启IDEA后,新建Project就可以看到Scala了。

新建Scala工程,普通的Scala就可以,不用选SBT之类的工程。新建后一般是空的工程,新建时可能需要选择JDK或者Scala SDK之类的,都一一设置好。

至于Scala SDK如何设置,就和JDK一样,下载Scala后,解压到一个目录,然后在/etc/profile中设置SCALA_HOMEPATH,在console中能运行scala -version就可以了。

winlin:spark winlin$ scala -version
Scala code runner version 2.10.4 -- Copyright 2002-2013, LAMP/EPFL

在新建的Scala工程中,添加一个文件,譬如叫Winlin.scala,内容如下:

object Winlin {
def main(args: Array[String]) {
println("Hello, Scala!")
}
}

在IDEA中选择Run或者,直接执行命令scala Winlin.scala,得到结果:

winlin:src winlin$ scala Winlin.scala 
Hello, Scala!

IDEA和Scala就设置完成了。

Spark

安装好HDFS后,就下载对应版本的Spark,譬如Spark1.3.1+Hadoop2.6,解压和设置环境变量就可以了。

Spark的主要参考文档Overview,包括Deployment: Standalone,还有实例Examples,提交程序Spark Submit

Spark的两种部署模式:

  • Local: 本机模式,master和slave都部署在一台机器。需要使用IDEA调试必须这么部署,开发也可以这么部署。
  • Cluster: 集群模式,可以有StandaloneApache MesosHadoop YARN。一般可以使用Standalone。

这几种部署都需要先做以下步骤:

  1. 安装JDK,能正常执行命令:java -version
  2. 设置SSH无密码登录,能直接执行命令而不需要输入密码:ssh localhost,开发时可以使用一个公钥。
  3. 解压Spark,设置/etc/profile如下:
export SCALA_HOME=/usr/local/scala
export SPARK_HOME=/usr/local/spark
export HADOOP_PREFIX=/usr/local/hadoop
export PATH=$PATH:$SCALA_HOME/bin:$SPARK_HOME/bin:$HADOOP_PREFIX/bin

Spark Local

Spark以Local方式启动时,需要设置spark/conf/spark-env.sh,内容如下:

export SPARK_MASTER_IP=localhost

然后启动Spark:

/usr/local/spark/sbin/start-all.sh 

查看Spark的Master页面:http://localhost:8080/

Spark Standalone Cluster

作为集群启动时,需要修改spark/conf/spark-env.sh,导出Master的HOST:

export SPARK_MASTER_IP=hdfs.winlin.cn

其中Master会侦听这个地址,Worker会连接这个Master。

Slave上面还需要配置JAVA_HOME,启动时会提示找不到这个变量,修改spark/conf/spark-env.sh

export JAVA_HOME=/usr/local/jdk

启动Master的命令:

stop-master.sh && start-master.sh 

启动Slave的命令:

stop-slaves.sh && start-slaves.sh 

启动Master和Slave后,查看Master的页面可以看到Slave有了:http://hdfs.winlin.cn:8080/

IDEA Debug Spark Application

若需要使用IDEA调试,则必须是以Spark Local方式启动。

然后新建Scala工程HelloSpark,文件内容如下:

import org.apache.spark.{SparkContext, SparkConf}

object Winlin {
def main(args: Array[String]):Unit = {
val conf = new SparkConf().setAppName("HelloSpark").setMaster("spark://localhost:7077")
val spark = new SparkContext(conf)

/**
echo -e "ERROR: SRS\nTRACE:\nERROR: DOLPHIN\nVERBOSE:\nERROR: SRS">spark.log &&
hdfs dfs -rm -f /srs/spark.log && hdfs dfs -copyFromLocal spark.log /srs/spark.log &&
rm -f spark.log
*/

val textFile = spark.textFile("hdfs://hdfs.winlin.cn:9000/srs/spark.log")
val errors = textFile.filter(line => line.contains("ERROR"))
val total = errors.count()
var srs = errors.filter(line => line.contains("SRS")).count()

println("\nHello, Spark!")
println("ERRORs: " + total)
println("\tSRS: " + srs)
}
}

编译Project,将Project的CLASS目录路径设置到CLASSPATH。修改spark/conf/spark-env.sh

export SPARK_CLASSPATH=/Users/winlin/IdeaProjects/HelloSpark/out/production/HelloSpark
export SPARK_MASTER_IP=localhost

重启Spark:

/usr/local/spark/sbin/stop-all.sh &&
/usr/local/spark/sbin/start-all.sh

生成HDFS文件hdfs://hdfs.winlin.cn:9000/srs/spark.log,命令:

      echo -e "ERROR: SRS\nTRACE:\nERROR: DOLPHIN\nVERBOSE:\nERROR: SRS">spark.log &&
hdfs dfs -rm -f /srs/spark.log && hdfs dfs -copyFromLocal spark.log /srs/spark.log &&
rm -f spark.log

然后和调试Project,得到结果:

15/07/13 17:47:07 INFO DAGScheduler: Stage 1 (count at Winlin.scala:18) finished in 0.029 s
15/07/13 17:47:07 INFO TaskSchedulerImpl: Removed TaskSet 1.0, whose tasks have all completed, from pool
15/07/13 17:47:07 INFO DAGScheduler: Job 1 finished: count at Winlin.scala:18, took 0.035174 s

Hello, Spark!
ERRORs: 3
SRS: 2

注意:若没有将Project的out目录加入到CLASSPATH,那么会导致找不到Winlin.xxx的类的问题。

Spark Submit Application

一般向集群提交Spark Application,都是直接导出jar。然后使用命令提交。

新增IDEA的Project,文件内容如下:

import org.apache.spark.{SparkContext, SparkConf}

object Winlin {
def main(args: Array[String]):Unit = {
val conf = new SparkConf().setAppName("HelloSpark").setMaster("spark://hdfs.winlin.cn:7077")
val spark = new SparkContext(conf)

/**hdfshdf
echo -e "ERROR: SRS\nTRACE:\nERROR: DOLPHIN\nVERBOSE:\nERROR: SRS">spark.log &&
hdfs dfs -rm -f /srs/spark.log && hdfs dfs -copyFromLocal spark.log /srs/spark.log &&
rm -f spark.log
*/

val textFile = spark.textFile("hdfs://hdfs.winlin.cn:9000/srs/spark.log")
val errors = textFile.filter(line => line.contains("ERROR"))
val total = errors.count()
var srs = errors.filter(line => line.contains("SRS")).count()

println("\nHello, Spark!")
println("ERRORs: " + total)
println("\tSRS: " + srs)
}
}

注意:我们将Master设置为了spark://hdfs.winlin.cn:7077,可以在Spark Submit时指定这个。

设置IDEA中,File => Project Structure => Artifacts,添加一个JAR(From Modules….),然后选择Main Class,去掉Scala和Spark的jar打包,只打包Project相关的,勾上Build on Make这样在编译时就会打包。

然后选择Build => Build Artifacts...或者Build => Make Project,就可以看到生成了jar:

winlin:HelloSpark winlin$ tree out/artifacts/
out/artifacts/
└── HelloSpark_jar
└── HelloSpark.jar

然后使用命令直接提交,即执行:

winlin:HelloSpark winlin$ spark-submit out/artifacts/HelloSpark_jar/HelloSpark.jar
15/07/13 18:13:33 INFO DAGScheduler: Stage 1 (count at Winlin.scala:16) finished in 2.259 s
15/07/13 18:13:33 INFO TaskSchedulerImpl: Removed TaskSet 1.0, whose tasks have all completed, from pool
15/07/13 18:13:33 INFO DAGScheduler: Job 1 finished: count at Winlin.scala:16, took 2.266994 s

Hello, Spark!
ERRORs: 3
SRS: 2

本文完毕