Sparn on YARN + Secured hbase

问题描述:

我正在向YARN(on spark 2.1.1 + kafka 0.10.2.1)提交一个作业,它连接到一个安全的hbase集群。这个工作,当我在“本地”模式(spark.master = local [*])下运行时表现得很好。Sparn on YARN + Secured hbase

然而,当我提交作业与主纱(和部署模式为客户端),我看到了以下错误消息 -

Caused by: javax.security.auth.login.LoginException: Unable to obtain password from user 

我下面的纱线集群提供信息hortonworks建议关于hbase和keytab等。关注此kb文章 - 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) 

请建议。

你并不孤单,希望从Spark获得Kerberos认证给HBase。 SPARK-12279

一个鲜为人知的事实是,火花现在生成Hadoop的“身份验证令牌”为纱线,HDFS,配置单元,HBase的在启动时。然后将这些令牌广播给执行者,以便它们不必再次混淆Kerberos认证,密钥表等。

第一个问题是它没有明确记录,并且在失败的情况下,错误被隐藏默认情况下是(即大多数人没有使用Kerberos连接到HBase,所以通常没有意识到HBase JAR不在CLASSPATH中,并且通常不会创建HBase标记。)
要记录所有详细信息关于这些令牌,您必须将org.apache.spark.deploy.yarn.Client的日志级别设置为DEBUG。

第二个问题是,除了属性,Spark支持许多env变量,一些文档记录,一些没有记录,一些实际上已被弃用。
例如,SPARK_CLASSPATH现已被弃用,其内容实际上注入Spark属性spark.driver/spark.executor.extraClassPath
SPARK_DIST_CLASSPATH仍在使用中,例如在Cloudera发行版中,它用于将核心Hadoop库&配置注入Spark“启动程序”,以便它可以在驱动程序启动之前引导YARN群集执行(即在评估spark.driver.extraClassPath之前)。
感兴趣的其他变量是

  • HADOOP_CONF_DIR
  • SPARK_CONF_DIR
  • SPARK_EXTRA_LIB_PATH
  • SPARK_SUBMIT_OPTS
  • SPARK_PRINT_LAUNCH_COMMAND

的第三个问题是,在某些特定情况下(如G。纱集群中的Cloudera的发行模式),星火财产spark.yarn.tokens.hbase.enabled默默地设置为false - 这使得完全没有意义,即默认是硬编码在火花源代码true ...!
因此,建议您在作业配置中明确强制使用true

第四个问题是,即使HBase令牌已经在启动时创建,那么执行者必须明确地使用它来验证。幸运的是,Cloudera为HBase贡献了一个“Spark连接器”,可以自动处理这种讨厌的东西。现在它默认是HBase客户端的一部分(参见hbase-spark*.jar)。

第五个问题是,据我所知,如果你没有metrics-core*.jar在CLASSPATH不那么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 [email protected] --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 [email protected] --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/在执行程序的CLASSPATH,通过conf自动传播。

PPS:我劝你设置log4j.logger.org.apache.zookeeper.ZooKeeper=WARNlog4j.properties,因为它是冗长的,无用的,甚至是混乱的(所有有趣的东西记录在HBase的水平)

PPS:不是那个冗长SPARK_SUBMIT_OPTS变种,你也可以静态列出$SPARK_CONF_DIR/log4j.properties中的Log4J选项,其余为$SPARK_CONF_DIR/java-opts;这同样适用于在$SPARK_CONF_DIR/spark-defaults.conf和env变量星火性质$SPARK_CONF_DIR/spark-env.sh


¤¤¤¤¤ 关于 “星火连接器” 到HBase的

摘自official HBase documentation,第83章基本星火

所有Spark和HBase集成的根源是HBaseContextHBaseContext接受HBase配置并将它们推送到Spark执行器的 。这样我们就可以在一个静态位置上为每个 Spark Executor建立一个HBase连接。

文档中未提及的是,HBaseContext自动使用HBase“授权令牌”(当存在时)来验证执行者。

还要注意,doc在RDD上有一个Spark foreachPartition操作的示例(在Scala中,然后是Java),使用BufferedMutator将异步批量加载到HBase中。