1. 程式人生 > 其它 >解決spark讀取hive許可權被拒絕的問題

解決spark讀取hive許可權被拒絕的問題

技術標籤:HiveSpark

使用spark讀取hive表時,發生如下錯誤:

Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=xingweidong, access=READ_EXECUTE, inode="/user/hive/warehouse/ads_seer.db/user_action_from_xyio/dt=2020-12-28":hive:hive:drwxrwx--x
	at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:400)
	at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:262)
	at org.apache.sentry.hdfs.SentryINodeAttributesProvider$SentryPermissionEnforcer.checkPermission(SentryINodeAttributesProvider.java:86)

hadoop叢集啟用了kerberos+sentry,hive使用sentry進行許可權管理,上面這個問題是使用者xingweidong訪問hive表ads_seer.user_action_from_xyio時,顯示無權訪問。
而使用hive beeline,使用者是可以訪問的。根據報錯提示,我們可以看到,使用者無權訪問hive表下的檔案。

對於這個問題,就涉及到spark訪問hive的鑑權機制了,貌似spark訪問hive需要有元資料訪問許可權和表文件訪問許可權。而此報錯就是因為spark對檔案沒有訪問許可權。這種情況,只需要配置sentry就可以解決。
配置如下:
在這裡插入圖片描述
新增上圖第二個許可權配置,spark就可以正常訪問hive了。

上圖第一個是表許可權,第二個是庫許可權。

資料讀取正常了,但是還會報警告如下:

21/01/20 17:43:31 INFO hive.HiveMetastoreCatalog: Saving case-sensitive schema for table ads_seer.user_action_from_xyio
21/01/20 17:43:31 WARN hive.HiveMetastoreCatalog: Unable to save case-sensitive schema for table ads_seer.user_action_from_xyio
org.apache.spark.sql.AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to alter table. User xingweidong does not have privileges for ALTERTABLE_ADDCOLS;
	at org.apache.spark.sql.hive.HiveExternalCatalog.withClient(HiveExternalCatalog.scala:108)
	at org.apache.spark.sql.hive.HiveExternalCatalog.alterTableDataSchema(HiveExternalCatalog.scala:687)
	at org.apache.spark.sql.catalyst.catalog.ExternalCatalogWithListener.alterTableDataSchema(ExternalCatalogWithListener.scala:132)
	at org.apache.spark.sql.catalyst.catalog.SessionCatalog.alterTableDataSchema(SessionCatalog.scala:386)
	at org.apache.spark.sql.hive.HiveMetastoreCatalog.updateDataSchema(HiveMetastoreCatalog.scala:264)
	at org.apache.spark.sql.hive.HiveMetastoreCatalog.org$apache$spark$sql$hive$HiveMetastoreCatalog$$inferIfNeeded(HiveMetastoreCatalog.scala:248)
	at org.apache.spark.sql.hive.HiveMetastoreCatalog$$anonfun$4$$anonfun$5.apply(HiveMetastoreCatalog.scala:167)
	at org.apache.spark.sql.hive.HiveMetastoreCatalog$$anonfun$4$$anonfun$5.apply(HiveMetastoreCatalog.scala:156)

這個警告看起來是修改表失敗,沒有深究spark讀取hive表的邏輯,因為讀取資料正常,所以暫時不研究這個問題。