修正
之前写这篇文章时根据: 《CDH大数据平台集成Apache Ranger安全管理框架解决方案》这篇文章的指导,发现并不太好实现,因为无法获得服务进程的路径。所以我直接修改CDH服务启动脚本,但是发现会影响其他服务的启动。后来我发现上面这篇文章的copyConfigFile放错了地方,修改以后可用
问题描述
我使用的是CDH6.3.0,本来hive版本是2.2.1,后来升级为3.1.2。我们希望使用apache ranger作为权限控制组件。
根据教程,发现hiveserver2启动失败,报不能读取ranger的配置文件。查看可知,配置文件生成到指定的目录下,但是CDH服务每次的配置目录是变化的,所以hiveserver2启动失败的原因是因为配置文件读取不到。
根据: 《CDH大数据平台集成Apache Ranger安全管理框架解决方案》这篇文章的指导,发现并不太好实现,因为无法获得服务进程的路径。
解决方案
在C:\zhanghy\workspace\ranger\agents-common\src\main\java\org\apache\ranger\authorization\hadoop\config\RangerPluginConfig.java文件添加copyConfigFile方法:
// An highlighted block
private void copyConfigFile(String serviceType) {
// 这个方法用来适配CDH版本的组件,非CDH组件需要跳出
if (serviceType.equals("presto")){return;}
// 环境变量
Map map = System.getenv();
Iterator it = map.entrySet().iterator();
while(it.hasNext())
{
Map.Entry entry = (Map.Entry)it.next();
LOG.info("env key: " + entry.getKey() + ", value: " + entry.getValue());
}
// 系统变量
Properties properties = System.getProperties();
Iterator itr = properties.entrySet().iterator();
while(itr.hasNext())
{
Map.Entry entry = (Map.Entry)itr.next();
LOG.info("system key: " + entry.getKey() + ", value: " + entry.getValue());
}
String serviceHome = "CDH_" + serviceType.toUpperCase() + "_HOME";
if ("CDH_HDFS_HOME".equals(serviceHome)) {
serviceHome = "CDH_HADOOP_HOME";
}
serviceHome = System.getenv(serviceHome);
File serviceHomeDir = new File(serviceHome);
String userDir = System.getenv("CONF_DIR");
File destDir = new File(userDir);
LOG.info("-----Service Home: " + serviceHome);
LOG.info("-----User dir: " + userDir);
LOG.info("-----Dest dir: " + destDir);
IOFileFilter regexFileFilter = new RegexFileFilter("ranger-.+xml");
Collection<File> configFileList = FileUtils.listFiles(serviceHomeDir, regexFileFilter, TrueFileFilter.INSTANCE);
for (File rangerConfigFile : configFileList) {
try {
FileUtils.copyFileToDirectory(rangerConfigFile, destDir);
} catch (IOException e) {
LOG.error("Copy ranger config file failed.", e);
}
}
}
在addResourcesForServiceType方法第一行添加copyConfigFile的调用:
// An highlighted block
private void addResourcesForServiceType(String serviceType) {
copyConfigFile(serviceType);
String auditCfg = "ranger-" + serviceType + "-audit.xml";
String securityCfg = "ranger-" + serviceType + "-security.xml";
String sslCfg = "ranger-policymgr-ssl.xml";
if (!addResourceIfReadable(auditCfg)) {
addAuditResource(serviceType);
}
if (!addResourceIfReadable(securityCfg)) {
addSecurityResource(serviceType);
}
if (!addResourceIfReadable(sslCfg)) {
addSslConfigResource(serviceType);
}
}