在 Elasticsearch 集群中配置了 HDFS 插件,用于存储集群的索引快照。
在 HDFS 存储库创建成功之后,尝试创建索引快照的时候,遇到了如下问题:
如上图所示,在执行创建快照的命令时,抛出了repository_exception
异常,但也给出了一串原因:
"reason 4" : "[test541to660] could not read repository data from index blob"
"reason 3" : "com.google.protobuf.ServiceException: java.security.AccessControlException: access denied (\"javax.security.auth.PrivateCredentialPermission\" \"org.apache.hadoop.security.Credentials\" \"read\")"
"reason 2" : "java.security.AccessControlException: access denied (\"javax.security.auth.PrivateCredentialPermission\" \"org.apache.hadoop.security.Credentials\" \"read\")"
"reason 1" : "access denied (\"javax.security.auth.PrivateCredentialPermission\" \"org.apache.hadoop.security.Credentials\" \"read\")"
从下向上看,显然,最根本的原因在于javax.security.auth.PrivateCredentialPermission
,没有read
权限。
实际上,每个 Java 应用在启动的时候,都会加载一个安全管理器,其指定了一些安全策略,在没有指定安全管理器的情况下,会默认加载$JAVA_HOME/jre/lib/security
目录下的java.policy
文件。
为了解决上述问题,我们需要做的就是在java.policy
文件中,新增一项配置:
permission java.security.AllPermission;
具体如下所示,
在添加完该项配置之后,重新启动 Elasticsearch 集群,再次创建快照,即可成功。
特别地,以下为博主的实践验证,供大家参考:
master
节点所在服务器的配置,重启master
节点,仍未生效;因此,博主算是把 Elasticsearch 集群和 HDFS 集群中所有节点所在服务器的配置都修改了一遍,这才解决了上面的权限问题。