Spark-Streaming Kafka In Kerberos

最近在HDP2.6的環(huán)境里嘗試了Kerberos,在各組件運行正常的情況下最終成功運行spark-streaming應(yīng)用,總結(jié)一下就是一葉障目,不見泰山鬼譬,坑多梯子少。尤其在國內(nèi)逊脯,關(guān)于Kerberos的資料較少优质,但在生產(chǎn)環(huán)境中,Kerberos又是如鯁在喉男窟,無法忽視盆赤。

因此分享這篇文章贾富,希望能給還在苦苦爬坑的小伙伴們一點幫助歉眷。

  • 我們的HDP為單用戶ocsp安裝,多用戶需要根據(jù)以下步驟進(jìn)行細(xì)微修改

確認(rèn)OCSP各組件的Kerberos工作正常

1. Kafka

  • 使用kafka-topics.sh創(chuàng)建topic

  • 使用kafka producer和consumer需要先kinit
    kinit -kt /etc/security/keytabs/kafka.service.keytab ocsp/host-10-1-236-122@ASIAINFO.COM

  • 使用producer發(fā)送消息颤枪,consumer消費消息

    • kafka producer
      /usr/hdp/2.6.0.3-8/kafka/bin/kafka-console-producer.sh --topic kerin --broker-list host-10-1-236-122:6667 --security-protocol PLAINTEXTSASL

    • kafka consumer
      /usr/hdp/2.6.0.3-8/kafka/bin/kafka-console-consumer.sh --topic kerin --security-protocol PLAINTEXTSASL --bootstrap-server host-10-1-236-122:6667

FAQ:

  • 使用kafka producer和consumer需要先kinit kinit -kt /etc/security/keytabs/kafka.service.keytab ocsp/<hostname>@ASIAINFO.COM
  • 否則:
    • kafka producer 報錯:

      [2017-07-19 10:44:56,582] WARN Error while fetching metadata with correlation id 0 : {kertest=UNKNOWN_TOPIC_OR_PARTITION} (org.apache.kafka.clients.NetworkClient)

    • kafka consumer 報錯:

      javax.security.auth.login.LoginException: Could not login: the client is being asked for a password, but the Kafka client code does not currently support obtaining a password from the user. not available to garner authentication information from the user


2. Hive

  • kinit
  • 使用beeline登錄

3. Phoenix

  • 使用sqlline與principal汗捡,keytab登錄

進(jìn)行Spark,Kafka針對Kerberos相關(guān)配置

1. 先放上最后提交任務(wù)的命令

spark-submit  --class <classname> --master yarn --deploy-mode client --executor-memory 2g --executor-cores 2 --driver-memory 2g --num-executors 2 --queue default  --principal ocsp-yg@ASIAINFO.COM --keytab /etc/security/keytabs/hdfs.headless.keytab --files "/usr/OCSP/conf/kafka_client_jaas.conf,/usr/OCSP/conf/ocsp.keytab" --driver-java-options "-Djava.security.auth.login.config=/usr/OCSP/conf/kafka_client_jaas.conf" --conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=./kafka_client_jaas.conf" --jars <your jars>,/usr/OCSP/lib/spark-kafka-0-10-connector-assembly_2.10-1.0.1.jar /usr/OCSP/lib/ocsp-core_1.6-2.1.0.jar 
  • --principal與--keytab這兩個參數(shù)為spark需要的Kerberos認(rèn)證信息

  • --driver-java-options "-Djava.security.auth.login.config=/usr/OCSP/conf/kafka_client_jaas.conf"為driver連接kafka用到的認(rèn)證信息,因此使用本地絕對路徑

  • --conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=./kafka_client_jaas.conf"為executor連接kafka用到的Kerberos認(rèn)證信息扇住,因此使用container中的相對路徑./

  • jaas文件中定義了principal與keytab春缕,由于我們使用了yarn-client模式,driver需要的文件在本地文件系統(tǒng)艘蹋,executor需要的文件需要我們使用--files的方式上傳锄贼,即--files "/usr/OCSP/conf/kafka_client_jaas.conf,/usr/OCSP/conf/ocsp.keytab"

  • 有的文檔中說--files中傳keytab文件會與spark本身的--keytab 沖突,其實是因為他們對spark和kafka使用了相同的principal和keytab女阀,在上述命令中我為了清晰起見宅荤,讓spark使用了principal ocsp-yg@ASIAINFO.COM,keytab hdfs.headless.keytab浸策,讓spark連接kafka時使用了principal ocsp/ASIAINFO.COM(principal其實是在jaas文件中指定的冯键,3中詳細(xì)講jaas文件) keytab ocsp.keytab,當(dāng)spark提交任務(wù)時庸汗,yarn會將--keytab后面的keytab文件與--files里的文件先后上傳惫确,即 hdfs.headless.keytab與ocsp.keytab均會被上傳,spark與kafka各取所需蚯舱,即可正常工作改化。當(dāng)spark與kafka要使用相同的keytab文件時,比如都用ocsp.keytab晓淀,那么yarn會先后上傳兩次ocsp.keytab所袁,在spark正使用的時候更新了keytab,造成異常退出

  • 因此如果spark與kafka需要使用相同的keytab文件凶掰,我們只需要在--files里不要上傳keytab即可避免沖突

spark-submit  --class <classname> --master yarn --deploy-mode client --executor-memory 2g --executor-cores 2 --driver-memory 2g --num-executors 2 --queue default  --principal ocsp@ASIAINFO.COM --keytab /etc/security/keytabs/ocsp.keytab --files "/usr/OCSP/conf/kafka_client_jaas.conf" --driver-java-options "-Djava.security.auth.login.config=/usr/OCSP/conf/kafka_client_jaas.conf" --conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=./kafka_client_jaas.conf" --jars <your jars>,/usr/OCSP/lib/spark-kafka-0-10-connector-assembly_2.10-1.0.1.jar /usr/OCSP/lib/ocsp-core_1.6-2.1.0.jar 
  • 還有一個問題是本例中drvier和executor使用了相同的kafka_client_jaas.conf燥爷,這也會造成一些問題,3中會詳細(xì)說明

2. 生成keytab和principal

  • 在KDC Server上執(zhí)行
    kadmin -p admin/admin@ASIAINFO.COM
  • 生成principal懦窘,principal最好使用ocsp的用戶名+domain
    addprinc -randkey ocsp/ASIAINFO.COM
  • 生成keytab
    ktadd -k /data/ocsp.keytab ocsp/ASIAINFO.COM
  • 將keytab文件copy到spark driver所在的機器(因為OCSP默認(rèn)使用yarn-client模式)

3. 創(chuàng)建spark讀取kafka的jaas配置文件

  • 配置文件kafka_client_jaas.conf樣例如下:
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
  useTicketCache=false
  useKeyTab=true
  principal="ocsp@ASIAINFO.COM"
  keyTab="./ocsp.keytab"
  renewTicket=true
  storeKey=true
  serviceName="ocsp";
};
  • 其中useTicketCache指從系統(tǒng)的cash中讀取credential信息前翎,useKeyTab指從指定的keyTab文件讀取credential

  • principal和keytab用第二步生成的principal與keytab,注意:k?eytab的路徑

    • 如果這個conf文件是給driver讀取畅涂,則我們要用keytab文件在本地的絕對路徑
    • 如果這個conf文件是executor讀取港华,則我們要用keytab文件在container中的相對路徑,即./ocsp.keytab
    • 如果為了方便起見午衰,drvier與executor要使用相同的jaas文件立宜,路徑配置為./ocsp.keytab,我們需要將keytab文件copy到運行spark-submit的當(dāng)前路徑
    • 如果driver和executor要使用不同的jaas文件臊岸,則driver的jaas文件中橙数,keytab應(yīng)為本地絕對路徑,executor的jaas文件中帅戒,keytab應(yīng)為相對路徑./

4. 配置spark1.6+kafka0.10 jar包

<dependency>
                    <groupId>com.hortonworks</groupId>
                    <artifactId>spark-kafka-0-10-connector-main_2.10</artifactId>
                    <version>1.0.1</version>
                    <scope>system</scope>
                    <systemPath>${project.basedir}/../lib/spark-kafka-0-10-connector_2.10-1.0.1.jar</systemPath>
</dependency>

5. 修改Spark讀取Kafka部分

  • 需要import org.apache.spark.streaming.kafka010.{ConsumerStrategies, KafkaUtils, LocationStrategies}
  • 我們使用的DirectApi讀取kafka
KafkaUtils.createDirectStream[String, String](
        SSC,
        LocationStrategies.PreferConsistent,
        ConsumerStrategies.Subscribe[String, String](TopicsSet, KafkaParams))

KafkaParams配置如下:

val KafkaParams = Map[String, Object]("auto.offset.reset" -> "latest"
            , "key.deserializer" -> classOf[StringDeserializer]
            , "value.deserializer" -> classOf[StringDeserializer]
            , "security.protocol" -> "SASL_PLAINTEXT"
            , "bootstrap.servers" -> "kafka-server1:6667"
            , "group.id" -> "test")

6. 修改Spark寫Kafka部分

  • 寫kafka調(diào)用的是kafka官方的庫
<dependency>
                <groupId>org.apache.kafka</groupId>
                <artifactId>kafka_2.11</artifactId>
                <version>0.10.1.1</version>
</dependency>
  • 代碼中需要import org.apache.kafka.clients.producer.{KafkaProducer, Producer, ProducerConfig, ProducerRecord}
val props = new Properties()
      props.put("bootstrap.servers", dsConf.get("metadata.broker.list", ""))
      props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
      props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer")
      if (MainFrameConf.KERBEROS_ENABLE == "true"){
        props.put("security.protocol","SASL_PLAINTEXT")
      }
new KafkaProducer[String, String](props)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末践盼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宾巍,更是在濱河造成了極大的恐慌咕幻,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顶霞,死亡現(xiàn)場離奇詭異肄程,居然都是意外死亡,警方通過查閱死者的電腦和手機选浑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蓝厌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人古徒,你說我怎么就攤上這事拓提。” “怎么了隧膘?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵代态,是天一觀的道長。 經(jīng)常有香客問我疹吃,道長蹦疑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任萨驶,我火速辦了婚禮歉摧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腔呜。我一直安慰自己叁温,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布核畴。 她就那樣靜靜地躺著膝但,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膛檀。 梳的紋絲不亂的頭發(fā)上锰镀,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音咖刃,去河邊找鬼泳炉。 笑死,一個胖子當(dāng)著我的面吹牛嚎杨,可吹牛的內(nèi)容都是我干的花鹅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼枫浙,長吁一口氣:“原來是場噩夢啊……” “哼刨肃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起箩帚,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤真友,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后紧帕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盔然,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年是嗜,在試婚紗的時候發(fā)現(xiàn)自己被綠了愈案。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹅搪,死狀恐怖站绪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丽柿,我是刑警寧澤恢准,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站甫题,受9級特大地震影響顷歌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜幔睬,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一眯漩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧麻顶,春花似錦赦抖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矫钓,卻和暖如春要尔,著一層夾襖步出監(jiān)牢的瞬間舍杜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工赵辕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留既绩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓还惠,卻偏偏與公主長得像饲握,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蚕键,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容