火花在YARN +安全的hbase

时间:2017-05-30 14:53:43

标签: apache-spark hbase kerberos hadoop2 spark-structured-streaming

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

但是,只要我将master作为YARN提交作业(并将部署模式作为客户端),我就会看到以下错误消息 -

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)

请建议。

1 个答案:

答案 0 :(得分:8)

从Spark中寻求Kerberos auth到HBase并不是唯一的。 SPARK-12279

一个鲜为人知的事实是,Spark现在为Yarn,HDFS,Hive,HBase 启动生成 Hadoop“auth令牌”。然后将这些令牌广播给执行者,这样他们就不必再使用Kerberos auth,keytabs等进行混乱。

第一个问题是它没有明确记录,并且在失败的情况下,默认情况下隐藏错误(即大多数人不使用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 libs&配置到Spark“启动器”,以便它可以在驱动程序启动之前(即在评估spark.driver.extraClassPath之前)引导YARN群集执行。
其他感兴趣的变量是

  • 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 会静默设置为 {{1 }} - 这完全没有意义,默认在Spark源代码中被硬编码为false ...!
因此建议您在作业配置中明确强制true

第四个问题是,即使在启动时创建了HBase令牌,执行程序也必须明确地使用它来进行身份验证。幸运的是,Cloudera为HBase贡献了一个“Spark连接器”,自动处理这种令人讨厌的东西。默认情况下,它现在是HBase客户端的一部分(参见true)。

第五个问题是,AFAIK,如果您在CLASSPATH中没有 hbase-spark*.jar ,那么HBase连接将会因令人费解(且无关)的ZooKepper错误而失败。


¤¤¤¤¤ 如何通过调试跟踪使这些东西工作

metrics-core*.jar

PS:当使用# 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 时,执行程序的CLASSPATH中不需要HBaseContext,会自动传播conf。

PPS:我建议你在/etc/hbase/conf/中设置log4j.logger.org.apache.zookeeper.ZooKeeper=WARN因为它冗长,无用,甚至令人困惑(所有有趣的东西都记录在HBase级别)

PPS:您可以静态列出log4j.properties中的Log4J选项以及SPARK_SUBMIT_OPTS中的其余选项,而不是那个详细$SPARK_CONF_DIR/log4j.properties var。同样适用于$SPARK_CONF_DIR/java-opts中的Spark属性和$SPARK_CONF_DIR/spark-defaults.conf

中的env变量


¤¤¤¤¤ 关于HBase的“Spark连接器”

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

  

所有Spark和HBase集成的根源是$SPARK_CONF_DIR/spark-env.sh。   HBaseContext接受HBase配置并将其推送到   Spark执行者。这允许我们拥有HBase连接   Spark Executor位于静态位置。

文档中未提及的是HBaseContext自动使用HBase“auth token”(如果存在)来验证执行程序。

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