prestodb安装ranger插件
一、背景
生产环境使用的prestodb为Facebook版本的prestodb,在安装ranger插件时发现源码中只支持prestosql版本,故考虑将ranger-presto-plugin的代码改为支持prestodb版本的,同时去掉对show schemas、show catalogs、 show tables的鉴权,因为在与上层查询系统对接时使用不到,只需要对select、insert、drop等操作的鉴权即可。
二、ranger presto插件源码结构
ranger中跟presto插件相关的模块为plugin-presto、ranger-presto-plugin-shim两个,其中shim为入口,类似hive的shim,起到适配的作用,在shim中不实现具体的业务逻辑,均为转调用plugin-presto模块中的类方法,两个模块中均有类:org.apache.ranger.authorization.presto.authorizer.RangerSystemAccessControl,该类实现了各种具体的鉴权逻辑。
三、ranger插件被加载的过程
ranger-presto-plugin-shim的org.apache.ranger.authorization.presto.authorizer.PrestoRangerPlugin实现了presto的com.facebook.presto.spi.Plugin接口(此处已经是换为prestodb下的类,修改前为prestosql中的类io.prestosql.spi.Plugin),同时在resouces/META-INF.services目录下有spi相关的文件io.prestosql.spi.Plugin,文件内容为Plugin的实现类org.apache.ranger.authorization.presto.authorizer.PrestoRangerPlugin;
presto进程在启动时会使用java spi自动装载技术将Plugin接口的所有实现类都加载到进程中,具体代码在presto源码的PluginManger#loadPlugin方法中:
image.png
四、ranger插件代码修改内容
1、两个模块的pom中中prestosql依赖,换为facebook的presto依赖,修改各类中引用的类为facebook的presto中的类,RangerSystemAcessControl实现的接口方法中有一些入参需要调整。
2、shim包: resouces/META-INF.services目录下文件名修改为Facebook presto的包名:com.facebook.presto.spi.Plugin
3、打包两个模块,并替换安装目录下对应的jar包
mvn clean package -Dmaven.test.skip=true -pl plugin-presto -am -amd
mvn clean package -Dmaven.test.skip=true -pl ranger-presto-plugin-shim -am -amd
4、修改后的代码见github: zfqhd43/ranger-prestodb
五、其他
远程debug方式:
1、在/opt/software/presto/bin/launcher.py中添加:command += ['-agentlib:jdwp=transport=dt_socket,address=5007,server=y,suspend=n'],位置如下:
image.png
2、在idea中新建remote jvm debug
image.png