0

按照https://georgheiler.com/2019/05/01/headless-spark-on-yarn/的教程,在 HDP 中启动自定义版本的 spark on yarn 可以正常工作,即:

# download a current headless version of spark
export SPARK_DIST_CLASSPATH=$(hadoop classpath)
export HADOOP_CONF_DIR=/usr/hdp/current/spark2-client/conf
export SPARK_HOME=<<path/to>>/spark-2.4.3-bin-without-hadoop/
<<path/to>>/spark-2.4.3-bin-without-hadoop/bin/spark-shell --master yarn --deploy-mode client --queue <<my_queue>> --conf spark.driver.extraJavaOptions='-Dhdp.version=2.6.<<version>>' --conf spark.yarn.am.extraJavaOptions='-Dhdp.version=2.6.<<version>>'

Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.4.3
      /_/

但是,一个:

spark.sql("show databases").show

只返回:

+------------+
|databaseName|
+------------+
|     default|
+------------+

现在尝试传递原始的 HDP 配置(我的自定义版本的 spark 显然没有读入),例如:

一:

--files /usr/hdp/current/spark2-client/conf/hive-site.xml

二:

--conf spark.hive.metastore.uris='thrift://master001.my.corp.com:9083,thrift://master002.my.corp.com:9083,thrift://master003.my.corp.com:9083' --conf spark.hive.metastore.sasl.enabled='true' --conf hive.metastore.uris='thrift://master001.my.corp.com:9083,thrift://master002.my.corp.com:9083,thrift://master003.my.corp.com:9083' --conf hive.metastore.sasl.enabled='true'

三:

--conf spark.yarn.dist.files='/usr/hdp/current/spark2-client/conf/hive-site.xml'

四:

--conf spark.sql.warehouse.dir='/apps/hive/warehouse'

一切都无助于解决问题。如何让 spark 识别 hive 数据库?

4

2 回答 2

0

您可以将hive-site.xml位于/usr/hdp/hdp.version/hive/conf/opt/hdp/hdp.version/hive/confconf中的文件复制到无头 spark 安装目录中,具体取决于 HDP 的安装位置. 现在,当您重新启动 Spark-Shell 时,它应该选择此配置单元并加载 Apache Hive 中存在的所有模式

于 2019-05-21T08:40:55.190 回答
0

Hive jar 需要在 Spark 的类路径中才能启用 Hive 支持。如果类路径中不存在 hive jar,则使用的目录实现是in-memory
在 spark-shell 中,我们可以通过执行来确认这一点

sc.getConf.get("spark.sql.catalogImplementation") 

这会给in-memory

为什么需要 Hive 类

    def enableHiveSupport(): Builder = synchronized {
      if (hiveClassesArePresent) {
        config(CATALOG_IMPLEMENTATION.key, "hive")
      } else {
        throw new IllegalArgumentException(
          "Unable to instantiate SparkSession with Hive support because " +
            "Hive classes are not found.")
      }
    }

SparkSession.scala

  private[spark] def hiveClassesArePresent: Boolean = {
    try {
      Utils.classForName(HIVE_SESSION_STATE_BUILDER_CLASS_NAME)
      Utils.classForName("org.apache.hadoop.hive.conf.HiveConf")
      true
    } catch {
      case _: ClassNotFoundException | _: NoClassDefFoundError => false
    }
  }

如果类不存在,则不会启用 Hive 支持。链接到作为 Spark shell 初始化的一部分进行上述检查的代码。

在作为问题的一部分粘贴的上述代码中,SPARK_DIST_CLASSPATH仅填充了 Hadoop 类路径和Hive jar 的路径丢失

于 2019-05-26T11:24:07.110 回答