自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 收藏
  • 关注

原创 AQS

  AQS(AbstractQuenedSynchronizer抽象的队列式同步器)在java.util.concurrent.locks包,自旋锁、互斥锁、读锁写锁、条件产量、信号量、栅栏都是AQS的衍生物。AQS的核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程并将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。  CLH队列是一个虚拟的双

2020-05-31 23:39:25 280

原创 RPC原理及实现

  RPC(Remote Procedure Call)远程过程调用, 允许像调用本地服务那样调用远程其它服务,即实现跨进程交互。RPC 调用分以下两种:同步调用:客户方等待调用执行完成并返回结果。异步调用:客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。 若客户方不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。异步和同步的区分在于是否等待服务端执行完成并返回结果。RPC框架如图:RPC 服务方通过 RpcServer 去导出(export)远程接口方法

2020-05-31 21:23:31 820

原创 ZooKeeper应用场景

ZooKeeper基本概念ZooKeeper集群角色  一个 ZooKeeper 集群同一时刻只会有一个 Leader,其他都是 Follower 或 Observer。ZooKeeper 配置很简单,每个节点的配置文件(zoo.cfg)都是一样的,只有 myid 文件不一样。myid 的值必须是 zoo.cfg中server.{数值} 的{数值}部分。  ZooKeeper 集群的所有机器通过一个 Leader 选举过程来选定一台被称为Leader的机器,Leader服务器为客户端提供读和写服务。F

2020-05-31 17:33:13 311

原创 HBase的MVCC

  MVCC是一种通过数据的多版本来解决读写一致性问题的解决方案。HBase在保证写数据一致性的同时,还保证读取的高性能。这一机制的实现就是通过MVCC来控制的。HBase为什么需要并发控制?可能存在多个客户端,可能同时在操作某一个Region的某一行的某一列。HBase的MVCC是在HRegion中的写操作的实现。MVCC实现类  MVCC的实现类是MultiVersionConsistencyControl,是个Region级别的MVCC控制。当有写操作来时,MVCC会做如下事情:HRegion

2020-05-30 23:34:56 1039

原创 Spark join的分类

  当前SparkSQL支持三种Join算法:shuffle hash join、broadcast hash join以及sort merge join。Hash Join  采用hash join算法,整个过程会经历三步:确定Build Table以及Probe Table:Build Table使用join key构建Hash Table,而Probe Table使用join key进行探测,探测成功就可以join在一起。通常情况下,小表会作为Build Table,大表作为Probe Ta

2020-05-30 11:42:08 747

原创 Java疑难杂问①

  泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。  Java 的泛型是伪泛型, 运行期的泛型类型,被擦除了,因此,在运行期,ArrayList< String> 和 ArrayList< Integer> 是相同的类型。JVM并不知道泛型的存在,因为泛型在编

2020-05-30 10:39:47 614

原创 Hbase的二级索引

  由于在 HBase 中的二级索引是通过建表的方式实现的,当需要更新时,就是两个表的数据原子更新,也就是跨表的事务功能,而 Hbase 只提供行级事务,没有跨表和跨行的事 务功能,这就需要开发者自己去实现,如果对数据一致性要求较高,那么就可能需要自己 去实现一套分布式的事务机制,之所以是分布式的事务机制,是因为原始数据可能由一些 HRegionserver 维护,而索引表由另外一些 HRegionserver 维护,这个事务机制就涉及到了多个HRegionserver,也就是分布式的事务机制。二级索引设

2020-05-29 22:15:41 714

翻译 MySQL高可用方案

目录基于共享存储的方案SAN基于磁盘复制的方案 DRBD基于主从复制(单点写)方案keepalived/heartbeatMHA基于ZooKeeper的高可用基于Cluster(多点写)方案基于中间件proxy的方案总结基于共享存储的方案SAN  SAN(Storage Area Network)可以实现网络中不同服务器的数据共享,共享存储能够为数据库服务器和存储解耦。使用共享存储时,服务器能够正常挂载文件系统并操作,如果服务器挂了,备用服务器可以挂载相同的文件系统,执行需要的恢复操作,然后启动MySQ

2020-05-29 16:34:43 620

原创 Zookeeper 数据结构

  ZooKeeper提供的名称空间非常类似于标准文件系统。ZooKeeper的数据存储是基于节点的,这个节点叫做Znode,Znode的引用方式是路径引用,是由斜线(/)分隔的层级结构,让每一个Znode节点拥有唯一的路径。Znode兼具文件和目录两种特点。既像文件,又像目录一样可以作为路径标识的一部分。Znode维护着:data:Znode存储的数据信息ACL:记录Znode的访问权限stat:包含Znode的各种元数据,比如事务ID、版本号、时间戳、大小等等child:当前节点的子节点引用

2020-05-29 11:36:50 509

原创 Redis的持久化

redis原理之数据持久化虽然redis这种no-sql一般都是作为cache来服务 但是如果完全没有数据可持久化的方法 那么显得有些单薄就像memcache 由于这种no-sql是工作在memory的 那么由于memory的实体是ram所以如果重启或者宕机 memory中的数据就全没了 数据的一致性的不到保障但是 redis不同 redis有相对的数据持久化的方案 由两种方式构成 aof & rdbaof就像关系数据库中的binlog一样 把每一次写操作以追加的形式记录在其中以文件的

2020-05-28 22:38:25 271

原创 Redis集群

Redis有三种集群模式,分别是:主从模式、Sentinel模式、Cluster模式主从模式  在主从复制模式中,数据库分为两类:主数据库(master)和从数据库(slave)。其中主从复制有如下特点:主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库从数据库一般都是只读的,并且接收主数据库同步过来的数据一个master可以拥有多个slave,但是一个slave只能对应一个masterslave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从

2020-05-28 17:04:22 258

转载 一条SQL语句执行得很慢的原因

需要分以下两种情况来讨论:1、大多数情况是正常的,只是偶尔会出现很慢的情况2、在数据量不变的情况下,这条SQL语句一直以来都执行的很慢针对偶尔很慢的情况数据库在刷新脏页  当要往数据库插入一条数据或者要更新一条数据的时候,数据库会在内存中把对应字段的数据更新了,但是更新之后,这些更新的字段并不会马上同步持久化到磁盘中去,而是把这些更新的记录写入到 redo log 日记中去,等到空闲的时候,在通过 redo log 里的日记把最新的数据同步到磁盘中去。  不过,redo log 里的容量是有限的

2020-05-28 14:57:18 419

原创 非关系数据库(MongoDB)和关系型数据库(MySQL)的区别

MongoDBMySQL数据库模型非关系型关系型存储方式虚拟存储+持久化不同的引擎有不同的存储方式查询语句独特的MongoDB查询方式传统SQL语句架构特点可以通过副本集以及分片来实现高可用常见有单点,M-S,MHA,Cluster,MMM等架构方式数据处理方式基于内存,将热数据存在物理内存中,从而达到高速读写不同的引擎拥有其自己的特点MySQL是关系型数据库。优势:在不同的引擎上有不同 的存储方式。查询语句是使用传统的sql语句...

2020-05-27 19:59:40 2800

原创 Zookeeper的数据发布与订阅模式

  数据发布/订阅(Publish/Subscribe)系统,即所谓的配置中心,即发布者将数据发布到ZooKeeper的一个或一系列节点上,供订阅者进行数据订阅,进而达到动态获取数据的目的,实现配置信息的集中式管理和数据的动态更新。  Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储, Zookeeper 作用主要是用来维护和监控存储的数据的状态变化,通过监控这些数据状态的变化,从而达到基于数据的集群管理。 

2020-05-26 12:18:15 1135

原创 单线程Redis高性能原因

目录Redis简介Redis快速的原因那么为什么Redis是单线程的Redis简介  Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串(String),散列(Hash),列表(List),集合(Set),有序集合(Sorted Set或者是ZSet)与范围查询,Bitmaps,Hyperloglogs 和地理空间(Geospatial)索引半径查询。其中常见的数据结构类型有:String、List、Set、Hash、ZSet这5种。

2020-05-26 09:46:05 409

原创 Kafka Consumer如何实现exactly once/at least once

目录消费端幂等性消费时出现几种异常情况自动提交手动提交精确一次消费实现总结至少消费一次消费端幂等性  kafka具有两种提交offset(消费偏移量)方式,在Kafka每个分区具备一offset记录消费位置,如果消费者一直处于正常的运行转态,那么offset将没有什么用处,因为正常消费时,consumer记录了本次消费的offset和下一次将要进行poll数据的offset起始位置,但是如果消费者发生崩溃或者有新的消费者加入消费者组,就会触发再均衡Rebalance,Rebalance之后,每个消费者将

2020-05-24 15:44:35 2652 2

原创 BIO和NIO | Reactor

目录基本概念BIO(同步阻塞)NIO(同步非阻塞)AIO(异步非阻塞)总结基本概念同步:使用同步IO时,Java自己处理IO读写异步:使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS,完成后OS通知Java处理(回调)阻塞:使用阻塞IO时,Java调用会一直阻塞到读写完成才返回非阻塞:使用非阻塞IO时,如果不能立马读写,Java调用会马上返回,当IO事件分发器通知可读写时在进行读写,不断循环直到读写完成BIO(同步阻塞)  服务器的实现模式是一个连接一个线程

2020-05-24 10:10:59 305

翻译 Elasticsearch架构原理

基本概念索引(Index)  ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库,或者一个数据存储方案(schema)。索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。一个ES集群中可以按需创建任意数目的索引。类型(Type)  类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。因此,一个索引内部可定义一个或多个类型(type)。

2020-05-23 12:57:19 282

原创 Java内存模型

目录java内存模型主内存与工作内存内存间交互操作重排序先行发生原则并发内存模型的实质原子性(Automicity)可见性有序性java内存模型  java内存模型(Java Memory Model,JMM)是java虚拟机规范定义的,用来屏蔽掉java程序在各种不同的硬件和操作系统对内存的访问的差异,这样就可以实现java程序在各种不同的平台上都能达到内存访问的一致性。主内存与工作内存  Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样

2020-05-19 22:43:36 266

原创 读写锁

目录ReentrantReadWriteLock分析特性源码分析构造方法Sync分析获取锁读锁的获取写锁的获取总结释放锁读锁的释放写锁的释放总结总结  ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁。读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。所有读写锁的实现必须确保写操作对读操作的内存影响。换句话说,一个获得了读锁的线程必须能看到前一个释放的写锁所更新的内容。  读写锁比互斥锁允许对于共享数据更大程度的并发。每次只能有一个写线程,但是同时可以有多个线程并发地读数据。Re

2020-05-19 19:33:27 254

原创 手撕生产者-消费者模式 | P问题、NP问题

研究P/NP问题的原因:  因为计算机处理的输入常常不是那么几十个几千个那么一点点,想象一下,当计算机处理的数据达到100万个的时候,时间复杂度为o(n^ 2)和o(e^ n)的算法,所需的运行次数简直是天壤之别,o(e^n)指数级的可能运行好几天都没法完成任务,所以我们才要研究一个问题是否存在多项式时间算法。而我们也只在乎一个问题是否存在多项式算法,因为一个时间复杂度比多项式算法还要复杂的算法研究起来是没有任何实际意义的。P类问题:存在多项式时间算法的问题。(P:polynominal,多项式)NP

2020-05-18 23:20:59 375

原创 Sqoop底层工作原理

目录Sqoop简介Sqoop架构Sqoop导入底层工作原理Sqoop导出底层工作原理Sqoop简介  Sqoop旨在协助RDBMS与Hadoop之间进行高效的大数据交流。可以把关系型数据库的数据导入到 Hadoop 与其相关的系统 (如HBase和Hive)中;同时也可以把数据从 Hadoop 系统里抽取并导出到关系型数据库里。  Sqoop是一个在结构化数据和Hadoop之间进行批量数据迁移的工具,结构化数据可以是MySQL、Oracle等RDBMS。Sqoop底层用MapReduce程序实现抽取、

2020-05-18 16:26:56 4296

原创 TCP粘包,拆包及解决方法

目录什么是粘包、拆包UDP会发生粘包和拆包么?粘包、拆包发生原因粘包、拆包解决办法什么是粘包、拆包  假设客户端向服务端连续发送了两个数据包,用packet1和packet2来表示,那么服务端收到的数据可以分为如下三种:第一种情况,接收端正常收到两个数据包,即没有发生拆包和粘包的现象第二种情况,接收端只收到一个数据包,由于TCP是不会出现丢包的,所以这一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包。这种情况由于接收端不知道这两个数据包的界限,所以对于接收端来说很难处理第三种情况

2020-05-18 13:18:06 335

原创 零拷贝

目录零拷贝的概念传统I/O通过sendfile实现的零拷贝I/O带有DMA收集拷贝功能的sendfile实现的I/O通过mmap实现的零拷贝I/OJava的实现NIO的零拷贝NIO的直接内存NIO DirectByteBuffer零拷贝的概念  零拷贝是CPU不执行拷贝数据从一个存储区域到另一个存储区域的任务,这通常用于通过网络传输一个文件时以减少CPU周期和内存带宽。零拷贝是操作系统底层的一种实现,在网络编程中,利用操作系统这一特性,可以大大提高数据传输的效率。零拷贝的好处减少甚至完全避免不必要

2020-05-15 14:03:44 249

原创 Spark和Flink的区别

Flink在进行集合的迭代转换时可以是循环或是迭代计算处理。这使得Join算法、对分区的链接和重用以及排序可以选择最优算法。当然flink也是一个很强大的批处理工具。flink的流式处理的是真正的流处理。流式数据一但进入就实时进行处理,这就允许流数据灵活地在操作窗口。它甚至可以在使用水印的流数中处理数据(It is even capable of handling late data in streams by the use of watermarks)。此外,flink的代码执行引擎还对现有使用stor

2020-05-14 23:59:51 5539

原创 TensorFlow

  TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构允许在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等。数据流图(Data Flow Graph)  数据流图用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点” 一般用来表示施加的数学操作,但也可以表

2020-05-13 10:52:42 104

原创 机器学习常见算法

在机器学习领域,有几种主要的学习方式:监督学习,非监督学习,半监督学习和强化学习。1、监督式学习  在监督式学习下,输入数据被称为“训练数据”,每组训练数据有一个明确的标识或结果。在建立预测模型的时候,监督式学习建立一个学习过程,将预测结果与“训练数据”的实际结果进行比较,不断的调整预测模型,直到模型的预测结果达到一个预期的准确率。监督式学习的常见应用场景如分类问题和回归问题。常见监督式学习算...

2020-05-13 10:03:17 286

原创 ElasticSearch 索引模板

参考:Elasticsearch权威指南  索引可使用预定义的模板进行创建,这个模板称作Index templates。模板设置包括settings和mappings,通过模式匹配的方式使得多个索引重用一个模板,例如:定义模板:curl -XPUT localhost:9200/_template/template_1 -d{ "template" : "te*", "settings" : { "number_of_shards" : 1 }, "m

2020-05-12 00:01:10 310

原创 HDFS保证数据一致性与容错机制

HDFS保证数据一致性HadoopNameNode保证元数据的一致性校验和HA高可用冗余副本机架感知心跳机制安全模式校验和回收站元数据保护快照机制Hadoop  HDFS作为分布式文件系统在分布式环境下如何保证数据一致性。HDFS中,存储的文件将会被分成若干的大小一致的block分布式地存储在不同的机器上,需要NameNode节点来对这些数据进行管理,存储这些block的结点称为DataNod...

2020-05-07 22:13:39 2975 1

原创 Spark分区器HashPartitioner和RangePartitioner/全局排序

  在Spark中分区器直接决定了RDD中分区的个数,RDD中每条数据经过Shuffle过程属于哪个分区以及Reduce的个数。只有Key-Value类型的RDD才有分区的,非Key-Value类型的RDD分区的值是None的。  在Spark中,存在两类分区函数:HashPartitioner和RangePartitioner,它们都是继承自Partitioner,主要提供了每个RDD有几个分...

2020-05-07 10:12:15 1510

原创 Spark jdbc(mysql) 读取并发度优化

 &emsp在Spark中使用默认提供的jdbc方法时,在数据库数据较大时经常发现任务 hang 住,其实是单线程任务过重导致,这时候需要提高读取的并发度。单partition(无并发)调用函数def jdbc(url: String, table: String, properties: Properties): DataFrame使用:val url = "jdbc:mys...

2020-05-06 18:21:53 727

原创 Spark的内存模型

Spark的内存管理机制堆内和堆外内存堆内堆外接口内存空间分配静态内存管理Execution的内存管理Storage的存储管理统一内存管理新的配置项如何应对内存压力MemoryManager存储内存管理RDD的持久化机制RDD缓存的过程淘汰和落盘执行内存管理堆内和堆外内存  作为一个JVM进程,Executor的内存管理建立在JVM的内存管理之上,Spark对JVM的堆内(On-heap)空间...

2020-05-06 15:52:55 474

原创 SparkSQL用户自定义函数

UDF函数通过spark.udf.register(“funcName”, func) 来进行注册,通过select funcName(name) from *来直接使用scala> val df = spark.read.json("1.json")df: org.apache.spark.sql.DataFrame = [age: bigint, name: string] s...

2020-05-06 13:11:26 313

原创 Kafka网络模型

  Kafka的网络通信模型是基于NIO的Reactor多线程模型来设计的。Kafka的网络通信层模型,主要采用了 1(1个Acceptor线程)+N(N个Processor线程)+M(M个业务处理线程) 。线程数线程名线程具体说明1kafka-socket-acceptor_%xAcceptor线程,负责监听Client端发起的请求Nkafka-network...

2020-05-05 21:05:21 1011

原创 跳表

对于一个单链表,即使链表是有序的,想要在其中查找某个数据,也只能从头到尾遍历链表,效率就很低。跳表查询的分析?如果链表中总共有 n个结点,那么第一级索引就有 n^ 2 个结点,第二级索引就有 n^ 4 个结点,以此类推,那么第 k 级索引就有 n^ 2k 个结点。如果最高级索引有 2 个结点,那总的索引级数 k=log2n−1,如果算上原始链表的话,那也就是总共有 log2n级。在第 k级索...

2020-05-04 13:47:38 335

原创 热备份和冷备份

冷备份  冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供一个完整的数据库。冷备份是将关键性文件拷贝到另外位置的一种说法。对于备份数据库信息而言,冷备份是最快和最安全的方法。冷备份的优点:1.是非常快速的备份方法(只需拷贝文件)2.容易归档(简单拷贝即可)3.容易恢复到某个时间点上(只需将文件再拷贝回去)4.能与归档方法相结合,作数据库“最新状态”的恢复5.低度维护,高度安...

2020-05-04 11:20:04 2080

原创 MySQL和Redis的区别

MySQL和Redis的数据库类型  MySQL是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。Redis是NoSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限MySQL的运行机制  MySQL作为持久化存储的关系型数据库,相对薄弱的地方在于每次请求访问数据库时,都存在着I/O操作,如果反复...

2020-05-04 01:01:12 288

原创 虚拟内存和物理内存

  操作系统有虚拟内存与物理内存的概念。在还没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于CPU的地址线条数。比如在32位平台下,寻址的范围是2^32(即4G)并且这是固定的,如果没有虚拟内存,且每次开启一个进程都给4G的物理内存,就可能会出现很多问题:因为物理内存是有限的,当有多个进程要执行的时候,都要给4G内存,很显然内存小一点,很快就分配完了,于是没...

2020-05-03 21:44:07 360

原创 内部类/静态内部类/局部类/匿名内部类

  内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。内部类主要有一下几种:成员内部类、局部内部类、静态内部类、匿名内部类。内部类的共性:内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名...

2020-05-03 20:16:34 398

空空如也

空空如也

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

TA关注的人

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