解決spark讀取hive許可權被拒絕的問題
阿新 • • 發佈:2021-01-21
使用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表的邏輯,因為讀取資料正常,所以暫時不研究這個問題。