使用HDP 2.5.3,我一直在尝试调试一些YARN容器类路径问题 .
由于HDP包括Spark 1.6和2.0.0,因此存在一些冲突的版本
我支持的用户能够成功地在YARN client
模式下使用带有Hive查询的Spark2,但是不能从 cluster
模式获得有关未找到的表的错误,或类似的东西,因为未 Build Metastore连接 .
我猜_1153251_之后设置 --driver-class-path /etc/spark2/conf:/etc/hive/conf
或传递 --files /etc/spark2/conf/hive-site.xml
会有效,但为什么 hive-site.xml
文件夹中已经没有 hive-site.xml
加载?
根据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
因此,我不认为我应该将 HADOOP_CONF_DIR
中的hive-site放置为 HIVE_CONF_DIR
,但我的问题是我们如何让Spark2拿起 hive-site.xml
而无需在运行时手动将其作为参数传递?
EDIT 当然,因为我在使用HDP,所以我正在使用Ambari . 以前的集群管理员已在所有计算机上安装了Spark2客户端,因此可能是潜在Spark驱动程序的所有YARN NodeManager都应具有相同的配置文件
4 回答
您可以使用spark属性 -
spark.yarn.dist.files
并指定hive-site.xml的路径 .我理解它的方式,在
local
或yarn-client
模式......Launcher检查它是否需要HDFS,YARN,Hive,HBase的Kerberos令牌
>
hive-site.xml
在HAS / Hadoop客户端库中在CLASSPATH中搜索(包括在driver.extraClassPath
中,因为驱动程序在Launcher中运行,此时已合并的CLASSPATH已构建)驱动程序检查用于 internal purposes 的哪种Metastore:由易失性Derby实例或常规Hive Metastore支持的独立Metastore
> 那是
$SPARK_CONF_DIR/hive-site.xml
使用Hive接口时,Metastore连接用于读取/写入驱动程序中的Hive元数据
>
hive-site.xml
在HAS / 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变量 .
它可能还需要在某些属性中覆盖,因为硬编码的默认值突然不再是默认值(静默) .
驱动程序无法点击原始
$SPARK_CONF_DIR
,它必须依赖Launcher提供的上传内容 . 这包括$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中完成,这是另一层讨厌 . 但我不以为然 .底线: start your diagnostic again .
A. 你真的,真的确定神秘的"Metastore connection errors"是由缺少属性引起的,特别是Metastore URI吗?
B. 那么,你的用户是否明确使用了
HiveContext
???C. YARN提供给驱动程序JVM的CLASSPATH究竟是什么,以及驱动程序在打开Metastore连接时向Hadoop库提供的CLASSPATH究竟是什么?
D. 如果YARN构建的CLASSPATH由于某种原因搞砸了,那么最小修正是什么 - 优先规则的改变?加成?都?
在
cluster
mode
配置中从机器的conf
目录中读取,该目录运行driver
容器,而不是spark-submit
的容器 .发现了这个问题
在创建配置单元上下文之前创建
org.apache.spark.sql.SQLContext
,在创建配置单元上下文时未正确选择hive-site.xml
.Solution :在创建另一个SQL上下文之前创建配置单元上下文 .