Skip to content

Commit a4220a8

Browse files
committed
hdfs
1 parent 36e2bc4 commit a4220a8

12 files changed

Lines changed: 592 additions & 667 deletions

File tree

docs/.vuepress/config.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,10 @@ function genFrameworkSidebar(){
200200
sidebarDepth: 2, // 可选的, 默认值是 1
201201
children: [
202202
['Spring/Spring-IOC', 'Spring IOC'],
203+
['Spring/Spring-IOC-Source', 'Spring IOC 源码解毒'],
203204
['Spring/Spring-Cycle-Dependency', 'Spring 循环依赖'],
204205
['Spring/Spring-AOP', 'Spring AOP'],
206+
['Spring/Spring-MVC', 'Spring MVC'],
205207
]
206208
},
207209
{
38.4 KB
Loading
5.38 KB
Loading

docs/_images/Spring/ioc-demo.png

25.1 KB
Loading

docs/big-data/HDFS.md

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,68 @@
1-
HDFS
1+
# HDFS
2+
3+
## HDFS 概述
4+
5+
### HDFS产生背景
6+
7+
随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是 **分布式文件管理系统**。HDFS 只是分布式文件管理系统中的一种。
8+
9+
### HDFS定义
10+
11+
HDFS(Hadoop Distributed File System),它是一个**文件系统**,用于存储文件,通过目录树来定位文件;其次,它是**分布式的**,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
12+
13+
HDFS的使用场景:适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做**数据分析**,并不适合用来做网盘应用。
14+
15+
### HDFS 优缺点
16+
17+
**优点:**
18+
19+
- 高容错性
20+
- 数据自动保存多个副本。它通过增加副本的形式,提高容错性
21+
- 某一个副本丢失以后,它可以自动恢复
22+
- 适合处理大数据
23+
- 数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据
24+
- 文件规模:能够处理百万规模以上的文件数量,数量相当之大
25+
- 可构建在廉价机器上,通过多副本机制,提高可靠性。
26+
27+
28+
29+
**缺点:**
30+
31+
- 不适合低延时数据访问,比如毫秒级的存储数据,是做不到的
32+
- 无法高效的对大量小文件进行存储
33+
- 存储大量小文件的话,它会占用 NameNode 大量的内存来存储文件目录和块信息。这样是不可取的,因为 NameNode 的内存总是有限的
34+
- 小文件存储的寻址时间会超过读取时间,它违反了 HDFS 的设计目标
35+
- 不支持并发写入、文件随机修改
36+
- 一个文件只能有一个写,不允许多个线程同时写
37+
- 仅支持数据 append(追加),不支持文件的随机修改
38+
39+
40+
41+
### HDFS 组成架构
42+
43+
![Hadoop分布式文件系统:架构和设计](https://hadoop.apache.org/docs/r1.0.4/cn/images/hdfsarchitecture.gif)
44+
45+
**NameNode**(nn):就是Master,它是一个主管、管理者。
46+
47+
1. 管理HDFS的名称空间;
48+
2. 配置副本策略;
49+
3. 管理数据块(Block)映射信息;
50+
4. 处理客户端读写请求。
51+
52+
**DataNode**:就是Slave。NameNode 下达命令,DataNode执行实际的操作。
53+
54+
1. 存储实际的数据块;
55+
2. 执行数据块的读/写操作。
56+
57+
**Client**:就是客户端。
58+
59+
1. 文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传;
60+
2. 与NameNode交互,获取文件的位置信息;
61+
3. 与DataNode交互,读取或者写入数据;
62+
4. Client提供一些命令来管理HDFS,比如NameNode格式化;
63+
5. Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作;
64+
65+
**Secondary NameNode**:并非NameNode的热备。当NameNode挂掉的时候,它并不 能马上替换NameNode并提供服务。
66+
67+
1. 辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给NameNode ;
68+
2. 在紧急情况下,可辅助恢复NameNode。

docs/framework/spring/My-Spring.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# 手写 Spring
2+
3+
![image-20201106173130849](https://cdn.jsdelivr.net/gh/Jstarfish/picBed/img/20201106173132.png)

docs/framework/spring/Spring-AOP.md

Lines changed: 61 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,59 @@
11
# Spring AOP
22

3+
"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块, 并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共 同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未 来的可操作性和可维护性。
34

5+
使用"横切"技术,AOP 把软件系统分为两个部分:**核心关注点****横切关注点**。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。
46

7+
AOP 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
58

9+
AOP 主要应用场景有:
610

11+
- Authentication 权限
12+
- Caching 缓存
13+
- Context passing 内容传递
14+
- Error handling 错误处理
15+
- Lazy loading 懒加载
16+
- Debugging 调试
17+
- logging, tracing, profiling and monitoring 记录跟踪 优化 校准
18+
- Performance optimization 性能优化
19+
- Persistence 持久化
20+
- Resource pooling 资源池
21+
- Synchronization 同步
22+
- Transactions 事务
723

824

925

26+
## AOP 核心概念
1027

28+
切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象
1129

30+
横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
1231

13-
## 两种代理的使用
32+
连接点(joinpoint):被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在 Spring 中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
1433

15-
**1.JDK动态代理** **2.cglib代理**
34+
切入点(pointcut):对连接点进行拦截的定义
35+
36+
通知(advice):所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、 异常、最终、环绕通知五类
37+
38+
目标对象:代理的目标对象
39+
40+
织入(weave):将切面应用到目标对象并导致代理对象创建的过程
41+
42+
引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法 或字段。
1643

17-
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
18-
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
19-
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
2044

21-
注:JDK动态代理要比cglib代理执行速度快,但性能不如cglib好。所以在选择用哪种代理还是要看具体情况,一般单例模式用cglib比较好,具体原因请自行百度。
2245

23-
### 一 JDK动态代理实现(原理是使用反射机制)
46+
47+
48+
## AOP 两种代理方式
49+
50+
Spring 提供了两种方式来生成代理对象: **JDKProxy****Cglib**,具体使用哪种方式生成由 AopProxyFactory 根据 AdvisedSupport 对象的配置来决定。默认的策略是如果目标类是接口, 则使用 JDK 动态代理技术,否则使用 Cglib 来生成代理。
51+
52+
### JDK 动态接口代理
53+
54+
JDK 动态代理主要涉及到 `java.lang.reflect` 包中的两个类:Proxy 和 InvocationHandler。 InvocationHandler 是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编制在一起。Proxy 利用 InvocationHandler 动态创建 一个符合某一接口的实例,生成目标类的代理对象。
55+
56+
原理是使用反射机制
2457

2558
**首先定义接口,并实现**
2659

@@ -109,11 +142,15 @@ public static void main(String[] args) {
109142

110143

111144

112-
### 二 CGLIB代理
145+
### CGLib 动态代理
146+
147+
CGLib 全称为 Code Generation Library,是一个强大的高性能,高质量的代码生成类库, 可以在运行期扩展 Java 类与实现 Java 接口,CGLib 封装了 asm,可以再运行期动态生成新 的 class。和 JDK 动态代理相比较:JDK 创建代理有一个限制,就是只能为接口创建代理实例, 而对于没有通过接口定义业务方法的类,则可以通过 CGLib 创建动态代理。
113148

114-
需要导入 cglib-nodep-2.1_3.jar
115149

116-
先说下cglib,CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
150+
151+
需要导入 cglib-nodep-2.1_3.jar
152+
153+
先说下cglib,CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
117154

118155
**先定义一个实现类(注意并没有实现接口)**
119156

@@ -128,7 +165,7 @@ public class TestCGLIBServiceImpl {
128165
```
129166

130167
**定义cglib代理类,此时导入的包应该是import net.sf.cglib.proxy.\***
131-
168+
132169

133170
```java
134171
import java.lang.reflect.Method;
@@ -198,6 +235,18 @@ import java.lang.reflect.Method;
198235

199236
结果图:
200237

201-
![img](https://images2015.cnblogs.com/blog/825618/201510/825618-20151023134432505-1808034718.png)
238+
![](https://images2015.cnblogs.com/blog/825618/201510/825618-20151023134432505-1808034718.png)
239+
240+
241+
242+
### 写在代理模式之后
243+
244+
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
245+
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
246+
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
247+
248+
注:JDK 动态代理要比 cglib 代理执行速度快,但性能不如 cglib 好。所以在选择用哪种代理还是要看具体情况,一般单例模式用 cglib 比较好。
249+
250+
202251

203252
**写在后面:spring AOP的两种代理实现代码就写到这,这里只是实现了,如果你要想真正明白,还得熟悉其中原理机制,比如反射机制,newProxyInstance(...),Enhancer()原理,invoke()原理等等。**

0 commit comments

Comments
 (0)