Spark的YARN模式部署
1:Spark的編譯
Spark可以通過(guò)SBT(Scala Build Tool)或者M(jìn)aven來(lái)編譯,官方提供的二進(jìn)制安裝文件是用Maven編譯,如果是要在YARN集群上運(yùn)行的話,還需要再用SBT編譯一下,生成YARN client端使用的jar包;最好是直接對(duì)源碼使用SBT進(jìn)行編譯而生成YARN client端使用的jar包。筆者在測(cè)試過(guò)程中,對(duì)Maven編譯過(guò)的Spark進(jìn)行SBT二次編譯后,在運(yùn)行部分例子的時(shí)候有錯(cuò)誤發(fā)生。
A:Maven編譯
筆者使用的環(huán)境曾經(jīng)編譯過(guò)Hadoop2.2.0(參見hadoop2.2.0源碼編譯(CentOS6.4)),所以不敢確定Maven編譯過(guò)程中,Spark是不是需要編譯Hadoop2.2.0中使用的部分底層軟件(看官方資料是需要Protobuf2.5)。除了網(wǎng)絡(luò)下載不給力而不斷的中止、然后重新編譯而花費(fèi)近1天的時(shí)間外,編譯過(guò)程還是挺順利的。
maven編譯時(shí),首先要進(jìn)行設(shè)置Maven使用的內(nèi)存項(xiàng)配置:
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源碼和二進(jìn)制安裝包都綁定了SBT。值得注意的是,如果要使用Scala進(jìn)行Spark應(yīng)用開發(fā),必須使用和Spark版本相對(duì)應(yīng)版本的Scala,如:Spark0.8.1對(duì)應(yīng)的Scala2.9.3。對(duì)于不匹配的Scala應(yīng)用開發(fā)可能會(huì)不能正常工作。
SBT編譯命令:
SPARK_HADOOP_VERSION=2.2.0 SPARK_YARN=true ./sbt/sbt assembly
二種編譯都是在Spark根目錄下運(yùn)行。在SBT編譯過(guò)程中如果網(wǎng)絡(luò)不給力,手工中斷編譯(ctrl+z)后要用kill-9 將相應(yīng)的進(jìn)程殺死后,然后再重新編譯,不然會(huì)被之前的sbt進(jìn)程鎖住而不能重新編譯。
2:Spark運(yùn)行
Spark可以單獨(dú)運(yùn)行,也可以在已有的集群上運(yùn)行,如Amazon EC2、Apache Mesos、Hadoop YARN。下面用Spark自帶的例程進(jìn)行測(cè)試,運(yùn)行的時(shí)候都是在Spark的根目錄下進(jìn)行。如果需要知道運(yùn)行更詳細(xì)的信息,可以使用log4j,只要在根目錄下運(yùn)行:
cp conf/log4j.properties.template conf/log4j.properties
A:本地運(yùn)行
./run-example org.apache.spark.examples.SparkPi local
也可以多線程方式運(yùn)行,下面的命令就是開4個(gè)線程。
./run-example org.apache.spark.examples.SparkPi local[4]
B:YARN集群
啟動(dòng)Hadoop2.2.0集群
確保環(huán)境變量HADOOP_CONF_DIR或YARN_CONF_DIR已經(jīng)設(shè)置
在YARN集群中運(yùn)行Spark應(yīng)用程序的命令:
- 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計(jì)算PI,可以看出程序運(yùn)行時(shí)是先將運(yùn)行文件上傳到Hadoop集群的,所以客戶端最好是和Hadoop集群在一個(gè)局域網(wǎng)里。
- 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計(jì)算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
點(diǎn)擊Tracking UI中的相應(yīng)鏈接可以查看Spark的運(yùn)行信息: