RemoteInterpreterServer 类
该类由 interpreter.sh 脚本启动,在运行时会判断是否是 spark 解释器,如果是的话则使用 spark-submit 命令启动该类,否则则使用普通的 java 命令启动该类。
if [[ "${INTERPRETER_ID}" == "spark" ]]; then
该类的 main 方法根据端口号构造了一个 RemoteInterpreterServer 对象( Thirft 相关代码在构造函数中,其实都是规定的写法,这里就不再赘述了),然后开启该线程( run 方法那句话才真正开启了 Thrift 服务端 ),并一直等待该线程死掉才退出。
public static void main(String[] args)
throws TTransportException, InterruptedException {
int port = Constants.ZEPPELIN_INTERPRETER_DEFAUlT_PORT;
if (args.length > 0) {
port = Integer.parseInt(args[0]);
}
RemoteInterpreterServer remoteInterpreterServer = new RemoteInterpreterServer(port);
remoteInterpreterServer.start();
remoteInterpreterServer.join();
System.exit(0);
}
该类中是基本上所有的方法都是给 Thirft 的客户端的对象也就是 Client 对象调用的,当 Client 调用相应的方法时,会调用这个类中同名的方法,然后在这个方法中再去调用别的类完成相应的功能,这里对其中一些方法的作用进行总结:
- createInterpreter 方法根据客户端传入的 className , interpreterGroupId 等参数和反射机制构建出一个对应的解释器对象。
- getInterpreter 方法根据该 JVM 中唯一的 InterpreterGroup 对象以及传入的 sessionKey 和 className 参数直接获取到指定的解释器。
- interpret 方法就是最关键的方法,每次调用这个方法时,都会直接向调度队列中提交一个 job,然后一直等待 job 运行结束并将结果返回。
- convert 有两个重载方法,两个重载方法都在干一个事情,就是将 RemoteInterpreterContext 重新转化成 InterpreterContext 对象。
- 其他方法这里就不再赘述。