在寻求从 Spark 到 HBase 的 Kerberos 身份验证过程中,您并不孤单,参见。 SPARK-12279
鲜为人知的事实是,Spark 现在在启动时为 Yarn、HDFS、Hive、HBase 生成Hadoop“身份验证令牌”。然后将这些令牌广播给执行者,这样他们就不必再与 Kerberos auth、keytabs 等混淆了。
第一个问题是它没有明确记录,并且在失败的情况下默认隐藏错误(即大多数人不使用 Kerberos 连接到 HBase,因此声明 HBase JARs 通常是没有意义的不在 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“启动器”,以便它可以在驱动程序启动之前(即在评估 spark.driver.extraClassPath 之前)引导 YARN 集群执行。
其他感兴趣的变量是
HADOOP_CONF_DIR
SPARK_CONF_DIR
SPARK_EXTRA_LIB_PATH
SPARK_SUBMIT_OPTS
SPARK_PRINT_LAUNCH_COMMAND
第三个问题是,在某些特定情况下(例如 Cloudera 发行版中的 YARN-cluster 模式),Spark 属性 spark.yarn.tokens.hbase.enabled 被静默设置为 false strong> -- 这完全没有意义,默认值在 Spark 源代码中硬编码为 true...!
因此,建议您在工作配置中明确地将其强制为true。
第四个问题是,即使在启动时已经创建了 HBase 令牌,那么执行器必须显式地使用它来进行身份验证。幸运的是,Cloudera 为 HBase 提供了一个“Spark 连接器”,可以自动处理这种讨厌的东西。它现在是 HBase 客户端的一部分,默认情况下(参见hbase-spark*.jar)。
第五个问题是,AFAIK,如果您在 CLASSPATH 中没有 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 时,执行程序的 CLASSPATH 中不需要 /etc/hbase/conf/,conf 会自动传播。
PPS:我建议你在log4j.properties 中设置log4j.logger.org.apache.zookeeper.ZooKeeper=WARN,因为它冗长、无用,甚至令人困惑(所有有趣的东西都记录在 HBase 级别)
PPS:除了冗长的SPARK_SUBMIT_OPTS var,您还可以在$SPARK_CONF_DIR/log4j.properties 中静态列出Log4J 选项,在$SPARK_CONF_DIR/java-opts 中列出其余选项; $SPARK_CONF_DIR/spark-defaults.conf 中的 Spark 属性和 $SPARK_CONF_DIR/spark-env.sh 中的环境变量也是如此
¤¤¤¤¤
关于 HBase 的“Spark 连接器”
摘自official HBase documentation,第 83 章 基本 Spark
所有 Spark 和 HBase 集成的根源是 HBaseContext。
HBaseContext 接受 HBase 配置并将它们推送到
Spark 执行者。这允许我们每个人都有一个 HBase 连接
Spark Executor 位于静态位置。
文档中没有提到的是 HBaseContext 自动使用 HBase “auth token”(如果存在)来验证执行者。
另请注意,该文档有一个示例(在 Scala 中,然后在 Java 中)在 RDD 上使用 BufferedMutator 异步批量加载到 HBase 中的 Spark foreachPartition 操作。