沧海月明

With great power comes great responsibility

0%

最近阅读 HDFS 的源码,看到在 DFSClient 中很多地方用到了 HTrace 这款框架,所以特意学习下。

HTrace 是一款由 Cloudera 开发的分布式追踪框架,在设计上借鉴了 Google 的 Dapper 论文,虽然 HTrace 已经停止了更新,在 Apache 里面孵化失败了,但是它现在任然被 Hadoop 和 HBase 所采用。

HTrace 产生的数据通常不够直观,我们还会使用 Zipkin 进行数据的可视化。

作用

在分布式系统中,用户发送的一个 RPC 请求,会在后台产生多个请求。例如用户通过 HDFS Client 上传一个文件,中间可能涉及到从 Client 到 NameNode,Client 到 DataNode,NameNode 到 DataNode 的 RPC 请求。但是我们该如何追踪这些具体 RPC 请求的性能呢?传统的方法只能监控到 Client 上传文件整一个过程的耗时,而无法捕捉到其间各个请求的性能,从而无法定位性能产生瓶颈的地方。这也就是 HTrace 所需要解决的问题。

阅读全文 »

最近阅读 Hadoop 的源码,看到各种动态代理,打算学习下。虽然以前也学过,但是感觉就是死记硬背的代码,有些地方根本不懂。温习了一遍网上 JDK 动态代理的教程后,自己尝试再一次死记硬背的写一写,结果错误百出。于是打算狠下心来系统的学习下动态代理。

在这篇博客中我不会具体的说明动态代理的实现,但是我会贴上我参考的博客供大家参考。

疑问

如果你和我一样,JAVA 基础不好,初次接触 JDK 动态代理,你一定会有下面的几个疑问。

我先贴上我的示例代码:

阅读全文 »

最近阅读 Hadoop 源码,使用 IDEA 打开 Hadoop,正常导入 maven 依赖后,发现某些类里面总是会报各种类不存在的错误,如下图:

2020-12-28-5YtjEW

一开始以为是因为我配置了国内 maven 镜像仓库,然后国内镜像仓库里面某些 jar 包没有及时同步,导致的缺失。但是我看了看 maven 中的导入记录,发现并没有报 jar 包找不到的错误。

看了看缺失的类,它们的包名基本都含有 proto 关键字,结合 Hadoop 是使用 protobuf 作为序列化框架,经过我的一番推理,我认为这些缺失的类是需要通过 protobuf 的命令行工具 protoc 产生的,源码里面默认是不带的。

阅读全文 »

Introduction

Log-Structured File System (LFS)发明的背景就是建立在 CPU 高速发展,磁盘读取写入速度极速发展,单位内存越来越便宜,而磁盘的寻道耗时(受限于物理因素,快不起来)没有什么进步的情况下。

LFS 假设文件可以缓存在内存中,而且随着内存变大,能缓存的文件越多。而写入文件终究还是要写入磁盘,所以只需要优化好磁盘的写入操作,就能极大的提升性能。

LFS 将所有写入的文件缓存在内存中,汇聚成一个顺序结构 log,然后一次性写入磁盘,这样能够最大限度使用磁盘的写入性能。

因为 LFS 都是顺序写入,所以它的 crash recovery 更加迅速,相比于传统文件系统需要扫描整个磁盘,LFS 只需要最近新增的 log 即可(看看最新增的几个 log 是否正常就行了)。

阅读全文 »

Fast File System(FFS)一个具有里程碑意义的文件系统。它没有修改上层调用的 API,例如( open(), read(), write() 等等),而修改了内部实现,提升文件系统的效率。基本此后所有的文件系统都基于这种模式进行开发。

Old Unix File System

再开始介绍 Fast File System之前,我们简单介绍下 Old Unix File System。如图:

2020-11-25-tduyKs

磁盘开头是 super block(S),包含了整个文件系统的信息,后面则是存放 inode 的区域。剩下的大多数地方为 data block。

阅读全文 »

原文地址:https://www.inlighting.org/archives/make-proxmox-centos-cloud-init-template

因为自己使用 Proxmox 进行开发,需要频繁的创建删除虚拟机,所以制作 cloud-init 模板来方便虚拟机的创建。

这里我没有自己在原系统上面安装 cloud-init 进行操作,而是直接使用了官方提供的 cloud image。下面的教程我以 Centos 为例,Proxmox 为全新安装的 v6.1-7 版本。

更换源-可忽略

阅读全文 »

介绍

Amdahl’s law(阿姆达尔定律) 由计算机科学家 Gene Amdahl 在 1967 年提出,旨在用公式描述在并行计算中,多核处理器理论上能够提高多少倍速度,公式如下:
$$
S=\frac{1}{1-a+\frac{a}{n}}
$$
$S$ 为 speedup,代表全局加速倍速(原来总时间/ 加速后总时间),$a$ 为并行计算所占比例(可以并行计算代码量 / 总代码量),$n$ 为并行节点处理个数,可以理解为 CPU 的核心数,这里先简要介绍下,后面会详细说明并且推导。

前置说明

Fraction enhanced

Fraction enhanced 顾名思义是部分提高。例如我的程序总共有 100 行代码,其中 50 行是可以通过并行计算的,那么这 50 行代码就是 Fraction enhanced 。但是实际上 Fraction enhanced 是一个比例数值,是并行计算代码 / 总代码量
$$
Fraction\ enhanced=\frac{parallel\ code}{total\ code}
$$
例如上面的例子,$Fraction\ enhanced = 50/100=0.5$ ,由此我们可以发现,Fraction enhanced 的值永远小于 1

阅读全文 »

Lamport 逻辑时钟(Lamport Timestamp)

Lamport Timestamp 是一种衡量时间和因果关系的方法。现实生活中,很多程序都有着因果(causality)关系,比如执行完事件 A 后才能执行事件 B。

1
2
3
4
5
int main {
create_photos(6);
view_photos(6);
return 0;
}

比如上面的代码,我只有创建完照片 6 才能访问照片 6,这就是因果关系。但是在分布式系统中,我们如何衡量事件的因果顺序呢?

如下图,比如我有 A,B,日志服务器 三台机器,用户发起一个购买操作,首先第一个请求在 Server A 上面创建了订单,之后支付操作在 Server B 上进行。然后为了记录用户操作,Server A 和 Server B 异步发送日志写入请求到达日志服务器。假设两条日志同时到达,那么日志服务器该如何区分先后顺序呢?

阅读全文 »

原文地址:https://www.inlighting.org/archives/understand-partial-ordering-and-global-ordering

在分布式系统中,我们在阅读关于事务一致性的论文中,经常会看到 partial ordering 和 global ordering。这里简单的说明下。

Partial ordering

部分有序。指在一系列的事件中,只保证部分的事件按照一定的顺序进行处理。

阅读全文 »

介绍

有限状态机通常用于模拟序列逻辑,换句话说,就是用于代表和控制执行流程。

有限状态机所需条件:

  • 一个物体只有固定的几种状态(例如交通灯只有绿灯、黄灯和红灯三个状态)。
  • 有固定的变化顺序(例如交通灯只能绿灯->黄灯->红灯->绿灯循环)
  • 物体同一时间点上只有一种状态。

例子

阅读全文 »