livy读源码总结

1、spark任务提交
https://blog.csdn.net/qq_32635069/article/details/80055745
2、线程池问题
线程池:一个管理线程的工具
解决的问题:一款好的软件设计是不建议手动创建和销毁会线程。线程的创建和销毁是非常耗CPU和内存的,因为这需要JVM和操作系统的参与
64位 JVM 默认线程栈是大小1 MB。这就是为什么说在请求频繁时为每个小的请求创建线程是一种资源的浪费。而线程可以根据创建是选择的策略
自动处理线程的生命周期。
Executors类中提供的常用线程池:
newSingleThreadExecutor:创建一个单线程的线程池,这样相当于串行执行所有的任务,适用于要求任务按一定顺序执行的场景
newFixedThreadPool:创建一个固定大小的线程池
newCachedThreadPool:创建一个可缓存的线程池,根据任务需要创建线程,并负责回收空闲线程,对线程的数目要求没有上限,线程池的大小完全依赖于操作系统(或JVM)
newScheduledThreadPool:创建一个大小无限的线程池,此线程池支持定时以及周期性的执行任务的需求。
好处:
减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务
根据系统的承受能力,调整线程池中工作线程的数目,防止内存消耗过多

这是Httpclient.java中的一段代码:
1、每一个Executor都对应这一单线程池,这样保证分配Executor中任务的执行是顺序的
2、ThreadFactory接口,他的作用就是将线程创建工作集中化,改变创建方式变得方便,也便于对Thread进行管理(计数等)
3、t.setDaemon(true)是将此线程设为true
GC垃圾收集器就是JVM的守护线程
守护线程的特点:
优先级低,
只有当被守护的线程终止时,他会随着被终止
不访问系统固有资源,如文件,数据库等

3、javaNIO
以前的IO模式是同步阻塞IO的模式(BIO Blocking IO),
livy读源码总结_第1张图片
NIO是异步非阻塞IO
livy读源码总结_第2张图片

NIO的单线程能处理连接的数量要比BIO高出很多,关键原因便是组件selector
当一个连接建立之后,接下来会有两个步骤
(1)接受客户端发过来的全部的数据
(2)服务端处理完请求业务之后返回response给客户端
BIO与NIO的重要区别就在于第一步,BIO在等待客户端发数据的过程的这个过程是阻塞的,这样一个线程只能处理一个请求的情况
而机器可以支持的最大线程数是有限的,这就是为什么BIO无法支持高并发的原因

这样关键在于IO完成后如何通知线程操作完成了,NIO是通过Reactor设计模式实现的,一旦IO时间的相应,便会进行广播发送给
相应的handler处理
JavaNIO是Java Non-blocking IO(java 非阻塞I/O),是为提供I/O吞吐量而专门设计的,NIO是通过Java的
Reactor模式的时间驱动机制来达到Non Blocking,Reactor模式可以理解成观察者模式,观察者模式是监听一个事件源,
而Reactor模式是与多个事件源相关联
NIO主要包括三个模块
Selector、Channel、Buffer
Channel的类型
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
每个channel都会向Selector注册,而selector则负责轮询当一个channel的事件就绪时,线程便可以处理对应的channel的数据
处理数据会用到buffer缓冲区
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
livy读源码总结_第3张图片
4、netty框架
参考:https://www.jianshu.com/p/b9f3f6a16911
Netty是一款基于NIO开发的网络通信框架
NIO的并发高
NIO零拷贝:传输快https://blog.csdn.net/lm324114/article/details/78222892
零拷贝需要操作系统提供支持,零拷贝涉及到用户空间和内核空间,零拷贝避免了从内核空间再拷贝到用户空间的操作,节省了时间
封装好:代码量少
Future、Promise、callback的异步模型

Future是read-only定义了isSuccess(),isCancellable(),cause()来判断执行状态
Promise继承自Future,添加了setSuccess(),setFailture()的方法允许任务执行者标记任务完成或失败
//RPC.java的createClient()连接driver
livy读源码总结_第4张图片
添加回调函数
livy读源码总结_第5张图片
Future表示未知,在异步调用时立即返回,相当于结果的占位符,然后通过为Future添加回调函数,来执行业务

你可能感兴趣的:(面试,livy)