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叢集裡,使得:
- RM和NM之間能互相認證,避免混進去惡意服務;
- 其他提交到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功能,
- Hadoop level許可權的使用者(如本例的dtdream),在當前會話過程中模擬proxy user(如普通使用者zlatan)來執行,許可權檢查時都是針對proxy user,而不是特權使用者
- 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,以達到認證+資料隔離的目的。
仔細閱讀:
傳送門:
相關推薦
YARN、Spark、Hive使用kerberos
本文記錄YARN、Spark、Hive各服務配置使用kerberos的過程。 我的環境: 三臺伺服器,分別命名為zelda1、zelda2、zelda3ubuntu 14.04hadoop 2.7.2spark 2.0/1.6.1 YARN認證 目的是將YARN接入到
docker部署分散式大資料叢集hadoop、spark、hive、jdk、scala、
(一)1 用docker建立映象並搭建三個節點容器的hadoop及spark服務 包括:mysql,hadoop,jdk,spark,hive,scala,sqoop docker已經安裝並且啟動 #搜尋centos映象: docker search centos #拉取
【經典】一篇文章初識大資料,及大資料相關框架Hadoop、spark、flink等
今天看到一篇講得比較清晰的框架對比,這幾個框架的選擇對於初學分散式運算的人來說確實有點迷茫,相信看完這篇文章之後應該能有所收穫。 簡介 大資料是收集、整理、處理大容量資料集,並從中獲得見解所需的非傳統戰略和技術的總稱。雖然處理資料所需的計算能力或儲存容量早已超過一
【技術世界】分享大資料領域技術、包括但不限於Storm、Spark、Hadoop等分散式計算系統,Kafka、MetaQ等分散式訊息系統, 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等技術 如果我的寫的文章能對您有幫助,請您能給點捐助,請看首頁置頂...
hadoop、spark、sparkstrming和kafka簡介
1、Hadoop和Spark的關係 Spark是為了跟Hadoop配合而開發出來的,不是為了取代Hadoop,專門用於大資料量下的迭代式計算。 Spark運算比Hadoop的MapReduce框架快的原因是因為Hadoop在一次MapReduce運算之後,會將資料的運算結果從記憶體寫入到磁碟中,
jupyter安裝及配置scala、spark、pyspark核心
安裝 jupyter和python 本文使用Anaconda安裝jupyter。 Anaconda可以看做Python的一個整合安裝,安裝它後就預設安裝了python、IPython、整合開發環境Spyder和眾多的包和模組 下載 Anaconda
hadoop、spark、Hbase、Hive、hdfs,是什麼
這些都是“大資料”相關的概念,即和關係型資料庫,相比較而產生的新技術。即j2ee的web開發中,資料庫部分(如傳統的關係型資料庫的oracle),的內容 1Hbase:是一個nosql資料庫,和mongodb類似。 2hdfs:hadoop distribut file
(轉)Hadoop、Spark、HBase與Redis的適用性見解
由於沒有機會對Hadoop、Spark、HBase與Redis的各個特性進行測試,所以在網路上找到了這篇文章,說說Hadoop、Spark、HBase與Redis的適用性問題。 轉自 http://datainsight.blog.51cto.com/8987355/142
資料計算(大資料):MapReduce、Spark、Storm概述、特點、原理
MapReduceMapReduce將複雜的、運行於大規模叢集上的平行計算過程高度地抽象到了兩個函式:Map和Reduce。特點:程式設計容易;分而治之策略(大規模資料集,會被切成許多獨立分片,分片由多個Map任務);計算向資料靠攏(設計理念)函式輸入輸出說明Map<k
大資料叢集遇到的問題(Hadoop、Spark、Hive、kafka、Hbase、Phoenix)
大資料平臺中遇到的實際問題,整理了一下,使用CDH5.8版本,包括Hadoop、Spark、Hive、kafka、Hbase、Phoenix、Impala、Sqoop、CDH等問題,初步整理下最近遇到的問題,不定期更新。 啟動nodemanager失敗 2016-09-07
阿里雲上部署java8和hadoop3.0、spark、hive及Mahout
1.安裝JDK1.8 到oracle官網:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安裝及配置參考http://blog.csdn.net/rc
資料探勘中SAS、python、R、spark、hadoop個人見解
2014年做過幾個比較大型的SAS專案,今年接觸接觸pandas,想在兩者說說自己的一些看法,對於SAS能處理的大資料,之前在民生銀行的是SAS伺服器配置的是128g記憶體 16核cpu 2t的硬碟空間,處理億級別的資料還是毫無壓力的,sas軟體不得不說不只是一個單純的統計軟體,在資料探勘這一塊無可媲美的
Hadoop、Spark、Storm相關元件安裝
一、準備 1. 安裝虛擬機器與編譯Hadoop 注:本文選的是base server,同時把java安裝選項去掉 建立3個虛擬機器,分別為hsm01, hss01, hss02 hostname ip
讓 Spark Streaming 程式在 YARN 叢集上長時間執行(二)—— 日誌、監控、Metrics
前段時間看到了外國朋友寫的一篇文章,覺得還不錯,於是就把他翻譯一下,供大家參考和學習。 如果沒看過第一篇文章,建議先去看一下上一篇文章哈,這裡是接著上一篇文章來寫的哈~ 日誌 訪問 Spark 應用程式日誌的最簡單方法是配置 Log4j 控
Hadoop、MapReduce、YARN和Spark的區別與聯絡
(1) Hadoop 1.0 第一代Hadoop,由分散式儲存系統HDFS和分散式計算框架MapReduce組成,其中,HDFS由一個NameNode和多個DataNode組成,MapReduce由一個JobTracker和多個TaskTracker組成,對應Hadoop版
Spark學習(二) 之叢集搭建(standalone、HA-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(HDFS、YARN、HBase、Hive和Spark等)預設埠表
埠 作用 9000 fs.defaultFS,如:hdfs://172.25.40.171:9000 9001 dfs.namenode.rpc-address,DataNode會連線這個
spark、hadoop動態增減節點
hadoop 動態 節點 之前在搭建實驗環境的時候按部就班的配置好,然後就啟動了。後來再一琢磨,有點不對勁。分布式系統的一個優勢就是動態可伸縮性,如果增刪節點需要重啟那肯定是不行的。後來研究了一下,發現的確是不需要重啟的。仍以Spark和Hadoop為例:對於spark來說很簡單,增加一個節點就是
處理大數據流常用的三種Apache框架:Storm、Spark和Samza。(主要介紹Storm)
領導 hdf 客戶端 orm 至少 per yar 持續性 apache 處理實時的大數據流最常用的就是分布式計算系統,下面分別介紹Apache中處理大數據流的三大框架: Apache Storm 這是一個分布式實時大數據處理系統。Storm設計用於在容錯和