gpt4 book ai didi

java - 解决 Apache Spark 中的依赖问题

转载 作者:IT老高 更新时间:2023-10-28 21:05:46 25 4
gpt4 key购买 nike

构建和部署 Spark 应用程序时的常见问题是:

  • java.lang.ClassNotFoundException .
  • object x is not a member of package y编译错误。
  • java.lang.NoSuchMethodError

  • 如何解决这些问题?

    最佳答案

    Apache Spark 的类路径是动态构建的(以适应每个应用程序的用户代码),这使其容易受到此类问题的影响。 @user7337271的答案是正确的,但还有一些问题,取决于 集群管理器 (“主人”)你正在使用。

    首先,Spark 应用程序由这些组件组成(每个组件都是一个单独的 JVM,因此其类路径中可能包含不同的类):

  • 司机 :这是您的应用程序创建 SparkSession (或 SparkContext)并连接到集群管理器以执行实际工作
  • 集群管理器 : 作为集群的“入口点”,负责为每个应用程序分配执行器。 Spark 支持几种不同的类型:standalone、YARN 和 Mesos,我们将在下面介绍。
  • 执行人 :这些是集群节点上的进程,执行实际工作(运行 Spark 任务)

  • 这些之间的关系在 Apache Spark 的 cluster mode overview 中的这张图中进行了描述。 :

    Cluster Mode Overview

    现在 - 哪些类应该驻留在这些组件中的每一个中?

    这可以通过下图来回答:

    Class placement overview

    让我们慢慢解析:
  • 星火码 是 Spark 的库。它们应该存在于所有三个组件中,因为它们包含让 Spark 执行它们之间通信的粘合剂。顺便说一句 - Spark 作者做出了一个设计决定,在所有组件中包含所有组件的代码(例如,也包括应该只在驱动程序中的 Executor 中运行的代码)以简化这一点 - 所以 Spark 的“fat jar”(版本高达 1.6 ) 或“存档”(在 2.0 中,详细信息如下)包含所有组件的必要代码,并且应该在所有组件中可用。
  • 驱动程序专用代码 这是不包含任何应该在 Executor 上使用的用户代码,即不用于 RDD/DataFrame/Dataset 上的任何转换的代码。这不一定必须与分布式用户代码分开,但可以分开。
  • 分布式代码这是用驱动程序代码编译的用户代码,但也必须在执行器上执行 - 实际转换使用的所有内容都必须包含在这个 jar(s) 中。

  • 现在我们明白了, 怎么样我们是否让类在每个组件中正确加载,它们应该遵循什么规则?
  • 星火码 :正如之前的答案所述,您必须使用相同的 斯卡拉 Spark 所有组件中的版本。

    1.1 在 独立 模式,有一个“预先存在的”Spark 安装,应用程序(驱动程序)可以连接到它。这意味着 所有驱动程序必须使用相同的 Spark 版本 在 master 和 executors 上运行。

    1.2 在 YARN/Mesos ,每个应用程序可以使用不同的 Spark 版本,但同一应用程序的所有组件必须使用相同的版本。这意味着如果您使用版本 X 来编译和打包驱动程序应用程序,则在启动 SparkSession 时应该提供相同的版本(例如,在使用 YARN 时通过 spark.yarn.archivespark.yarn.jars 参数)。您提供的 jars/archive 应包含所有 Spark 依赖项( 包括传递依赖项 ),并且在应用程序启动时由集群管理器发送到每个执行程序。
  • 驱动代码 : 这完全取决于 - 驱动程序代码可以作为一堆 jars 或“fat jar”提供,只要它包含所有 Spark 依赖项 + 所有用户代码
  • 分布式代码 :除了存在于驱动程序中,此代码还必须传送到执行程序(同样,连同其所有传递依赖项)。这是使用 spark.jars 完成的范围。

  • 总结 ,这是构建和部署 Spark 应用程序的建议方法(在本例中 - 使用 YARN):
  • 使用您的分布式代码创建一个库,将其打包为“常规”jar(带有描述其依赖项的 .pom 文件)和“fat jar”(包括其所有传递依赖项)。
  • 创建一个驱动程序应用程序,对分布式代码库和 Apache Spark(具有特定版本)具有编译依赖性
  • 将驱动应用打包成fat jar 部署到驱动
  • 传递正确版本的分布式代码作为 spark.jars 的值启动 SparkSession 时的参数
  • 传递包含 lib/ 下所有 jar 的存档文件(例如 gzip)的位置下载的 Spark 二进制文件的文件夹作为 spark.yarn.archive 的值
  • 关于java - 解决 Apache Spark 中的依赖问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41383460/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com