IDEA调试SPARK程序
为SPARK部署好HDFS后,就可以部署SPARK环境了。如何部署HDFS参考HDFS。
IDEA for Scala
在Scala官网,就有IDE的说明,IDEA中比较方便的编写和调试Scala程序。步骤如下:
- 下载IDEA社区版,注意你的版本,譬如是
IDEA 14.0.3
,特别是Build #IC-139.1117
。Scala插件要求IDEA的指定版本。 - 下载Scala Plugin for IDEA,选择你的IDEA对应的版本,譬如
139.1117
对应的是1.4
,它适配的范围是139.791 - 140
。 - 安装好IDEA后,启动后选择
configure => plugins
,然后从硬盘安装,选择下载的Scala Plugin的zip文件,就可以安装好了。 - 重启IDEA后,新建Project就可以看到Scala了。
新建Scala工程,普通的Scala就可以,不用选SBT
之类的工程。新建后一般是空的工程,新建时可能需要选择JDK或者Scala SDK之类的,都一一设置好。
至于Scala SDK如何设置,就和JDK一样,下载Scala后,解压到一个目录,然后在/etc/profile
中设置SCALA_HOME
和PATH
,在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: 集群模式,可以有Standalone、Apache Mesos、Hadoop YARN。一般可以使用Standalone。
这几种部署都需要先做以下步骤:
- 安装JDK,能正常执行命令:
java -version
。 - 设置SSH无密码登录,能直接执行命令而不需要输入密码:
ssh localhost
,开发时可以使用一个公钥。 - 解压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
本文完毕