clock |


  • 首页

  • 分类

  • 归档

  • 标签

spark基础

发表于 2018-03-06

1.基本概念

并发变并行
多线程转变多JVM计算
内存计算(内存为主,磁盘为车铺),延迟计算,分阶段计算

RDD Resilient Distributed DataSet

弹性式分布计算集合 – 可并行计算、可重复计算

  • 分区(partition) – 一个基本的计算单元,也是Spark并行计算的基础
  • 分区计算函数 – 处理分区的数据,计算逻辑封装
  • Partitioner – 如何分布分区中的数据
    典型的就是在RDD之间按键值对进行Shuffle操作的时候(如reduceByKey,join),Spark需要 根据某种规则来决定分区中的键被重新分配到哪些分区(一般是通过键的哈希,类似于Kafka往 分区中发送消息的策略)。
    阅读全文 »

spring-quartz实现周末节假日排除的定时任务配置

发表于 2018-02-28

一、前言

最新开发基金数据相关的需求,理财的同学知道对基金的开盘收盘是每天9:15-15:30之间,如果遇到某些数据只需要在开盘期间基金更新,那么我们需要设置定时
任务运行时间为每天9:15-15:30之间,经过学习quartz,发现我们常用使用的SimperTrigger和CronTrgger这两种触发器都无法满足这种需求的表达.经过不停查找相关资料,
终于发现Calender插件是可以实现的,下面看下具体配置

阅读全文 »

jvm内存模型

发表于 2017-09-08

一、 并发编程模型分类

在并发编程中中,我们通常需要处理2个关键问题:线程之间如何通信,如何同步.
通信:是指线程怎么交换信息,线程之间通信机制有2种:共享内存,消息传递.
共享内存:线程之间通过写-读内存中的公共状态来隐式通信
消息传递:线程间没有公共状态,线程间通过明确的发送消息来显式通信.
同步:是指程序控制不同线程之间操作发生相对顺序的机制,
共享内存:程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行,是显示进行的
消息传递:消息的发送必须在消息的接收之前,因此同步是隐式进行的.
java的并发采用共享内存模型,Java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。

阅读全文 »

volatile

发表于 2017-09-05   |   分类于 java

一.内存模型的相关概念

cpu从内存读取数据的速度跟不上cpu执行的速度,所以cpu中有了高速缓存。当程序在运行时,会将运算需要的数据从主存复制一份到cpu的高速缓存,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,
当运算结束之后,再将高速缓存中的数据刷新到主存当中。在单线程中是没有问题,但到多线程环境下可能就会出现缓存不一致性的问题.
如何解决缓存不一致性问题,通常来说有以下2种解决方法:

1> 通过总线加#LOCK方式
早期cpu是通过这种方式实现的,但是这个做会导致效率低下.因为cpu和其他部件进行通信都是通过总线来进行的,如果对总线加LOCK#锁的话,也就是说阻塞了其他CPU对其他部件访问(如内存),从而使得只能有一个CPU能使用这个变量的内存。
2> 通过缓存一致性协议
当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。

阅读全文 »

cas

发表于 2017-08-28   |   分类于 java

一、cas简介

java.util.concurrent包完全建立在CAS之上的,没有CAS就不会有此包
ava.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。

二、cas原理

CAS:Compare and Swap 比较并交换
CAS有三个参数,内存位置V、旧的预期值A、新的预期值B。当且仅当V符合预期值A的时候,CAS用新值B原子化
的更新V的值;否则他什么都不做。在任何情况下都会返回V的真实值。
(这个变量称为compare-and-set,无论操作是否成功都会返回。)CAS的意思是,“ 我任务V的值应该是A,如果是A则将其赋值给B,若不是,则不修
改,并告诉我应该为多少。”CAS是以项乐观技术–它抱着成功的希望进行更新,并且如果,另一个线程在上次检查后更新了变量,它能够发现错误。

阅读全文 »

cyclicBarrier

发表于 2017-08-28   |   分类于 java

一、cyclicBarrier简介

CyclicBarrier允许N个线程相互等待。

基本使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//启动主方法
public static void main(String[] args){
final int ROWS=10000;
final int NUMBERS=1000;
final int SEARCH=5;
final int PARTICIPANTS=5;
final int LINES_PARTICIPANT=2000;
MatrixMock mock=new MatrixMock(ROWS, NUMBERS,SEARCH);
Results results=new Results(ROWS);
Grouper grouper=new Grouper(results,mock.getDatas());
//需要等待5个线程执行完,执行grouper
final CyclicBarrier barrier=new CyclicBarrier(PARTICIPANTS,grouper);
Searcher searchers[]=new Searcher[PARTICIPANTS];
for (int i=0; i<PARTICIPANTS; i++){
if(i==PARTICIPANTS-1){
searchers[i]=new Searcher(i*LINES_PARTICIPANT, (i*LINES_PARTICIPANT)+LINES_PARTICIPANT-1, mock, results, 5,barrier);
}else{
searchers[i]=new Searcher(i*LINES_PARTICIPANT, (i*LINES_PARTICIPANT)+LINES_PARTICIPANT-1, mock, results, 5,barrier);
}
Thread thread=new Thread(searchers[i]);
thread.start();
}
System.out.printf("Main: The main thread has finished.\n");
}

阅读全文 »

ReentrantReadWriteLock读写锁

发表于 2017-08-25   |   分类于 java
ReentrantReadWriteLock介绍ReentrantReadWriteLock是读写锁,它维护了一对相关的锁读取锁和写入锁,一个用于读操作,另一个用于写操作读取锁:用于只读操作,这它是“共享锁“,能同时被多个线程获取.写入锁:用于写入操作,它是“独占锁”,写入锁只能被一个线程锁获取。
阅读全文 »

CountDownLatch共享锁

发表于 2017-08-23   |   分类于 java

一、CountDownLatch简介

CountDownLatch是同步工具类之一,可以指定一个计数值,在并发环境下由线程进行减1操作,当计数值变为0之后,被await方法阻塞的线程将会唤醒,实现线程间的同步。

CountDownLatch和CyclicBarrier的区别
(01) CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。
(02) CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier。

阅读全文 »

ReentrantLock(可重入互斥锁,独占锁)实现原理

发表于 2017-08-23   |   分类于 java

前言

不太擅长记录原理类东西,但另一方面这些理论确实比较重要,只有掌握了这些东西,在出现问题的时候才能更好的解决.

一、ReentrantLock涉及到几个概念

1、什么是AQS:AQS即是AbstractQueuedSynchronize抽象类

AQS是java中管理“锁”的抽象类,锁的许多公共方法都是在这个类中实现。AQS是独占锁(例如,ReentrantLock)和共享锁(例如,Semaphore)的公共父类。它是基于FIFO等待队列实现的一个用于实现同步器的基础框架。
JCU包里面几乎所有的有关锁、多线程并发以及线程同步器等重要组件的实现都是基于AQS这个框架。AQS核心是基于volatile int state这样的一个属性同时配合Unsafe工具对其原子性的操作来实现对当前锁的状态进行修改。当state的值为0的时候,标识改为Lock不被任何线程所占有。

阅读全文 »

定时任务之spring-task

发表于 2017-07-25

前言

主要记录在项目中使用spring-taks作为定时任务需要注意的地方

一、spring-task 配置文件

1
2
3
4
5
6
<!--使用注解方式启动task -->
<task:annotation-driven />
<task:scheduled-tasks >
<task:scheduled ref="serviceTestTask" method="test1" cron="0 0/30 0,1,2,3,4,22,23 * * ?" />
<task:scheduled ref="serviceTestTask" method="test2" cron="0 0/30 0,1,2,3,4,22,23 * * ?" />
</task:scheduled-tasks>

大概只要这样配置就可以运行了,注意这样的配置,单个定时任务之间是串行的,就是说一个时间点只有一个job在执
行,因为spring-task默认的线程数是1,但我们需要的是在不同的定进任务之间是并行,需要修改成:

阅读全文 »
123
clock bone

clock bone

29 日志
4 分类
10 标签
GitHub
© 2015 clock bone
Powered by Hexo
Theme - NexT.Muse