【问题标题】:Local or remote jar for Spark submitSpark提交的本地或远程jar
【发布时间】:2018-09-19 23:16:26
【问题描述】:

我有一个在 yarn-client(客户端驱动程序)中运行的 spark-submit 作业,除其他功能外,它还通过 Kafka 读取和发送消息。

在我的集群上,只有 Kafka 代理节点有 Kafka jar,我不想让我的所有节点都成为 Kafka 客户端。这意味着我的 Spark 作业必须加载 (--jars) 并将 Kafka jar 从客户端服务器复制到集群上的所有执行程序。

我的问题是:一般的最佳做法是什么?将这些 jars (~20MB) 复制到每个执行程序是否会对性能/延迟产生影响?还是一种经典的工作方式?

Environment
RHEL7
Spark 1.6
Kafka 0.10.1
Network 10GB

【问题讨论】:

    标签: java apache-spark hadoop apache-kafka


    【解决方案1】:

    一般来说,最好的选择是将您的代码制作成一个胖 jar,并将所有必要的依赖项捆绑为其中的一部分。

    如果您发现提交过程太慢,请随意将必要的 Kafka Streaming JAR(包括它们的依赖项)复制到每个 YARN NodeManager 的 SPARK_HOME 中。我相信您还可以引用 JAR 文件的 HDFS 路径,如果您增加该文件的复制因子,它将分摊网络流量

    无论如何,您的所有节点都必须是 Kafka 客户端。您无法控制 Spark 启动执行程序的位置。注意:“安装 Kafka”与在服务器上提供 Java 客户端不同。

    【讨论】:

    • 感谢您的回答。由于我使用 Ambari 并且因为 Kafka 客户端不是由他管理的,所以我不希望在所有节点上手动部署此客户端(出于维护目的)。我知道我们无法控制 Spark 作业将在哪里执行,这就是为什么我问自己将 Kafka jar 从客户端部署到集群上的执行程序(在作业执行时,从 Spark 码头服务器)是否是一个好习惯我的情况。
    • 即使 Kafka 由 Ambari 管理,Kafka 类路径也不包含 Spark 库
    • 就个人而言,我使用 Puppet 或 Ambari 来维护 Ambari 背后的外部系统。如果您设置了它,则无需维护太多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多