使用 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.xml
和 core-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 的路径。
按照我的理解,在 local
或 yarn-client
模式下...
- Launcher 检查它是否需要用于 HDFS、YARN、Hive、HBase 的 Kerberos 令牌
> hive-site.xml
由 Hive/Hadoop 客户端库 在 CLASSPATH 中搜索(包括在 driver.extraClassPath
中,因为驱动程序在 Launcher 中运行并且此时已经构建了合并的 CLASSPATH)
- 驱动程序检查哪种元存储用于内部用途:由易失性 Derby 实例支持的独立元存储,或常规 Hive 元存储
> 即 $SPARK_CONF_DIR/hive-site.xml
- 使用 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 上下文之前创建配置单元上下文。
使用 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.xml
和 core-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 的路径。
按照我的理解,在 local
或 yarn-client
模式下...
- Launcher 检查它是否需要用于 HDFS、YARN、Hive、HBase 的 Kerberos 令牌
>hive-site.xml
由 Hive/Hadoop 客户端库 在 CLASSPATH 中搜索(包括在driver.extraClassPath
中,因为驱动程序在 Launcher 中运行并且此时已经构建了合并的 CLASSPATH) - 驱动程序检查哪种元存储用于内部用途:由易失性 Derby 实例支持的独立元存储,或常规 Hive 元存储
> 即$SPARK_CONF_DIR/hive-site.xml
- 使用 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 上下文之前创建配置单元上下文。