YARN常见异常

YARN容器启动异常解析
本文解析了YARN中容器启动失败的几种常见异常情况,包括文件系统权限问题、磁盘空间不足及虚拟内存限制等问题,并提供了相应的解决方案。

异常1:

2012-05-16 16:18:42,468 WARN org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch: Failed to launch container.

java.io.FileNotFoundException: File /tmp/nm-local-dir/usercache/a/appcache/application_1337150856633_0016 does not exist

        at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:449)

        at org.apache.hadoop.fs.FileSystem.primitiveMkdir(FileSystem.java:864)

        at org.apache.hadoop.fs.DelegateToFileSystem.mkdir(DelegateToFileSystem.java:143)

        at org.apache.hadoop.fs.FilterFs.mkdir(FilterFs.java:189)

        at org.apache.hadoop.fs.FileContext$4.next(FileContext.java:700)

        at org.apache.hadoop.fs.FileContext$4.next(FileContext.java:697)

        at org.apache.hadoop.fs.FileContext$FSLinkResolver.resolve(FileContext.java:2319)

        at org.apache.hadoop.fs.FileContext.mkdir(FileContext.java:697)

原因A:

yarn-site.xml中参数yarn.nodemanager.local-dirs和yarn.nodemanager.log-dirs使用

默认路径(/tmp/..),导致将磁盘空间撑爆

原因B:

org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor文件中,创建目录方法在默认情况下需要创建的目录父目录不存在则失败,具体代码如下

 

  @Override
  public int launchContainer(Container container,
      Path nmPrivateContainerScriptPath, Path nmPrivateTokensPath,
      String userName, String appId, Path containerWorkDir,
      List<String> localDirs, List<String> logDirs) throws IOException {

    ContainerId containerId = container.getContainerID();

    // create container dirs on all disks
    String containerIdStr = ConverterUtils.toString(containerId);
    String appIdStr =
        ConverterUtils.toString(
            container.getContainerID().getApplicationAttemptId().
                getApplicationId());
    for (String sLocalDir : localDirs) {
      Path usersdir = new Path(sLocalDir, ContainerLocalizer.USERCACHE);
      Path userdir = new Path(usersdir, userName);
      Path appCacheDir = new Path(userdir, ContainerLocalizer.APPCACHE);
      Path appDir = new Path(appCacheDir, appIdStr);
      Path containerDir = new Path(appDir, containerIdStr);
      lfs.mkdir(containerDir, null, false);
    }

 该方法第三个参数为false的时候,如果创建目录的父目录不存在,则调用失败,将其改为

 

lfs.mkdir(containerDir, null, true);

异常2:

2012-05-16 09:56:57,078 INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ResourceLocalizationService: Localizer failed

java.lang.ArithmeticException: / by zero

        at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:355)

        at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:150)

        at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:131)

        at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:115)

        at org.apache.hadoop.yarn.server.nodemanager.LocalDirsHandlerService.getLocalPathForWrite(LocalDirsHandlerService.java:257)

        at org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ResourceLocalizationService$LocalizerRunner.run(ResourceLocalizationService.java:854)

 

原因:

该错误是由于无法创建本地文件而产生的,可能会由上述磁盘空间不足导致,重定向上面提到的两个参数即可

异常3:

查看log没有明显的ERROR,但存在类似以下描述的日志

2012-05-16 13:08:20,876 INFO org.apache.hadoop.yarn.server.nodemanager.NodeStatusUpdaterImpl: Sending out status for container: container_id {, app_attempt_id {, application_id {, id: 18, cluster_timestamp: 1337134318909, }, attemptId: 1, }, id: 6, }, state: C_COMPLETE, diagnostics: "Container [pid=15641,containerID=container_1337134318909_0018_01_000006] is running beyond virtual memory limits. Current usage: 32.1mb of 1.0gb physical memory used; 6.2gb of 2.1gb virtual memory used. Killing container.\nDump of the process-tree for container_1337134318909_0018_01_000006 :\n\t|- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE\n\t|- 15641 26354 15641 15641 (java) 36 2 6686339072 8207 /home/zhouchen.zm/jdk1.6.0_23/bin/java

 

原因:

该错误是YARN的虚拟内存计算方式导致,上例中用户程序申请的内存为1Gb,YARN根据此值乘以一个比例(默认为2.1)得出申请的虚拟内存的值,当YARN计算的用户程序所需虚拟内存值大于计算出来的值时,就会报出以上错误。调节比例值可以解决该问题。具体参数为:yarn-site.xml中的yarn.nodemanager.vmem-pmem-ratio

 

 

 

 

 

### ### Spark 常见开发异常及解决方法 在使用 Apache Spark 进行开发时,开发者常常会遇到一些常见异常情况。这些异常通常涉及资源分配、网络通信、代码逻辑以及上下文管理等方面。以下是一些典型的异常信息及其解决方案。 #### 1. **Executor 内存不足或资源分配失败** 当 Spark 应用程序启动时,如果每个 Executor 请求的内存超过了集群管理器能够分配的内存,会导致任务启动失败。这种情况通常伴随着类似 `ExecutorLostFailure` 或 `OutOfMemoryError` 的错误信息。 解决方法包括: - 检查 Spark UI 中显示的可用内存,并根据实际资源情况调整 `spark-submit` 命令中的内存配置参数,例如 `--executor-memory` 和 `--driver-memory`。 - 适当减少每个 Executor 的内存请求,或增加集群节点数量以提升整体资源容量。 - 如果使用 YARN 或 Kubernetes 等集群管理器,确保其资源配置与 Spark 的请求匹配。 #### 2. **SparkContext 缺失异常** 在某些情况下,RDD 的转换或动作操作可能在非驱动程序中被调用,或者在 Spark Streaming 的检查点恢复过程中引用了未定义的 RDD,这会导致 `SparkException: This RDD lacks a SparkContext` 的错误。 解决方法包括: - 避免在 RDD 转换中嵌套调用其他 RDD 的操作,例如在 `map` 中调用 `count()` 或 `collect()`。 - 在 Spark Streaming 中使用检查点功能时,确保所有涉及的 RDD 都在流处理逻辑中定义,避免引入外部未定义的 RDD 引用[^2]。 #### 3. **网络通信失败或端口不通** Spark 任务在运行过程中需要多个节点之间进行通信,例如 Executor 与 Driver 之间、Executor 与存储系统之间。如果网络配置不当,可能会导致任务失败,例如 `java.net.ConnectException` 或 `java.io.IOException`。 解决方法包括: - 确保所有节点之间的网络端口(如 `7077` 用于 Spark Standalone 模式)开放,允许相互通信。 - 如果使用防火墙或安全组策略,应配置允许 Spark 相关端口的访问。 - 使用 `telnet` 或 `nc` 工具测试节点之间的端口连通性。 #### 4. **序列化异常** 在 Spark 任务中,如果传递给 RDD 操作的函数引用了不可序列化的对象(如某些数据库连接或未实现 `Serializable` 接口的类),会导致 `java.io.NotSerializableException`。 解决方法包括: - 确保所有传递给 RDD 操作的函数及其引用的对象都实现 `Serializable` 接口。 - 对于数据库连接等资源,建议在 RDD 操作内部创建,而不是在外部初始化后传递。 - 使用 `@transient` 注解标记不需要序列化的字段,避免意外包含不可序列化对象。 示例代码: ```scala val connection = new DatabaseConnection(...) // 不可序列化对象 val data = sc.parallelize(Seq(1, 2, 3)) val result = data.map { x => val conn = new DatabaseConnection(...) // 在 RDD 操作内部创建连接 conn.query(x) } ``` #### 5. **任务超时或执行时间过长** 当 Spark 任务执行时间过长或某些阶段未能按时完成时,可能会触发超时异常,如 `TaskTimeoutException` 或 `JobExecutionTimeoutException`。 解决方法包括: - 增加 `spark.network.timeout` 和 `spark.executor.heartbeatInterval` 的值,以适应较长的网络延迟。 - 优化任务逻辑,减少单个任务的数据处理量,例如通过 `repartition` 或 `coalesce` 调整数据分区。 - 检查数据倾斜问题,确保数据在各个分区之间均匀分布。 #### 6. **类路径冲突或依赖缺失** 在提交 Spark 应用程序时,如果依赖项未正确打包或存在版本冲突,可能导致 `ClassNotFoundException` 或 `NoClassDefFoundError`。 解决方法包括: - 使用构建工具(如 Maven 或 SBT)将所有依赖打包进 JAR 文件。 - 检查 Spark 集群中是否已包含某些依赖库,避免重复打包。 - 使用 `--jars` 参数显式指定额外的依赖 JAR 文件。 示例命令: ```bash spark-submit --class com.example.MyApp --jars /path/to/dependency.jar myapp.jar ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值