spark on yarn

本文详细介绍了如何在YARN环境下配置Spark与Hadoop,包括配置yarn-site.xml文件以支持mapreduce_shuffle和spark_shuffle,设置环境变量确保Spark正确访问Hadoop资源,以及如何通过spark-submit命令提交不同类型的作业,如PI计算和文本处理任务。同时,提供了在yarn-cluster和yarn-client模式下执行作业的示例,并强调了配置YARN和HDFS的前置条件。

说明

这篇文章记录下 spark提交左右在yarn上运行

hadoop配置

主要配置yarn-site.xml文件,我们目前使用mapreduce_shuffle,而有些公司也增加了spark_shuffle

  • 只使用mapreduce_shuffle

    <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
    </property>
    
    <property>
      <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
      <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    
    <property>
      <name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
      <value>org.apache.spark.network.yarn.YarnShuffleService</value>
    </property>
    • 使用mapreduce_shuffle & spark_shuffle
    <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle,spark_shuffle</value>
    </property>
    
    <property>
      <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
      <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    
    <property>
      <name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
      <value>org.apache.spark.network.yarn.YarnShuffleService</value>
    </property>

当提交hadoop MR 就启用,mapreduce_shuffle,当提交spark作业 就使用spark_shuffle,但个人感觉spark_shuffle 效率一般,shuffle是很大瓶颈,还有 如果你使用spark_shuffle 你需要把spark-yarn_2.10-1.4.1.jar 这个jar copy 到HADOOP_HOME/share/hadoop/lib下 ,否则 hadoop 运行报错 class not find exeception

spark配置

$SPARK_HOME/conf/spark-env.sh

export YARN_CONF_DIR=/home/cluster/apps/hadoop/etc/hadoop

export JAVA_HOME=/home/cluster/share/java1.7
export SCALA_HOME=/home/cluster/share/scala-2.10.5
export HADOOP_HOME=/home/cluster/apps/hadoop
export HADOOP_CONF_DIR=/home/cluster/apps/hadoop/etc/hadoop
export SPARK_MASTER_IP=master

export SPARK_LIBRARY_PATH=$SPARK_LIBRARY_PATH:/home/cluster/apps/hadoop/lib/native
export SPARK_CLASSPATH=$SPARK_CLASSPATH:/home/cluster/apps/hadoop/share/hadoop/yarn/*:/home/cluster/apps/hadoop/share/hadoop/yarn/lib/*:/home/cluster/apps/hadoop/share/hadoop/common/*:/home/cluster/apps/hadoop/share/hadoop/common/lib/*:/home/cluster/apps/hadoop/share/hadoop/hdfs/*:/home/cluster/apps/hadoop/share/hadoop/hdfs/lib/*:/home/cluster/apps/hadoop/share/hadoop/mapreduce/*:/home/cluster/apps/hadoop/share/hadoop/mapreduce/lib/*:/home/cluster/apps/hadoop/share/hadoop/tools/lib/*:/home/cluster/apps/spark/spark-1.4.1/lib/*

SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=3 -Dspark.history.fs.logDirectory=hdfs://master:8020/var/log/spark"

参数解释:
YARN_CONF_DIR:指定yarn配置所在路径,如果不增加这行,在提交作业时候增加如下代码:

export YARN_CONF_DIR=/home/cluster/apps/hadoop/etc/hadoop

HADOOP_HOME:指定hadoop 根目录
HADOOP_CONF_DIR:hadoop配置文件,这个是在spark,如操作hdfs时候读取hadoop配置文件
SPARK_LIBRARY_PATH:告诉spark读取本地的.so文件
SPARK_CLASSPATH:spark加载各种需要的jar包
SPARK_HISTORY_OPTS:配置启动spark history 服务

前置条件

如果操作hdfs,需要启动namenode&datanode
还有yarn服务器,resourcemanger&nodemanager

 /home/cluster/apps$ jps
29368 MainGenericRunner
29510 Jps
22885 Main
29210 NodeManager
28952 NameNode
29158 ResourceManager
29023 DataNode

提交作业

  1. PI:

    • yarn-cluster模式:
    /home/cluster/apps/spark/spark-1.4.1/bin/spark-submit --master yarn-cluster --executor-memory 3g   --driver-memory 1g  --class org.apache.spark.examples.SparkPi /home/cluster/apps/spark/spark-1.4.1/examples/target/scala-2.10/spark-examples-1.4.1-hadoop2.3.0-cdh5.1.0.jar  10
    • yarn-client模式:
    /home/cluster/apps/spark/spark-1.4.1/bin/spark-submit --master yarn-client --executor-memory 3g   --driver-memory 1g  --class org.apache.spark.examples.SparkPi /home/cluster/apps/spark/spark-1.4.1/examples/target/scala-2.10/spark-examples-1.4.1-hadoop2.3.0-cdh5.1.0.jar  10
  2. wordcount:

    • yarn-cluster模式:
    /home/cluster/apps/spark/spark-1.4.1/bin/spark-submit --master yarn-cluster --executor-memory 3g   --driver-memory 1g  --class org.apache.spark.examples.JavaWordCount /home/cluster/apps/spark/spark-1.4.1/examples/target/scala-2.10/spark-examples-1.4.1-hadoop2.3.0-cdh5.1.0.jar /data/hadoop/wordcount/
    • yarn-client模式:
    /home/cluster/apps/spark/spark-1.4.1/bin/spark-submit --master yarn-client --executor-memory 3g   --driver-memory 1g  --class org.apache.spark.examples.JavaWordCount /home/cluster/apps/spark/spark-1.4.1/examples/target/scala-2.10/spark-examples-1.4.1-hadoop2.3.0-cdh5.1.0.jar /data/hadoop/wordcount/

结果截图

这里写图片描述
这四条记录从下往上看,分别是PI:yarn-cluster模式,PI:yarn-client模式,wordcount:yarn-cluster模式,wordcount:yarn-client模式

尊重原创,拒绝转载
http://blog.youkuaiyun.com/stark_summer/article/details/48661317

<think> 我们正在讨论SparkYARN上的使用、配置及运行机制。根据用户提供的引用内容,特别是引用[1]和引用[2]中关于YARN上运行SparkMapReduce的信息,我们可以进行如下组织: 1. **运行模式**:YARN-client和YARN-cluster模式的区别(引用[1]提到Driver的位置)。 2. **提交作业**:如何提交Spark作业到YARN集群。 3. **配置**:关键配置项,特别是内存配置(包括PermGen,虽然JDK1.8后移除了PermGen,但用户引用中提到了,所以需要说明)。 4. **运行机制**:结合引用[2]中MapReduceYARN上的运行机制,类比SparkYARN上的运行机制(因为Spark的ApplicationMaster也是类似的工作方式)。 5. **常见问题**:比如内存配置问题、调试等。 注意:用户引用[3]是关于MapReduce的,但我们可以忽略,因为用户明确要求Spark。 下面开始组织回答: ### Spark on YARN 详解 #### 一、运行模式 Spark支持两种模式在YARN上运行: 1. **YARN-client模式**(适用于交互式场景): - Driver运行在**提交作业的客户端机器**上 - Executor运行在YARN容器中 - 日志可直接在客户端查看,但客户端必须保持在线 2. **YARN-cluster模式**(适用于生产环境): - Driver运行在**YARN集群的某个容器**中 - Executor同样运行在YARN容器中 - 客户端提交作业后即可断开连接 > **注意**:在JDK1.8之前,YARN-cluster模式下Driver的JVM永久代(PermGen)可能使用默认值(如82MB),容易导致`OutOfMemoryError`。需通过`-XX:MaxPermSize`调整(但JDK1.8及以上已移除PermGen,改为Metaspace)[^1]。 #### 二、作业提交流程 ```mermaid flowchart TD Client[客户端] -->|1.提交应用| RM[ResourceManager] RM -->|2.分配容器| AM[Spark ApplicationMaster] AM -->|3.申请资源| RM RM -->|4.分配容器| NM[NodeManager] NM -->|5.启动Executor| Container[Executor容器] Container -->|6.注册与通信| AM ``` 1. **提交应用** 使用`spark-submit`提交作业: ```bash spark-submit --master yarn \ --deploy-mode cluster \ # 或client --class org.apache.spark.examples.SparkPi \ /path/to/examples.jar 100 ``` 2. **资源分配** - ResourceManager分配容器启动ApplicationMaster(AM) - AM向RM申请Executor资源(容器) - 每个Executor容器运行一个JVM进程 3. **任务执行** - AM将任务分发给Executor执行 - Executor通过心跳向AM汇报状态 #### 三、关键配置 在`spark-defaults.conf`中配置: | 配置项 | 说明 | 示例值 | |--------|------|--------| | `spark.yarn.am.memory` | AM内存 | 1g | | `spark.executor.memory` | Executor内存 | 2g | | `spark.executor.cores` | Executor核数 | 2 | | `spark.driver.memory` | Driver内存(client模式) | 1g | 环境变量配置(`spark-env.sh`): ```bash export HADOOP_CONF_DIR=/etc/hadoop/conf # 指向Hadoop配置目录 export YARN_CONF_DIR=/etc/hadoop/conf # 同上 ``` #### 四、内存优化指南 1. **堆内存管理** - Executor总内存 = `spark.executor.memory` + `spark.executor.memoryOverhead` - 内存溢出时增加`spark.yarn.executor.memoryOverhead`(默认executor内存的10%) 2. **Metaspace配置**(JDK1.8+) ```bash spark-submit --conf spark.executor.extraJavaOptions="-XX:MaxMetaspaceSize=256m" ... ``` 3. **堆外内存优化** 调整`spark.memory.offHeap.size`启用堆外内存 #### 五、问题排查 1. **查看日志** ```bash yarn logs -applicationId <app_id> ``` 2. **监控资源** - YARN Web UI:`http://<rm-address>:8088` - Spark Web UI:通过`http://<am-address>:4040`查看(需配置历史服务器) #### 六、与MapReduce对比 | **特性** | **MapReduce on YARN** | **Spark on YARN** | |----------|-----------------------|-------------------| | 计算模型 | 多阶段Map/Reduce | 内存迭代计算 | | 任务启动 | 每个任务单独JVM | Executor进程复用 | | 数据缓存 | HDFS读写 | 内存+磁盘缓存 | | 适用场景 | 批处理 | 批处理+流处理+机器学习 | --- ### 相关问题 1. 如何解决Spark on YARN的`NoSuchMethodError`类冲突问题? 2. 如何动态调整Spark on YARN的Executor数量? 3. Spark on YARN如何配置高可用(HA)? 4. 如何优化Spark Shuffle过程在YARN上的性能? 5. 在容器化环境中(如K8s)运行Spark on YARN有哪些注意事项?[^1][^2] </think> ### Spark on YARN 全面解析 SparkYARN上的运行结合了资源管理的高效性和Spark内存计算的灵活性,核心机制如下: #### 一、运行机制与架构 ```mermaid flowchart TD Client[客户端] -->|1.提交应用| RM[ResourceManager] RM -->|2.分配容器| AM[Spark ApplicationMaster] AM -->|3.申请资源| RM RM -->|4.分配容器| NM[NodeManager] NM -->|5.启动Executor| Container[Executor容器] Container -->|6.注册与通信| AM ``` 1. **两种部署模式** - **YARN-client模式** Driver运行在**客户端机器**上,直接控制任务执行(适合调试) ```bash spark-submit --master yarn --deploy-mode client ``` - **YARN-cluster模式** Driver运行在**YARN容器**中(生产环境推荐),需注意JVM配置差异[^1]: ```bash spark-submit --master yarn --deploy-mode cluster ``` 2. **核心组件交互** - ApplicationMaster(AM):Spark专属AM,负责向RM申请资源 - Executor:运行任务的容器,每个Executor对应一个JVM进程 - 资源本地化:优先将任务调度到数据所在的NodeManager #### 二、关键配置项 在`spark-defaults.conf`中配置: | **配置项** | **说明** | **示例值** | |------------|----------|------------| | `spark.yarn.am.memory` | AM内存 | 1g | | `spark.executor.memory` | Executor堆内存 | 4g | | `spark.executor.cores` | Executor核数 | 2 | | `spark.dynamicAllocation.enabled` | 动态资源分配 | true | **内存组成**: $$ \text{总容器内存} = \text{spark.executor.memory} + \text{spark.executor.memoryOverhead} $$ Executor实际内存包含堆内存 + 堆外内存(默认取`max(384MB, 0.1 * executorMemory)`) #### 三、作业提交流程 1. **提交命令** ```bash spark-submit --master yarn \ --deploy-mode cluster \ --executor-memory 4g \ --num-executors 10 \ --class org.apache.spark.examples.SparkPi \ /path/to/examples.jar 100 ``` 2. **资源申请策略** - 初始申请:AM启动后立即申请`spark.dynamicAllocation.initialExecutors`个Executor - 动态伸缩:根据任务积压情况自动增减Executor(需启用`spark.dynamicAllocation.enabled`) #### 四、调优实践 1. **内存优化** - 解决PermGen问题(JDK1.8前): ```bash spark-submit --conf spark.executor.extraJavaOptions="-XX:MaxPermSize=256m" ``` - JDK1.8+优化Metaspace: ```bash spark-submit --conf spark.executor.extraJavaOptions="-XX:MaxMetaspaceSize=512m" ``` 2. **数据本地化** 配置等待本地化任务的超时时间: ```scala spark.locality.wait = 3s // 默认3秒 ``` 3. **Shuffle优化** ```scala spark.shuffle.service.enabled = true // 启用外部Shuffle服务 spark.shuffle.compress = true // 压缩Shuffle输出 ``` #### 五、故障排查 1. **日志查看** ```bash yarn logs -applicationId <app_id> # 获取完整日志 ``` 2. **Web UI监控** - YARN RM UI:`http://<rm-host>:8088` - Spark UI:通过`http://<am-host>:4040`访问(需提前配置端口转发) 3. **常见错误** - **Executor丢失**:检查内存配置,增加`spark.executor.memoryOverhead` - **类冲突**:使用`spark.jars.packages`指定依赖 #### 六、与MapReduce对比 | **特性** | **MapReduce on YARN** | **Spark on YARN** | |----------|------------------------|-------------------| | 计算模型 | 磁盘迭代 | 内存迭代 | | 任务启动 | 每个Task独立JVM | Executor复用JVM | | 延迟 | 高(分钟级) | 低(秒级) | | 适用场景 | 批处理 | 流处理+机器学习 | --- ### 相关问题 1. 如何解决Spark on YARN的`NoSuchMethodError`类冲突问题? 2. Spark动态资源分配在YARN上的工作原理是什么? 3. 如何配置Spark Executor的堆外内存防止OOM? 4. YARN队列资源不足时如何优先保障Spark作业? 5. 在Kubernetes上部署SparkYARN部署有何优劣?[^1][^2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值