executor

多个角度全方位带你深入理解 Java 线程池

霸气de小男生 提交于 2019-12-28 21:01:10
一、简介 什么是线程池 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。 为什么要用线程池 如果并发请求数量很多,但每个线程执行的时间很短,就会出现频繁的创建和销毁线程。如此一来,会大大降低系统的效率,可能频繁创建和销毁线程的时间、资源开销要大于实际工作的所需。 正是由于这个问题,所以有必要引入线程池。使用 线程池的好处 有以下几点: 降低资源消耗 - 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度 - 当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性 - 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。 二、Executor 框架 Executor 框架是一个根据一组执行策略调用,调度,执行和控制的异步任务的框架,目的是提供一种将”任务提交”与”任务如何运行”分离开来的机制。 核心 API 概述 Executor 框架核心 API 如下: Executor - 运行任务的简单接口。 ExecutorService - 扩展了 Executor 接口。扩展能力: 支持有返回值的线程; 支持管理线程的生命周期。 ScheduledExecutorService - 扩展了

spark

让人想犯罪 __ 提交于 2019-12-28 20:28:03
Apache Spark 什么是Spark? Spark是 Lightning-fast unified analytics engine - 快如闪电的统一的分析引擎(不参与数据持久化)。 快 (1)Spark基于内存的计算引擎,相比于MapReduce磁盘计算,速度自然 快 - 大众认知 (2)Spark使用先进的DAG(矢量计算)计算模型,将一个复杂的任务拆分成若干个stage(阶段), 这样复杂的任务Spark只需要一个job即可完成。(如果使用MapReduce计算模型可能需要串连若干个Job) (3) Spark实现DAG计算将任务划分为若干个阶段,同时也提供了对stage阶段计算数据的缓存能力,这样就极大提升计算效率和容错。 统一 :Spark统一大数据常见计算例如:批处理(替代MapReduce)、流处理(替代Storm)、统一SQL(替代了Hive)、Machine Learning(替代Mahout 基于MapReduce计算方案)、支持GraphX存储-图形关系存储(存储数据结构)(替代了早期Neo4j的功能) Spark VS Hadoop Spark的诞生仅仅是为了替换早期的Hadoop的MapReduce计算引擎。Spark并没有存储解决方案,在Spark的架构中,底层存储方案依然延续Hadooop的HDFS/Hbase

spark高可用, yarn

爷,独闯天下 提交于 2019-12-28 15:44:22
1.配置spark-env.sh # 配置大哥;在二哥上面,MASTER_PORT=指的是自己 SPARK_MASTER_HOST=hadoop102 # 设置zookeepr,不能换行 SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=hadoop101:2181,hadoop102:2181,hadoop103:2181 -Dspark.deploy.zookeeper.dir=/spark" # 告诉Spark,hadoop放到哪里面了,前题是每一个Spark,的服务器上都装有hadoop HADOOP_CONF_DIR=/data/hadoop/hadoop-3.2.1/etc/hadoop/ 配置二哥MASTER_PORT=指的是自己 SPARK_MASTER_HOST=hadoop101 2.配置slaves #配置的小弟 hadoop103 hadoop104 3.启动 启动zookeeper bin/zkServer.sh 启动hadoop sbin/start-all.sh 启动spark sbin/start-all.sh 停止spark sbin/stop-all.sh 注意查看spark的web端的时候

Storm:分布式流式计算框架

北城以北 提交于 2019-12-27 05:25:17
Storm是一个分布式的、高容错的实时计算系统。Storm适用的场景: Storm可以用来用来处理源源不断的消息,并将处理之后的结果保存到持久化介质中。 由于Storm的处理组件都是分布式的,而且处理延迟都极低,所以可以Storm可以做为一个通用的分布式RPC框架来使用。(实时计算?) Storm集群架构 Storm集群采用主从架构方式,主节点是Nimbus,从节点是Supervisor,有关调度相关的信息存储到ZooKeeper集群中,架构如下图所示 Nimbus:Storm集群的Master节点,负责分发用户代码,指派给具体的Supervisor节点上的Worker节点,去运行Topology对应的组件(Spout/Bolt)的Task。 Supervisor:Storm集群的从节点,负责管理运行在Supervisor节点上的每一个Worker进程的启动和终止。 ZooKeeper: 存储客户端提供的topology任务信息,nimbus负责将任务分配信息写入Zookeeper,supervisor从Zookeeper上读取任务分配信息 存储supervisor和worker的心跳(包括它们的状态),使得nimbus可以监控整个集群的状态, 从而重启一些挂掉的worker 存储整个集群的所有状态信息和配置信息。 组件抽象 我们先看一下

(executor 1 exited caused by one of the running tasks) Reason: Executor heartbeat timed out after

£可爱£侵袭症+ 提交于 2019-12-26 23:51:43
WARN TaskSetManager: Lost task 44.0 in stage 1368.0 (TID 17283, 172.19.32.66, executor 1): ExecutorLostFailure (executor 1 exited caused by one of the running tasks) Reason: Executor heartbeat timed out after 167411 ms 参考文章: https://blog.csdn.net/datadev_sh/article/details/83541153 提交任务到spark集群,老是超时。至于超时原因,可能是计算量太大。 解决方案:提交时,加一个参数“–conf spark.network.timeout=10000000”。 spark-submit –conf spark.network.timeout=10000000 \ 自身修改如下: –conf spark.network.timeout 1200s --conf spark.executor.heartbeatInterval=1200s --conf spark.driver.maxResultSize=4g 同时还会报出如下错误: ExecutorLostFailure (executor 1 exited

OutputStreamWriter not writing

柔情痞子 提交于 2019-12-25 18:15:00
问题 I have created a file with an asynctask. Afterwards scheduled an executor to write information to said file once every second. Once I touch a button the executor is shut down and the file closed but more often than not nothing is written in the file. Code: startButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { preferences.edit().putBoolean(GlobalConstants.stopPreference,false).commit(); loc_thr = new LocationThread(preferences, getApplicationContext()); loc

Java并发编程(四) 任务的执行

ぃ、小莉子 提交于 2019-12-25 11:04:38
1. 启动线程的最基本方式 在Java中用Runnable表示一个任务,需要在Runnable接口的run方法中实现任务的具体业务逻辑,然后创建一个Thread并调用start方法启动任务。 例如执行一个匿名任务: new Thread(new Runnable() { public void run() { //.... } } ).start(); 2. 使用Executor框架执行线程 Java中执行任务更灵活的方式是使用Executor框架。 java.util.concurrent.Executor是一个十分简单的接口,只有一个方法execute,参数为Runnable对象,表示对任务处理器的抽象。 public interface Executor { public abstract void execute(Runnable task); } Executor还有一个更常用的接口是java.util.concurrent.ExecutorService,ExecutorService扩展了Executor接口的功能,添加了开启关闭任务处理器等功能。java.util.concurrent.Executors类是一个工具类,主要提供了很多创建Executor对象以及ExecutorService对象的工厂方法。 Executor框架实现了将任务的提交与任务的执行解耦

【Java并发.6】结构化并发应用程序

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-25 11:04:23
   6.1  在线程中执行任务   应用程序提供商希望程序支持尽可能多的用户,从而降低每个用户的服务成本,而用户则希望获得尽可能快的响应。大多数服务器应用程序都提供了一种自然的任务边界选择方式:以独立的客户请求为边界。 6.1.1  串行地执行任务   在应用程序中可以通过多种策略来调度任务,而其中一些策略能够更好地利用潜在的并发性。最简单的策略就是在单个线程中串行地执行各项任务。    程序清单 6-1 :串行的 Web 服务器 public class SingleThreadWebServer { public static void main(String[] args) throws IOException{ ServerSocket socket = new ServerSocket(80); while (true) { Socket connection = socket.accept(); handleRequest(connection); } } }   SingleThreadWebServer 很简单,且在理论上是正确的,但在实际生产环境中的执行性能却很糟糕,因为它每次只能处理一个请求。   在服务器应用程序中,串行处理机制通常都无法提供高吞吐率或快速响应性。也有一些例外,例如,当任务数量很少且执行时间长时,或者当服务器只为单个用户提供服务

Java并发-任务执行

我怕爱的太早我们不能终老 提交于 2019-12-25 11:04:10
  大多数的应用程序都是围绕“任务执行”来构造的:任务常常是一些抽象的并且离散的工作单元。我们把应用程序的工作分解到多个任务中,可以简化程序的组织结构,提供一种自然的事物便捷来优化错误恢复过程,并且提供一种自然的并行结构来提升并发性。    在线程中执行任务   我们在围绕任务执行来设计程序结构的时候,首先就是要找出清晰的任务边界,一般来说,任务之间是相互独立的---任务不依赖其他任务。独立性有助于实现并发。大多数的服务器应用程序都提供了一种自然的任务边界选择方式:以独立的客户请求为边界。   串行地执行任务   显示的为任务创建线程   无线创建线程的不足:现成的生命周期开销非常高;资源消耗;稳定性。    Executor框架   在Java类库中,任务执行的主要抽象不是Thread,而是Executor,虽然Executor是个简单的接口,但它却为灵活且强大的异步任务执行框架提供了基础。它提供了一种标准的方法将任务的提交过程与执行过程解耦开来,并用Runnable来表示任务。Executor的实现还提供了对生命周期的支持、统计信息收集、应用程序管理机制和性能监视等机制。它基于生产者-消费者模式,提交任务的操作相当于生产者,执行任务的线程相当于消费者。   void execute(Runnable command)   在未来某个时间执行给定的命令。该命令可能在新的线程

Java - Ideal use of wait and notify?

亡梦爱人 提交于 2019-12-25 11:01:10
问题 This code seems to work fine so far in testing. However I am new at multithreading and want to know if this code is ideal, since I know there is a lot of "donts" regarding concurrency. Is there a better way to make an executor for queued Runnables on a single thread? This is my first time making one so I feel inclined to believe something could be better. public class ExplosionExecutor{ private static List<Runnable> queue= new ArrayList<Runnable>(); private static Thread thread= new Thread