使用 spark-submit YARN 集群模式时缺少 hive-site

Missing hive-site when using spark-submit YARN cluster mode

使用 HDP 2.5.3,我一直在尝试调试一些 YARN 容器类路径问题。

由于 HDP 同时包含 Spark 1.6 和 2.0.0,因此存在一些版本冲突

我支持的用户能够在 YARN client 模式下成功地将 Spark2 与 Hive 查询一起使用,但在 cluster 模式下却无法使用,他们会收到关于未找到表的错误,或者类似的错误,因为 Metastore未建立连接。

我猜测在 spark-submit 之后设置 --driver-class-path /etc/spark2/conf:/etc/hive/conf 或传递 --files /etc/spark2/conf/hive-site.xml 都可以,但为什么 hive-site.xml 还没有从 conf文件夹?

根据Hortonworks docs,说hive-site应该放在$SPARK_HOME/conf中,它是...

我看到 hdfs-site.xmlcore-site.xml,以及属于 HADOOP_CONF_DIR 的其他文件,例如,这是来自 YARN UI 容器信息。

2232355    4 drwx------   2 yarn     hadoop       4096 Aug  2 21:59 ./__spark_conf__
2232379    4 -r-x------   1 yarn     hadoop       2358 Aug  2 21:59 ./__spark_conf__/topology_script.py
2232381    8 -r-x------   1 yarn     hadoop       4676 Aug  2 21:59 ./__spark_conf__/yarn-env.sh
2232392    4 -r-x------   1 yarn     hadoop        569 Aug  2 21:59 ./__spark_conf__/topology_mappings.data
2232398    4 -r-x------   1 yarn     hadoop        945 Aug  2 21:59 ./__spark_conf__/taskcontroller.cfg
2232356    4 -r-x------   1 yarn     hadoop        620 Aug  2 21:59 ./__spark_conf__/log4j.properties
2232382   12 -r-x------   1 yarn     hadoop       8960 Aug  2 21:59 ./__spark_conf__/hdfs-site.xml
2232371    4 -r-x------   1 yarn     hadoop       2090 Aug  2 21:59 ./__spark_conf__/hadoop-metrics2.properties
2232387    4 -r-x------   1 yarn     hadoop        662 Aug  2 21:59 ./__spark_conf__/mapred-env.sh
2232390    4 -r-x------   1 yarn     hadoop       1308 Aug  2 21:59 ./__spark_conf__/hadoop-policy.xml
2232399    4 -r-x------   1 yarn     hadoop       1480 Aug  2 21:59 ./__spark_conf__/__spark_conf__.properties
2232389    4 -r-x------   1 yarn     hadoop       1602 Aug  2 21:59 ./__spark_conf__/health_check
2232385    4 -r-x------   1 yarn     hadoop        913 Aug  2 21:59 ./__spark_conf__/rack_topology.data
2232377    4 -r-x------   1 yarn     hadoop       1484 Aug  2 21:59 ./__spark_conf__/ranger-hdfs-audit.xml
2232383    4 -r-x------   1 yarn     hadoop       1020 Aug  2 21:59 ./__spark_conf__/commons-logging.properties
2232357    8 -r-x------   1 yarn     hadoop       5721 Aug  2 21:59 ./__spark_conf__/hadoop-env.sh
2232391    4 -r-x------   1 yarn     hadoop        281 Aug  2 21:59 ./__spark_conf__/slaves
2232373    8 -r-x------   1 yarn     hadoop       6407 Aug  2 21:59 ./__spark_conf__/core-site.xml
2232393    4 -r-x------   1 yarn     hadoop        812 Aug  2 21:59 ./__spark_conf__/rack-topology.sh
2232394    4 -r-x------   1 yarn     hadoop       1044 Aug  2 21:59 ./__spark_conf__/ranger-hdfs-security.xml
2232395    8 -r-x------   1 yarn     hadoop       4956 Aug  2 21:59 ./__spark_conf__/metrics.properties
2232386    8 -r-x------   1 yarn     hadoop       4221 Aug  2 21:59 ./__spark_conf__/task-log4j.properties
2232380    4 -r-x------   1 yarn     hadoop         64 Aug  2 21:59 ./__spark_conf__/ranger-security.xml
2232372   20 -r-x------   1 yarn     hadoop      19975 Aug  2 21:59 ./__spark_conf__/yarn-site.xml
2232397    4 -r-x------   1 yarn     hadoop       1006 Aug  2 21:59 ./__spark_conf__/ranger-policymgr-ssl.xml
2232374    4 -r-x------   1 yarn     hadoop         29 Aug  2 21:59 ./__spark_conf__/yarn.exclude
2232384    4 -r-x------   1 yarn     hadoop       1606 Aug  2 21:59 ./__spark_conf__/container-executor.cfg
2232396    4 -r-x------   1 yarn     hadoop       1000 Aug  2 21:59 ./__spark_conf__/ssl-server.xml
2232375    4 -r-x------   1 yarn     hadoop          1 Aug  2 21:59 ./__spark_conf__/dfs.exclude
2232359    8 -r-x------   1 yarn     hadoop       7660 Aug  2 21:59 ./__spark_conf__/mapred-site.xml
2232378   16 -r-x------   1 yarn     hadoop      14474 Aug  2 21:59 ./__spark_conf__/capacity-scheduler.xml
2232376    4 -r-x------   1 yarn     hadoop        884 Aug  2 21:59 ./__spark_conf__/ssl-client.xml

如您所见,hive-site 不存在,尽管我肯定有 conf/hive-site.xml 供 spark-submit 使用

[spark@asthad006 conf]$ pwd && ls -l
/usr/hdp/2.5.3.0-37/spark2/conf
total 32
-rw-r--r-- 1 spark spark   742 Mar  6 15:20 hive-site.xml
-rw-r--r-- 1 spark spark   620 Mar  6 15:20 log4j.properties
-rw-r--r-- 1 spark spark  4956 Mar  6 15:20 metrics.properties
-rw-r--r-- 1 spark spark   824 Aug  2 22:24 spark-defaults.conf
-rw-r--r-- 1 spark spark  1820 Aug  2 22:24 spark-env.sh
-rwxr-xr-x 1 spark spark   244 Mar  6 15:20 spark-thrift-fairscheduler.xml
-rw-r--r-- 1 hive  hadoop  918 Aug  2 22:24 spark-thrift-sparkconf.conf

所以,我不认为我应该将 hive-site 放在 HADOOP_CONF_DIR 中,因为 HIVE_CONF_DIR 是分开的,但我的问题是我们如何让 Spark2 接收 hive-site.xml 无需在运行时手动将其作为参数传递?

EDIT 当然,因为我使用的是 HDP,所以我使用的是 Ambari。之前的集群管理员已经在所有机器上安装了 Spark2 客户端,所以所有可能是潜在 Spark 驱动程序的 YARN NodeManagers 应该有相同的配置文件

cluster mode 配置是从机器的 conf 目录读取的,它运行 driver 容器,而不是用于 [=14] =].

您可以使用 spark 属性 - spark.yarn.dist.files 并在此处指定 hive-site.xml 的路径。

按照我的理解,在 localyarn-client 模式下...

  1. Launcher 检查它是否需要用于 HDFS、YARN、Hive、HBase 的 Kerberos 令牌
    > hive-site.xml 由 Hive/Hadoop 客户端库 在 CLASSPATH 中搜索(包括在 driver.extraClassPath 中,因为驱动程序在 Launcher 中运行并且此时已经构建了合并的 CLASSPATH)
  2. 驱动程序检查哪种元存储用于内部用途:由易失性 Derby 实例支持的独立元存储,或常规 Hive 元存储
    >$SPARK_CONF_DIR/hive-site.xml
  3. 使用 Hive 接口时,Metastore 连接用于 read/write Driver 中的 Hive 元数据
    > hive-site.xml 由 Hive/Hadoop 客户端库在 CLASSPATH 中搜索(并且使用 Kerberos 令牌,如果有的话)

所以你可以有一个 hive-site.xml 声明 Spark 应该使用嵌入式内存中的 Derby 实例作为沙箱 (内存中暗示 "stop leaving all these temp files behind you") 而另一个 hive-site.xml 给出了实际的 Hive Metastore URI。一切都很好。


现在,在 yarn-cluster 模式下,所有这些机制几乎都会爆炸成令人讨厌的、未记录的混乱。

Launcher 需要自己的 CLASSPATH 设置来创建 Kerberos 令牌,否则它会静默失败。最好去源代码找出你应该使用哪个未记录的 Env 变量。
它可能还需要在某些属性中进行覆盖,因为硬编码的默认值突然不再是默认值(无声地)。

Driver 无法点击原始 $SPARK_CONF_DIR,它必须依赖 Launcher 提供的可上传内容。这是否包括 $SPARK_CONF_DIR/hive-site.xml 的副本?好像不是这样。
所以您可能正在使用 Derby 事物作为存根。

并且驱动程序必须以任何顺序处理 YARN 强加到容器 CLASSPATH 上的任何内容。
此外,默认情况下 driver.extraClassPath 添加不优先;为此你必须强制 spark.yarn.user.classpath.first=true ( 它被翻译成标准的 Hadoop 属性 我现在不记得它的确切名称,特别是因为有多个具有相似名称的道具可能已被弃用 and/or 不适用于 Hadoop 2.x)


认为那很糟糕?尝试以 yarn-cluster 模式连接到 Kerberized HBase。连接是在 Executors 中完成的,这是另一层麻烦。但是我离题了。

底线:再次开始诊断

A. 您真的非常确定神秘的 "Metastore connection errors" 是由缺少属性引起的,特别是 Metastore URI?

B. 顺便问一下,您的用户是否明确使用 HiveContext???

C. YARN 提供给 Driver JVM 的 CLASSPATH 到底是什么,打开 Metastore 连接时 Driver 提供给 Hadoop 库的 CLASSPATH 到底是什么?

D. 如果 YARN 构建的 CLASSPATH 由于某种原因被弄乱了,最小的修复是什么——改变优先规则?添加?两个?

发现此问题

您在创建 Hive 上下文之前创建了 org.apache.spark.sql.SQLContext,但在创建 Hive 上下文时未正确选择 hive-site.xml

解决方案 :在创建另一个 SQL 上下文之前创建配置单元上下文。