我正在向连接到安全hbase集群的yarn(在spark 2.1.1+kafka 0.10.2.1上)提交作业。当我在“local”模式(spark.master=local[*])下运行时,这个作业执行得很好。
但是,当我以master作为yarn(以deploy mode作为client)提交作业时,我会看到以下错误消息-
Caused by: javax.security.auth.login.LoginException: Unable to obtain password from user
我遵循hortonworks的建议,向yarn cluster提供有关hbase和keytab等的信息。遵循这篇知识库文章-https://community.hortonworks.com/content/supportkb/48988/how-to-run-spark-job-to-interact-with-secured-hbas.html
有什么线索吗?会发生什么事?
登录hbase的机制:
UserGroupInformation.setConfiguration(hbaseConf)
val keyTab = "keytab-location")
val principal = "kerberos-principal"
val ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI(principal, keyTab)
UserGroupInformation.setLoginUser(ugi)
ugi.doAs(new PrivilegedExceptionAction[Void]() {
override def run: Void = {
hbaseCon = Some(ConnectionFactory.createConnection(hbaseConf))
null
}
})
此外,我还尝试了另一种登录机制,如:
UserGroupInformation.loginUserFromKeytab(principal, keyTab)
connection=ConnectionFactory.createConnection(hbaseConf)
请建议。
1条答案
按热度按时间1cosmwyk1#
您并不是唯一一个从spark向hbase寻求kerberos身份验证的人,参见spark-12279
一个鲜为人知的事实是,spark现在在启动时为yarn、hdfs、hive、hbase生成hadoop“身份验证令牌”。然后将这些令牌广播给执行器,这样它们就不必再与kerberos auth、keytab等发生冲突。
第一个问题是它没有明确的文档记录,如果失败,错误在默认情况下是隐藏的(也就是说,大多数人不使用kerberos连接到hbase,所以声明hbase jar不在类路径中并且没有创建hbase令牌通常是毫无意义的。。。通常情况下。)
要记录有关这些令牌的所有详细信息,必须设置
org.apache.spark.deploy.yarn.Client
调试。第二个问题是,除了属性之外,spark还支持许多env变量,有些是有文档记录的,有些没有文档记录,还有一些实际上已经弃用。
例如,
SPARK_CLASSPATH
现在已弃用,其内容实际上已注入spark属性中spark.driver
/spark.executor.extraClassPath
.但是
SPARK_DIST_CLASSPATH
仍在使用中,例如在cloudera发行版中,它用于将核心hadoop libs&config注入spark“launcher”,以便在驱动程序启动之前(即在spark.driver.extraClassPath
进行评估)。其他感兴趣的变量包括
HADOOP_CONF_DIR
SPARK_CONF_DIRSPARK_EXTRA_LIB_PATH
SPARK_SUBMIT_OPTSSPARK_PRINT_LAUNCH_COMMAND
第三个问题是,在某些特定情况下(例如cloudera发行版中的Yarn簇模式),Spark特性spark.yarn.tokens.hbase.enabled
将静默设置为false
--这完全没有意义,默认值是硬编码的true
在spark源代码中。。。!所以建议你明确地强制它
true
在作业配置中。第四个问题是,即使hbase令牌是在启动时创建的,执行者也必须显式地使用它进行身份验证。幸运的是,cloudera为hbase提供了一个“spark connector”,可以自动处理这种讨厌的东西。默认情况下,它现在是hbase客户端的一部分(参见。
hbase-spark*.jar
).第五个问题是,如果你没有
metrics-core*.jar
在类路径中,hbase连接将失败,并出现令人费解的(和不相关的)zookepper错误。¤¤¤¤¤ 如何使这些东西工作,与调试跟踪
ps:当使用
HBaseContext
你不需要/etc/hbase/conf/
在执行器的类路径中,conf会自动传播。pps:我建议你设置
log4j.logger.org.apache.zookeeper.ZooKeeper=WARN
在log4j.properties
因为它冗长、无用,甚至令人困惑(所有有趣的东西都记录在hbase级别)pps:而不是那些冗长的
SPARK_SUBMIT_OPTS
var,您还可以静态地列出中的log4j选项$SPARK_CONF_DIR/log4j.properties
剩下的在$SPARK_CONF_DIR/java-opts
; 这同样适用于Spark的性质$SPARK_CONF_DIR/spark-defaults.conf
和环境变量$SPARK_CONF_DIR/spark-env.sh
¤¤¤¤¤ 关于hbase的“spark connector”摘自hbase官方文档,第83章基本Spark
所有spark和hbase集成的根本是
HBaseContext
. 这个HBaseContext
接收hbase配置并将它们推送到spark执行器。这允许我们在静态位置为每个spark executor建立hbase连接。文件中没有提到的是
HBaseContext
自动使用hbase“auth token”(如果存在)对执行者进行身份验证。还要注意,doc有一个spark的例子(在scala中,然后是java中)
foreachPartition
rdd上的操作,使用BufferedMutator
异步批量加载到hbase。