1. 程式人生 > >YARN、Spark、Hive使用kerberos

YARN、Spark、Hive使用kerberos

本文記錄YARN、Spark、Hive各服務配置使用kerberos的過程。

我的環境:

  • 三臺伺服器,分別命名為zelda1、zelda2、zelda3
  • ubuntu 14.04
  • hadoop 2.7.2
  • spark 2.0/1.6.1

YARN認證

目的是將YARN接入到kerberos叢集裡,使得:

  1. RM和NM之間能互相認證,避免混進去惡意服務;
  2. 其他提交到YARN上的JOB必須能夠通過kerberos認證,避免無證商戶提交作業到YARN叢集上去。

配置:修改yarn-site.xml,指定rm和nm的Principal和keytab,將該檔案同步到所有節點。

<property>
     <name
>
yarn.resourcemanager.principal</name> <value>rm/[email protected]</value> </property> <property> <name>yarn.resourcemanager.keytab</name> <value>/etc/security/rm.service.keytab</value> </property> <property> <name
>
yarn.nodemanager.principal</name> <value>nm/[email protected]</value> </property> <property> <name>yarn.nodemanager.keytab</name> <value>/etc/security/nm.service.keytab</value> </property>

Hortonworks還會要求配置container-excutor為LinuxContainer,可以有更好的物理隔離(底層為lxc)。但由於它需要啟動container-executor,而這個要求配置檔案container-executor.cfg必須為root許可權,並且其上層所有目錄許可權都是root,所以只能把配置檔案放到/etc/下,但是!container-executor程式碼裡寫死了配置檔案的路徑為../etc/,所以只能重新編譯一個container-excutor。

所以我就先沒配,挖個坑。

spark作業認證

目的是spark-submit提交作業的時候,能夠接入到kerberos中,從而向YARN提交作業、訪問HDFS等等。

針對spark-submit的任務,有兩種辦法通過kerberos認證:

  • 先kinit -k -t /etc/security/xx.keytab user/[email protected],然後spark-submit提交即可
  • 作為引數提供給spark-submit:--keytab /etc/security/dtdream.zelda1.keytab --principaldtdream/[email protected],注意緊跟著命令,不要放到最後(會被當做spark JOB的引數)

總之還是以keytab的方式來的,只是從當前Principal快取裡讀取,還是自己從keytab裡讀取。

1、新增一個Principal:

addprinc -randkey dtdream/zelda1@ZELDA.COM
xst -k dtdream.spark.keytab dtdream/zelda1@ZELDA.COM

2、將生成的dtdream.spark.keytab檔案拷貝到/etc/security/下

3、kinit後submit作業

kinit -kt /etc/security/dtdream.spark.keytab  dtdream/zelda1
klist #檢查Principal快取
./bin/spark-submit --master yarn --class org.apache.spark.examples.SparkLR --name SparkLR lib/spark-examples-1.6.1-hadoop2.6.0.jar

或者跳過kinit直接指定keytab路徑:

 ./bin/spark-submit --keytab /etc/security/dtdream.zelda1.keytab --principal dtdream/zelda1@ZELDA.COM --master yarn --class org.apache.spark.examples.SparkLR --name SparkLR lib/spark-examples-1.6.1-hadoop2.6.0.jar

spark sql的thriftserver是作為一個spark作業,通過spark-submit提交給yarn的,啟動之前需要設定kinit或者指定keytab由spark-submit自己loginfromkeytab。

spark-submit還可以指定–proxy-user引數,可以模擬其他使用者來提交job。

hive認證

hive支援三種:Kerberos、LDAP、CUSTOM(自定義外掛)。如果使用 Kerberos 身份驗證,Thrift 客戶端和 HiveServer2 以及 HiveServer2 和安全 HDFS 之間都支援身份驗證。如果使用 LDAP 身份驗證,僅在 Thrift 客戶端和 HiveServer2 之間支援身份驗證(CUSTOM類似)。

下面採用kerberos認證的配置。

  <property>
    <name>hive.server2.enable.doAs</name>
    <value>false</value>
  </property>

<property>
  <name>hive.server2.authentication</name>
  <value>KERBEROS</value>
</property>
<property>
  <name>hive.server2.authentication.kerberos.principal</name>
  <value>dtdream/[email protected]</value>
</property>
<property>
  <name>hive.server2.authentication.kerberos.keytab</name>
  <value>/etc/security/dtdream.zelda1.keytab</value>
</property>

注意需要先kinit保證已經有Principal快取。Kerberos客戶端支援兩種,一是使用Principal+Password,二是使用Principal+keytab,前者適合互動式應用,例如hadoop fs -ls這種,後者適合服務,例如yarn的rm、nm等。兩種初始化方法的命令如下:

$ kinit zlatan/zelda1@ZELDA.COM
Password for zlatan/zelda1@ZELDA.COM:
--
$ kinit -k -t /../xx.keytab {username}/{instance}@{REALM}.COM

kinit後,啟動hiveserver2,使用beeline登入:

beeline> !connect jdbc:hive2://zelda1:10000/default;principal=dtdream/zelda1@ZELDA.COM;
Connecting to jdbc:hive2://zelda1:10000/default;principal=dtdream/zelda1@ZELDA.COM;
Enter username for jdbc:hive2://zelda1:10000/default;principal=dtdream/zelda1@ZELDA.COM;: 
Enter password for jdbc:hive2://zelda1:10000/default;principal=dtdream/zelda1@ZELDA.COM;: 
Connected to: Apache Hive (version 2.0.0)
Driver: Hive JDBC (version 2.0.0)
16/06/13 10:46:50 [main]: WARN jdbc.HiveConnection: Request to set autoCommit to false; Hive does not support autoCommit=false.
Transaction isolation: TRANSACTION_REPEATABLE_READ

注意這裡還是會提示輸入使用者名稱、密碼,是個bug,別理它,直接回車就好了,我們用的其實是klist的Principal快取來表示我是誰。 beeline會將Principal傳給hive2 JDBC,由JDBC Driver去做Kerberos認證,這個過程略微複雜,等我弄懂了再寫篇文章。

Spark SQL Thriftserver認證

目的是讓不同的使用者,使用不同的身份來登入beeline。

1、使用管理員賬戶kinit到Kerberos

我們用dtdream/[email protected]。thriftserver實際是個spark Job,通過spark-submit提交到YARN上去,需要這個賬戶用來訪問YARN和HDFS;如果使用一些普通賬戶,由於HDFS許可權不足,可能啟動不了,因為需要往HDFS寫一些東西。

2、配置spark配置檔案裡的hive-site.xml

thriftserver在YARN上跑起來了以後,也需要接入到Kerberos,hive-site裡指定的就是這個Principal,這裡我也是用的Principal。

配置跟前面hive的一樣,注意doAs務必是true,否則又會包shim包找不到的錯誤;又由於doAs是true,所以下面需要安全偽裝(我猜的)。

  <property>
    <name>hive.server2.enable.doAs</name>
    <value>true</value>
  </property>

<property>
  <name>hive.server2.authentication</name>
  <value>KERBEROS</value>
</property>
<property>
  <name>hive.server2.authentication.kerberos.principal</name>
  <value>dtdream/[email protected]</value>
</property>
<property>
  <name>hive.server2.authentication.kerberos.keytab</name>
  <value>/etc/security/dtdream.zelda1.keytab</value>
</property>

3、配置hadoop安全偽裝

跟hive不一樣,spark sql thriftserver需要使用安全偽裝

修改hadoop的core-site.xml,配合doAs,[email protected]�人,例如zlatan/[email protected]登入到beeline上以後,thriftserver會使用zlatan的許可權去訪問HDFS,而不是啟動thriftserver的這個Principal(即dtdream/[email protected])。

<property>
  <name>hadoop.proxyuser.dtdream.hosts</name>
  <value>*</value>
</property>
<property>
  <name>hadoop.proxyuser.dtdream.groups</name>
  <value>*</value>
</property>

4、啟動spark sql thriftserver

./start-thriftserver.sh --master yarn  --driver-java-options '-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=13838'  --executor-memory 6g  --driver-memory 6g --conf spark.yarn.executor.memoryOverhead=4096 --driver-class-path /home/dtdream/spark/spark-1.6.1-bin-hadoop2.6/lib/mysql-connector-java-5.1.35-bin.jar

我在裡面指定了remote debug,可以用IDEA遠端連線到機器上除錯。

5、登入跟hive一樣,需要先kinit一個使用者(密碼or keytab),然後JDBC connect上去。

beeline > !connect jdbc:hive2://zelda1:20000/default;principal=dtdream/zelda1@ZELDA.COM;
Connecting to jdbc:hive2://zelda1:20000/default;principal=dtdream/zelda1@ZELDA.COM;
Enter username for jdbc:hive2://zelda1:20000/default;principal=dtdream/zelda1@ZELDA.COM;: 
Enter password for jdbc:hive2://zelda1:20000/default;principal=dtdream/zelda1@ZELDA.COM;: 
16/06/13 14:45:30 INFO Utils: Supplied authorities: zelda1:20000
16/06/13 14:45:30 INFO Utils: Resolved authority: zelda1:20000
16/06/13 14:45:30 INFO HiveConnection: Will try to open client transport with JDBC Uri: jdbc:hive2://zelda1:20000/default;principal=dtdream/zelda1@ZELDA.COM;
Connected to: Spark SQL (version 1.6.1)
Driver: Spark Project Core (version 1.6.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
6: jdbc:hive2://zelda1:20000/default> show databases;

beeline登入時遇到的幾個問題:

1、Unsupported mechanism

beeline> !connect jdbc:hive2://zelda1:20000/default
16/06/12 14:24:32 INFO HiveConnection: Transport Used for JDBC connection: null
Error: Could not open client transport with JDBC Uri: jdbc:hive2://zelda1:20000/default: Peer indicated failure: Unsupported mechanism type PLAIN (state=08S01,code=0)

需要指定principal。不指定的話顯然就是PLAIN方式啊笨蛋。

2、不準偽裝!

beeline> !connect jdbc:hive2://zelda1:20000/default;principal=dtdream/zelda1@ZELDA.COM
Connecting to jdbc:hive2://zelda1:20000/default;principal=dtdream/zelda1@ZELDA.COM
Enter username for jdbc:hive2://zelda1:20000/default;principal=dtdream/zelda1@ZELDA.COM: 
Enter password for jdbc:hive2://zelda1:20000/default;principal=dtdream/zelda1@ZELDA.COM: 
16/06/12 14:40:42 INFO Utils: Supplied authorities: zelda1:20000
16/06/12 14:40:42 INFO Utils: Resolved authority: zelda1:20000
16/06/12 14:40:43 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
16/06/12 14:40:43 INFO HiveConnection: Will try to open client transport with JDBC Uri: jdbc:hive2://zelda1:20000/default;principal=dtdream/zelda1@ZELDA.COM
Error: Failed to open new session: java.lang.RuntimeException: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: dtdream/zelda1@ZELDA.COM is not allowed to impersonate dtdream (state=,code=0)

需要配置安全偽裝。

多租戶和程式設計場景

前面的方案要求先kinit,每個client(linux使用者級別)當前只能有一個使用者,其他使用者再kinit會頂替掉當前的Principal,不適合多租戶和程式設計場景:

In the current approach of using Kerberos you need to have a valid Kerberos ticket in the ticket cache before connecting. This entails a static login (using kinit, key tab or ticketcache) and the restriction of one Kerberos user per client. These restrictions limit the usage in middleware systems and other multi-user scenarios, and in scenarios where the client wants to login programmatically to Kerberos KDC.

不過hive提供了secure proxy users功能,

  1. Hadoop level許可權的使用者(如本例的dtdream),在當前會話過程中模擬proxy user(如普通使用者zlatan)來執行,許可權檢查時都是針對proxy user,而不是特權使用者
  2. Delegation token based connection for Oozie,即使用一個已經授權的機器的token,去訪問另一個未經授權的機器。還沒用過Oozie。

我們這裡先關注JDBC,它的方法比較簡單,增加hive.server2.proxy.user=bob引數即可。

beeline> !connect jdbc:hive2://zelda1:20000/default;principal=dtdream/zelda1@ZELDA.COM;hive.server2.proxy.user=bob
0: jdbc:hive2://zelda1:20000/default> insert into x1 select t.* from (select 105, 37) t;
Error: java.lang.RuntimeException: Cannot create staging directory 'hdfs://zelda1/user/hive/warehouse/dtdream.db/x1/.hive-staging_hive_2016-06-14_11-15-29_063_112329594714965380-1': Permission denied: user=bob, access=WRITE, inode="/user/hive/warehouse/dtdream.db/x1/.hive-staging_hive_2016-06-14_11-15-29_063_112329594714965380-1":dtdream:supergroup:drwxrwxr-x

基於儲存的認證、授權模型基本是可用的了,若輔助以Ranger這樣的許可權控制,會比較靈活、統一。不過這裡還有個問題,Kerberos的使用者怎麼跟Ranger打通(啊!)。目前Ranger只支援跟UNIX和LDAP/AD使用者同步。

總結

使用Kerberos,的確可以解決服務互相認證、使用者認證的功能。

場景1:使用者提交spark App。需要該使用者有kerberos的許可權,以及對應的yarn、hdfs的讀寫許可權等。

場景2:jdbc登入。以beeline為例,不同的使用者通過kinit使用自己的Principal+密碼通過Kerberos的AS認證拿到TGT,就可以登入到spark sql thriftserver上去檢視庫、表;不過由於sts還不支援sqlbased authorization,所以還只能做到底層hdfs的許可權隔離,比較可惜;相對來說hive的完整度高一些,支援SQLstandard authorization。

對於Zeppeline或者數夢的dataStudio這樣的產品來說,web服務可以使用管理員賬戶啟動;普通使用者先通過Studio的認證,在JDBC訪問Spark thrift server的時候,studio可以使用Principal+proxyUser的方式,以當前會話的使用者的身份,來訪問最終資源如HDFS,以達到認證+資料隔離的目的。

仔細閱讀:

傳送門:

相關推薦

YARNSparkHive使用kerberos

本文記錄YARN、Spark、Hive各服務配置使用kerberos的過程。 我的環境: 三臺伺服器,分別命名為zelda1、zelda2、zelda3ubuntu 14.04hadoop 2.7.2spark 2.0/1.6.1 YARN認證 目的是將YARN接入到

docker部署分散式大資料叢集hadoopsparkhivejdkscala

(一)1 用docker建立映象並搭建三個節點容器的hadoop及spark服務 包括:mysql,hadoop,jdk,spark,hive,scala,sqoop docker已經安裝並且啟動 #搜尋centos映象: docker search centos #拉取

【經典】一篇文章初識大資料,及大資料相關框架Hadoopsparkflink等

今天看到一篇講得比較清晰的框架對比,這幾個框架的選擇對於初學分散式運算的人來說確實有點迷茫,相信看完這篇文章之後應該能有所收穫。 簡介 大資料是收集、整理、處理大容量資料集,並從中獲得見解所需的非傳統戰略和技術的總稱。雖然處理資料所需的計算能力或儲存容量早已超過一

【技術世界】分享大資料領域技術包括但不限於StormSparkHadoop等分散式計算系統,KafkaMetaQ等分散式訊息系統, MongoDB等NoSQL,PostgreSQL等RDBMS,SQL優

技術世界 分享大資料領域技術、包括但不限於Storm、Spark、Hadoop等分散式計算系統,Kafka、MetaQ等分散式訊息系統, MongoDB等NoSQL,PostgreSQL等RDBMS,SQL優...

【stark_summer的專欄 】專注於開發分散式任務排程框架分散式同步RPC非同步MQ訊息佇列分散式日誌檢索框架hadoop、spark、scala等技術 如果我的寫的文章能對您有幫助,請您能給點捐助,請看首頁置頂

專注於開發分散式任務排程框架、分散式同步RPC、非同步MQ訊息佇列、分散式日誌檢索框架、hadoop、spark、scala等技術 如果我的寫的文章能對您有幫助,請您能給點捐助,請看首頁置頂...

hadoopsparksparkstrming和kafka簡介

1、Hadoop和Spark的關係 Spark是為了跟Hadoop配合而開發出來的,不是為了取代Hadoop,專門用於大資料量下的迭代式計算。 Spark運算比Hadoop的MapReduce框架快的原因是因為Hadoop在一次MapReduce運算之後,會將資料的運算結果從記憶體寫入到磁碟中,

jupyter安裝及配置scalasparkpyspark核心

安裝 jupyter和python 本文使用Anaconda安裝jupyter。 Anaconda可以看做Python的一個整合安裝,安裝它後就預設安裝了python、IPython、整合開發環境Spyder和眾多的包和模組 下載 Anaconda

hadoopsparkHbaseHivehdfs,是什麼

這些都是“大資料”相關的概念,即和關係型資料庫,相比較而產生的新技術。即j2ee的web開發中,資料庫部分(如傳統的關係型資料庫的oracle),的內容 1Hbase:是一個nosql資料庫,和mongodb類似。 2hdfs:hadoop distribut file

(轉)HadoopSparkHBase與Redis的適用性見解

由於沒有機會對Hadoop、Spark、HBase與Redis的各個特性進行測試,所以在網路上找到了這篇文章,說說Hadoop、Spark、HBase與Redis的適用性問題。 轉自 http://datainsight.blog.51cto.com/8987355/142

資料計算(大資料):MapReduceSparkStorm概述特點原理

MapReduceMapReduce將複雜的、運行於大規模叢集上的平行計算過程高度地抽象到了兩個函式:Map和Reduce。特點:程式設計容易;分而治之策略(大規模資料集,會被切成許多獨立分片,分片由多個Map任務);計算向資料靠攏(設計理念)函式輸入輸出說明Map<k

大資料叢集遇到的問題(HadoopSparkHivekafkaHbasePhoenix)

大資料平臺中遇到的實際問題,整理了一下,使用CDH5.8版本,包括Hadoop、Spark、Hive、kafka、Hbase、Phoenix、Impala、Sqoop、CDH等問題,初步整理下最近遇到的問題,不定期更新。 啟動nodemanager失敗 2016-09-07

阿里雲上部署java8和hadoop3.0sparkhive及Mahout

1.安裝JDK1.8 到oracle官網:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安裝及配置參考http://blog.csdn.net/rc

資料探勘中SASpythonRsparkhadoop個人見解

2014年做過幾個比較大型的SAS專案,今年接觸接觸pandas,想在兩者說說自己的一些看法,對於SAS能處理的大資料,之前在民生銀行的是SAS伺服器配置的是128g記憶體 16核cpu  2t的硬碟空間,處理億級別的資料還是毫無壓力的,sas軟體不得不說不只是一個單純的統計軟體,在資料探勘這一塊無可媲美的

HadoopSparkStorm相關元件安裝

一、準備 1. 安裝虛擬機器與編譯Hadoop 注:本文選的是base server,同時把java安裝選項去掉 建立3個虛擬機器,分別為hsm01, hss01, hss02 hostname ip

Spark Streaming 程式在 YARN 叢集上長時間執行(二)—— 日誌監控Metrics

前段時間看到了外國朋友寫的一篇文章,覺得還不錯,於是就把他翻譯一下,供大家參考和學習。 如果沒看過第一篇文章,建議先去看一下上一篇文章哈,這裡是接著上一篇文章來寫的哈~ 日誌 訪問 Spark 應用程式日誌的最簡單方法是配置 Log4j 控

HadoopMapReduceYARNSpark的區別與聯絡

(1) Hadoop 1.0 第一代Hadoop,由分散式儲存系統HDFS和分散式計算框架MapReduce組成,其中,HDFS由一個NameNode和多個DataNode組成,MapReduce由一個JobTracker和多個TaskTracker組成,對應Hadoop版

Spark學習(二) 之叢集搭建(standaloneHA-standalone spark on yarn)

Spark standalone (一) 安裝過程 1、上傳並解壓縮 tar -zxvf spark-2.3.0-bin-hadoop2.7.tgz -C apps/ 2、進入spark/conf修改配置檔案 cp slaves.template slav

Hadoop(HDFSYARNHBaseHive和Spark等)預設埠表

埠 作用 9000 fs.defaultFS,如:hdfs://172.25.40.171:9000 9001 dfs.namenode.rpc-address,DataNode會連線這個

sparkhadoop動態增減節點

hadoop 動態 節點 之前在搭建實驗環境的時候按部就班的配置好,然後就啟動了。後來再一琢磨,有點不對勁。分布式系統的一個優勢就是動態可伸縮性,如果增刪節點需要重啟那肯定是不行的。後來研究了一下,發現的確是不需要重啟的。仍以Spark和Hadoop為例:對於spark來說很簡單,增加一個節點就是

處理大數據流常用的三種Apache框架:StormSpark和Samza。(主要介紹Storm)

領導 hdf 客戶端 orm 至少 per yar 持續性 apache 處理實時的大數據流最常用的就是分布式計算系統,下面分別介紹Apache中處理大數據流的三大框架: Apache Storm 這是一個分布式實時大數據處理系統。Storm設計用於在容錯和