我正在创建一个火花会话对象,将数据存储到配置单元表中,如下所示:
_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是不安全的。
答案 0 :(得分:2)
Hive Metastore有其自己的XML文件,该文件确定Hive表在HDFS上的位置。此属性由HiveServer而非Spark确定
例如,在Hortonworks集群上,请注意仓库具有777权限,并由hive
用户和hdfs
超级用户组拥有。
$ hdfs dfs -ls /apps/hive
Found 2 items
drwxrwxrwx - hive hadoop 0 2018-02-27 20:20 /apps/hive/auxlib
drwxrwxrwx - hive hdfs 0 2018-06-27 10:27 /apps/hive/warehouse
根据您的错误,该目录存在,但是没有用户可以读取,写入或列出该仓库目录的内容。
理想情况下,我建议不要将仓库放在HDFS用户目录中。
答案 1 :(得分:0)
似乎是用户“ diplatform”在HDFS上的权限问题。
使用管理员用户登录并执行以下操作
hadoop fs -mkdir -p /apps/hive/warehouse
hadoop fs -mkdir /tmp
hadoop fs -chmod -R 777 /user/hive
hadoop fs -chmod 777 /tmp
然后从“ diplatform”创建数据库语句。