1.環境的安裝與准備
參考下圖:
2.數據庫服務的安裝與添加(HADOOP,HDFS,HIVE)
如下圖所示:
3.華為官網的文檔的指導手冊(HADOOP,HDFS,HIVE)
FusionInsight HD 6.5.1 應用開發指南 03
https://support.huawei.com/enterprise/zh/doc/EDOC1100094183/2a06ceda
4.HIVE數據庫的連接
你會發現:UserGroupInformation這個類。在訪問帶有kerberos認證的hadoop生態圈服務時,必須帶上keytab文件認證
目的:通過 UserGroupInformation.
loginUserFromKeytabAndReturnUGI(userCode,keytabPath); 這個方法成功后,返回的票據信息,通過這個票據,可以在沒過期的情況下,用來訪問hadoop系統。
userCode是用戶的名稱,keytabPath是keytab文件的路徑,一般系統是采用kdc生成的驗證文件,來進行系統登錄。系統不需要知道密碼。
默認userCode你在使用:內置的hive 的下hive/hadoop.hadoop.com@HADOOP.COM 在測試來鏈接,拿到connection是沒有問題的。后續才發現問題來了。請看下面。
建議:使用這種鏈接方式,也是華為封裝的一些登錄和認證的方法工具類。也是為了后面的HDFS認證的需要
5.HDFS文件上傳
HDFS初始化是指在使用HDFS提供的API之前,需要做的必要工作。
大致過程為:加載HDFS服務配置文件,並進行Kerberos安全認證,認證通過后再實例化Filesystem,之后使用HDFS的API。此處Kerberos安全認證需要使用到的keytab文件,可在客戶端下載即可。每個對應的用戶對應的有認證文件。
安全認證:核心就是配置文件(我是直接從安裝的路徑中先查找再下載下來的。)
hadoop.rpc.protection—這一項非常關鍵。你會按照正常的HA 的方式,或者網上各種連接HDFS認證方式的代碼,都會執行報錯。每次報的錯誤都不一樣,完全摸不到頭緒。
上圖你會根據出現的這個圖,你就離成功不遠啦,這是說明了你的客戶端和服務端的這項參數配置不一致導致了(怎么理解這句話。)
本段代碼,我在自己本地windowS中,我去掉這個參數設置,執行,獲取連接,HDFS文件上傳,load數據,查詢表數據都沒有問題。
一部署到linux上就各種報錯。這個時候你會各種百度查資料,想着去確認是不是服務端的core-site.xml的配置文件中的參數是不是真的不一致。於是,我find / - name core-site.xml 在 主110 ,從109,108找到了接近40個core-site.xml文件。我一個一個去編輯查看該參數。結果居然全是一樣,value就是privacy。
那么問題又來了,hadoop.rpc.protection中的參數到底是什么意思?privacy是什么含義呢?
3. 原因分析
1.HDFS的客戶端和服務端數據傳輸走的rpc協議,該協議有多種加密方式,由hadoop.rpc.protection參數控制。
2.如果客戶端和服務端的hadoop.rpc.protection參數的配置值不一樣,即會報No common protection layer between client and server錯誤。
含義解釋:
hadoop.rpc.protection參數表示數據可通過以下任一方式在節點間進行傳輸。
• privacy:默認值,指數據在鑒權及加密后再傳輸。這種方式會降低性能。
• authentication:指數據在鑒權后直接傳輸,不加密。這種方式能保證性能但存在安全風險。
• integrity:指數據直接傳輸,即不加密也不鑒權。 為保證數據安全,請謹慎使用這種方式。
看到這里我似乎就明白了,不知道你們明不明白,我在HDFS文件上傳時,獲取Configuration時,沒有指定數據傳輸的方式導致。
於是就有了了下面這短代碼:
config.addResource("hdfs-site.xml");
config.addResource("core-site.xml");
conf.set("hadoop.security.authentication", "Kerberos");
conf.setBoolean("fs.hdfs.impl.disable.cache",true);
conf.set("fs.defaultFS", "hdfs://fusion3:25000");
conf.set("hadoop.rpc.protection", "privacy");
conf.set("dfs.data.transfer.protection", "integrity");
結果還是報錯。
你發現查網上,結合HA集群的方式,都不行。那怎么辦,到底是哪里的問題。根據報錯,我還是斷定是數據傳輸的協議問題。我想我只設置配置conf.set("hadoop.rpc.protection", "privacy");
這一個參數呢,其他的亂七八糟和認證的方式我都不管,先保證它沒問題。還是不行出現下面的錯誤:
一看到這個錯誤,我就斷定是認證文件的問題,我放開config.addResource("hdfs-site.xml");
config.addResource("core-site.xml");
文件認證的限制,果然外面是可以跑通的,現在就是測試項目中是否可行。結果項目中真的就是這4行代碼就解決了HDFS的問題。