【问题标题】:Add CLASSPATH to Oozie workflow job将 CLASSPATH 添加到 Oozie 工作流作业
【发布时间】:2015-08-06 06:24:32
【问题描述】:

我用 Java 编写了用于访问 Hive 表的 SparkSQL,并打包了一个可以使用 spark-submit 运行的 jar 文件。

现在我想将这个 jar 作为 Oozie 工作流(和协调器,如果我让工作流正常工作)运行。当我尝试这样做时,作业失败并进入 Oozie 作业日志

java.lang.NoClassDefFoundError: org/apache/hadoop/hive/conf/HiveConf

我所做的是在 $HIVE_HOME/lib 中查找包含该类的 jar,将该 jar 复制到我的 Oozie 工作流根路径的 lib 路径中,并将其添加到 Spark 操作中的 workflow.xml

<spark-opts> --jars lib/*.jar</spark-opts>

但这会导致另一个java.lang.NoClassDefFoundError 指向另一个丢失的类,所以我再次执行了查找 jar 和复制、运行作业的过程,同样的事情也结束了。看起来它需要依赖于我的 Hive 库中的许多 jar。

我不明白的是,当我使用 jar 在 shell 中使用 spark-submit 时,它运行正常,我可以 SELECT 和 INSERT 到我的 Hive 表中。只有当我使用 Oozie 时才会发生这种情况。当包含在 Oozie 工作流作业中时,Spark 似乎无法再看到 Hive 库。有人可以解释这是怎么发生的吗?

如何向 Oozie 路径添加或引用必要的类/jar?

我正在使用 Cloudera Quickstart VM CDH 5.4.0、Spark 1.4.0、Oozie 4.1.0。

【问题讨论】:

    标签: apache-spark hive oozie


    【解决方案1】:

    通常,“边缘节点”(您可以连接的节点)在默认 CLASSPATH 中预先安装和引用了很多东西。 但 Hadoop“工作节点”可能是准系统,只预装了核心 Hadoop 库。

    因此,您可以等待几年让 Oozie 将 Spark 依赖项正确打包到 ShareLib 中,并使用“blablah.system.libpath”标志。

    [EDIT] 如果基本 Spark 功能正常,但您在 Hive 格式界面上失败,则指定 ShareLibs 的 列表,包括“HCatalog”,例如

    action.sharelib.for.spark=spark,hcatalog
    

    或者,您可以找出 Spark 实际使用的 JAR 和配置文件,将它们上传到 HDFS,并在 下的 Oozie Action 中引用它们(全部,一一),以便下载它们在 YARN 容器的工作目录中运行时。

    [EDIT] 也许 ShareLibs 包含 JAR,但不包含配置文件;那么您只需上传/下载一个有效配置文件列表(Hive、Spark 等)

    【讨论】:

      【解决方案2】:

      避免在 Oozie 中找不到 ClassPath 异常的更好方法是,在集群中安装 Oozie SharedLib,并更新共享位置中的 Hive/Pig jar {Some Times Existing Jar in Oozie Shared Location use to get mismatch with产品罐子。} hdfs://hadoop:50070/user/oozie/share/lib/ 一旦相同已更新,请传递一个参数 "oozie.use.system.libpath = true"

      这些将通知 oozie 从 Hadoop 共享位置读取罐子。

      一旦您通过将参数设置为“true”来提及共享位置,您就无需在 workflow.xml 中一一提及所有和每个 jar

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-22
        • 1970-01-01
        相关资源
        最近更新 更多