spark程序正在内部调用hdfs:/apps/hive/warehouse

zpgglvta  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(427)

场景/代码详细信息

我正在创建spark会话对象以将数据存储到配置单元表中,如下所示:

_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是不安全的。
以上两个原因是正确的还是有解决办法?

wkftcu5l

wkftcu5l1#

似乎是用户“diplatform”的hdfs的权限问题。
使用admin用户登录并执行以下操作

hadoop fs -mkdir -p /apps/hive/warehouse
hadoop fs -mkdir /tmp
hadoop fs -chmod -R 777 /user/hive
hadoop fs -chmod 777 /tmp

然后从“diplatform”创建数据库语句。

a11xaf1n

a11xaf1n2#

配置单元元存储有自己的xml文件,用于确定配置单元表在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用户目录中。

相关问题