Yarn上的Spark+固定hbase

jgovgodb  于 2021-06-09  发布在  Hbase
关注(0)|答案(1)|浏览(286)

我正在向连接到安全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)

请建议。

1cosmwyk

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_DIR SPARK_EXTRA_LIB_PATH SPARK_SUBMIT_OPTS SPARK_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错误。
¤¤¤¤¤ 如何使这些东西工作,与调试跟踪


# we assume that spark-env.sh and spark-default.conf are already Hadoop-ready,

# and also *almost* HBase-ready (as in a CDH distro);

# especially HADOOP_CONF_DIR and SPARK_DIST_CLASSPATH are expected to be set

# but spark.*.extraClassPath / .extraJavaOptions are expected to be unset

KRB_DEBUG_OPTS="-Dlog4j.logger.org.apache.spark.deploy.yarn.Client=DEBUG -Dlog4j.logger.org.apache.hadoop.hbase.zookeeper.RecoverableZooKeeper=DEBUG -Dlog4j.logger.org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation=DEBUG -Dlog4j.logger.org.apache.hadoop.hbase.spark.HBaseContext=DEBUG -Dsun.security.krb5.debug=true -Djava.security.debug=gssloginconfig,configfile,configparser,logincontext"
EXTRA_HBASE_CP=/etc/hbase/conf/:/opt/cloudera/parcels/CDH/lib/hbase/hbase-spark.jar:/opt/cloudera/parcels/CDH/lib/hbase/lib/metrics-core-2.2.0.jar

export SPARK_SUBMIT_OPTS="$KRB_DEBUG_OPTS"
export HADOOP_JAAS_DEBUG=true
export SPARK_PRINT_LAUNCH_COMMAND=True

spark-submit --master yarn-client \
  --files "/etc/spark/conf/log4j.properties#yarn-log4j.properties" \
  --principal XX@Z.NET --keytab /a/b/XX.keytab \
  --conf spark.yarn.tokens.hbase.enabled=true \
  --conf spark.driver.extraClassPath=$EXTRA_HBASE_CP \
  --conf spark.executor.extraClassPath=$EXTRA_HBASE_CP \
  --conf "spark.executor.extraJavaOptions=$KRB_DEBUG_OPTS -Dlog4j.configuration=yarn-log4j.properties" \
  --conf spark.executorEnv.HADOOP_JAAS_DEBUG=true \
  --class TestSparkHBase  TestSparkHBase.jar

spark-submit --master yarn-cluster --conf spark.yarn.report.interval=4000 \
  --files "/etc/spark/conf/log4j.properties#yarn-log4j.properties" \
  --principal XX@Z.NET --keytab /a/b/XX.keytab \
  --conf spark.yarn.tokens.hbase.enabled=true \
  --conf spark.driver.extraClassPath=$EXTRA_HBASE_CP \
  --conf "spark.driver.extraJavaOptions=$KRB_DEBUG_OPTS -Dlog4j.configuration=yarn-log4j.properties" \
  --conf spark.driverEnv.HADOOP_JAAS_DEBUG=true \
  --conf spark.executor.extraClassPath=$EXTRA_HBASE_CP \
  --conf "spark.executor.extraJavaOptions=$KRB_DEBUG_OPTS -Dlog4j.configuration=yarn-log4j.properties" \
  --conf spark.executorEnv.HADOOP_JAAS_DEBUG=true \
  --class TestSparkHBase  TestSparkHBase.jar

ps:当使用 HBaseContext 你不需要 /etc/hbase/conf/ 在执行器的类路径中,conf会自动传播。
pps:我建议你设置 log4j.logger.org.apache.zookeeper.ZooKeeper=WARNlog4j.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。

相关问题