自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 资源 (1)
  • 收藏
  • 关注

原创 DataX 3.0执行流程分析

DataX 3.0执行流程分析入口类:com.alibaba.datax.core.EngineEngine是DataX入口类,该类负责初始化Job或者Task的运行容器,并运行插件的Job或者Task逻辑。1. 重要参数介绍DataX 的执行涉及到三类重要的配置文件,它们分别是:xxxJob.json,core.json和plugin.jsonxxxJob.json:作业相关配...

2019-12-15 21:17:23 848

原创 使用IntelliJ IDEA解决Java包冲突

使用IntelliJ IDEA解决Java包冲突在实际的 Maven 项目开发中,由于项目引入的依赖过多,遇到 jar 冲突算是一个很常见的问题了。那么,在这种情况下我们采用什么样的方式来解决Java包冲突问题呢?如果你使用的开发工具是IDEA的话,那么解决Java包冲突问题将会变得十分easy,IDEA为我们提供了十分方便的依赖分析工具,废话不多说,让我们先来看看如何使用IDEA提供的依赖分...

2019-12-15 20:59:33 984

原创 Spark源码调试

在学习Spark源码或者开发过程中,往往需要远程调试Spark。下面将介绍如何在IDEA下对Spark源码进行远程调试。调试前准备工作 下载需要调试的Spark对应的版本源码,并用make-distribution.sh编译方式对Spark源码进行编译(由于可能涉及到源码的修改问题,为便于修改后源码的编译和调试,选择该种方式进行编译,并利用编译生成的.tgz包安装Standalone模式...

2019-04-09 19:39:55 891

原创 Spark源码编译

源码编译前的准备工作 安装jdk:(安装前需要卸载Linux自带的OpenJdk) 下载jdk并解压到相应安装目录(如:/usr/install/jdk1.8) 修改/etc/profile文件,用vim编辑器打开/etc/profile文件,并在文件末尾追加以下内容: export JAVA_HOME=/usr/install/jdk1.8 expor...

2019-04-08 16:55:43 240

原创 从零开始学架构——与架构相关的概念

架构和框架、模块和组件以及系统和子系统等这些词语也许是每个程序员在工作当中听到比较频繁的词语了,但是细问什么是架构,架构与框架什么区别?什么是模块?什么是组件?组件和模块又有什么关系呢?我相信很多人都无法说出个所以来。那么,废话不多说,下面我们就来捋一捋这些基本概念。系统与子系统系统与子系统应该算是上边这三对词语中最容易区分和辨识的一对概念了。一般来说子系统是更大的系统的一部分,但是其也是...

2018-10-18 21:29:13 704

原创 每日设计模式——策略模式

策略模式策略模式是一种非常简单的设计模式,其主要思想是设计一系列或一组算法并将每一个算法都封装起来,使他们之间可以互换,在需要执行的时候根据不同的需求执行不同的算法,java集合框架中的Collections.sort()方法就是一个典型的策略模式。如下图所示,其类结构图也比较简单:策略模式涉及到三个角色:Context封装角色:该角色起到承上启下封装作用 ,屏蔽高层模块对策略、算...

2018-10-16 10:17:45 137

原创 每日设计模式——建造者模式

建造者模式建造者模式主要功能构建复杂的产品,而且是细化的,分步骤的构建产品,也就是建造者模式重在解决一步一步构造复杂对象的问题。更重要的是,这个构建过程是统一的,固定不变的,变化的部分放到生成器部分了,只要配置不同的生成器,那么同样的过程,就能构建出不同的产品来。建造者模式的通用类图如下:在建造者模式中,有四个角色:Product产品类,Builder抽象建造者,ConcreateBu...

2018-10-15 21:07:32 148

原创 每日设计模式——适配器模式

适配器模式适配器模式将一个类的接口转换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能在一起工作。适配器在生活中还是很常见的,比如说咱们的手机充电器一般是两个脚的,但是咱们只有三个插孔的插线板,如果想要通过这个插线板给手机充电的话就需要一个转换器能够连接插线板和手机充电器,而这个转换器就是一个适配器。从上面的例子中,我们可以抽象出适配器模式涉及到的角色主要有以下...

2018-10-12 19:25:41 177

原创 每日设计模式——代理模式和装饰器模式的区别

代理模式和装饰器模式的区别首先我们对比一下代理模式和装饰器模式的类图结构:代理模式:这两个设计模式看起来很像。对装饰器模式来说,装饰者(Decorator)和被装饰者(ConcreateComponnet)都实现同一个 接口。对代理模式来说,代理类(ProxySubject)和真实处理的类(RealSubject)都实现同一个接口。此外,不论我们使用哪一个模式,都可以很容易地在真实...

2018-10-12 10:46:41 212

原创 每日设计模式——装饰器模式

装饰器模式装饰器模式是一个比较常见的模式,其主要是动态的给一个对象添加一些额外的职责。但从给对象增加职责来说,使用继承也能够实现,但是正如《head first大话设计模式》中那样,单纯的继承会造成“类爆炸”的问题,同时继承也不够灵活,很难做到对扩展开放,对修改关闭。所以,从这个角度来说,装饰模式相比生成子类来说更为灵活。装饰模式的类图结构如下:在类图中,包含四个部分的角色,Com...

2018-10-11 21:32:27 155

原创 每日设计模式——责任链模式

示例说责任链模式场景:大学生请假。大学,是一个相对宽松而自由的环境,请假出游都非常的容易,但是为了同学们的安全,学校对学生请假做出了如下规定:1. 请假时间在3天以内,找班导师签字即可;2.请假时间超过3天但小于7天,找系主任签字即可;3.请假时间超过一周,找院长签字即可......那么,这样一个场景,假如让你用代码来实现,你应该怎么做呢??很多人说简单,看我的:...

2018-09-29 20:41:43 175

原创 每日设计模式——原型模式

示例说原型模式又到了一年一度最火热最繁忙的秋招,每天都会收到各个公司各种各样的短信或邮件,你是否层认真的思考过,公司是如何给你发送这条短信或者这封邮件的呢???有的人可能会说,hr小姐姐们一条一条编辑的啊。但是真的是这样吗???那有人又说了,我直接将短信的大致内容编辑成一个模板交给代理商,代理商会给我解决的,但是你有想过代理商又是怎么给你发送短信或邮件的呢??假如这个任务交给你,你...

2018-09-29 10:41:05 232

原创 每日设计模式——模板方法模式

模板方法模式模板方法模式就是定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。例如:某个特定的应用中具有很多的子任务,每个任务的数据计算步骤几乎都是一致的,只是具体的实现可能存在一些差别,则可以定义一个超类,在超类中定义所有任务的计算流程,然后子类去实现特殊的步骤。代码如下所示:package com.factor...

2018-09-24 18:08:09 192

原创 每日设计模式——工厂模式之三(抽象工厂模式)

抽象工厂模式抽象工厂又叫做工厂的工厂。从某个角度来说抽象工厂是工厂方法模式的升级版。工厂方法模式相对简单,只负责某一类产品的创建工作,而工厂方法模式很强大,能创建很多的产品,从这个角度来说抽象工厂模式确实是工厂方法模式的升级。但是,从职能和应用场景上来看,不应该将抽象工厂看成是工厂方法模式的升级版。工厂方法模式通常运用在具有相同功能但是实现不同的产品类的创建,而抽象工厂模式则是运用于具备不同功...

2018-09-24 14:34:50 176

原创 每日设计模式——工厂模式之二(工厂方法模式)

简单工厂模式负责所有对象的创建,如果有新的对象增加,或者某些对象的创建方式不同,就需要不断的修改工厂类,不利于后期的维护 。虽然最后我们改进了简单工厂模式,即使增加产品类也不需要再去修改工厂类,但是这也增加了客户端代码的复杂度(客户端需要知道创建哪个类的实例)。工厂方法模式工厂方法模式定义一个用于创建对象的接口,让子类去决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到其子类。下面...

2018-09-18 21:43:03 155

原创 每日设计模式——工厂模式之一(简单工厂模式)

工厂模式以下内容来自百度百科,个人认为其可以作为一个很好的引子来讲述工厂模式,故将其贴在这。工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,...

2018-09-16 22:11:44 178

原创 每日算法之——常见排序算法集锦(算法之发展历程)

常见排序算法及发展历程所谓排序,就是将数据分为有序区和无序区,通过对无序区元素的调整并扩展有序区,最后达到所有元素都有序的状态。在排序界,常见(或者说常用)的算法主要有冒泡排序,选择排序、直接插入排序、希尔排序(其实不太常用)、堆排序、快速排序、归并排序。一些不太常用但是比较有技巧性的排序有:计数排序、位图排序、基数排序、桶排序、外部排序(一般结合hash然后多路归并)。在此,我们仅仅介绍...

2018-09-11 12:52:28 1334

原创 每日算法之——快速排序

快速排序快速排序的思想:选择一个基准数(轴),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据小。然后再按次方法对这两部分的数据分别进行快速排序。整个排序过程可以递归进行,以此达到整个数组变得有序。排序过程大致如下:1.选定一个基准数(temp)作为轴,通常选最左或者最右的数作为轴;2声明两个变量i,j,i指向数组的最左端,j指向数组的...

2018-09-10 21:40:45 160

原创 每日设计模式之—单例模式

单例模式单例模式:一个系统只能存在一个对象的实例,如一个国家只能有一个皇帝,一个系统只能有一个资源管理器。单例通常分为饿汉式单例和懒汉式单例。饿汉式单例是不管需不需要,一旦加载类就进行创建,懒汉式单例是按需创建。一般来说,懒汉式单例要优于饿汉式单例。在面试过程中,面试官常常会要求我们实现一个单例模式。单例模式的实现通常需要考虑性能和线程安全两个方面,性能高又线程安全的单例模式才是面...

2018-09-10 20:23:20 147

原创 java代码块、静态代码块、局部代码块

 代码块:在Java中,使用{}括起来的代码成为代码块根据其位置和声明的不同,可以分为局部代码块:局部位置,用于限定变量的生命周期构造代码块:在类中的成员位置,用{}括起来的代码。每次调用构造方法执行前,都会先执行构造代码块。       作用:可以把多个构造方法的共同代码放在一起。 静态代码块:在类中的成员位置,用{}括起来的代码,只不过它用static修饰      作用:一般是对类进行...

2018-09-10 16:55:22 437

原创 每日设计模式——代理模式(动态代理)

代理模式之动态代理上一篇文章https://blog.csdn.net/qq_28044241/article/details/82534196已经介绍了静态代理的基本原理和实现:所谓代理,其实就是找一个对象(如上一篇文章中的游戏代练)代替自己去干一些事(如上篇文章中的登陆、打怪、升级等),其反应到代码中就是去实现一个代理类,并调用自己(被代理对象)的方法。在代理类执行被代理对象的方法之前或之...

2018-09-10 12:34:32 216

原创 每日设计模式之—代理模式(静态代理)

代理模式之静态代理模式 代理模式在生活中十分常见,比如代购,其本质是本该自己完成的事情找别人帮忙完成了,这就是代理。比如说喜欢玩游戏的朋友,每天都是开黑升级打怪,升级打怪,(日积月累,累啊),但是还想升级咋办呢???方案一:各种砸钱(高昂的费用,但是省了时间)方案二:找代练(费用稍低,本质还是时间堆积,不过是把打怪的时间转嫁给另外一个哥们而已)。        找代练也有两种方式:...

2018-09-09 19:12:20 256

原创 每日算法之—排序数组相邻最大差值

题目:给定一个无序整形数组,要求返回排序后相邻两个数的最大差值。例如:输入数组[1,2,3,5,9,6,8,7]排序后:[1,2,3,5,6,7,8,9]最大差值为5-3=2解决办法:1.对原数组进行排序,然后逐个求差值2.首先遍历数组,求得数组的最大值max和最小值min,然后将max-min的区间划分为n+1个桶,再遍历数组,将数组元素依次放入对应的桶中,最后一定有...

2018-09-05 15:21:54 548

原创 每日算法之—数据区间划分

题目:给定一个只包含0,1,2的数组,要求把整个数组进行区间划分,把0划分到左边,1划分到中间,2划分到右边。如:数组为[0,1,2,1,0,1,2,2,1,0,1,2]划分结果为:[0,0,0,1,1,1,1,1,2,2,2,2]要求:空间复杂度为O(1),时间复杂度为O(n)。 解决思路:假想原始数组左边有一个长度为0的0区域,右边有一个长度为0的2区域,中间是1区...

2018-09-05 12:20:38 5301

原创 每日算法之—排序最短子数组

题目:给定整形数组nums,求需要排序的最短子数组的长度。如:nums=[1,5,4,3,2,6,7],输出结果为4。解释:只有[5,4,3,2]需要排序,故输出4。解决办法: 从前往后和从后往前两次遍历数组。从前往后遍历时,首先默认首元素为max,当遍历的当前值小于max时,记录下元素位置为p,否则更新max为当前元素。从后往前遍历时,默认尾元素为min,当遍历的...

2018-09-05 10:50:34 180

原创 位图排序之bitMap实现

 位图排序通常用在特定的大数据量的场景下,如对给定的20亿条无重复整形数据进行排序,要求使用的内存不能超过265M。此时我们可以采用位存储的方式来对数据进行排序。首先,申请一个20亿的bit数组,然后读取20亿的数据,找到当前读取的整数所在的bit的位置,将其置1,直到所有的数据都读完。第二,遍历bit数组,如果当前位置的bit位为1,则将下标输出到文件,否则判断下一个是否为1。p...

2018-08-17 15:41:56 449

翻译 复杂事件处理(CEP)——事件模式,规则及约束

从大量执行中的事件里找出感兴趣的事件集合的能力是观察和控制事件驱动系统的基础。我们需要能够描述我们感兴趣事件的模式并能快速发现匹配这类模式的事件集合。1.事件模式事件模式是一个模板,用来匹配期望找出的特定事件的集合。它准确的描述了事件和事件之间的因果依赖,时间关系、数据参数和上下文。一些事件模式的例子如下:a.客户C上个月的所有订单;b.常客上个月所有的订单第一个模式匹配来自一个特定客户C发生在一...

2018-04-07 14:19:40 2977

翻译 复杂事件处理(CEP)——事件、时序以及因果关系

复杂事件处理(Complex Event Processing,CEP)是一种新兴的基于事件流的技术,它将系统数据看作不同类型的事件,通过分析事件间的关系,建立不同的事件关系序列库,利用过滤、关联、聚合等技术,最终由简单事件产生高级事件或商业流程。CEP适合的场景包括实时风险管理、实时交易分析、网络诈欺、网络攻击、市场趋势分析等等。想要利用CEP技术解决遇到的问题,首先需要知道什么是事件,什么是复...

2018-04-05 19:33:26 6250

原创 SparkStreaming学习示例

随着云计算等相关技术的发展,实时计算分析越来越成为一个重要的议题,许多不同的领域都有着实时处理数据的需求,尤其是在物联网概念提出之后,海量的数据需要存储、处理并且提供实时或者近实时的分析。因此,许多的技术都在试图提供这种实时计算的能力。像Storm,Spark这样的技术框架已经成为市场的主导,尤其是集批处理,流处理、图计算、机器学习为一体的Spark框架更是得到了众多企业、高校、IT从业人员的追捧...

2018-04-03 22:29:07 353 1

原创 java虚拟机学习之(十)java内存模型

“内存模型”,可以理解为在特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象,就像物理计算机中由一开始的CPU—内存交互访问发展到CPU—高速缓存—内存三层交互访问,这也是物理计算机内存模型,不同架构的物理机器可以拥有不一样的内存模型,而java虚拟机也有自己的内存模型。java内存模型,java虚拟机规范中定义的一种用来屏蔽各种硬件操作和操作系统访问差异,以实现java程序在各种平台...

2018-03-21 22:33:26 134

原创 java虚拟机学习之(九)虚拟机性能监控与故障处理工具

作为java程序开发人员,在程序开发过程中或者程序开发完成之后,总是避免不了需要对自己开发的代码进行各种测试,寻找各种bug,对程序进行优化。一听到bug和优化,很多人包括我自己都会感到头皮发麻,我们总是期望自己写的代码近乎完美,没有bug且性能优越,但这常常是事与愿违,总免不了折腾。下面介绍一些常用的工具,以帮助我们更快的完成代码的调试调优工作。1.JDK的命令行工具很多java开发人员肯定知道...

2018-03-20 15:55:03 179

原创 java虚拟机学习之(八)内存分配策略

java技术体系中所提倡的自动内存管理最终可归结为自动化的解决给对象分配内存和回收分配给对象的内存。关于回收内存,我们已经在之前的学习中进行了详细的介绍,下面介绍一下给对象分配内存的相关知识。对象内存的分配,从大的方向上来说是在java堆上分配(但也可能经过JIT(Just In Time)编译器编译后被拆散为标量类型并间接的在栈上分配)。对象主要分配在新生代的Eden上,如果启动了本地线程缓冲,...

2018-03-19 20:59:49 140

原创 java虚拟机学习之(七)常见垃圾收集器

在此之前我们已经介绍了Hotspot虚拟机如何去发起内存回收,介绍了如何判断对象是否存活,介绍了垃圾回收的各种算法,对比了这些算法 的优缺点,但是虚拟机如何具体的进行垃圾回收动作仍然未涉及,因为内存回收如何进行是由虚拟机所选用的GC收集器而决定的,而通常虚拟机中往往不止一种GC收集器。下面我们来对一些常用的垃圾收集器进行对比介绍。1.Serial收集器Serial收集器是最基本、发展历史最悠久的收...

2018-03-18 17:08:33 115

原创 算法学习之(一)分治策略

许多有用的算法在结构上是递归的:为了解决一个给定的问题,算法一次或者多次的递归调用其自身以解决紧密相关的若干子问题。这些算法典型的遵循分治法是思想。分治法的思想将原问题分解为几个规模较小但类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来建立原问题的解。分治模式在每层递归时都有三个步骤:分解原问题为若干子问题:这些子问题都是原问题规模较小的实例。解决这些子问...

2018-03-15 22:09:04 849

原创 java虚拟机学习之(六)HotSpot虚拟机垃圾收集

java虚拟机学习之(五)垃圾收集器与垃圾回收算法(http://blog.csdn.net/qq_28044241/article/details/79520481)已经介绍了对象存活判定的算法和垃圾收集算法。下面将以HotSpot虚拟机为例,讲述真实情况下虚拟机垃圾回收的相关知识。1.枚举根节点从可达性分析中从GC Roots 节点找到引用链这个操作为例,可作为GC Roots的节点主要在全局...

2018-03-14 19:48:00 132

原创 java虚拟机学习之(五)垃圾收集器与垃圾回收算法

经过前面是学习我们已经对java运行时区域的各个部分有了一定的了解,其中程序计数器,虚拟机栈,本地方法栈3个区域属于线程私有区域,它们随着线程的创建而存在,随着线程的死亡而释放。栈中的栈帧随着方法的进入和退出也在有条不紊的进行着入栈和出栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此上述区域的内存分配和回收都是确定的,一旦方法结束或者线程结束,相应的内存自然也就被回收了。而...

2018-03-11 21:59:43 748

原创 java虚拟机学习之(四)对象访问定位

创建对象是为了访问对象,那么对象是通过何种方式被访问的呢?前面我们已经对对象的创建过程进行了介绍,但是对于对象的信息的存储位置可能还是不太清楚。下面就先介绍一下对象创建过程中,对象在内存区域的存储,以便我们了解对象的访问。1.对象创建回顾Object obj = new Object();现在假设上述语句出现在方法体中,“Object obj”这部分将会反应到java栈的本地变量表中,作为一个re...

2018-03-11 14:53:23 169

原创 java虚拟机学习之(三)对象的内存布局

在HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头、实例数据和对齐填充。对象头:包含两个部分,第一部分用于存储对象自身的运行时数据,如哈希值,GC分代年龄、锁状态标志等;第二部分是类型指针,即指向它的类的元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。如果对象是一个java数组,那在对象头中还必须有一块用于记录数组长度的数据,因为java虚拟机可以通过普通对象的...

2018-03-10 21:06:32 231

原创 java虚拟机学习之(二)java对象的创建过程

java是一门面向对象的编程语言,在java程序运行的过程中无时无刻不在产生新的对象。在语言层面,java普通对象的创建仅仅是一个new关键字而已,而在虚拟机中,对象的创建(不包括数组和Class对象)又是一个怎样的过程呢??Step1:当虚拟机遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否被加载、解析和初始化过,如果没有,那必...

2018-03-09 16:39:21 152

原创 java虚拟机学习之(一)java内存区域

2018-03-09 14:43:55 134

Spark Streaming 示例

包含kafka消息中间件的使用和Spark Streaming的示例。

2018-04-03

空空如也

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

TA关注的人

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