场景/代码详情
我正在创建一个 spark session 对象来将数据存储到 hive 表中,如下所示:
_sparkSession = SparkSession.builder().
config(_sparkConf).
config("spark.sql.warehouse.dir", "/user/platform").
enableHiveSupport().
getOrCreate();
将我的 JAR 部署到服务器后,出现以下异常:
Caused by: org.apache.spark.sql.AnalysisException:
org.apache.hadoop.hive.ql.metadata.HiveException:
MetaException(message:org.apache.hadoop.security.AccessControlException:
Permission denied: user=diplatform, access=EXECUTE,
inode="/apps/hive/warehouse":hdfs:hdfs:d---------
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:353)
在我的 hive-site.xml 中,我给出了以下配置。我们将此 xml 添加到我们的 spark 代码中,以便可以覆盖 /etc/hive/conf 中的默认 xml:
<property>
<name>hive.security.metastore.authenticator.manager</name>
<value>org.apache.hadoop.hive.ql.security.HadoopDefaultMetastoreAuthenticator</value>
</property>
<property>
<name>hive.security.metastore.authorization.auth.reads</name>
<value>false</value>
</property>
<property>
<name>hive.security.metastore.authorization.manager</name>
<value>org.apache.hadoop.hive.ql.security.authorization.DefaultHiveMetastoreAuthorizationProvider</value>
</property>
<property>
<name>hive.metastore.authorization.storage.checks</name>
<value>false</value>
</property>
<property>
<name>hive.metastore.cache.pinobjtypes</name>
<value>Table,Database,Type,FieldSchema,Order</value>
</property>
<property>
<name>hive.metastore.client.connect.retry.delay</name>
<value>5s</value>
</property>
<property>
<name>hive.metastore.client.socket.timeout</name>
<value>1800s</value>
</property>
<property>
<name>hive.metastore.connect.retries</name>
<value>24</value>
</property>
<property>
<name>hive.metastore.execute.setugi</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.failure.retries</name>
<value>24</value>
</property>
<property>
<name>hive.metastore.kerberos.keytab.file</name>
<value>/etc/security/keytabs/hive.service.keytab</value>
</property>
<property>
<name>hive.metastore.kerberos.principal</name>
<value>hive/_HOST@EXAMPLE.COM</value>
</property>
<property>
<name>hive.metastore.pre.event.listeners</name>
<value>org.apache.hadoop.hive.ql.security.authorization.AuthorizationPreEventListener</value>
</property>
<property>
<name>hive.metastore.sasl.enabled</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.server.max.threads</name>
<value>100000</value>
</property>
<property>
<name>hive.metastore.uris</name>
<value>thrift://masternode1.com:9083</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/platform</value>
</property>
问题:
整个开发团队现在不确定为什么以及从哪里获取这条路径:/apps/hive/warehouse,即使在覆盖我们的自定义 hive-site.xml 之后也是如此?
是不是内部 HDFS 框架调用这个位置来存储它的中间结果并且它需要这个路径的执行权限?
根据政策,我们无法在 /apps/hive/warehouse 向用户提供 777 级访问权限,原因有两个:
将来可能会有其他一组不同的用户。在仓库向用户提供 777 是不安全的。
- 以上两个原因是正确的还是有一些解决方法?