自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

eddie's Blog

点个关注呗

  • 博客(146)
  • 收藏
  • 关注

原创 Java多线程、Java虚拟机(JVM)博客合集

因为Java多线程与JVM关系紧密,故将两个部分的内容整理在一起Java多线程java多线程创建方式及线程的生命周期与线程方法Java并发工具包JUCCAS(Compare And Swap)流程及原理java引用类型及ThreadLocal内存泄漏Java并发编程之对象内存布局与锁揭示volatile关键字背后的奥秘——CPU多级缓存与指令重排Java虚拟机(JVM)JVM-类装载子系统java引用类型及ThreadLocal内存泄漏Java并发编程之对象内存布局.

2020-08-06 21:29:30 235

原创 三色标记法与垃圾回收器(CMS、G1)

三色标记法是一种垃圾回收法,它可以让JVM不发生或仅短时间发生STW(Stop The World),从而达到清除JVM内存垃圾的目的。三色标记法-算法思想三色标记法将对象的颜色分为了黑、灰、白,三种颜色。黑色:该对象已经被标记过了,且该对象下的属性也全部都被标记过了。(程序所需要的对象)灰色:该对象已经被标记过了,但该对象下的属性没有全被标记完。(GC需要从此对象中去寻找垃圾)白色:该对象没有被标记过。(对象垃圾)算法流程:从我们main方法的根对象(JVM中称为GC Root)开.

2020-08-02 00:58:36 1006

原创 浅析分布式锁实现

分布式锁实现MySQLRedisZooKeeper什么时候需要加锁?资源是共享的资源是互斥的多任务环境为什么需要分布式锁?传统的多线程解决方案为什么适用了?分布式事务,往往都是多个不同的主机并发的,他们的主机上有着不同的JVM环境,Java多线程加锁对象是对对象对类的线程控制,只能阻止同一个JVM内的资源被JVM内的线程同时占用的情况。而不同的JVM需要互斥占用一个外部的资源时,就需要分布式锁的实现了。基于MySQL实现分布式锁实现思路在MySQL中的设置一

2020-07-21 23:46:45 188 1

原创 说一说 MySQL的锁机制(行锁、表锁、间隙锁、Next-Key Lock)

锁的操作类型分类读锁:共享锁,多个读操作可以对同一份数据同时进行而不会互相影响。写锁:排他锁,在写操作未完成之前,会阻止其他的写锁与读锁。锁的操作粒度分类表锁: 偏向于读,MyiSAM行锁:偏向于写,InnoDBMyiSAM在进行SELECT 操作前,MyiSAM会给涉及到的表加读锁。这个时候其他Session可以正常对未加锁的表进行操作。但是对加了读锁的表,只能对其进行查询(共享锁),对其修改则会阻塞,等待至表解锁后,才会生效。Session1Sessi

2020-06-21 11:22:35 1636

原创 说一说 关于ZooKeeper与ZAB一致性算法

1. 简述ZAB协议以及Zookeeper?Zookeeper是一个高可用强一致的分布式协调服务,基于ZAB协议实现了一个主从一致的架构模式来保证数据的一致性。 zookeeper = 文件系统 + 通知机制Zookeeper是一个基于主从一致的高可用集群,他的节点主要有几种角色:Leader、Follower、ObserverLeader:一个集群只有一个Leader,负责写数据,处理数据同步的主节点,所有的数据写入必须先通过Leader再广播同步到所有的FollowerFollower:

2020-05-21 21:58:44 279

原创 Kafka日志存储——《深入理解Kafka:核心设计与实践原理》

文件目录布局日志格式演变Kafka消息格式经过了3个版本的变化。v0版本v1版本新增了一个timestamp字段。启用压缩时,多个KV被压缩在value位置:v2版本v2版本使用RecordBatch代替了Message Set,引入可变长整数Varint、ZigZag编码。日志索引Kafka日志索引分为两种:偏移量索引时间戳索引Kafka的索引是以稀疏索引构建的,因为Kafka的日志排列都是有序的(offset有序、时间戳有序),所以可以使用这种索引方式,在空间与时间

2021-05-10 10:01:13 338

原创 设计一个应用于分布式系统中的可伸缩性IO模型

设计目标步骤分而治之事件驱动模型Reactor模型基本版多线程版本其他版本目标能够实现优雅地降级,在负载增加的情况下(更多的连接)能够随着系统的资源的增加,持续地提高性能还能满足可用性和性能目标短延迟满足高峰期请求可调整的服务质量分而治之,通常都是实现可伸缩性目标的最好的方法。步骤在一些web服务、分布式存储等一些分布式的项目中,他们都基于这样的一个模型:读取反序列化服务的处理序列化写出但是每一步的资源开销都是不一样的,..

2021-03-29 10:12:36 255

原创 Redis主从同步

Redis分布式模型,在CAP定理中,使用了AP的模型,即保证了可用性与分区容错。Redis采用了BASE最终一致性原理,来保证最终数据的一致,即可以允许出现数据不一致的状态。增量同步Redis使用指令流的方式(类似AOF指令)进行同步信息,主节点一边发送指令至从节点,从节点一遍执行该指令,一边将自己的同步情况(偏移量)反馈给主节点。Redis的指令存放在一个buffer中,buffer是一个环形缓冲区(环形数组),当指令流来不及处理之后,会被后面来的数据进行覆盖,这样就会造成数据的丢失,这时候就会

2021-03-15 20:12:16 186

原创 Redis持久化

因为Redis都是基于内存进行存储的,在突然宕机的情况下,就会造成数据的丢失,所以要开启基于磁盘存储的持久化机制。RDB (Redis DataBase)快照,将Redis里的数据进行一次全量操作,存储到一个文件中去。但是RDB需要对磁盘就行一个大量的IO操作,那么RDB是如何保证在持久化的过程,数据更新的问题呢?使用操作系统中的fork函数fork函数COW(Copy On Write)操作系统克隆出一个Redis的子进程,进行数据的持久化操作。而在这个子进程中,如果原来的数据段都不进行修改

2021-03-15 11:31:29 112

原创 关于Redis-IO模型思考——结合秒杀系统说说为什么是「多路复用+单线程」

为什么写这篇文章因为博主最近在实现一个分布式缓存系统,说到分布式缓存系统,不得不去借鉴Redis的一下设计,于是在看了一些关于Redis-IO模型的技术文章与书籍之后,有了这么一个思考,于是写一篇博客来记录一下。我的分布式缓存系统:https://github.com/eddieVim/eddie-cacheRedis的IO模型简单来说,多路复用IO + 单线程就是Redis的IO模型所在,相信大部分读者如果看过Redis的一些介绍都有所印象,不过本文并不是主要为了去介绍多路复用IO与传统的IO有什

2021-03-11 22:58:11 198

原创 redis-scan命令

为什么使用scan?因为在Redis的命令执行是单线程模型的,使用keys指令时,若数据量很大,Redis会对全量数据进行匹配,导致会有几秒钟的阻塞事件,而Scan是通过游标对hash-slot分步进行的,阻塞时间短,适合进行线上生产环境使用。scan特点复杂度虽然也是 O(n),但是它是通过游标分步进行的,不会阻塞线程;提供 limit 参数,可以控制每次返回结果的最大条数,limit 只是一个 hint,返回的结果可多可少;同 keys 一样,它也提供模式匹配功能;服务器不需要为游标保存状

2021-03-11 19:58:54 220 1

原创 简单说说JDK8-Stream

JDK8-Stream我发现,Stream的处理方式是借鉴于大数据的流式处理方式。所以我就简单使用Stream来写一个WordCount程序:先简单说一下下面代码的含义,将一个String[]的内容模拟成文件的一行一行数据,最终我们需要将单词映射为word -> count的形式,进行排序,让相同的word靠在一起,最终即可通过比较相近的元素的word是否相等,相等对count进行相加,即可得到最终的答案。import java.util.Arrays;import java.util.Co

2021-02-23 21:32:05 111

原创 简单讲讲HashMap & LinkedHashMap

简单讲讲HashMap & LinkedHashMapHashMapHashMap的结构一个数组 + 链表 or 红黑树为什么是这样的结构呢?哈希表原理就是通过哈希映射,来快速定位到对应的key,所以必须要有一个数组用来承接数据,假设我们用Key的hashcode值对数组的长度进行取余,得到对应的数组下标后,进行存储,下次即可通过同样的方法进行快速查找;但是当我们的数据量很大的时候,难免会发生哈希冲突(虽然Key不同但是存储位置是相同的),解决哈希冲突的方法有很多种,HashMap是使用了

2021-02-23 15:41:49 164

原创 Spark-CombineByKey函数

combineByKeyCombineByKey这一函数过程就是根据Key值,将Value值进行合并的过程。参数解释def combineByKey[C]( createCombiner: V => C, mergeValue: (C, V) => C, mergeCombiners: (C, C) => C): RDD[(K, C)] = {}createCombiner: V => C:如何处理第一个ValuemergeValue

2021-01-30 17:08:43 130

原创 大数据开发经典面试题:说一说Yarn、HDFS、MR

Yarn是什么?是Hadoop2之后推出的,用于管理集群中的资源,他有这几个角色:ResourceManager(下文简称RM)NodeManager(下文简称NM)ApplicationMaster(下文简称AppMaster)Container其中RM是整个集群的管理者,所有的资源的使用申请与释放都要向它进行汇报与调度,NM是集群中各个Node结点的管理资源,主要配合RM进行工作。这两者生命周期是从Yarn启动到结束均存在的。AppMaster与Container是对进行某一次任务的资

2021-01-29 11:17:08 337

原创 Disruptor简介及其应用

Disruptor背景Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖。目前,包括Apache Storm、Camel、Log4j 2在内的很多知名项目都应用了Disrup

2021-01-27 15:12:02 882

原创 说一说Spark-RDD(一)

RDDA Resilient Distributed Dataset (RDD).一个弹性的分布式数据集合。RDD数据集有5个主要的属性:在RDD的源码内部,有以下注释,理解即可。有分区列表,指RDD这个对象中,是知道各个分区数据在分布式文件系统中的哪个位置。有相同的函数可以用于计算每个切片的数据有该RDD数据集合所依赖的数据集合列表可选的,可以有对Key-Value进行分区操作的分区器(例如:默认是hash值分区)可选的,RDD会更加偏向于数据本地化计算(在每个切片所在的位置进

2021-01-23 21:28:09 157 2

原创 初识Scala(二)

初识Scala(二)trait相当于Java的接口,但是Scala可以实现多继承。package pro.eddievim.multi/** * @Author eddieVim * @微信公众号 艾迪威姆 / PositiveEddie * @Blog https://blog.csdn.net/weixin_44129784 * @Create 2021/1/17 10:28 * @Discription */trait God { def aSay(): Unit =

2021-01-19 11:20:32 76

原创 设计模式之迭代器模式(Iterator)

设计模式之迭代器模式(Iterator)提供一种方法顺序访问一个集合对象中的各个元素,而不暴露该对象的内部表示。迭代器模式在很多场景都有应用,例如链表的遍历操作,就需要用到迭代器。大数据中的迭代处理(避免出现多个中间数据集)等等。这里我们来自己实现ArrayList与LinkedList迭代器,加深对迭代器的理解。MyCollectionpackage pers.eddievim.dp.iterator;import java.util.Iterator;/** * @Author

2021-01-16 23:15:50 120 1

原创 Golang Channel简介

Go ChannelChannel,管道。从它的名字,就可以差不多可以了解到是一个与队列类似的东西。它可以轻松地实现,线程之间的通信,线程之间可以通过它接收和发送数据,达到线程安全的目的。定义初始化channel := make(chan int) // 初始化一个不带缓冲区的channelchannel := make(chan int, 9) // 初始化一个带9个缓冲区的channel有无缓冲区区别?有缓冲区若缓冲区大小为N,线程A发送数据至channel中,若channel中已

2020-12-27 16:22:21 103

原创 麻省理工硬核课程分布式系统lab_1解析 MIT6.824 lab_1 MapReduce

这个Lab并不是真的让我们去实现MapReduce的分布式并行框架,而是通过本地开启不同的进程(线程),去模拟集群执行MapReduce程序。课程相关文献建议优先使用官方的相关资料,进行完成课程,本文章仅供参考。MIT 6.824 分布式系统课程官网mit 6.824 Distributed SystemsMIT6.824 分布式系统 MapReduce 实验1mit 6.824 Lab1 MapReduce谷歌MapReduce论文MapReduce Paper源代码作者代码仓.

2020-12-11 17:04:11 839 1

原创 从源码级别深挖Zookeeper监听机制

从源码级别深挖Zookeeper监听机制监听机制是Zookeeper的一个重要特性,例如:Zookeeper实现的高可用集群、分布式锁,就利用到了这一特性。在Zookeeper被监听的结点对象/信息发生了改变,就会触发监听机制,通知注册者。注册监听机制创建客户端,创建默认监听器在创建zookeeper客户端实例时,需要下列参数。new ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)三个参数分别的含义

2020-12-03 22:41:20 214 2

原创 初识Scala(一)

初识Scalaval 与 varval常量:相当于使用final修饰的变量var用于声明变量object 与 classobjectScala的object就相当于一个单例的对象,即static class修饰Object内的方法是直接可以运行的(不需要new一个对象),所以main方法必须在objectobject允许裸露代码,相当于object将代码放到了static静态代码块中classclass内的方法是必须要创建对象后才能使用的类里允许裸露代码,其字节码

2020-12-03 14:53:45 93

原创 初识HBase(HBase数据模型与架构)

HBaseApache HBase™ is the Hadoop database, a distributed, scalable, big data store.Use Apache HBase™ when you need random, realtime read/write access to your Big Data. This project’s goal is the hosting of very large tables – billions of rows X millions

2020-11-27 09:47:55 112

原创 计算机网络——网络分层 + TCP三次握手四次挥手

网络分层OSI自顶向下:应用层表示层会话层运输层网络层数据链路层物理层TCP/IP体系结构自顶向下:应用层(TELNET、HTTP、FTP、SMTP)运输层(TCP、UDP)网络层IP网络接口层结合两种模型可以得出一种五层的体系结构自顶向下:应用层运输层网络层数据链路层物理层五层协议体系结构应用层运输层网络层数据链路层物理层应用层应用层的任务就是通过应用进程间的交互来完成特定网络应用。应用层协议定义,应用层进程之间通信和

2020-11-22 15:01:41 260

原创 Hive如何调优

Hive调优把Hive SQL当作MapReduce程序进行优化Hive抓取策略Hive允许方式并行计算严格模式Hive排序Hive JoinMap-Side聚合(Combiner)合并小文件JVM重用Hive抓取策略Hive中对某些情况的查询不需要MapReduce以下SQL不会转为MapReduce来执行SELECT仅查询本表字段WHERE仅对本表字段进行条件过滤配置方式set hive.fetch.task.conversion=none / mor

2020-11-22 13:52:58 225

原创 了解Hive-SQL

Hive的组成由MapReduce承担计算层的角色,由HDFS承担存储层的角色;Hive核心负责解析、执行、优化Hive SQL语句生产对应的MapReduce程序,然后再去执行另外加一个数据库进行存储Hive的元数据(表信息、表结构、字段信息、字段类型等)Load与Insert的区别Insert语句Insert into table table_name values(xx, yy, zz);通过Insert语句插入语句,需要去进行SQL语法的解释,分析,优化成对应的

2020-11-17 10:45:09 177 1

原创 MapReduce实现好友推荐

MapReduce实现好友推荐问题描述给定一个好友列表,第一个为用户名,接下来为这个用户的好友。需要通过MapReduce来实现好友推荐的功能。即两个用户直接若有共同好友即可进行相互推荐,若共同好友越多,则越优先进行推荐。解决思路利用自顶向下的思路进行思考。首先,两个用户之间若已经是好友了,则无需进行相互推荐。其次,如何定义Key,让数据在Reduce阶段相遇?我们可以将关系作为Key,关系又分为直接好友关系,与间接好友关系。Map端如何处理数据?Map端主要要生成对

2020-11-13 15:53:30 1152 1

原创 MapReduce源码分析心得

源码分析分布式计算追求:计算向数据移动并行度、分而治之数据本地化读取Client没有计算发生。支撑了计算向数据移动,和计算的并行度。做的最主要的是:存储与计算解耦,就是对所要进行切片的数据进行split切片,(split == map并行度)。Split默认是与Block块数量一致,目的是为了计算向数据移动,几个Block块分布在几个地方,就起几个Map,这样就不需要让大量数据进行移动,而是只需要将Jar包分发到各个Block所在的结点进行执行即可。用户也可以对Split进行自定

2020-11-12 17:07:34 107

原创 MapReduce手写WordCount

MapReduce-WordCount引入依赖这里的版本应该与你自己的Hadoop版本相对应<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.2.1</version></dependency>创建主类package pro.e

2020-11-05 19:26:48 139

原创 Hadoop-Yarn作用及其优点

YarnHadoop2.x版本出现角色ResourceManager 管理集群资源NodeManager 管理各个结点自身资源AppMaster 一次任务调度的领导Container 容器,分配资源用于一个Task的执行资源管理RM(ResourceManager),了解集群中所有结点的资源信息。NM(NodeManager)掌握本台机器的资源信息,并需要定期向RM汇报自己的资源信息。MapReduce on YarnMR-Cli将任务所需文件(Jar(代码)、XML(参数

2020-11-05 10:46:06 2423

原创 leetcode120. 三角形最小路径和

leetcode120. 三角形最小路径和给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。例如,给定三角形:[[2],[3,4],[6,5,7],[4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。思路DFS(会超时)class Solution { public int minimumTot

2020-10-18 16:22:58 67

原创 对Git的理解与Git常用命令

对Git的理解与Git常用命令这里只整理本人常用的Git命令,与帮助理解Git的机制与思想。GitGit就是一个仓库管理工具,我们可以利用他很好地对代码进行管理,多分支(版本)开发,版本回滚等操作;GitHub是一个代码托管平台,我们可以利用Git将代码放到上面进行托管。分支分支有本地分支,也有远程分支。可以理解为分支之间互不干扰,可以处在不同的开发进度上,通过git checkout命令去切换本地分支,与关联远程分支,达到项目的多版本管理的目的。git init创建一个Git本地

2020-09-25 13:16:34 97

原创 简单说说JUC核心-AQS

AQS(AbstractQueuedSynchronizer)一个同步工具类,使用了模版方法设计模式,内部维护了一个volatile修饰的state,维护了一个双向链表队列,是一个个Node连接起来的,每个Node内部存储了一个线程,使用AQS过程中大量通过CAS操作去修改state与对队列进行操作。相关链接核心思想:如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制

2020-09-11 14:58:29 233

原创 说一说Java多线程之线程池

为什么使用线程池?重复利用现有的线程继续执行任务,避免创建与销毁所带来的开销由于没有创建与销毁线程的开销,所以会提高系统的响应速度通过线程池可以对线程进行合理的管理,根据系统的承受能力调整可运行线程的数量启动线程数 = [任务执行时间 / (任务执行时间-IO等待时间)] * CPU内核数ThreadPoolExecutornewCacheThreadPool不指定线程数,线程数最大值可以达到Integer.MAX_VALUE线程可以缓存重复利用和回收(回收默认时间为1分钟)当线

2020-09-05 15:04:26 234

原创 随便说说HDFS(Hadoop Distributed File System)

HDFSHadoop Distributed File SystemNameNode作为HDFS的核心、大脑,NameNode负责记录文件的元数据与Block块及其副本存储的DataNode的位置信息。由于NameNode在一个HDFS集群中仅有一个,且访问频率高(每次读写操作都需要去访问它),所以NameNode将数据存放在内存中,加快访问速度。持久化由于数据都存放在内存中,所以就需要进行持久化操作,防止NameNode突然宕机而导致内存中的数据丢失,HDFS使用了两种策略进行内存的

2020-08-29 00:09:00 221

原创 借用一个给定概率的概率函数实现自定义概率的概率函数

借用一个给定概率的概率函数实现自定义概率的概率函数给定一个等概率随机生成数字为1 - 7的函数fun7(),要求只借用此函数封装一个实现等概率生成1 - 10的函数fun10(),或者等概率生成1 - n的函数funN();思路fun2()函数将所有的数都拆成二进制来做,首先要将给定的函数改造成实现等概率出现0、1的函数。将函数fun7()生成的结果做分类判断,若结果为1 - 3则为0,若结果为4 - 6则为1;结果为7则重新调用函数。funN()函数将需要生产的n拆成二进制形式,例

2020-08-28 00:00:54 288

原创 蓄水池算法(实时确保流中数据的等概率性)

蓄水池算法假如某个网站每日有1亿+的用户量访问,而今天有一个活动,需要抽取100个在今天登陆的幸运用户,要求:要求每个用户被选中的概率是相等的;这100个幸运用户实时更新,在当日的24点过后马上公布名单;问题分析首先分析等概率问题:一般情况下,在需要等概率的情况下,我们只需要在总数n个中,抽取1个,连续抽取k次(遇到已经抽过的再放回重新抽取)。分析实时更新问题:前面的等概率抽取的情况,必须在总数n确定的情况下才能够进行,而实时更新问题,在n的数量级与抽取的数量较小时且机器性能较好时,

2020-08-27 23:04:57 295

原创 设计模式之门面(Facde)、调停器(Mediator)、装饰器(Decorator)

门面(Facde)、调停器(Mediator)、装饰器(Decorator)门面模式(Facde)示意图用户调用的模块之间的关系错综复杂,使用门面模式来使得调用者调用更加方便直接。案例SpringMVC中的DispatcherServlet把本来需要请求多个接口的业务改成只请求一个接口的业务调停器(Mediator)示意图模块之间错综复杂的调用关系,通过引入一个中间协调者来解耦模式之间的复杂关系。案例消息队列装饰器模式(Decorator)顾名思义就是给类加一

2020-08-26 17:00:44 441

原创 设计模式之工厂模式(Factory)

工厂模式Factory任何可以产生对象的方法和类,都可以称之为工厂单例也是一种工厂为什么有了new关键字后还需要工厂模式?灵活控制控制对象的权限,作用范围等信息简单工厂Simple Factory通过一个工厂类去获得一类实体类 or 接口 or 抽象类的实例,称为简单工厂。代码演示UML关系图Produce类package pers.eddievim.dp.factory;/** * @author eddieVim * @微信公众号 埃迪的Code日记 / Pos

2020-08-23 23:00:01 183

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除