大數據系列之:深入理解學習使用騰訊COS和COS Ranger權限體系解決方案,從hdfs同步數據到cos
- 對象存儲COS
- 對象存儲基本概念
- COS Ranger權限體系解決方案
- 部署組件
- COS Ranger Plugin
- 部署COS-Ranger-Service
- 部署COS Ranger Client
- 部署 COSN
- 從hdfs同步數據到cos
對象存儲COS
- 對象存儲(Cloud Object Storage,COS)是由騰訊云推出的無目錄層次結構、無數據格式限制,可容納海量數據且支持 HTTP/HTTPS 協議訪問的分布式存儲服務。騰訊云 COS 的存儲桶空間無容量上限,無需分區管理,適用于 CDN 數據分發、數據萬象處理或大數據計算與分析的數據湖等多種場景。
對象存儲基本概念
基本概念:
- 存儲桶(Bucket):是對象的載體,可理解為存放對象的“容器”。一個存儲桶可容納無數個對象。
- 對象(Object):是對象存儲的基本單元,可理解為任何格式類型的數據,例如圖片、文檔和音視頻文件等。
- 地域(Region):是騰訊云托管機房的分布地區,對象存儲 COS 的數據存放在這些地域的存儲
COS Ranger權限體系解決方案
Hadoop Ranger 權限體系是大數據場景下的權限解決方案。用戶使用存算分離后,將數據托管在對象存儲(Cloud Object Storage,COS)上。COS 使用的是騰訊云訪問管理(Cloud Access Management,CAM)權限體系,無論是用戶身份,權限策略等,都與本地 Hadoop Ranger 體系不同。為維持客戶的使用習慣,我們提供 COS 的 Ranger 接入解決方案。
優勢
- 細粒度的權限控制,兼容 Hadoop 權限邏輯,用戶統一管理大數據組件與云端托管存儲的權限。
- 插件側無需在 core-site 中設置密鑰,密鑰統一在 COS Ranger Service 中設置,避免明文密鑰的泄露。
解決方案架構
Hadoop 權限體系中,認證由 Kerberos 提供,授權鑒權由 Ranger 負責。在此基礎上,我們提供以下組件,來支持 COS 的 Ranger 權限方案。
- COS Ranger Plugin:提供 Ranger 服務端的服務定義插件。它們提供了 Ranger 側的 COS 服務描述,包括權限種類,必要參數定義(例如 COS 的 bucket 參數和 region 參數)。部署了該插件后,用戶即可在 Ranger 的控制頁面上,填寫相應的權限策略。
- COS Ranger Service:該服務集成了 Ranger 的客戶端,周期性從 Ranger 服務端同步權限策略,在收到客戶的鑒權請求后,在本地進行權限校驗。 同時它提供了 Hadoop 中 DelegationToken 相關的生成、續租等接口,所有的接口都是通過 Hadoop IPC 定義。
- COS Ranger Client:COSN 插件對其進行動態加載,把權限校驗的請求轉發給 COS Ranger Service。
部署環境
- Hadoop 環境。
- ZooKeeper、Ranger。
- Kerberos 服務。
推薦EMR-V350版本使用的組件版本。
- Hadoop-3.2.2
- Zookeeper-3.6.3
- Ranger-2.3.0
- Kerberos-1.15.1
部署組件
部署組件請按照 COS Ranger Plugin、COS Ranger Service、COS Ranger Client、COSN 次序進行。
COS Ranger Plugin
COS-Ranger-Plugin 拓展了 Ranger Admin 控制臺上的服務種類,用戶可在 Ranger 控制臺上,設置和 COS 相關的操作權限。
在 Ranger 的服務定義目錄下新建 COS 目錄(注意,目錄權限需要保證至少有 x 與 r 權限)。
- a. 騰訊云的 EMR 環境,路徑位于部署了ranger服務的Master節點的 /usr/local/service/ranger/ews/webapp/WEB-INF/classes/ranger-plugins。
- b. 自建的 hadoop 環境,可以通過在 ranger 目錄下查找 hdfs 等已經接入到 ranger 服務的組件,查找目錄位置。
在 COS 目錄下,放入 cos-chdfs-ranger-plugin-xxx.jar。(注意 jar 包至少有 r 權限)。同時需要放入 cos-ranger.json 文件。
https://github.com/tencentyun/cos-ranger-service/blob/main/ranger-plugin/cos-chdfs-json-for-ranger-2.x/cos-ranger.json
重啟 Ranger 服務。
在 Ranger 上注冊 COS Service。可參考如下命令:
##生成服務,需傳入 Ranger 管理員賬號密碼,以及 Ranger 服務的地址。
##對于騰訊云 EMR 集群,管理員用戶是 root,密碼是構建 emr 集群時設置的 root 密碼,ranger 服務的 IP 換成 EMR 的 master 節點 IP。
adminUser=root
##構建 EMR 集群時設置的密碼,也是 ranger 服務 web 頁面的登錄密碼
adminPasswd=xxxxxx
##如果 ranger 服務有多個 master 節點,任選一個 master 即可
rangerServerAddr=10.0.0.1:6080
##命令行中 -d 指定步驟 2 中的 json 文件
curl -v -u${adminUser}:${adminPasswd} -X POST -H "Accept:application/json" -H "Content-Type:application/json" -d @./cos-ranger.json http://${rangerServerAddr}/service/plugins/definitions
##如果要刪除剛定義的服務,則傳入剛剛創建服務時,返回的服務 ID
serviceId=102
curl -v -u${adminUser}:${adminPasswd} -X DELETE -H "Accept:application/json" -H "Content-Type:application/json" http://${rangerServerAddr}/service/plugins/definitions/${serviceId}
創建服務成功后,可在 Ranger 控制臺看到 COS 服務。如下所示:
在 COS 服務側單擊**+**,定義新服務實例,服務實例名可自定義,例如cos或者cos_test,服務的配置如下所示。
配置項需添policy.grantrevoke.auth.users和policy.download.auth.users。value設置后續啟動 COS Ranger Service 服務的用戶名(即允許拉取權限策略的用戶)。通常建議設置成 hadoop,后續 COS Ranger Service 可使用此用戶名進行啟動。
單擊新生成的 COS 服務實例。
添加 policy,如下所示:
在跳轉界面中,配置以下參數,說明如下:
- bucket:存儲桶名稱,例如 examplebucket-1250000000,可登錄 COS 控制臺 查看。
- path:COS 對象路徑。注意 COS 的對象路徑不以/開始。
- include:表示設置的權限適用于 path 本身,還是除了 path 以外的其他路徑。
- recursive:表示權限不僅適用于 path,還適用于 path 路徑下的子成員(即遞歸子成員)。通常用于 path 設置為目錄的情況。
user/group:用戶名和用戶組。這里是或的關系,即用戶名或者用戶組滿足其中一個,即可擁有對應的操作權限。
Permissions:
- Read:讀操作。對應于對象存儲里面的 GET、HEAD 類操作,包括下載對象、查詢對象元數據等。
- Write:寫操作。對應于對象存儲里面的 PUT 類等修改操作,例如上傳對象。
- Delete:刪除操作。 對應于對象存儲里刪除 Object。對于 Hadoop 的 Rename 操作,需要有對原路徑的刪除操作權限,對新路徑的寫入操作權限。
- List:遍歷權限。對應于對象存儲里面的 List Object。
驗證
使用 hadoop cmd 執行訪問 COSN 的相關操作。查看當前用戶執行的操作是否符合主賬號的權限設置預期,示例如下所示:
#將bucket,路徑等替換為主賬號的實際信息。
hadoop fs -ls cosn://examplebucket-1250000000/doc
hadoop fs -put ./xxx.txt cosn://examplebucket-1250000000/doc/
hadoop fs -get cosn://examplebucket-1250000000/doc/exampleobject.txt
hadoop fs -rm cosn://examplebucket-1250000000/doc/exampleobject.txt
部署COS-Ranger-Service
COS-Ranger-Service 是整個權限體系的核心,負責集成 ranger 的客戶端,接收 ranger client 的鑒權請求,token 生成續租請求和臨時密鑰生成請求。同時也是敏感信息(騰訊云密鑰信息)所在的區域,通常部署在堡壘機器上,只允許集群管理員操作,查看配置等。
COS-Ranger-Service 支持多節點的 HA 部署,DelegationToken 狀態持久化到 DB上。通過 ZK 互相感知彼此節點的存在。通過客戶端配置的任何一個存活的 cos-ranger-server 的地址, 即可知道全量的列表。 客戶端通過 round-robin 的方式, 把請求發送給所有 cos-ranger-server 的節點. 因此可以通過平行擴容 cos-ranger-server,來提升整體的鑒權能力。
版本
V6.0 版本及以上。
部署步驟
將 COS Ranger Service 服務代碼拷貝到集群的幾臺機器上,生產環境建議至少兩臺機器。因為涉及到敏感信息,建議是堡壘機或者權限嚴格管控的機器。
如果是 kerberos 集群, 則需要一個 db 來保存 Delegation Token(有關 kerberos 的 Delegation token 的作用, 搜索相關博文即可), db 規格推薦16c32g,100g磁盤以上。在負載不高的集群上,可混用 Hive meta store 的 db。 初始化 database 和表的 sql 語句可前往 Github 的 cos-ranger-service/sql 目錄下獲取.
修改 cos-ranger.xml 文件中的相關配置,其中必須修改的配置項如下所示。配置項說明請參見文件中的注釋說明。
- qcloud.object.storage.rpc.address
- qcloud.object.storage.status.port
- qcloud.object.storage.enable.cos.ranger
- qcloud.object.storage.zk.address (zk 地址,cos ranger service 啟動后注冊到 zk 上)
- qcloud.object.storage.cos.secret.id
- qcloud.object.storage.cos.secret.key
- qcloud.object.storage.kerberos.principal (kerberos 集群下的 principal, 非 kerberos 請忽略)
- qcloud.object.storage.kerberos.keytab (kerberos 集群下的 keytab 文件, 非 kerberos 請忽略)
- sql-dt-secret-manager.connection.url(kerberos 集群, 保存 delegation token 的db, 非 kerberos 請忽略)
- sql-dt-secret-manager.connection.username (kerberos 集群, 訪問 delegation token 的db的用戶名, 非 kerberos 請忽略)
- hadoop.security.credential.provider.path (kerberos 集群, 訪問 delegation token 的db的用戶密碼的 jceks 文件路徑, 非 kerberos 請忽略)
修改 ranger-cos-security.xml 文件中的相關配置。其中必須修改的配置項有如下所示。配置項說明請參見文件中的注釋說明。
- ranger.plugin.cos.policy.cache.dir
- ranger.plugin.cos.policy.rest.url
- ranger.plugin.cos.service.name
修改 start_rpc_server.sh 中 hadoop_conf_path 和 java.library.path 的配置。這兩個配置分別指向 hadoop 配置文件所在的目錄(例如 core-site.xml、hdfs-site.xml)以及 hadoop native lib 路徑。
執行如下命令啟動服務。
chmod +x start_rpc_server.sh
nohup ./start_rpc_server.sh &> nohup.txt &
如果啟動失敗,查看 log 下 error 日志是否有錯誤信息。
COS Ranger Service 支持展示 HTTP 端口狀態(端口名為 qcloud.object.storage.status.port,默認值為9998)。用戶可通過以下命令獲取狀態信息(例如目前全量的cos-ranger-server列表、鑒權數量統計等)。
# 請將下面的10.xx.xx.xxx替換為部署 ranger service 的機器 IP
# port 9998 設置為 qcloud.object.storage.status.port 配置值
curl -v http://10.xx.xx.xxx:9998/status
驗證
使用 hadoop cmd 執行訪問 COSN 的相關操作。查看當前用戶執行的操作是否符合主賬號的權限設置預期,示例如下所示:
#將bucket,路徑等替換為主賬號的實際信息。
hadoop fs -ls cosn://examplebucket-1250000000/doc
hadoop fs -put ./xxx.txt cosn://examplebucket-1250000000/doc/
hadoop fs -get cosn://examplebucket-1250000000/doc/exampleobject.txt
hadoop fs -rm cosn://examplebucket-1250000000/doc/exampleobject.txt
使用 MR Job 進行驗證,驗證前需重啟相關的服務,例如 Yarn、Hive 等。
獲取統計信息
可以通過以下 curl 命令手動獲取 COS Ranger 的統計信息
curl http://${ranger_ip}:9998/status | jq# 返回
{"allMemberAddress": "10.0.0.7:9999",//集群中所有成員的地址"currentNodeIsLeader": true, // 當前節點是否是leader節點"leaderAddress": "10.0.0.7:9999", // leader地址(對于客戶端v5.x版本有意義,v6.x后是全對等模式,leader信息沒有意義"authStat": {// 自定義鑒權認證的次數統計信息(對于為實現自定義認證的服務,始終是認證成功)"authSuccessStat": { // 認證成功統計信息"qps_5m": 0,// 最近 5 分鐘的每秒查詢數(QPS)"total_1m": 0,//最近 1 分鐘的總成功認證次數"qps_1m": 0,// 最近 1 分鐘的每秒查詢數"total_5m": 0,//最近 5 分鐘的總成功認證次數"qps": 0//當前的每秒查詢數},"authFailedStat": {// 鑒權認證失敗統計信息,字段含義與 authSuccessStat 相同"qps_5m": 0,"total_1m": 0,"qps_1m": 0,"total_5m": 0,"qps": 0}},"rpcMethodStat": {//包含不同 RPC 方法的調用次數的統計信息"checkPermission": {//檢查權限的方法統計信息"qps_5m": 10,"total_1m": 3000,"qps_1m": 50,"total_5m": 3000,"qps": 1000},"getAvailableService": {//獲取可用服務的方法統計信息"qps_5m": 0,"total_1m": 1,"qps_1m": 0.02,"total_5m": 1,"qps": 0}},"checkPermissionAllowAfterRetryCnt": 0,// 經過重試后允許的權限檢查次數"checkPermissionAllowCnt": 4000,//允許的權限檢查總次數"becomeLeaderTime": "2024-12-10T12:56:52.888Z",//當前節點成為leader的時間"checkAuthDenyCnt": 0,//被拒絕的認證檢查次數"serviceStartTime": "2024-12-10T12:56:52.884Z",//服務啟動的時間"checkPermissionDenyCnt": 0,//被拒絕的權限檢查次數"accessStat": {//包含不同訪問類型的統計信息"READ": {//讀取操作的統計信息"qps_5m": 10,"total_1m": 3000,"qps_1m": 50,"total_5m": 3000,"qps": 1000}},"checkCostStat": {//checkPermission(檢查權限)耗時的統計信息"checkFailStat": {//失敗"avg_5m": 0,"min_1m": 0,"avg": 0,"min": 0,"max": 0,"max_1m": 0,"avg_1m": 0,"max_5m": 0,"min_5m": 0},"checkSuccessStat": {//成功"avg_5m": 5,//最近 5 分鐘的平均耗時"min_1m": 0,//最近1分鐘最小耗時"avg": 4,//平均耗時"min": 0,//最小耗時"max": 1263,//最大耗時"max_1m": 1263,//最近一分鐘最大耗時"avg_1m": 5,//最近一分鐘平均耗時"max_5m": 1263,//最近五分鐘最大耗時"min_5m": 0//最近五分鐘最小耗時}},"authCostStat": {// 權限認證耗時統計"authSuccessStat": {"avg_5m": 0,"min_1m": 0,"avg": 0,"min": 0,"max": 0,"max_1m": 0,"avg_1m": 0,"max_5m": 0,"min_5m": 0},"authFailedStat": {"avg_5m": 0,"min_1m": 0,"avg": 0,"min": 0,"max": 0,"max_1m": 0,"avg_1m": 0,"max_5m": 0,"min_5m": 0}},"rpcMethodCostStat": {//RPC接口耗時統計"checkPermission": {"avg_5m": 5,"min_1m": 0,"avg": 4,"min": 0,"max": 1263,"max_1m": 1263,"avg_1m": 5,"max_5m": 1263,"min_5m": 0},"getAvailableService": {"avg_5m": 280,"min_1m": 280,"avg": 280,"min": 280,"max": 280,"max_1m": 280,"avg_1m": 280,"max_5m": 280,"min_5m": 280}},"statsTimestamp": "2024-12-12T05:28:38.688Z",//統計時間"checkStat": {// check policy統計信息"checkFailStat": {"qps_5m": 0,"total_1m": 0,"qps_1m": 0,"total_5m": 0,"qps": 0},"checkSuccessStat": {"qps_5m": 10,"total_1m": 3000,"qps_1m": 50,"total_5m": 3000,"qps": 1000}}
}
部署COS Ranger Client
COS Ranger Client 由 hadoop cosn 插件動態加載,并代理訪問 COS Ranger Service 的相關請求。例如獲取臨時密鑰、獲取 token、鑒權操作等。
版本
cos-ranger-client 要求V6.0 版本及以上。cosn-ranger-interface 要求 v1.0.5版本及以上。
騰訊云 EMR 環境中默認安裝目錄在 common/lib 下,例如 /usr/local/service/hadoop/share/hadoop/common/lib 下。請根據自己的環境,放在對應的common/lib 路徑下。 對于 ranger-client 的包名,例如 hadoop-ranger-client-for-hadoop-2.8.5-6.0.jar,2.8.5 是 hadoop 版本號,6.0是該包的版本號。for-hadoop 是通常組件使用的版本,其他一些組件,例如 presto, impala 以及高版本的 spark(spark-3.2.0版本及以后) 等,由于對依賴的 hadoop-common做了 shade,因此 ranger-client 也必須做 shade,否則會報類找不到。這些包請下載對應的 for-presto, for-impala, for-spark 版本等。
部署方式
將 cos-ranger-client jar 包和cosn-ranger-interface jar 包拷貝到與 COSN 同一目錄下通常在/usr/local/service/hadoop/share/hadoop/common/lib/目錄下;請選擇拷貝與自身 hadoop 大版本一致的 jar 包,最后確保 jar 包有可讀權限。
在 core-site.xml 添加如下配置項:
<configuration><!--*****必須配置********--><!-- 上一步部署的 cos ranger server 的地址 --><property><name>qcloud.object.storage.ranger.service.address</name><value>10.0.0.8:9999,10.0.0.10:9999</value></property><!--***可選配置****--> <!-- 設置 cos ranger service 端用的 kerberos 憑據,參考 cos ranger service 端的配置,須保持一致,如果沒有認證的需求,不需要配置 --><property> <name>qcloud.object.storage.kerberos.principal</name><value>hadoop/_HOST@EMR-XXXX</value></property>
</configuration>
部署 COSN
部署 COSN 插件方法請參考 Hadoop 工具 文檔,但需注意以下幾點:
使用 ranger 后,fs.cosn.userinfo.secretId 和 fs.cosn.userinfo.secretKey 密鑰信息不需要配置。COSN 插件后續通過 COSRangerService 獲取臨時密鑰。
fs.cosn.credentials.provider 需設置為 org.apache.hadoop.fs.auth.RangerCredentialsProvider 才可通過 Ranger 進行認證鑒權。如下所示:
<property><name>fs.cosn.credentials.provider</name><value>org.apache.hadoop.fs.auth.RangerCredentialsProvider</value>
</property>
從hdfs同步數據到cos
from pyspark.sql import SparkSession
import argparse# 初始化 Spark 會話
spark = SparkSession.builder \.appName("Write Parquet Example") \.getOrCreate()parser = argparse.ArgumentParser()
parser.add_argument('--dt', type=str)
arg = parser.parse_args()
date_time = arg.dt# 讀取 Parquet 文件
df = spark.read.parquet(f"{HDFS路徑}/datetime={date_time}")# 重新分區為 1 個分區
df_repartitioned = df.repartition(1)# 指定輸出路徑
output_path = f"cosn://{HDFS路徑}/datetime={date_time}"# 寫入 Parquet 文件到指定路徑
df_repartitioned.write.mode("overwrite").parquet(output_path)# 關閉 Spark 會話
spark.stop()