2017-05-30 103 views
0

我正在向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) 

請建議。

回答

2

你並不孤單,希望從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中。