源码

spark源码系列(9)BlockManager的原理

北战南征 提交于 2019-12-10 09:25:11
上一篇说到CacheManager和checkpoint来管理缓存和数据相关的东西。但实际上,他们底层都是通过BlockManger来管理数据的。 找到RDD#getOrCompute中的 SparkEnv.get.blockManager.getOrElseUpdate(blockId, storageLevel, elementClassTag,我们就可以看到最终是通过BlockManager来管理数据。在分析源码前老规矩,先画一张整体的图 首先Driver上有一个BlockManagerMaster,它的功能就是负责各个节点上的BlockManager元数据管理,进行维护。比如block的增删改查等操作,都会在这里维护变更。 每个节点上都会有blockManager,BlockManager有几个关键组件: DiskStore:负责磁盘上的数据进行读写 MemoryStore:负责对内存上的数据进行读写 BlockTransferService:负责和远程节点建立数据传输的组件 每个BlockManager创建之后,向Driver中的BlockManagerMaster进行注册,此时BlockManager会为创建对应的BlockManagerInfo。 使用BlockManager进行读写操作时,比如RDD运行过程中间数据,或者手动指定了persisit,优先将数据写入内存

Spring 的 getBean 方法源码解析

北战南征 提交于 2019-12-10 09:11:58
文本将从以下几个方面介绍 相关文章 FactoryBean 接口 BeanFactory 接口 BeanFactory 接口 和 FactoryBean 接口的区别 getBean 方法的源码解析 Spring 循环依赖的解决方式 相关文章 Spring 中 bean 注册的源码解析 Spring bean 创建过程源码解析 前言 在文章 Spring 中 bean 注册的源码解析 和 Spring bean 创建过程源码解析 了解了 bean 的注册和创建过程,当通过 getBean 方法来获取对应 bean 的时候,会是如何的呢?下面就来看看 getBean 方法的内部实现。在进入 getBean 方法内部之前,先来看看 FactoryBean 这个接口,因为在 getBean 方法内部会对该接口的实现类进行另外的处理。 FactoryBean 这个接口和 BeanFactory 接口非常的像,但是作用却截然不同,先来看看 javadoc 文档的定义,大致意思就是:如果某个 bean 实现了这个接口,通过 getBean 方法来获取 bean 的时候,并不是返回自己的实例,而是返回其 getObject() 方法的返回值;此外 FactoryBeans 可以支持 singletons 和 prototypes 模式。它的源码如下,只有 三个 方法: public

Mybatis 源码分析1

心已入冬 提交于 2019-12-10 08:57:30
上图是mybatis 3.4.5版本jar的 结构图,接下来这个系列会顺着这个包的模块进行源码分析。 来源: CSDN 作者: 石硕页 链接: https://blog.csdn.net/u014209205/article/details/103466033

Tomcat源码学习(二)--Tomcat_7.0.70 启动分析

旧时模样 提交于 2019-12-10 07:55:57
1、运行Tomcat_7.0.70源码 项目build成功后,刷新整个项目,会发现多出一个output目录: 为了让应用跑起来,可以检查一下output\build\conf下是否已经有配置文件,这些文件实际是从项目根路径conf目录下拷贝过来的。 找到BootStarp.java文件,Debug前加入默认的catalina home路径作为启动参数。 路径设置为output下build的绝对路径。比如我自己的机器设置的值是-Dcatalina.home="W:\workspace\tc7.0.70\output\build" 这样就可以愉快的在文件中加入断点Debug源码分析了。运行之后的效果图: OK,源码到此运行成功,完美~ 2、启动分析 上面运行源码用的BootStarp.java这个类中的main方法(后面再对这个main方法做分析),实际上我们在用Tomcat的时候,大部分都是使用脚本文件startup.sh、startup.bat、shutdown.sh、shutdown.bat等脚本或者批处理命令来启动Tomcat的.大家一定知道改如何使用它,但是它们究竟是如何实现的,下面就一点一点的分析。 由于在生产环境中,Tomcat一般部署在Linux系统下,所以将以startup.sh和shutdown.sh等shell脚本为准,对Tomcat的启动与停止进行分析。

Idea中自定义修改jdk源码

邮差的信 提交于 2019-12-10 06:02:25
1.环境说明: jdk1.8 前言. 工作中常常需要读jdk源码,有时候想添加自己的一些注释,却发现无法编辑.可以采用如下方法在idea工具中添加jdk源码的注释. idea中默认使用的jdk源码是jdk开源出的src.zip压缩包中代码,压缩包中不允许修改,所以将该压缩包解压替换即可. 步骤 1. idea中默认引用的jdk源码中选择要替换的先删除. 删除后打开jdk源码,发现这时打开的是idea反编译的代码,没有源码了. 2.本地解压src.zip,然后在idea中新增该源码 如图此时本地idea中引用的是我解压后代码. 3.打开jdk源码,尝试编辑弹出提示,选择编辑即可.然后就可以愉快的添加自己的注释了,不过建议 1.不要删除原有注释. 2.建议在代码行后面添加注释,不改动代码行数 来源: CSDN 作者: 天空之城灬 链接: https://blog.csdn.net/weixin_41276238/article/details/103460914

Netty-源码分析ByteBuf-readSlice和readRetainedSlice使用细节

南楼画角 提交于 2019-12-10 05:50:08
返回从当前readerIndex开始的此缓冲区的子区域的新分片,并将readerIndex增加新分片的大小(=长度)。 另请注意,此方法将不会调用retain(),因此不会增加引用计数。 跟slice极为相似,只是把原始缓冲区的readerIndex进行了增加 @Override public ByteBuf readSlice(int length) { checkReadableBytes(length); ByteBuf slice = slice(readerIndex, length); readerIndex += length; return slice; } public static void main(String[] args) throws Exception { ByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT; ByteBuf original = allocator.directBuffer(32); original.writeByte(1); original.writeByte(2); original.writeByte(3); original.writeByte(4); //分配子缓冲区 ByteBuf sub = original.readSlice(3); /

ubuntu16.04源码方式安装配置nginx

試著忘記壹切 提交于 2019-12-10 03:30:35
一:官方下载nginx源包 官方下载地址:http://nginx.org/en/download.html 下载最新版本:目前最新版本是 nginx 1.11.4 下载地址是:http://nginx.org/download/nginx-1.11.4.tar.gz 可以先点击CHANGES 查看一下改动,查看一些新版本的新特性,寻找最适合自己的nginx版本 二:编译安装 2.1:解压缩 tar zxvf nginx-1.11.4.tar.gz 2.2:编译安装 2.2.1 编译 编译选项官方提供的有: --prefix=path 定义一个目录来保存你的nginx的提供功能的文件夹,就这好比我们安装软件的时候软件存放的目录,如果我们在编译的不指定安装位置,那么默认的位置/usr/local/nginx 目录 --sbin-path=path 设置nginx执行脚本的位置,这里如果设置在path变量里面,就可以在bash环境下,任意使用nginx命令,默认位置prefix/sbin/nginx 注意这里的prefix是 在配置文件里面配置的路径 --conf-path=path 配置nginx配置文件的路径,如果不指定这个选项,那么配置文件的默认路径就会是 prefix/conf/nginx.conf --pid-path =path 配置nginx.pid file的路径

ConcurrentHashMap源码解读

不问归期 提交于 2019-12-10 02:03:40
基于jdk1.7进行源码阅读 1.chm的类图 2.chm的属性和构造方法 /** * Creates a new, empty map with the specified initial * capacity, load factor and concurrency level. * * @param initialCapacity the initial capacity. The implementation * performs internal sizing to accommodate this many elements. * @param loadFactor the load factor threshold, used to control resizing. * Resizing may be performed when the average number of elements per * bin exceeds this threshold. * @param concurrencyLevel the estimated number of concurrently * updating threads. The implementation performs internal sizing * to try to accommodate this

吃透Shiro源码第三天

家住魔仙堡 提交于 2019-12-10 01:54:58
文章目录 技术手法 (1)接口的代理 (2)接口作为方法参数 (3)生命周期的使用工具 重点研究类 技术手法 (1)接口的代理 Shiro自己也实现了会话机制。Shiro创建了自己的Session接口。为了拦截某些Session调用并执行其他逻辑,创建了一个简单的Session代理。如何扩展呢?可以继承ProxiedSession这个类,重写某个function(),并调用super.function()立即调用代理对象的方法,在此之前可编写其他代码以执行其他逻辑。此实现思路可以应用到任何已经创建的接口上。 /** * 简单的代理Session实现 * 立即将调用转给代理实例 * 此类对于框架子类继承很有用, * 以拦截某些Session调用并执行其他逻辑。 */ public class ProxiedSession implements Session . . . /** * 代理实例 */ protected final Session delegate ; /** * @param target 要被代理的Session对象 */ public ProxiedSession ( Session target ) { this . delegate = target ; } @Override public Serializable getId ( ) { /

scrapy启动过程源码分析

孤人 提交于 2019-12-10 01:36:44
看了上一节分析的 scrapy 架构,我们最想了解的,应该就是5大核心模块是怎么实现的吧。好,从github中找到各大核心模块的源码: (1) Engine :scrapy/scrapy/core/engine.py (2) Scheduler :scrapy/scrapy/core/scheduler.py (3) Downloader :scrapy/scrapy/core/downloader/ (4) Spider :scrapy/scrapy/spider.py (5) Item pipeline :scrapy/scrapy/pipelines/ 这些模块,不是用class实现的,就是用package实现的。看模块代码顶多能了解它们的功能(成员函数),根本看不出scrapy是怎么运行的。那么问题来了,scrapy是怎么被启动并运行的? 一个scrapy程序的运行过程 从(1)中我们可以看到,我们自己写一个scrapy程序,这个程序的运行,是从命令 scrapy crawl hello 开始的。 那这条命令到底做了哪些事呢? crawl 命令的运行 scrapy程序的源代码结构是非常清晰的,可以“猜”到 crawl 命令的代码在这里: https://github.com/scrapy/scrapy/blob/master/scrapy/commands/crawl.py