# Note: Env variable `SPARK_CLASSPATH` has been deprecated in Spark 1.0+.
vim $SPARK_HOME/conf/spark-env.sh
SPARK_CLASSPATH=$SPARK_CLASSPATH:/opt/spark/external_jars/*
# 指定 spark.driver.extraClassPath,不要在程序 SparkConf 中指定,因为那时候 JVM 已经启动了。
spark-submit --driver-class-path /somepath/project/mysql-connector-java-5.1.30-bin.jar --jars /somepath/project/mysql-connector-java-5.1.30-bin.jar
然后将所有依赖的jars包放到external_jars
文件夹下就可以了。
上面所说的所有路径,集群所有节点都需要复制一份完全相同jar文件。
Spark On YARN
方式1:YARN Application 依赖的路径在 YARN 中的yarn.application.classpath
配置。将 jar 包放在该配置项指定的路径下即可。
方式2:在conf/spark-defaults.conf
配置spark.yarn.archive
或spark.yarn.jars
。详细介绍
客户端模式和集群模式的最主要的区别
客户端模式比较适合开发调试,因为它是在同一物理位置(即同一网关)的服务器上提交应用程序,Driver直接在用户的spark-submit进程(client)中启动,应用程序的输入和输出连接到控制台,能够快速的看到application的输出,比较适合开发和测试
如果应用程序是在远离Worker节点的某台机器上提交的(比如你远程开发的电脑),一般使用Cluster模式,这样可以使Drivers和Executors之间的网络延迟最小化,比较适合生产环境。
从深层次讲,他们的区别就是Application Master进程的区别,yarn-cluster模式下,driver运行在am(application master)中,他(driver)负责向yarn申请资源,并监督作业的运行状况,当用户提交了作业之后就可以关掉client了,作业会继续在yarn上运行。而client模式下am仅仅向yarn请求executor。driver运行在client中,client会和请求的container通信来调度他们的工作,也就是说不能关掉client(client 模式下你的 spark-submit 启动的进程,ctrl + c 你提交的任务就停了!)。
client模式下,am向yarn请求资源,client进行监督调度,所以spark yarn-client模式的配置都是以spark.am开头
cluster模式下,driver向yarn请求资源,并监督作业运行,所以spark yarn-cluster模式的配置以spark.driver开头
附:cluster模式的日志是下面这个样子的,因为具体的 driver 日志都返回到 driver 了,因此你看不到具体的日志信息,只能看到心跳信息。
17/04/07 18:27:10 INFO yarn.Client: Application report for application_1491557185266_0001 (state: RUNNING)
17/04/07 18:27:11 INFO yarn.Client: Application report for application_1491557185266_0001 (state: RUNNING)
17/04/07 18:27:12 INFO yarn.Client: Application report for application_1491557185266_0001 (state: RUNNING)
17/04/07 18:27:13 INFO yarn.Client: Application report for application_1491557185266_0001 (state: RUNNING)
17/04/07 18:27:14 INFO yarn.Client: Application report for application_1491557185266_0001 (state: RUNNING)
17/04/07 18:27:15 INFO yarn.Client: Application report for application_1491557185266_0001 (state: RUNNING)
Spark 指定执行用户
在shell中指定环境变量
export HADOOP_USER_NAME=hdfs
在程序中指定环境变量
System.setProperty("HADOOP_USER_NAME", "hdfs")
在 spark executor 指定执行用户
val sparkConf = new SparkConf()
sparkConf.set("HADOOP_USER_NAME", "hdfs")
SparkSubmit 源码
spark-submit
具体的执行逻辑都在spark-core org.apache.spark.deploy.SparkSubmit
的main
方法中。
SparkShell
What do the numbers on the progress bar mean in spark-shell?
[Stage7:===========> (14174 + 5) / 62500]
What you get is a Console Progress Bar, [Stage 7: shows the stage you are in now, and (14174 + 5) / 62500]
is (numCompletedTasks + numActiveTasks) / totalNumOfTasksInThisStage]
. The progress bar shows numCompletedTasks / totalNumOfTasksInThisStage
.
It will be shown when both spark.ui.showConsoleProgress
is true (by default) and log level in conf/log4j.properties
is ERROR or WARN (!log.isInfoEnabled is true).
# Help
$ spark-shell -h
$ spark-shell \
--master yarn \
--driver-cores 4 \
--driver-memory 8G \
--num-executors 40 \
--executor-memory 30G \
--executor-cores 4 \
--conf "spark.yarn.maxAppAttempts=1" \
--packages com.databricks:spark-avro_2.11:4.0.0