自定义spark在运行时找不到配置单元数据库

ldfqzlk8  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(357)

在hdp中启动一个定制版本的spark-on-yarn可以很好地完成来自的教程https://georgheiler.com/2019/05/01/headless-spark-on-yarn/ i、 e.以下内容:


# 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
      /_/

但是,a:

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数据库?

qjp7pelc

qjp7pelc1#

你可以复制 hive-site.xml 位于/usr/hdp/hdp.version/hive/conf或/opt/hdp/hdp.version/hive/conf中,具体取决于hdp的安装位置 conf 无头Spark安装目录。现在,当您重新启动sparkshell时,它应该选择这个配置单元配置并加载apache配置单元中存在的所有模式

w8biq8rn

w8biq8rn2#

配置单元jar必须位于spark的类路径中,才能启用配置单元支持。如果配置单元jar不在类路径中,则使用目录实现 in-memory 在sparkshell中,我们可以通过执行

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
    }
  }

如果类不存在,则不启用配置单元支持。链接到在sparkshell初始化过程中执行上述检查的代码。
在上面作为问题的一部分粘贴的代码中, SPARK_DIST_CLASSPATH 只使用hadoop类路径填充,缺少到配置单元jar的路径。

相关问题