Spark的YARN模式部署
1:Spark的编译
Spark可以通过SBT(Scala Build Tool)或者Maven来编译,官方提供的二进制安装文件是用Maven编译,如果是要在YARN集群上运行的话,还需要再用SBT编译一下,生成YARN client端使用的jar包;最好是直接对源码使用SBT进行编译而生成YARN client端使用的jar包。笔者在测试过程中,对Maven编译过的Spark进行SBT二次编译后,在运行部分例子的时候有错误发生。
A:Maven编译
笔者使用的环境曾经编译过Hadoop2.2.0(参见hadoop2.2.0源码编译(CentOS6.4)),所以不敢确定Maven编译过程中,Spark是不是需要编译Hadoop2.2.0中使用的部分底层软件(看官方资料是需要Protobuf2.5)。除了网络下载不给力而不断的中止、然后重新编译而花费近1天的时间外,编译过程还是挺顺利的。
maven编译时,首先要进行设置Maven使用的内存项配置:
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
然后用Maven编译:
mvn -Pnew-yarn -Dhadoop.version=2.2.0 -Dyarn.version=2.2.0 -DskipTestspackage
参考文档:Building Spark with Maven
B:SBT编译
Spark源码和二进制安装包都绑定了SBT。值得注意的是,如果要使用Scala进行Spark应用开发,必须使用和Spark版本相对应版本的Scala,如:Spark0.8.1对应的Scala2.9.3。对于不匹配的Scala应用开发可能会不能正常工作。
SBT编译命令:
SPARK_HADOOP_VERSION=2.2.0 SPARK_YARN=true ./sbt/sbt assembly
二种编译都是在Spark根目录下运行。在SBT编译过程中如果网络不给力,手工中断编译(ctrl+z)后要用kill-9 将相应的进程杀死后,然后再重新编译,不然会被之前的sbt进程锁住而不能重新编译。
2:Spark运行
Spark可以单独运行,也可以在已有的集群上运行,如Amazon EC2、Apache Mesos、Hadoop YARN。下面用Spark自带的例程进行测试,运行的时候都是在Spark的根目录下进行。如果需要知道运行更详细的信息,可以使用log4j,只要在根目录下运行:
cp conf/log4j.properties.template conf/log4j.properties
A:本地运行
./run-example org.apache.spark.examples.SparkPi local
也可以多线程方式运行,下面的命令就是开4个线程。
./run-example org.apache.spark.examples.SparkPi local[4]
B:YARN集群
启动Hadoop2.2.0集群
确保环境变量HADOOP_CONF_DIR或YARN_CONF_DIR已经设置
在YARN集群中运行Spark应用程序的命令:
- SPARK_JAR=<SPARK_ASSEMBLY_JAR_FILE> ./spark-classorg.apache.spark.deploy.yarn.Client \
- --jar <YOUR_APP_JAR_FILE> \
- --class <APP_MAIN_CLASS> \
- --args <APP_MAIN_ARGUMENTS> \
- --num-workers <NUMBER_OF_WORKER_MACHINES> \
- --master-class <ApplicationMaster_CLASS>
- --master-memory <MEMORY_FOR_MASTER> \
- --worker-memory <MEMORY_PER_WORKER> \
- --worker-cores <CORES_PER_WORKER> \
- --name <application_name> \
- --queue <queue_name> \
- --addJars <any_local_files_used_in_SparkContext.addJar> \
- --files <files_for_distributed_cache> \
- --archives <archives_for_distributed_cache>
例1计算PI,可以看出程序运行时是先将运行文件上传到Hadoop集群的,所以客户端最好是和Hadoop集群在一个局域网里。
- SPARK_JAR=./assembly/target/scala-2.9.3/spark-assembly-0.8.1-incubating-hadoop2.2.0.jar \
- ./spark-class org.apache.spark.deploy.yarn.Client \
- --jar examples/target/scala-2.9.3/spark-examples-assembly-0.8.1-incubating.jar \
- --class org.apache.spark.examples.SparkPi \
- --args yarn-standalone \
- --num-workers 3 \
- --master-memory 2g \
- --worker-memory 2g \
- --worker-cores 1
例2计算TC
- SPARK_JAR=./assembly/target/scala-2.9.3/spark-assembly-0.8.1-incubating-hadoop2.2.0.jar \
- ./spark-class org.apache.spark.deploy.yarn.Client \
- --jar examples/target/scala-2.9.3/spark-examples-assembly-0.8.1-incubating.jar \
- --class org.apache.spark.examples.SparkTC \
- --args yarn-standalone \
- --num-workers 3 \
- --master-memory 2g \
- --worker-memory 2g \
- --worker-cores 1
点击Tracking UI中的相应链接可以查看Spark的运行信息: