更多内容,请访问 bbhhhh.github.io
环境:
hadoop-2.5.0-cdh5.2.1
spark-1.2.0-bin-hadoop2.4
master,
slave2 30G ram,32 vCore
slave4 60G ram,24 vCore
slave5 60G ram,24 vCore
测试用例:根据关联条件对2个文件进行关联操作,并将关联后的结果保存到HDFS上。主文件大小:13.1GB, 100086432条记录。关联文件大小:6.2GB,100086432条记录。关联后生成的文件大小:14.7GB,100086432条记录。
1 Spark配置说明
声明:以下spark配置都只需要在master节点上配置,不需要同步到slave节点上,一样生效。
1.1 Spark-env.sh
先来看spark on yarn 模式
# Options read in YARN client mode
# - SPARK_EXECUTOR_INSTANCES, Number ofworkers to start (Default: 2)
# - SPARK_EXECUTOR_CORES, Number of coresfor the workers (Default: 1).
# - SPARK_EXECUTOR_MEMORY, Memory perWorker (e.g. 1000M, 2G) (Default: 1G)
1. SPARK_EXECUTOR_INSTANCES 这个参数配在这里不起任何作用, 如果要指定executor的个数,可以通过spark-submit–num-executors 这个参数来动态指定,比修改配置文件来的方便。
2. SPARK_EXECUTOR_INSTANCES 这个参数的默认值是1, 配置文件中的注释是错的。
3. SPARK_EXECUTOR_CORES 这个参数不管是在这里还是通过 spark-submit –executor-cores参数配置,都不起作用,始终是1。
4. SPARK_EXECUTOR_MEMORY 这个参数在这里是起作用的,并且不单针对on yarn模式,同时针对 standalone模式。当然,也可以通过spark-submit –executor-memory 参数动态指定。
再来看standalone 模式
# Options for the daemons used in thestandalone deploy mode
# - SPARK_WORKER_CORES, to set the numberof cores to use on this machine
# - SPARK_WORKER_MEMORY, to set how muchtotal memory workers have to give executors (e.g. 1000m, 2g)
# - SPARK_WORKER_INSTANCES, to set thenumber of worker processes per node
1. SPARK_WORKER_CORES参数是指所有worker最多能使用的cpu 核数,默认是全部cpu资源,除非你希望限制使用数,否则不需要修改这个参数
2. SPARK_WORKER_MEMORY, 参数是指所有worker最多能使用的内存,默认是全部mem资源。除非你希望限制使用数,否则不需要修改这个参数
3. SPARK_WORKER_INSTANCES,每个节点运行的worker数量,默认是1,如果希望在standalone模式下提高每个节点同时运行的executor个数,就需要增大这个参数。
调优经验:
在spark standalone模式下,
大的SPARK_EXECUTOR_MEMORY+ 少的SPARK_WORKER_INSTANCES 运行性能要好于
小的SPARK_EXECUTOR_MEMORY+ 多的SPARK_WORKER_INSTANCES,在笔者硬件条件下,最佳组合是:
–executor-memory24G SPARK_WORKER_INSTANCES=1,该组合由于下列组合:
–executor-memory12G SPARK_WORKER_INSTANCES=2
–executor-memory6G SPARK_WORKER_INSTANCES=4
在spark on yarn模式下,
笔者通过测试不同的参数组合,在笔者的硬件条件下,发现最佳组合是:
–num-executors32 –executor-memory 4G,该组合要优于下列组合:
–num-executors16 –executor-memory 8G –num-executors 8 –executor-memory 16G, –num-executors 64–executor-memory 2G
1.2 spark-defaults.conf
该文件主要是配置log和history,内容如下:
spark.eventLog.dir hdfs://master:8020/directory
spark.eventLog.enabled true
spark.yarn.historyServer.address master:18080
奇怪的是在http://master:18080下只能看到笔者在sparkon yarn-cluster模式下运行的记录,其他spark standalone和spark on yarn-client的运行记录都看不到,不知道原因何在,若有高手知道望赐教,谢谢。
1.3 slaves
列出spark standalone模式下所有节点的主机名(不是ip地址)。
注意:该文件只有在sparkstandalone运行模式时才需要配置,如果是spark on yarn-client(cluster)模式,我们不需要节点的worker进程,可以将文件中的所有主机名注释掉,这样就不会在节点上启动worker进程了。如:
#slave2
#slave4
#slave5
2 Hadoop配置说明
Hadoop的配置不同于spark,有的需要在master上配,有的需要在slave上配。
归纳:master上负责每个container最多能使用的资源数量。而slave上负责本节点最多能提供的资源数量。前者必须小于后者。
2.1 yarn-site.xml
2.1.1 在master节点上
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>256</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>20480</value><!-- must less than the max mem one slave nodemanager can allocat -->
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>2</value>
</property>
以上4个参数要配置在master上,配置到slave上不起作用。
yarn.scheduler.maximum-allocation-mb节点上最多分配给每个container的内存量,必须小于yarn.nodemanager.resource.memory-mb最小的那个节点。
在我们的环境中,slave2的物理内存最小,它的yarn.nodemanager.resource.memory-mb= 22G,因此master上的yarn.scheduler.maximum-allocation-mb必须小于22G。
该参数同时会影响到spark onyarn模式,--executor-memory 必须小于该值减去 384MB,否则spark任务报错。
yarn.scheduler.maximum-allocation-vcores节点上分配个每个container的cpu核数,必须小于yarn.nodemanager.resource.cpu-vcores 最小的那个节点。
2.1.2 在salve节点上
以上在master节点配的4个参数你即使配到slave上也不起作用。Slave上关键的参数是下面2个:
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>32</value>
<description></description>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>22528</value>
</property>
yarn.nodemanager.resource.cpu-vcores,该节点最多可使用的cpu核数(cpu资源管理),
yarn.nodemanager.resource.memory-mb该节点最多可使用的内存数(内存资源管理)
这2个参数值每个节点根据节点实际硬件情况定。
2.2 mapred-site.xml
2.2.1 在master节点上
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx8192m</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value>
</property>
<property>
<name>mapreduce.map.cpu.vcores</name>
<value>1</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>8192</value>
</property>
<property>
<name>mapreduce.reduce.cpu.vcores</name>
<value>2</value>
</property>
以上几个参数配置到slave上不起作用。
mapred.child.java.opts配置java参数,如-Xmx,默认是200m,太小了,按照reduce任务最多需要的量来配置。但不能超过master上的yarn.scheduler.maximum-allocation-mb值。
mapreduce.map.memory.mb每个map任务的内存量,不能超过-Xmx值。
mapreduce.map.cpu.vcores每个map任务的cpu核数,不能超过master上的yarn.scheduler.maximum-allocation-vcores
mapreduce.reduce.memory.mb每个reduce任务的内存量,不能超过-Xmx值。
mapreduce.reduce.cpu.vcores每个reduce任务的cpu核数,不能超过master上的yarn.scheduler.maximum-allocation-vcores
2.2.2 在salve节点上
除了不需要配置以上master的5个参数,其他与master一致即可。