zeppelin
https://zeppelin.apache.org/download.html
cp conf/zeppelin-site.xml.template conf/zeppelin-site.xml
vi conf/zeppelin-site.xml
修改zeppelin-site.xml
指定绑定的ip和port
bin/zeppelin-daemon.sh start
bin/zeppelin-daemon.sh stop
支持的组件
1 | alluxio elasticsearch groovy java kylin neo4j scalding sparql |
解释器使用credentials密码加密
配置文件添加配置项 zeppelin.credentials.encryptKey
,注意密钥需要是16/24/32字节
创建interpreter时不配置默认密码,用户添加credentials即可
SparkThriftServer方案
配置个人账密连接受限用户(proxyuser)启动的thrift,thrift可显示sql对应用户,文件操作为受限用户
配置JDBC的依赖为 org.apache.hive:hive-jdbc:2.3.4 会自动联网下载. (离线部署则使用hive-jdbc-2.3.10-standalone.jar,否则还需要下载其他依赖)
driver为 org.apache.hive.jdbc.HiveDriver
1 | ./local-repo/org/apache/hive/hive-jdbc |
使用登录用户身份连接,但还是用的STS进程用户查询,添加自定义配置项 default.proxy.user.property=hive.server2.proxy.user
hive.server2.enable.doAs=true
为了能避免创建目录是当前登录用户、写出数据又是启动STS的用户导致permission deny问题,配置hive.server2.enable.doAs=false
,使得操作都是sts的启动用户
最后使用的方案是启动thriftserver时指定--proxy-user zeppelin
,则都用zeppelin身份进行io,而在thriftserver可以知道谁执行
zeppelin.spark.run.asLoginUser
- global share: 以第一个使用的人的身份启动
- isolated per note: 每个人都独立启动
- scoped per note: 同一个sparksession,但变量相互不干扰
检查用户登陆
cat zeppelin-hadoop-LGJF-ZYC6-HCY-SVR556.log2023-08-0* |grep user |awk -F ‘:’ ‘{print $8}’ |sort -u
grep “Creating connection pool” zeppelin-interpreter-query-shared_process-hadoop-a51-dg-hcy-bi-cal-003.log |awk -F’,’ ‘{print $3}’
用户密码加密
ini方式
shiro.ini
1 |
|
生成密码方法: echo -n thisIsPassword | sha256sum
其他验证类:
SimpleCredentialsMatcher
AllowAllCredentialsMatcher
HashedCredentialsMatcher
PasswordMatcher
JDBC方式
Maven Repository: org.xerial » sqlite-jdbc
1 | [main] |
1 | sqlite3 user.db |
代码
ZeppelinServer
NotebookService.java[runParagraph] 界面发起执行
Note.run
Paragraph.execute getBindedInterpreter()
InterpreterFactory#getInterpreter
InterpreterSetting getDefaultInterpreter(ExecutionContext executionContext)
InterpreterSetting#getOrCreateSession(org.apache.zeppelin.interpreter.ExecutionContext)
InterpreterSetting.java[getOrCreateInterpreterGroup] Create InterpreterGroup with groupId
ManagedInterpreterGroup#getOrCreateSession
InterpreterSetting#createInterpreters : new RemoteInterpreter
Paragraph.execute interpreter.getScheduler().submit(this);放入队列
RemotetScheduler(每个interpreter一个) /AbstractScheduler#run出队列->runJobInScheduler->JobRunner->runJob
Paragraph/InterpretJob(是一种job) jobRun
RemoteInterpreter.interpret发起执行
getOrCreateInterpreterProcess
ManagedInterpreterGroup.java[getOrCreateInterpreterProcess]
- interpreterSetting.createInterpreterProcess -> createLauncher
- PluginManager.java[loadInterpreterLauncher]
- StandardInterpreterLauncher.java[launchDirectly]
- ProcessLauncher.java[transition] 启动interpreter进程
- RemoteInterpreterProcess#callRemoteFunction 发起远程执行
RemoteInterpreterServer
作为进程容器,后续由zeppelinServer的RemoteInterpreterEventClient
作为客户端创建InterpreterJDBCInterpreter
其中一种interpreter实例