【问题标题】:Missing hive-site when using spark-submit YARN cluster mode使用 spark-submit YARN 集群模式时缺少 hive-site
【发布时间】:2018-01-10 15:24:58
【问题描述】:

使用 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 会起作用,但为什么没有从conf 文件夹中加载hive-site.xml

根据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在运行时将其作为参数传递?

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

【问题讨论】:

  • 我有点慢,所以去年我没有考虑过,但是... (a) $HADOOP_CONF_DIR 可能包含一个 list 条目,就像任何 CLASSPATH (b) Spark 也考虑 $YARN_CONF_DIR 这可能是注入 Hive 配置 (c) 源代码的肮脏解决方法很明显,并非$SPARK_CONF_DIR 中的所有内容都被运送到 YARN 容器中,参见。 github.com/apache/spark/blob/branch-2.2/resource-managers/yarn/…
  • 请随时使用新信息更新您的答案;)

标签: apache-spark hive hortonworks-data-platform spark-hive


【解决方案1】:

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

【讨论】:

  • 这似乎是一个合理的解决方案,因为这正是--files 的工作原理。有什么缺点吗?
  • @cricket_007 这就是在 MapR 发行版中的做法。你可以在这里查看文档 -maprdocs.mapr.com/home/Spark/IntegrateSparkSQL_Hive.html
  • 哦,太好了!我从没想过要检查 MapR,只检查 HDP 和 CDH
【解决方案2】:

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

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

所以你可以有一个 hive-site.xml 声明 Spark 应该使用嵌入式内存中的 Derby 实例来用作沙箱(内存中的意思是“不要把所有这些临时文件留在你身后”) em> 而另一个 hive-site.xml 给出了实际的 Hive Metastore URI。一切都很好。


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

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

驱动程序无法点击原始$SPARK_CONF_DIR,它必须依赖启动器提供的可供上传的内容。这包括$SPARK_CONF_DIR/hive-site.xml 的副本吗?好像不是这样的。
因此,您可能正在使用 Derby 作为存根。

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


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

底线:重新开始诊断

答。您真的确定神秘的“Metastore 连接错误”是由于缺少属性,特别是 Metastore URI 造成的吗?

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

C. YARN 呈现给 Driver JVM 的 CLASSPATH 究竟是什么,Driver 在打开 Metastore 连接时呈现给 Hadoop 库的 CLASSPATH 究竟是什么?

D. 如果 YARN 构建的 CLASSPATH 由于某种原因搞砸了,那么最小的修复方法是什么——改变优先规则?添加?两者都有?

【讨论】:

  • 感谢您的深入回复。幸运的是,没有使用 Kerberos(目前)。我只是在管理,所以我无法控制 HiveContext 与 SparkSession,但对于最初的解决方案,我告诉人们只需在他们的代码中设置 hive.metastore.uris,它运行良好,所以 A,是的。对于@Artur 给出的答案spark.yarn.dist.files 确实上传了文件,正如我所料。似乎是 IMO 的一种解决方法,但它解决了 D,尽管我理解您所说的优先级变量的意思。
  • 总体而言,您将hive.metastore.uris 直接注入Hadoop 属性的想法可能是一个较小的邪恶。特别是如果在构建spark-submit 命令行时可以自动获取该值,并以某种方式作为参数传递给应用程序。
  • 我认为这些用户正在使用 Spring Boot 构建他们的应用程序,因此配置注入应该不会太难,这只是我们希望避免的一件事,以防 HiveServer 安装/FQDN变化。机器上的hive-site.xml应该是真相的来源
  • 没错,当说 “在构建命令行时来源” 我是在暗示 sed 上的某种 hive-site.xml 技巧,在提交时...跨度>
【解决方案3】:

cluster mode 配置是从机器的conf 目录中读取的,该目录运行driver 容器,而不是spark-submit 的一个用途。

【讨论】:

  • 有道理,那么解决办法是什么?我使用 Ambari 分发配置,并在每个 ResourceManager 上都有 Spark 客户端,正如您所见,YARN 容器信息没有显示 hive-site。
  • 我的意思是 NodeManager*
【解决方案4】:

发现这个问题

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

解决方案:在创建另一个 SQL 上下文之前创建 hive 上下文。

【讨论】:

  • 实际上,该错误是在某些 2.x 版本的 Spark 中引入的,无论如何您都应该使用 SparkSession 而不是 SQLContext。我在 JIRA 中发现了这个问题。只是忘记票号。另外,HiveContext 包装了一个 SQLContext,所以制作两个相同的东西似乎不是一个解决方案
猜你喜欢
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2015-04-30
  • 2018-01-12
  • 2021-05-19
相关资源
最近更新 更多