自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Elasticsearch5.数据建模和并发控制

并发控制并发控制有两种,悲观并发控制和乐观并发控制悲观并发控制假定有变更冲突的可能。会对资源加锁,防止冲突。例如数据库行锁乐观并发控制假定冲突是不会发生的,不会阻塞正在尝试的操作。如果数据在读写中被修改,更更新将会失败。应用程序决定如何解决冲突,例如重试更更新,使用新的数据,或者将错误报告给⽤户Elasticsearch的并发控制Elasticsearch采用的乐观并发控制,ES中的文档是不可变更更的。如果你更新一个⽂文档,会将就文档标记为删除,同时增加一个全新的⽂文档。同时文档的versi

2021-01-20 15:21:16 179

原创 Elasticsearch4.聚合

Elasticsearch的分析分为Bucket,Metric,Pipeline三种类型Metric在一组文档中对某一个数字型字段进行计算指标值Metric包含两种单值分析和多值分析单值分析只输出一个分析结果min, max, avg, sum,Cardinality(类似 distinct Count)多值分析输出多个分析结果stats, extended stats,percentile, percentilerank,top hits(排在前面的结果)Bucket按照一定的规则

2021-01-20 15:03:05 187

原创 Elasticsearch3.搜索

词项和全文检索Term表达语义的最小单位,在Es中,对于Term的查询,对输入不做分词,会将输入作为一个整体,在倒排索引中查找准确的词项,并计算词项在该文档中算分 可以通过Constant Score将该查询转换为Filtering,避免算分,利用缓存,提高性能全文检索索引和搜索时,都会分词,查询字符串先传递到一个合适的分词器,然后生成一个供查询的此项列表查询时候,先会对输入的查询进⾏分词,然后每个词项逐个进⾏底层的查询,最终将结果进行合并。并为每个文档生成一个算分检索过程:结

2021-01-19 17:19:10 173

原创 Elasticsearch2.基本概念

1.基本概念mapping定义了索引中字段的名称,字段的数据类型,字段的一些特殊设置,比如倒排索引的相关设置等基本数据类型string,long,integer,short,byte,double,float,data,boolean,binary复杂数据类型数组数据类型:不需要专门的类型来定义数组对象数据类型:object,单独的JSON对象嵌套数据类型:netsted,关于JSON对象的数组地理数据类型地理点数据类型:geo_point,经纬点地理形状数据类型:geo_shape,

2021-01-19 17:14:38 119

原创 Elasticsearch1.lucenne基本概念

数据写入流程1.数据同时写入indexbuffer缓冲和translog日志文件2.默认每隔一秒钟,buffer中的数据被写入新的segmentfile,并进入os cache,此时segment被打开并供search使用3.buffer被清空4.重复1~3的步骤,新的segment不断添加,buffer不断被清空,而translog中的数据不断累加commit(flush)操作当translog文件达到一定的阀值(默认512M),commit操作发生1.buffer中的所有数据写入一个新的s

2021-01-19 14:58:34 157

原创 Specifying keys via field positions is only valid for tuple data types. Type: GenericType<scala.Tupl

出现了如下图所示的问题原因是导入了scala的Tuple2包

2020-12-11 16:19:37 1401

原创 kafka源码7-生产者对异常的处理

之前我们分析的都是消息正常发出和收到响应,现在分析一下对应异常消息的处理Producer对请求超市的处理在Sender的run方法中,有专门检测超时的请求public class Sender implements Runnable {void run(long now) { /** * 建立网络连接,发送数据 */ client.poll(pollTimeout, now); } } public L

2020-12-03 11:22:28 1321

原创 flink 集成到cdh6.2管理平台中

cdh和flink版本cdh版本:6.2步骤

2020-12-02 18:04:10 645

原创 kafka源码6-Sender线程对Broker响应的处理

生产者处理响应前面我们分析了producer发送请求的过程,现在分析发送请求后,怎么处理响应的,producer的响应处理也是在Sender线程中处理的,再看Selector的pollSelectionKeys方法class Selector{void pollSelectionKeys(Set<SelectionKey> selectionKeys, boolean isImmediatelyConnected,

2020-12-01 14:05:41 127

原创 kafka源码5-Sender线程发送数据

前面已经分析到数据封装成了batch,现在就是要发送数据,kafka生产者发送数据是通过Sender线程来发送,在分析Producer初始化的时候看到,Sender线程是在Producer初始化的时候就启动了Sender线程发送流程看run方法做了什么操作 void run(long now) { if (transactionManager != null) { try { if (transactionManager.sh

2020-12-01 11:40:56 300

原创 kafka源码4-消息封装RecordAccumulator

kafka发送的消息是封装成批次发送的,这些操作都是在RecordAccumulator对象中操作的,下图是RecordAccumulator中的对象对应关系首先看一下RecordAccumulator中的一些对应关系,生产者发送数据是分装在ProducerBatch中的,每个Partition对应一个Dequeue队列,这些队列组成批次batches,BufferPool是一个内存池,ProducerBatch对象的内存就是在内存池中申请的封装批次流程 public RecordAppendResu

2020-11-25 18:27:13 143

原创 kafka源码3-分区器

之前我们知道,生产者在拿到topic的元数据信息后,就是分区,分区主要是看生产者是按照什么策略来分区的public class KafkaProducer<K, V> implements Producer<K, V> {private int partition(ProducerRecord<K, V> record, byte[] serializedKey, byte[] serializedValue, Cluster cluster) { /

2020-11-24 11:44:50 115

原创 kafka源码2-元数据

从前面我们看到,生产者在发送数据时,首先是更新元数据,这次分析一下更新元数据的流程,首先生产者是怎么保存元数据的元数据结构Metadata对象public final class Metadata implements Closeable {private static final Logger log = LoggerFactory.getLogger(Metadata.class);public static final long TOPIC_EXPIRY_MS = 5 * 60 * 1

2020-11-23 21:35:50 922

原创 kafka源码1-生产者流程

生产者初始化生产者在发送数据时,首先要创建KafkaProducer对象,我们看该对象做了什么KafkaProducer(ProducerConfig config, Serializer<K> keySerializer, Serializer<V> valueSerializer, Metadata metadata, KafkaCl

2020-11-19 18:54:08 122

原创 1.RPC的基础知识

什么是RPCRPC的全称是Remote ProcedureCall,即远程过程调用,RPC屏蔽了底层网络通信相关的细节,实现调用远程方法和调用本地方法一样RPC通信流程RPC协议RPC协议设计RPC协议的设计可以分为协议头和协议体协议头包含协议长度、序列化方式、协议标示、消息 ID、 消息类型等协议体包含请求接口方法、请求的业务参数值、扩展属 性等可扩展的协议设计上面设计的协议都是固定的协议,如果想在这个协议中增加新的参数,那么就会有兼容性问题,那么就要设计一个可扩展的协议,如下所示:

2020-11-17 16:08:22 584 2

原创 2.多线程的状态

1.操作系统的生命周期初始状态,线程被创建,这个线程被创建是编程语言级别的线程创建,操作系统还没创建可运行:线程可以分配CPU,表示真正的操作系统线程以及被创建,可以分配CPU了运行:操作系统把CPU分配给了一个可运行状态的线程休眠:运行状态的CPU调用阻塞API就变成了休眠状态终止:线程执行完或者异常退出在计算机语言层面,对于这五种状态,有些做了合并,对于Java语言,把可运行状态和运行状态合并了2.Java线程的生命周期Java语言有6种状态NEW(初始化状态)RUNNABL

2020-11-09 14:12:52 65

原创 一.多线程出现的问题

为什么多线程代码可能会出现问题现代计算机都为了追求更快的运行,对其做了很多的优化,但是CPU,内存,IO三者还是有很大的差距,为了提高CPU的效率,增加CPU的缓存,操作系统采用了分时复用,编译器增加了指令优化。这些方式虽然增加了CPU执行的效率,但是对于多线程而言,也增加了可见性,原子性,有序性等问题.1.可见性对于多核的计算机,每个CPU都有自己的缓存,数据都是先读取到CPU本地缓存,更新完后再把数据写入到CPU本地缓存,而把缓存中的数据刷新到内存中的时间是不确定的,这样就会导致每个线程读取的数

2020-11-06 17:46:39 317

原创 10.信号量和管程

基本同步方法信号量信号量是操作系统系统的一种同步机制,是一种抽象的数据类型,由一个整形(sem)变量和两个原子操作组成p():sem减1,如果sem<0,进入等待,否则继续v():sem加1,如sem<=0,则唤醒一个线程使用路灯来类别,每次同时能通过几辆车信号量的特性信号量是被保护的整数变量初始化完成后, 只能通过P()和V()操作修改由操作系统保证,pv操作是原子操作P()可能阻塞,V()不会阻塞通常假定信号量是"公平的"线程不会被无限期阻塞在P()操作假定信

2020-11-05 14:31:55 190

原创 九、同步互斥

并发进程的好处并发进程的正确性独立进程不和其它进程共享资源或状态确定性:输入状态决定结果可重现:能够重现起始条件调度顺序不重要并发进程:在多个进程间共享资源不确定性不可重现并发进程的正确性执行过程是不确定性和不可重现的程序错误可能是间歇性发生的这些不确定性和不可重复以意味着bug可能是间歇性发生的,也就是合作是有风险的问题的原因以上四条汇编指令的意思是:1)把next_pid赋值给寄存器1(Reg1)2)再把这个寄存器1存到了new_pid这个内存单元的去。此时new_

2020-11-03 17:46:35 444

原创 七.操作系统的进程和线程

1. 进程1.进程的概念进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。当操作系统把执行程序调入到内存之后,让这个程序可以执行起来。就是把静态的程序通过cpu动态执行起来的过程就是进程2.进程的组成进程包括程序的代码,程序处理的数据,程序计数器的值即下一条指令的地址,寄存器的值,系统的资源(打开文件,内存占用等)1.进程和程序的区别程序是进程的基础程序是静态的,进程是动态的程序每次运行都会构建不同的进程(输入的数据不同,产生的结果也会不一样,所以会构建不同的进程)

2020-11-02 21:50:40 121

原创 Netty系列二 Linux IO NIO 多路复用 Reactor模式

阻塞I/O非阻塞IO同步用户进程自己去查询数据是否就绪异步不用自己,内核把数据拷贝到了buffer,通知用户程序去读取

2020-08-12 15:06:46 365

原创 Netty系列一 Java BIO NIO

Java支持的I/O模型Java共支持3种网络编程模型/IO模式:BIO、NIO、AIOJavaBIO:同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销JavaNIO:同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求就进行处理JavaAIO:异步非阻塞,AIO引入异步通道的概念,采用了Proactor

2020-08-11 17:58:22 90

原创 spark累加器,广播变量

累加器:分布式只写共享变量,只在内部读数据广播变量:分布式只读变量 def main(args: Array[String]): Unit = { var conf = new SparkConf().setAppName("master").setMaster("local[*]") var sc = new SparkContext(conf) var...

2020-07-12 23:01:30 139

原创 IDEA 导入spark源码 及问题解决

软件准备1.IDEA 2.maven3.jdk4.scala下载源码https://github.com/apache/spark.git下载需要的版本,解压jar包导入saprk源码编译jar包maven编译代码,选择根目录出现的问题1.scala代码不规范error file=/iteblog/spark-1.3.1/streaming/src/main/scala/org/apache/spark/streaming/StreamingContext.scalame

2020-07-08 14:22:24 757

原创 scala 惰性函数

当函数返回值被声明为lazy时,函数的执行将被推迟,直到我们首次对此取值,该函数才会执行。这种函数我们称之为惰性函数def main(args: Array[String]): Unit = { lazy val res = sum(10, 20) println("-----------------") println("res=" + res) }def sum(n1 : Int, n2 : Int): Int = { println("sum() 执行了..")

2020-06-30 11:29:23 211

原创 scala 过程(procedure)

过程将函数的返回类型为Unit的函数称之为过程(procedure),如果明确函数没有返回值,那么等号可以省略def f(name:String) :Unit={ println(name+"hello") }注意区分: 如果函数声明时没有返回值类型,但是有 = 号,可以进行类型推断最后一行代码。这时这个函数实际是有返回值的,该函数并不是过程。(这点在讲解函数细节的时候讲过的.)...

2020-06-30 11:17:19 217

原创 scala 参数类型推断

参数推断省去类型信息(在某些情况下[需要有应用场景],参数类型是可以推断出来的,如list=(1,2,3) list.map() map中函数参数类型是可以推断的),同时也可以进行相应的简写参数类型推断写法说明/规则1.参数类型是可以推断时,可以省略参数类型2.当传入的函数,只有单个参数时,可以省去括号3.如果变量只在=>右边只出现一次,可以用_来代替 println(list.map((x:Int)=>x+1)) println(list.map((x)=>x+1))

2020-06-30 11:11:25 240

原创 Scala 函数柯里化

柯里化指的是将原来接受多个参数的函数变成新的接受一个参数的函数的过程, 新函数的参数接受原来的第二个参数为唯一参数, 如果有n个参数, 就是把这个函数分解成n个新函数的过程(1)函数编程中,接受多个参数的函数都可以转化为接受单个参数的函数,这个转化过程就叫柯里化(2)柯里化就是证明了函数只需要一个参数而已。其实我们刚才的学习过程中,已经涉及到了柯里化操作。(3)不用设立柯里化存在的意义这样的命题。柯里化就是以函数为主体这种思想发展的必然产生的结果。(即:柯里化是面向函数思想的必然产生结果)传统方式,

2020-06-30 11:03:39 386

原创 scala流程控制语句 if for while 中断 break

ifif (条件表达式) { 执行代码块}forfor(i <- 1 to 3){ print(i + " ")}说明i 表示循环的变量, <- 规定好 to 规定i 将会从 1-3 循环, 前后闭合 (包括1 和 3)for(i<- 1 until 3){ println(i) }说明:这种方式和前面的区别在于 i 是从1 到 (3-1)前闭合后开的范围for(i<- 1 to 3 if i!=2){ pri

2020-06-30 10:03:46 222

原创 算法的时间复杂度和空间复杂度

一、大O表示法int cal(int n) { int sum = 0; int i = 1; int j = 1; for (; i <= n; ++i) { j = 1; for (; j <= n; ++j) { sum = sum + i * j; } } }我们分析上面程序的时间是T(n)=(...

2020-04-13 15:10:19 301

原创 Hbase的体系结构

Hbase的体系结构Client包含访问Hbase的接口,并维护表对应的RegionServer和Region缓存实现对HRegionServer的快速访问Master(1)管理集群中所有的RegionServer,包括RegionServer的负载均衡,RegionServer的宕机恢复,Region的迁移(2)响应用户对表的各种管理请求,包括DDl,权限操作、切分表、合并数据分片以...

2020-04-02 11:16:35 439

原创 Hbase 的数据模型

Hbase的数据模型数据模型如下图所示:行键(RowKey)行键,是ByteArray,是表中每条记录的主键,按照字典的顺序来排序,只能存储64KB字节的数据列族(Column Family)列族作为表定义的一部分需预先给出,每个列族可以包含多个列成员,权限控制,存储和调优都是列族层面控制的列(Column)列由列族(ColumnFamily)和列名(qualifier)两部分组成...

2020-04-02 11:14:10 458

原创 Hbase在ZookeePer中的节点信息

Hbase在ZookeePer中的节点信息Hbase在Zookeeper中创建的数据节点在/hbase下:meta-region-server元数据存储的RegionServer地址,Hbase读取数据的时候都要先在zookeeper中获取元数据,并且会把部分缓存在本地master/backup-mastersHbase集群中的高可用table集群中所有表信息region-in...

2020-03-31 15:46:16 2276

原创 分布式算法 - Paxos

解决的问题如上图所示,对于一个分布式系统,客户端同时发送一个数据,比如a,每个客户端a的值是不一样的,那么怎么保证服务器集群的各个节点a的值是保持一致的呢,Paxos就是解决这个问题的上图有引入客户端,只是为了便于理解这个场景,本质是节点之间的数据共识,下面的都是节点Paxos三种角色Proposers:提议者,提供一个提议Acceptors :接受者...

2020-03-18 17:09:33 383

原创 二分查找

可以使用二分查找的条件目标函数单调性 存在上下边界 能够通过索引访问模板代码Left,right=0.len(array)-1 While left<=right; Mid = (left+right)/2 If array[mid]==target #find the target!! Elif array[mid]<target ...

2020-01-08 10:32:46 94

原创 Spark Sql 使用

SparkSql简介SparkSql主要用于处理结构化的数据以及Spark执行类sql的查询SparkSql的数据源:SparkSql的数据源可以是JSON字符串,JDBC,HIVE,HDFS等DataFrameDataFrame也是一个分布式的数据容器,与RDD类似,也可以转换成RDD,DataFrame除了保存数据外,还保存数据的结构信息scheme,DataFrame底层封装...

2019-11-30 17:35:32 243

原创 Spark RDD的数据分区

数据分区1.只有Key-Value类型的RDD才有数据分区器,非Key-Value类型的RDD分区器为None2.每个RDD的分区ID范围为:0~numPartitions-1 def main(args: Array[String]): Unit = { var conf = new SparkConf().setAppName("master").setMaster("l...

2019-11-27 18:28:34 371

原创 Spark RDD中函数的传递

在RDD中传递函数,代码的初始化在Driver端,运行在Executor端,所以传递时要对类进行序列化如下:class Search(query:String) extends Serializable { def isMatch(s:String): Boolean ={ s.contains(query) } def getMatchFunctionRefer...

2019-11-26 18:25:44 213

原创 设计模式 之: 封装、抽象、继承、多态

封装隐藏对象的属性和实现细节,仅对外公开接口,控制程序中属性的读取和修改的访问级别public class Wallet { private String id; private long createTime; private BigDecimal balance; private long balanceLastModifiedTime; // ...省略其他属...

2019-11-13 16:10:31 195

原创 计算机组成原理学习15-16 浮点数和定点数

一 定点数实数怎么表示,能用二进制表示所有的实数嘛,开始是用BCD编码来表示BCD编码用 4 个比特来表示 0~9 的整数,那么 32 个比特就可以表示 8 个这样的整数。然后我们把最右边的 2 个 0~9 的整数,当成小数部分;把左边 6 个 0~9 的整数,当成整数部分。这样,我们就可以用 32 个比特,来表示从 0 到 999999.99 这样 1 亿个实数了。BCD编...

2019-11-08 11:15:00 449

空空如也

空空如也

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

TA关注的人

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