簡體   English   中英

使用Windows中的Java和Kerberos Keytab在Cloudera上訪問HDFS

[英]Accessing HDFS on Cloudera with Java and Kerberos Keytab from Windows

我正在嘗試連接到在Cloudera上運行的HDFS實例。 我的第一個步驟啟用Kerberos和創建Keytabs(如圖所示這里 )。

在下一步中,我想使用keytab進行身份驗證。

Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://cloudera:8020");
conf.set("hadoop.security.authentication", "kerberos");

UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab("hdfs@CLOUDERA", "/etc/hadoop/conf/hdfs.keytab");

FileSystem fs = FileSystem.get(conf);
FileStatus[] fsStatus = fs.listStatus(new Path("/"));
for (int i = 0; i < fsStatus.length; i++) {
    System.out.println(fsStatus[i].getPath().toString());
}

它失敗並出現以下錯誤

java.io.IOException:來自keytab /etc/hadoop/conf/hdfs.keytab的hdfs @ CLOUDERA登錄失敗:javax.security.auth.login.LoginException:無法從用戶獲取密碼

問題是:如何正確處理密鑰表? 我必須將它復制到我的本地機器嗎?

在Windows上運行Hadoop客戶端以訪問kerberized集群時,您需要一個特定的“本機庫” (即DLL)。
據我所知,沒有充分的理由,因為lib實際上並沒有在一些自動回歸測試之外使用(!?!),因此Hadoop提交者對Hadoop用戶造成了痛苦。

為了增加額外的痛苦,沒有正式構建該DLL(以及允許從Java使用它的Windows“存根”)。 您必須(a)自己從源代碼構建它 - 祝你好運 - 或者(b)在互聯網上搜索可下載的Hadoop-for-Windows運行時,並祈禱它不包含任何惡意軟件。
最好的選擇(對於64位Windows)在這里: https//github.com/steveloughran/winutils
...而自述文件解釋了為什么你可以合理地相信運行時。 但是,如果您遇到舊的32位Windows,那么您就是獨立的。

現在讓我們假設您在Windows框下部署了該運行時
C:\\Some Dir\\hadoop\\bin\\
(最后的bin是必需的;嵌入式空間只是額外的樂趣)

您必須使用幾個Java屬性將Hadoop客戶端指向該運行時:
"-Dhadoop.home.dir=C:/Some Dir/hadoop" "-Djava.library.path=C:/Some Dir/hadoop/bin"
(注意Windows args周圍的雙引號,以保護路徑中的嵌入空間,這些空間已被翻譯為Java風格以獲得額外的樂趣)
(在Eclipse中,只需將這些道具填入“VM Arguments”,包括引號)

現在,有Kerberos配置。 如果您的KDC是您的公司Active Directory服務器,那么Java應該自動找到配置參數。 但是,如果您的KDC是Linux上的獨立“MIT Kerberos”安裝,那么您必須在群集上找到有效的/etc/krb5.conf文件,將其復制到Windows框中,並讓Java使用其他屬性。 ..
"-Djava.security.krb5.conf=C:/Some Other Dir/krb5.conf"

然后我們假設您已經在Linux機器上創建了keytab文件,使用ktutil (或者使用某些AD命令為您創建的Active Directory管理員)並將文件放在
C:\\Some Other Dir\\foo.keytab
在其他任何事情之前,如果密鑰表是用於真正的Windows帳戶 - 即您自己的帳戶 - 或Prod服務帳戶,那么請確保密鑰表是安全的! 使用Windows安全性對話框僅限制對您的帳戶的訪問(對於備份,可能只限制系統) 因為該文件可以使任何計算機上的任何人在群集(以及任何支持Kerberos的系統,包括Windows)上進行身份驗證。

現在您可以嘗試使用身份驗證
UserGroupInformation.loginUserFromKeytab("foo@BAR.ORG", "C:/Some Other Dir/foo.keytab");

如果它不起作用,請使用環境變量啟用Kerberos調試跟蹤
set HADOOP_JAAS_DEBUG=true
...和Java屬性
-Dsun.security.krb5.debug=true
(在Eclipse中,分別在“Environment”和“VM Arguments”中設置它們)

你有設置適當的權限嗎?

 chown hdfs:hadoop /etc/hadoop/conf/hdfs.keytab
 chmod 440 /etc/hadoop/conf/hdfs.keytab

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM