自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

白色咖啡

White Java

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

原创 Flink简介、基本原理、架构图

Flink是一款支持有状态运算的流计算引擎。支持有状态运算是指数据的计算过程中可以保存计算的中间过程状态,比如我们要计算一个整数数据流的求和,那么我们就需要一个中间变量把数据流中的每一项数据加到这个变量上。而这个变量就是计算的中间状态。Flink框架会帮你管理状态的保存和复原。流计算是指我们要针对一个数据流进行源源不断的计算,产出实时的结果。比如说我们曾经看到过天猫淘宝的双11大屏,上面有当前的GMV成交量的数据,这个数字在屏幕上疯狂的跳动。这就是通过流计算产出的实时GMV成交量数据。

2022-08-20 22:28:09 2478

原创 《简单的逻辑学》读书笔记

读了《简单的逻辑学》Being Logical: A Guide to Good Thinking 作者D.Q.麦克伦尼。译者赵明燕。逻辑学是哲学里的一个分支,系统性地研究如何正确做出推理。参考维基百科。提高信息处理能力:在日常生活中我们每天都会收到很多的信息,这些信息里面包括错误的信息以及少量正确的信息。对于一个没有逻辑思维习惯的人来说,不会去思考这些信息和脑子里已经存在的信息有什么样的联系,甚至不去思考这些信息是否真实,也不思考观点是否正确,就直接接收这些信息。长此以往大脑中充满了知识散点以及错误信息,

2022-06-19 08:27:12 1121

原创 《HBase权威指南》读书笔记 第八章:架构:读取数据、region生命周期、ZK数据结构

读取数据读取数据的难点在于,有可能一行数据储存在多个文件中,也有可能在memstore中。例如,同一个row key在不同的时间写入不同列的数据,那么取这个row key所有列的时候就需要扫描多个文件。get操作从实现上来说,和scan操作是一样的。get或者scan操作内部实现机制步骤如下:根据时间戳、布隆过滤器快速排除一些文件,这些文件中绝不可能包含需要取的KeyValue。从最新的stor

2017-10-02 13:32:25 845

原创 《HBase权威指南》读书笔记 第八章:架构,WAL预写日志

WAL预写日志WAL的目的是为了容灾。一个Region Server会将本节点上所有的region的修改记录都记到同一个HLog文件中。当一次操作成功记录到WAL中时才会返回成功。这种机制保证了断电不会丢失数据。当region打开时,HBase会读取每个HFile中的序列号。根据最大的序列号判断应该从HLog的哪个位置开始恢复数据。HLogKey中包含了KeyValue以及region、表名、序列号

2017-09-24 15:16:19 575

原创 《HBase权威指南》读书笔记 第八章:架构,HFile格式

HFile文件格式文件结构如上图。主要有以下部分:Data-block:数据块,每个块中存放多个KeyValue对象。默认每个块64KB。但不是严格意义上的64KB,大致维持在64KB左右。Meta-block:储存元数据信息File Info:储存HFile文件信息Trailer:包含指向其他块的指针。Trailer写完了才能算一个完整的HFile文件。通过以下工具可以手动解析HFile

2017-09-17 20:23:43 564

原创 《HBase权威指南》读书笔记 第八章:架构,Compaction合并

compaction合并操作compaction操作将小文件合并成大文件,加快查询速度,减少文件数量,减少资源占用。compaction分为两种:minor compaction:将一个region中一部分小文件合并到一个新的文件中major compaction:将一个region中所有文件都合并到一个文件中。在这个过程中剔除已删除的数据、剔除多于的多版本数据。HBase会在以下几种情况下检

2017-09-10 15:19:19 781

原创 《HBase权威指南》读书笔记 第八章:架构,region拆分

region拆分region拆分的条件满足以下任何一条时做split拆分操作:当region储存文件大于配置项hbase.hregion.max.filesize当region储存文件大于列族层面配置的大小拆分过程非常迅速。其大致过程为:HBase创建两个引用文件,然后在后台执行compaction操作替换掉被引用的文件。假设要拆分的region文件路径为/hbase/testtable/b0

2017-09-02 14:46:15 476

原创 《HBase权威指南》读书笔记 第八章:架构,存储

存储HBase架构图如下:从图中可以看到HBase主要处理两种文件,WAL和实际的数据文件。这两种文件最终都存在HDFS中。首次请求所需的步骤如下:从zk中取得hbase:meta表所在的节点,路径为/hbase/meta-region-server。从hbase:meta表中读取元数据,根据元数据推测出数据所在的节点。连接实际的数据节点取得数据。其中步骤2的元数据会在客户端进行缓存,下次不

2017-08-27 19:29:41 508

原创 《HBase权威指南》读书笔记 第八章:架构,LSM树

LSM树LSM的英文名是 log-structured merge-tree。它适合写入量很大的数据库。执行写入操作时,先把数据写在C0层级,通常C0放在内存中。当C0层级的数据达到设定的阈值时,将数据合并到C1层级。当C1层级达到阈值时,合并到C2层级。这样层层合并,文件数量越来越少,文件变得越来越大。每个层级的数据都是排序的,合并的时候通过类似归并排序的算法实现快速排序。对于删除操作,仅仅将数据

2017-08-19 17:51:20 420

原创 《HBase权威指南》读书笔记 第八章:架构,B+树

B+树先说红黑树。红黑树是平衡二叉查找树。它通常用于Map结构的实现,可以根据Key快速找到Value。Java中的TreeMap就是通过红黑树实现的。它是一种二叉树,一个节点最多只能有两个子节点。当BST的存储结构放在硬盘上时,就出现问题了。因为二叉树的高度比较大,寻找一个叶子节点需要较多次数访问硬盘。我们知道访问硬盘的速度是非常慢的,所以BST不太适合用在硬盘上。然而B+树可以解决这个问题。B+

2017-08-13 07:50:47 871

原创 《HBase权威指南》读书笔记 第四章:客户端API高级特性

前面提到的scan操作支持设置过滤器,筛选需要返回的结果。下面看一个简单的例子:import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hbase.TableName;import org.apache.hadoo

2017-06-10 17:31:36 608

原创 《HBase权威指南》读书笔记 第三章:客户端API基础知识

基本操作HTable提供了操作接口。建议应用程序初始化的2时候创建多个HTable,每个线程要有一个,或者使用HTablePool连接池。所有的修改只保证行级别的原子性。以下是Java中操作HBase的例子,书中提供的代码已经deprecated,因此笔者用了最新的连接方式。这段代码运行一次要1分钟左右,主要耗时在连接部分,有配置可以跳过某些步骤没必要的步骤加快连接速度。import org.apa

2017-06-04 12:02:26 907 1

原创 《HBase权威指南》读书笔记:第二章 安装

基本操作首先确保已经安装Java。通过java -version命令查看,要求版本1.7以上。下载hbase: http://www.apache.org/dyn/closer.cgi/hbase/将下载来的压缩包解压配上数据储存目录,编辑文件conf/hbase-site.xml<configuration> <property> <name>hbase.rootdir</na

2017-06-01 19:49:31 461

原创 《HBase权威指南》读书笔记:第一章 简介

传统的关系型数据库无法存放海量数据,因此HBase诞生,解决海量数据存取难题。当然除了HBase,还有很多其他类型的数据库解决不同的问题。HBase的诞生参考了谷歌的这两篇论文,值得阅读:The Google File SystemMapReduce: Simplified Data Processing on Large ClustersHBase应用逻辑的基本概念有:表:表有表名,其含有

2017-05-29 16:00:49 766

原创 Curator框架的使用

Curator框架的目的是减少用户的复杂度,毕竟原生的Zookeeper难以使用。这里举一个使用例子。第一步:建立连接// 以下代码与192.168.1.101:2181建立了连接CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.1.101:2181", new Exponent

2016-11-26 12:30:21 519

原创 nginx端口占用案例分享

这里分享一个案例,问题的原因是反向代理使用不当。现象首先描述一下问题的现象。当时的问题是应用启动失败,日志里面报错显示端口占用。我们的应用都是通过脚本发布的,之前发布过多次都没有出现过问题。那么同样的脚本、同样的机器,这次怎么就发布失败了呢?报错信息如下:OSError: [Errno 48] Address already in use问题排查

2016-11-20 13:41:28 2536

原创 Ubuntu搭建NFS

NFS全称是Network File System,网络文件系统。它可以通过网络实现文件共享。其结构图大概是这样的:在机器E上开启NFS服务,机器ABCD都挂载NFS,这样可以实现机器ABCD共享文件。由于文件共享的特性,NFS还被用作分布式系统的备份。比如Elasticsearch集群的备份需要用到NFS。服务端首先开启NFS服务端,在Ub

2016-11-06 14:07:33 510

原创 谈谈工作上的杂事

谈谈工作上的杂事工作已经有两年多了,来做一个专题总结。这篇文章的关键词是:杂事。时间碎片我所在的公司是一个创业公司。创业公司都有个共同的特点就是事多人少。当我静下心来集中精力开始开发需求的时候,总会有一些所谓的急事来插队。比如突然要开会,比如别人来咨询这段代码的工作原理,比如线上系统疑似出现BUG,需要我来马上修复。这些事情确实需要马上处理,拖延只会造成更大的问题,

2016-10-30 15:56:44 1196

原创 Web性能优化:基本思路和常见工具

Web性能优化听了荣华的演讲之后,我对性能优化有了更深层次的认识。性能优化的重要性性能优化是为了赢得用户,为了降低成本。性能优化思路Web常见优化点Java常见排查工具

2016-10-23 16:13:17 745

原创 用Swagger生成接口文档

Swagger简介在系统设计的时候,各个应用之间往往是通过接口进行交互的。因此接口的定义在整个团队中就变得尤为重要。我们可以把接口的规范用接口描述语言进行描述,然后Swagger可以根据我们定义的接口规范生成对应的接口文档。它生成的接口文档提供了接口测试功能。我们只需要填上对应的参数,然后点击调用,就可以完成一次接口测试,非常方便。就像下图展示的那样。不仅如此,Swagger还

2016-10-12 22:00:22 10051

原创 浅谈Java的匿名类

在实际的项目中看到一个很奇怪的现象,Java可以直接new一个接口,然后在new里面粗暴的加入实现代码。就像下面这样。那么问题来了,new出来的对象没有实际的类作为载体,这不是很奇怪吗?思考以下代码的输出是什么?Runnable x = new Runnable() { @Override public void run() { System.out.p

2016-10-04 11:11:38 2330

原创 什么是RAID?RAID有什么用?RAID原理

什么是RAID硬盘是个很脆弱的东西,它经常会坏掉。所以,为了保证服务器可靠耐用,硬盘必须时时刻刻保持可用。所以有了RAID这个东西。它的目的是将好几个硬盘合并在一起,就算硬盘坏了一个,剩下还有好几个硬盘是正常的,这样服务器才不会挂掉。当然,保证服务高可用只是RAID其中的一个功能。它还能提升储存容量、加快存取速度等能力。RAID分为0~6级,另外还有RAID 1+0,简称RAID 10

2016-09-25 14:09:51 18405

原创 线上操作使用tmux提高工作效率

对于经常在线上操作的人来说有一种烦恼,就是在操作过程中,有事离开了一下,电脑自动睡眠了,然后网络断开连接,这时候任务就要重新跑,很烦恼。 tmux可以解决这个问题。tmux可以看成虚拟屏幕,不受断网的影响。如果断网了,只重新连接屏幕就行了,虚拟屏幕上的文字都还在。tmux的常用命令如下:tmux new -s session_nametux attach -t session_nametmux

2015-07-03 16:43:20 1870

原创 ElasticSearch:剖析query_and_fetch和query_then_fetch的区别

在ElasticSearch实际使用中遇到了一个问题,就是在数据量很大的情况下做聚合查询(aggregation)会导致内存溢出。当时看了文档,猜测修改search_type能避免内存溢出。实际测试发现,在数据量相同的情况下,search_type设置为query_and_fetch的聚合查询不会导致内存溢出,而默认的query_then_fetch则会内存溢出。本文就从源码层面分析这两种searc

2015-06-08 21:48:24 15596

原创 开发工具系列(一):Btrace——线上Debug工具

BtraceBtrace用于调试正在运行的系统,并且在调试时不会暂停系统。特别适用于跟踪线上问题。你可以实时监控一个系统中任何一个方法的调用,你可以知道这些方法的参数、返回值是什么,还可以知道方法调用消耗了多少时间。Btrace不需要安装,只要下载一个包,解压即可。Btrace用法为bin/btrace 。其中pid是正在运行的java进程,trace-script是跟踪

2014-12-23 21:15:50 3363 1

原创 Webx框架:表单验证

表单验证传统的应用中,表单中的数据是放在Java代码中进行检验的。这种方法在编写java代码的时候很无聊,而且后期的修改也不方便。 而webx框架将表单验证的逻辑独立放在配置文件中。这种方式更加方便。webx中,表单的验证有三个步骤:定义验证规则在Java代码中调用该规则在页面中显示验证结果。定义验证规则。下面是验证规则的一个例子。services:form x

2014-12-13 20:23:59 2584 2

原创 Webx框架:会话管理

在Servlet中,Session和Cookie是分开的。Session一般保存在内存中,当然也可以保存在数据库等其他地方。如果保存在内存中,对于服务集群来说就需要解决Session共享的问题。如果保存在数据库,就存在单点故障、性能差等问题。webx提供了会话框架,将session这样复杂的问题统一进行解决。在webx框架中,主张将cookie合并到session中,再通过规则,路由到co

2014-12-05 20:20:04 2250

原创 Webx框架:AutoConfig

AutoConfigAutoConfig是一个小工具,用于解决不同机器之间配置不同的问题。有时候有些配置,比如数据库地址、缓存地址等,这些配置与环境有关。每次在不同的环境中都需要重新修改配置,比较麻烦。解决这个问题有两种方法,一种是通过maven中的filter工具,另外一种是使用autoconfig。maven-filter工具的缺点是,当项目编译打包之后,无法再修改配置文件。而auto

2014-12-05 20:10:18 3889

原创 Webx框架:ResourceLoader

Spring中的ResourceLoader获取Resource的方法有两种。一种是通过ResourceLoader载入资源,另外一种是通过注入。通过ResourceLoader载入资源的方法如下:public class Test implements ResourceLoaderAware { private ResourceLoader resourceLoader; pu

2014-11-27 21:59:05 1800

原创 Webx框架:Valve详解

Valve用于控制请求的执行流程。它采用责任链的设计模式(类似于struts的拦截器)。valve的意思是阀,阀控制水流(网络请求)的走向。自定义阀。public class MyValve implements Valve { public void invoke(PipelineContext pipelineContext) throws Exception {

2014-11-20 20:38:27 3104

原创 Webx框架:RequestContext详解

RequestContextRequestContext可以看成request和response的合体。多个RequestContext还可以串起来,就像Filter链条一样。每个外层RequestContext都会在内层RequestContext的基础上增加功能。在设计模式中这叫装饰器。RequestContext种类有basic/buffered/lazy-commit/pa

2014-11-12 21:28:57 5966

原创 Webx框架:Pipeline简介

Pipeline。它的含义就是管道,一个管道可以安装很多的阀门,可以有很多分支。它用于控制页面的处理流程。它需要定义在pipeline.xml文件中,该文件中的每个标签都是一个阀门。该文件中可以放一些简单的控制语句。在项目中,下面这样的管道配置就已经够用了。

2014-11-03 22:05:41 2428

原创 Webx框架:依赖注入

Webx的依赖注入和Spring的依赖注入非常像,只是有一点点的区别。注入的时候只能让生命周期长的注入到生命周期短的对象中,比如requestScope对象注入到singleton时就会发生错误。但是对于一些特殊的对象,比如request、session、response它们的生命周期是requestScope,而它们可以注入到任意对象中。这是因为webx对这些对象进行了特殊的处理。

2014-10-29 21:40:25 1478

原创 Webx框架:Spring Schema 和 Spring Ext

webx诞生的原因是当时市面上没有好用的web框架。现在的Web框架有很多,然后它们背后的思想都是相似的,而且越来越趋同。Spring Schema在传统的spring中,配置bean时需要手动去指定具体的实现类是什么,参数有哪些。这样开发者需要记住具体的实现类、参数名称、含义等,会带来很大的记忆负担。为了解决这个问题,SpringSchema出现了。它的解决办法是将所有的参数转换

2014-10-23 21:24:20 1717

原创 Spring框架:Spring安全

在传统的Web开发中,安全性的代码都是分散在各个模块中的,这样不方便管理,而且有时候可能会漏掉一个地方导致安全漏洞。为了解决这个问题,有人发明了Spring Security。它的作用是将业务逻辑中有关安全的代码全都移动到一个模块中集中管理。本质上是AOP的一个子集。过滤URL为了过滤URL,首先要在web.xml中加入一个过滤器。filter-name不能随便填写,因为它和另外一

2014-10-13 22:14:23 1786

原创 Spring框架:SpringMVC详解

SpringMVC的工作流程。最先接触到请求的是DispatcherServlet,它会将请求根据配置文件转发到控制器,控制器返回视图名称和一个Model表示处理结果。DispatcherServlet再将处理结果发送给视图模板引擎,由它进行页面的渲染。下图是整个过程。基本配置声明servlet。首先要在web.xml中声明Spring的Servlet,代码如下: sp

2014-10-11 21:41:13 2032

原创 Spring框架:Spring与持久化

Spring的持久化用于简化数据的操作。数据源数据源有多种类型:JNDI、连接池、JDBC。JNDI的配置方法。例子中使用Tomcat作为Web容器。首先要在context.xml中加上下面这段代码。<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"

2014-10-08 22:53:33 4114

原创 Spring框架:AOP详解

AOP的中文名称叫做面向切面编程。这个名字非常形象,因为你真的可以把一个系统像面包一样切开,并直接在面包上增加修饰。切面可大可小,大到整个系统,小到某一个方法。AOP有什么用呢?举个例子,每个组件中都可能含有安全、事务、数据库等方面的逻辑,AOP就是把每个组件中的安全作为一个方面进行集中处理,事务作为一个方面,数据库作为一个方面等等。这样才能做到高内聚、低耦合。AOP中有三个重要的术语

2014-09-28 23:23:07 2379

原创 Spring框架:Spring容器详解

Spring容器Spring容器可以帮助你管理所有的Bean对象,专业术语称之为IoC控制反转。在传统的程序中,对象的生成都是由开发者完成的。而在控制反转中,对象的生成全部都交给框架完成。这样的好处就是减少了程序的依赖性。Bean在Spring中的生命周期如下:实例化。Spring通过new关键字将一个Bean进行实例化,JavaBean都有默认的构造函数,因此不需要提供构

2014-09-18 21:40:16 9779 2

原创 Web框架:Spring简介

Spring是一个比较全面的框架,有很多功能。见下图:ApplicationContextApplicationContext是Spring的核心类,保存了所有的配置。它有多种加载方式,例子如下:// 只能从/WEB-INF/classes加载配置文件new ClassPathXmlApplicationContext("applicationContext.xml"

2014-09-16 22:32:09 1284

空空如也

空空如也

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

TA关注的人

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