1、命令介绍
啥话不说先看一组命令吧
#submit.sh CONF_DIR=//demoFile APP_CONF=app.conf spark-submit --class com.thinkenergy.AlarmApp --master yarn --deploy-mode cluster --driver-memory 6g --driver-cores 2 --executor-memory 8g --executor-cores 4 --num-executors 10 --conf spark.dynamicAllocation.enabled=false --conf spark.driver.extraClassPath=/etc/hbase/conf --conf spark.yarn.maxAppAttempts=1 --conf spark.sql.shuffle.partitions=20 --conf spark.yarn.submit.waitAppCompletion=false --conf spark.yarn.executor.memoryOverHead=2028 --keytab /appserv/tsinghua/gcy.gybatt.keytab --driver-java-options "-Djava.security.krb5.conf=/etc/krb5.conf" --conf "spark.executor.extraJavaOptions=-Djava.security.krb5.conf=/etc/krb5.conf" --conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=/demoFile/jaas.conf" --files $CONF_DIR/APP_CONF,CONF_DIR/log4j.properties,/demoFile/krb5.conf,/demoFile/jaas.conf --jars /demoFile/xxxjava-1.0.jar
这是我们运行某项目时候的执行脚本,看起来是不是还可以?不着急 ,我们慢慢来哈。
接下来我们上一个任务参数介绍表:
| 参数名 | 参数说明 |
|---|---|
| –master | master 的地址,提交任务到哪里执行,例如 spark://host:port, yarn, local,这里我们用到的最多的是其实是local[](这里是指使用本机电脑的所有核,亦可以改成你想要的核数,比如四核:4),也就是本地调试。其他的还可以是mesos://host:port,k8s://HOST:PORT等等资源容器,这里的yarn就是hadoop的资源管理器。看来hadoop还是很重要的。 |
| –name | 这里是我们提交任务的名称,比如 “WordCount App” |
| –jars | 这个是我们的jar包,如上/demoFile/xxxjava-1.0.jar |
| –packages | 包含在driver 和executor 的 classpath 中的 jar 的 maven 坐标 |
| –exclude-packages | 为了避免冲突 而指定不包含的 package |
| –repositories | 远程 repository |
| –conf PROP=VALUE | 指定 spark 配置属性的值,通过这些Key-values的键值对可以设置我们的集群节点资源等信息,例如spark.yarn.executor.memoryOverHead=2028,控制我们集群子节点的对外内存,放置内存太小,不够JVM的开销。当我们在真正开发,遇到内存溢出等问题的时候,可以考虑一下这里的设置 |
| –properties-file | 加载的配置文件路径。这个的目的是便于测试,或者便于部署。通过修改配置文件路径,来控制运行环境。 |
| –driver-memory | Driver内存,我们集群driver的任务可用资源,缺省默认 1G,一般情况下下,相对executor,它消耗内存不会太大,因为driver一般都是任务的控制节点。 |
| –driver-java-options | 传给 driver 的额外的 Java 选项 |
| –driver-library-path | 传给 driver 的额外的库路径 |
| –driver-class-path | 传给 driver 的额外的类路径 |
| driver-cores | 允许集群dirver使用的核数 |
| –executor-core | 每个 executor 的核数。这个参数决定了每个Executor进程并行执行task线程的能力,在yarn或者standalone下使用 |
| –executor-memory | 允许使用的executor的内存大小,因为executor是我们任务的执行节点,一般可以按照资源分配合适的情况下可以多给一点。这里缺省默认是1G。 |
| –num-executors | 启动的 Executor进程数量。可以是集群节点以及目前执行任务个数而定在,一般情况下下可以除去dirver,尽量的多给就可以,每个Spark作业的运行一般设置50~100个左右的Executor进程比较合适,设置太少或太多的Executor进程都不好,这里要说明一下,executor和物理节点不是一回事。 yarn 下使用缺失默认默认为2。 |
| –total-executor-cores | 所有 executor 总共的核数。仅仅在 mesos 或者 standalone 下使用。这个就是total-executor-cores = executor-core*num-executor |
上面是绝大部分用得到的参数设置了,还有一些可能大姐也不会遇到,所以暂时不说了,等我真正的需要设置的时候,在介绍吧,否则也只是纸上谈兵。
2、设置技巧
看了这么多复杂的设置,那在我们提交任务的会后我们应该怎么设置了?
我们下来看一个腾讯云大佬的实验例子:https://cloud.tencent.com/developer/ask/52337;
| 节点 | CPU | RAM | HDD |
|---|---|---|---|
| host1 | Core i7-4790(内核数量:4,线程数量:8) | 32GB(8GB x 4) | 8TB(2TB x 4) |
| host2 | Core i7-4790(内核数量:4,线程数量:8) | 32GB(8GB x 4) | 8TB(2TB x 4) |
| host3 | Core i7-4790(内核数量:4,线程数量:8) | 32GB(8GB x 4) | 8TB(2TB x 4) |
- 网络:1Gb
- Spark版本:1.0.0
- Hadoop版本:2.4.0(Hortonworks HDP 2.1)
- Spark工作流程:sc.textFile - > filter - > map - > filter - > mapToPair - > reduceByKey - > map - > saveAsTextFile
- 输入数据: 类型:单个文本文件,
大小:165GB,
行数:454,568,833。 - 输出数据: 第二次过滤后的行数:310,640,717
结果文件的行数:99,848,268
结果文件的大小:41GB
| 方案 | 参数设置 | 任务时间 |
|---|---|---|
| 方案1 | –master yarn-client --executor-memory 19G --executor-cores 7 --num-executors 3(每个数据节点的执行者,尽可能多地使用核心) | 50分15秒 |
| 方案2 | –master yarn-client --executor-memory 19G --executor-cores 4 --num-executors 3 (减少了内核数量) | 55分48秒 |
| 方案3 | –master yarn-client --executor-memory 4G --executor-cores 2 --num-executors 12 (少核心,多执行 | 31分23秒 |
可以看到方案三的时间是最少的。有人会问,方案1那么多的内存为什么会是比方案3慢呢?
主要是因为虽然内存给的大,但是任务的速度却没有提高,大部分数据加载在内存里面处于排队状态,但是方案3num-executors给的多,任务的并行度会高一下,排队等待的时间少,所以会快。



