executor

初识Azkaban

≯℡__Kan透↙ 提交于 2020-03-05 04:31:00
先说下hadoop 内置工作流的不足 (1)支持job单一 (2)硬编码 (3)无可视化 (4)无调度机制 (5)无容错机制 在这种情况下Azkaban就出现了 1)Azkaban是什么 Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。Azkaban定义了一种KV文件格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。 2)Azkaban的功能特点 ①Web用户界面 ②方便上传工作流 ③方便设置任务之间的关系 ④工作流调度 ⑤认证/授权 ⑥能够杀死并重新启动工作流 ⑦模块化和可插拔的插件机制 ⑧项目工作区 ⑨工作流和任务的日志记录和审计 3)Azkaban的架构 MySQL实例 – Azkaban使用MySQL来存储项目和执行 Azkaban Web服务器 – Azkaban使用Jetty作为Web服务器,用作控制器以及提供Web界面 Azkaban执行服务器 – Azkaban执行服务器执行提交工作流 4)Azkaban三种运行模式 ①solo server mode H2 web server和executor server运行在一个进程里 ②two server mode MySQL(主从结构) web server和executor server运行在不同的进程

深入理解 Java 线程池:ThreadPoolExecutor

妖精的绣舞 提交于 2020-03-05 01:48:35
线程池介绍 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题: 如果并发的请求数量非常多,但每个线程执行的时间很短,这样就会频繁的创建和销毁线程,如此一来会大大降低系统的效率。可能出现服务器在为每个请求创建新线程和销毁线程上花费的时间和消耗的系统资源要比处理实际的用户请求的时间和资源更多。 那么有没有一种办法使执行完一个任务,并不被销毁,而是可以继续执行其他的任务呢? 这就是线程池的目的了。线程池为线程生命周期的开销和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 什么时候使用线程池? 单个任务处理时间比较短 需要处理的任务数量很大 使用线程池的好处 引用自 ifeve.com/java-thread… 的说明: 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 Java中的线程池是用ThreadPoolExecutor类来实现的. 本文就结合JDK 1.8对该类的源码来分析一下这个类内部对于线程的创建,

MyBatis源码学习三:mybatis插件

感情迁移 提交于 2020-03-03 15:35:36
一、mybatis插件的实现 1. 实现步骤 1.实现Interceptor接口,重写对应方法,主要是Intercept()和setProperties()方法 2.在子类中采用@Intercepts注解,标识要拦截的类和方法 3.在mybatis-config.xml中配置Plugins标签 以pagehelper插件为例来说明: @Intercepts ( { @Signature ( type = Executor . class , method = "query" , args = { MappedStatement . class , Object . class , RowBounds . class , ResultHandler . class } ) , @Signature ( type = Executor . class , method = "query" , args = { MappedStatement . class , Object . class , RowBounds . class , ResultHandler . class , CacheKey . class , BoundSql . class } ) , } ) public class PageInterceptor implements Interceptor { // .

Spark调度模型

*爱你&永不变心* 提交于 2020-03-02 18:19:25
调度模型的好坏,是由底层的抽象模型所决定的,spark的底层抽象是RDD spark调度模型系统,分为 底层调度模型(TASKscheduler)和高层调度模型(DAGscheduler) 调度过程 1. application driver 发出请求,这个application首先创建sparkconf和 sparkcontext对象, 在sc对象中 TASKscheduler,DAGscheduler以及schedulerbackend对象, 并 向master注册 当前程序并 申请计算资源 (注意,如果底层是用yarn来进行资源管理和调度,那么会向yarn resource manager去申请计算资源,standalone模式下,具体的实现是taskschedulerimpl来完成的) 2. 这时候master会根据当前它掌握的worker的资源并通过心跳看worker是不是存活的),为application 分配appid和计算资源,并通知对应的worker按需求启动executor 分配计算资源的依据,来自spark-env.sh,default.sh,spark-submit的参数,和程序中sparkConf配置的参数 worker机器上会生成一个worker进程,通过一个proxy启动executorbackend进程,这个进程会启动executor

Java8新特性 之CompletableFuture

谁都会走 提交于 2020-03-02 10:20:37
文章目录 参考 CompletableFuture引入 使用CompletableFuture作为Future实现 每一种方法都有三种形式 创建一个异步任务 计算完成时对结果的处理 whenComplete、exceptionally、handle 结果处理转换 thenApply 纯消费 thenAccept、thenRun、thenAcceptBoth、runAfterBoth 组合 thenCompose、thenCombine 任意一个方法执行完成就结束acceptEither、applyToEither 辅助方法allOf、anyOf 使用CompletableFuture提升程序性能 CompletableFuture使用详解 static方法说明 supplyAsync()使用 thenRun()使用 thenAccept()使用 参考 Java CompletableFuture 详解 CompletableFuture基本用法 使用了CompletableFuture之后,程序性能提升了三倍 Java8的CompletableFuture进阶之道–开发时看这个 CompletableFuture引入 Future是JDK5添加的类,用来描述一个异步计算的结果。可以使用 isDone 方法检查计算是否完成,或者使用 get 阻塞住调用线程,直到计算完成返回结果

多线程进阶——JUC并发编程之Executors框架设计思想一探究竟🔥

浪子不回头ぞ 提交于 2020-03-01 16:55:31
1、学习切入点 Executors 框架是整个JUC 包中类/接口关系中最为复杂的框架,真正理解Executors框架的前提是理清楚各个模块之间的关系,高屋建瓴, 从整体到局部 才能透彻理解各个模块的功能和背后设计的思路! 本文将从 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory和Callable 这些核心模块展开分析。 2、从Executor谈起 Executor 是JDK 1.5 时,随着JUC引入的一个接口,引入该接口的主要目的是 解耦任务本身和任务执行。我们之前通过线程执行一个任务时,往往需要先创建一个线程.satrt()去执行任务, 而Executor 接口解耦了任务和任务的执行,该接口只有一个方法,入参为待执行的任务。 public interface Executor { /** * 执行给定的Runable任务 * 根据Executor接口的实现类不同,具体执行方式也不同 */ void execute(Runnable command); } 我们可以像下面这样执行任务,而不必心线程的创建 Executor executor = anExecutor executor.execute(new RunnableTask1()); executor.execute(new

Executor框架+实例

南笙酒味 提交于 2020-03-01 09:30:29
Executor框架 是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。 Executor框架简介 Executor框架描述 Executor框架 是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。 运用该框架能够很好的 将任务分成一个个的子任务 ,使并发编程变得方便。 Executor相关类图 该框架的类图(方法并没有都表示出来)如下: 创建线程池类别 创建线程池 Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。 public static ExecutorService newFixedThreadPool(int nThreads) 创建固定数目线程的线程池 public static ExecutorService newCachedThreadPool() 创建一个可缓存的线程池 创建一个可缓存的线程池,调用execute 将重用以前构造的线程

Executors常用的创建ExecutorService的方法的简单说明

荒凉一梦 提交于 2020-02-29 19:49:04
一、线程池的创建 我们可以通过ThreadPoolExecutor来创建一个线程池。 Java代码 ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) 创建一个线程池需要输入几个参数: corePoolSize(线程池的基本大小):当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会 创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的prestartAllCoreThreads方法,线程池会提前创 建并启动所有基本线程。 runnableTaskQueue(任务队列):用于保存等待执行的任务的阻塞队列。 可以选择以下几个阻塞队列。 ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。 LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列。

java 线程池管理类:Executors

混江龙づ霸主 提交于 2020-02-29 15:41:32
java.util.concurrent 类 Executors java.lang.Object 继承者 java.util.concurrent.Executors 此类是个 工具类 ,它提供对 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 类的一些实用方法。 此类支持以下 各种方法 : * 创建并返回设置有常用配置的 ExecutorService 的方法。 * 创建并返回设置有常用配置的 ScheduledExecutorService 的方法。 * 创建并返回“包装的” ExecutorService 方法,它使特定于实现的方法不可访问,只让 ExecutorService 接口的方法可用。 * 创建并返回 ThreadFactory 的方法,它可将新创建的线程设置为已知的状态。 * 创建并返回非闭包形式的 Callable 的方法,这样可将其用于需要 Callable 的执行方法中。 主要方法: public static ExecutorService newFixedThreadPool(int nThreads) 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。 在任意点,在大多数 nThreads 线程会处于处理任务的活动状态

Java 并发 – 第七部分:Executors 与线程池

ぐ巨炮叔叔 提交于 2020-02-29 09:50:10
现在让我们开始 Java 并发系列的新篇章。这壹次我们会学习如何干净的启动壹個新线程,以及如何在线程池中管理它。在 Java 中,假设你有壹個像下面这样的 Runnable 线程: Runnable runnable = new Runnable(){ public void run(){ System.out.println("Run"); } } 你可以简单的在壹個线程中运行它: new Thread(runnable).start(); 这個代码很简洁,但是如果我们想并行的启动多個任务该怎么办呢,而且我们还想等待所有任务完成之后获取所有任务的返回值,这样的话,要想保持较好的代码风格实际上有点困难了。不过,就像所有其它的难题壹样,Java 为我们提供了壹個解决方案,那就是 Executor ,这個简单的类允许你创建线程池和线程工厂。 ExecutorService executor = Executors.newFixedThreadPool(5); for (int i = 0; i < 10; i++) { executor.execute(new Runnable() { public void run() { System.out.println("do something here..."); } }); } executor.shutdown(); 线程池实际表现为