你不知道的开源分布式存储系统 Alluxio 源码完整解析(上篇)

2024-03-20 05:48

本文主要是介绍你不知道的开源分布式存储系统 Alluxio 源码完整解析(上篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

4611f148dfa16775acceb2d662cc6841.gif


PART ONE

前言

目前数据湖已成为大数据领域的最新热门话题之一,而什么是数据湖,每家数据平台和云厂商都有自己的解读。整体来看,数据湖主要的能力优势是:集中式存储原始的、海量的、多来源的、多类型的数据,支持数据的快速加工及计算。相比于传统的数据仓库,数据湖对数据有更大的包容性,支持结构化/半结构化/非结构化数据,能快速进行数据的落地和数据价值发掘。数据湖的技术体系可以分为三个子领域:数据湖存储、数据湖计算、数据湖统一元数据。

数据湖存储提供海量异构数据的存储能力,支持多类型的底层存储系统,如分布式存储 HDFS、对象存储 AWS S3、腾讯云对象存储 COS 等,除此之外,在数据湖场景中计算和存储分离,使得计算的数据本地性不复存在。因此有必要在数据湖存储和计算之间引入统一的数据缓存层。

Alluxio是一款基于云原生开源的数据编排技术,为数据计算与数据存储构建了桥梁,支持将数据从原始存储层移动到加速计算的虚拟分布式存储系统。Alluxio可为数据湖计算提供统一的数据湖存储访问入口,支持跨不同类型的底层存储并抽象出统一的数据访问命名空间,提供数据本地性、数据可访问性、数据伸缩性。

本文将对 Alluxio 底层源码进行简要分析,分上下两篇:主要包括本地环境搭建,源码项目结构,服务进程的启动流程,服务间RPC调用,Alluxio 中重点类详解,Alluxio 中 Block 底层读写流程,Alluxio Client调用流程和 Alluxio 内置的轻量级调度框架。

PART TWO

环境准备

2.1. 本地部署

从官方下载安装版本(下载地址),以2.6.0安装为例,下载后解压安装包:

tar -zxvf alluxio-2.6.0-bin.tar.gz

修改基本的配置文件,(1). 修改alluxio-site.properties,设置master地址,设置默认Alluxio root挂载点

cp conf/alluxio-site.properties.template  alluxio-site.properties
#放开注释:
alluxio.master.hostname=127.0.0.1
alluxio.master.mount.table.root.ufs=${alluxio.work.dir}/underFSStorage

(2). 修改masters、workers配置对应ip,本地安装,可都设置为127.0.0.1

vi conf/masters
vi conf/workers

修改完配置后,准备启动Alluxio服务,执行如下命令操作:

# mount对应磁盘
bin/alluxio-mount.sh Mount workers
# 进行环境校验
bin/alluxio validateEnv master
bin/alluxio validateEnv worker

服务启动命令操作,对于所有服务操作包括:master、worker、job_master、job_worker、proxy

# 启动所有服务
bin/alluxio-start.sh all
# 停止所有服务
bin/alluxio-stop.sh all# 启动单个服务
bin/alluxio-start.sh -a master
bin/alluxio-start.sh -a worker
bin/alluxio-start.sh -a job_master
bin/alluxio-start.sh -a job_worker
bin/alluxio-start.sh -a proxy

启动后服务成功,也可通过JPS查看Java进程:AlluxioMaster、AlluxioWorker、AlluxioJobMaster、AlluxioJobWorker、AlluxioProxy。

94bccc244a95dac6a423d02222cd1251.png

  • http://localhost:19999,页面查看alluxio master ui界面,默认端口:19999

  • http://localhost:30000,页面查看alluxio worker ui界面,默认端口:30000

56d113ee78fc59a577c5714ced196579.png


2.2. IDEA调试

源码编译可参考官方说明文档:Building Alluxio From Source

mvn clean install -DskipTests
# 加速编译
mvn -T 2C clean install -DskipTests -Dmaven.javadoc.skip -Dfindbugs.skip -Dcheckstyle.skip -Dlicense.skip -Dskip.protoc

通过IDEA启动Alluxio各个服务进程,其核心启动类包括:

  • AlluxioMaster:Main函数入口,设置启动运行VM Options,alluxio.logger.type=MASTER_LOGGER,RPC端口:19998,Web端口:19999;

  • AlluxioJobMaster:Main函数入口,设置启动运行VM Options,alluxio.logger.type=JOB_MASTER_LOGGER

  • AlluxioWorker:Main函数入口,设置启动运行VM Options,alluxio.logger.type=WORKER_LOGGER,

  • AlluxioJobWorker:Main函数入口,设置启动运行VM Options,alluxio.logger.type=JOB_WORKER_LOGGER

  • AlluxioProxy:Main函数入口,设置启动运行VM Options,alluxio.logger.type=PROXY_LOGGER

VM Options参数示例如下:

-Dalluxio.home=/code/git/java/alluxio -Dalluxio.conf.dir=/code/git/java/alluxio/conf -Dalluxio.logs.dir=/code/git/java/alluxio/logs -Dlog4j.configuration=file:/code/git/java/alluxio/conf/log4j.properties -Dorg.apache.jasper.compiler.disablejsr199=true -Djava.net.preferIPv4Stack=true -Dalluxio.logger.type=MASTER_LOGGER -Xmx2g -XX:MaxDirectMemorySize=516M

操作示例如下:

6a69b77b9ddcccdcd3c53bd7bdea3413.png

在项目根目录 logs下可查看服务启动的日志文件:

43c8d8eec6b3f42212624e6ab9262e4c.png

DEBUG远程调试,在alluxio-env.sh 配置环境变量,可增加如下配置属性

export ALLUXIO_WORKER_JAVA_OPTS="$ALLUXIO_JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6606"
export ALLUXIO_MASTER_JAVA_OPTS="$ALLUXIO_JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6607"
export ALLUXIO_USER_DEBUG_JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=6609"

如下图所示,增加远程的监控端口,监控Alluxio Worker 6606:

26996625c78d55373bcd9cdd82289b75.png

调用Alluxio Shell命令时开启DEBUG的输出,使用参数:-debug,示例如下:

bin/alluxio fs -debug ls /

PART THREE

项目结构

Alluxio源码的项目结构可简化如下几个核心模块:

  • alluxio-core:实现Alluxio系统的核心模块,其中alluxio-core-server内实现Alluxio Master、Alluxio Worker、Alluxio Proxy;alluxio-core-client定义Alluxio Clien操作;alluxio-core-transport 实现服务间RPC通信;

  • alluxio-job:Alluxio内部轻量级作业调度实现,alluxio-job-server内实现 Alluxio Job Master、Alluxio Job Worker;

  • alluxio-underfs:适配对接不同的底层存储,如hdfs、cephfs、local、s3等;

  • alluxio-table:实现Alluxio Catalog功能,基于table引擎读取元数据并支持关联Alluxio存储,目前catalog的底层UDB支持hive metastore和aws glue catalog;

  • alluxio-shell:封装Alluxio shell工具;

0bcae72ccb822ca3911ac8fb92a692fc.png


PART FOUR

服务进程

Alluxio服务内部的5个核心进程:AlluxioMaster、AlluxioWorker、AlluxioProxy、AlluxioJobMaster、AlluxioJobWorker 都是基于Process(进程)接口类扩展实现的,定义组件进程的生命周期管理操作。

类图实现继承关系如下所示:

87184f8ca96713dbdb658e118da00423.png



4.1 AlluxioMaster


4.1.1. 启动流程

  • 基于JournalSystem维护Master元数据持久化信息,便于服务宕机后,从最新的Journal File恢复,详见Journal Management;

  • 进行AlluxioMaster选举,Master选举支持两种方式:ZK、Raft(RaftJournalSystem);

  • 基于ProcessUtils进行进程启停管理触发,执行AlluxioMasterProcess 启动

    • JournalSystem 启动/设置主要执行模式(gainPrimacy)

    • AlluxioMasterProcess#startMasters:启动所有Master相关服务,包括block master、FileSystem master等;若是leader,则调用BackupManager#initFromBackup初始化所有注册master server组件,若不是leader则仅启动Master的RPC/UI服务

    • AlluxioMasterProcess#startServing:启动指标相关服务,包括Web、JVM、RPC相关的指标;

启动时序图简化如下所示:

b269e25f39bfa0126f39fcd4bf98ca52.png

4.1.2. Server接口类

特别的,初始化并启动的Server接口类组件,主要包括Master类和Worker类,Server会从线程池获取线程,启动执行各个Server定义的操作,server中定义服务线程的生命周期操作,定义的接口方法如下:

  • getName:获取该Server名称;

  • getDependencies:该Server依赖的其他前置Server;

  • getServices:获取Server定义的GrpcService集合;

  • start:Server启动;

  • stop:Server停止;

  • close:Server关闭;

7e85e964c61246882ebb78b74a0bdf42.png


4.1.3. Master Server

定义Master组件中封装的各个线程Server服务,包括Block元数据管理,文件系统管理等,其细化类图如下所示:

5b1d61a698a8deff825a340267143fad.png


4.1.3.1. DefaultFileSystemMaster

Alluxio Master处理系统中所有文件系统元数据管理的Server服务,基于DefaultFileSystemMaster可对文件执行Lock(加锁)操作,为了对任意inode进行读写操作,需要对 inode tree中的每个独立路径进行加锁。InodeTree对象提供加锁方法有:InodeTree#lockInodePath、InodeTree#lockFullInodePath,方法返回已被加锁处理的LockedInodePath 路径对象。

在DefaultFileSystemMaster中常用的上下文对象:JournalContext, BlockDeletionContext, RpcContext;用户对文件元数据的访问(方法调用)都有一个独立的线程进行审计日志记录及管理。

备注:当获取inode path时,可能存在并发操作对该path进行写变更操作,那么读取inode path会抛出异常,提示path的数据结构已变更。

DefaultFileSystemMaster start启动流程概述

  • 基于InodeTree初始化文件系统根目录(initializeRoot)并判断是否有该文件系统权限;

  • 遍历MountTable,初始化MasterUfsManager并进行文件系统挂载Mount操作;

  • 提交不同的HeartbeatThread(心跳线程) 进行各个检测校验,最终调用HeartbeatExecutor.heartbeat方法,其心跳检测包括:

    •  BlockIntegrityChecker:Block完整性校验

    • InodeTtlChecker:File Inode TTL 生命周期校验

    • LostFileDetector:丢失文件探测

    • ReplicationChecker:副本数校验

    • PersistenceSchedule:持久化调度

    • PersistenceChecker:持久化校验

    • TimeSeriesRecorder:时间序列记录

    • UfsCleaner:UFS清理器

52056fc732c6d86425e95c5a206477fe.png

HeartbeatExecutor的类图概要

cbe01f8b8316a5f4be90ad7d17e813bf.png


4.1.3.2. DefaultBlockMaster

Alluxio Master中管理所有Block和Worker映射元数据的Server服务。

为保证并发请求,BlockMaster Server使用支持并发的数据结构,每个元数据都可以进行独立的加锁操作。在BlockMaster中有两大类元数据:block metadata(block块元数据),worker metadata(worker节点元数据):

  • block metadata 加锁操作:基于block执行任意的BlockStore操作,从mLostBlocks中移除元素;

  • worker metadata 加锁操作:校验/更新worker注册状态,读/写worker使用率,读/写worker上的block管理;

为避免死锁操作,如果block和worker元数据需要同时加锁,worker需要在block之前加锁,释放锁时则相反,block需要在worker之前释放锁。

start启动流程概述:提交HeartbeatThread(心跳线程) 进行检测校验,提交的线程是:LostWorkerDetectionHeartbeatExecutor,对worker的心跳进行检测。

4.2. AlluxioWorker

4.2.1. 启动流程

  • 通过MasterInquireClient.Factory 获取Alluxio Master的地址和相关配置信息;

  • 创建AlluxioWorkerProcess进程对象,并执行start方法,具体如下:

    • 通过WorkerRegistry获取Worker上的所有Worker Server服务,并启动相应的Server

    • 注册WebServer Handler,并启动,包括通用指标和Prometheus指标;

    • 注册JvmPauseMonitor,采集worker节点相关的JVM监控指标信息;

  • 如果Worker内嵌FUSE服务,则启动FuseManager

0d91234cb9cf1fb0f14e0c5279ed7d42.png


4.2.2. Worker Server

3029f0f3824d9378bd705fa55abb00b3.png


4.2.2.1. DefaultBlockWorker

负责管理Worker节点中最高层级的Block抽象操作,包括:

  • 周期性的BlockMasterSync,将当前Worker节点的Block信息周期定时上报同步给Master;

  • 维护当前Worker所有Block信息与底层存储操作的逻辑关系;

start启动流程概述:通过BlockMasterClientPool获取BlockMaster RPC地址并注册,基于ExecutorService提交Worker节点的HeartbeatThread线程,包括:

  • BlockMasterSync:将Worker节点Block信息定时同步BlockMaster进行统一block元数据管理;

  • PinListSync:维护Alluxio与底层UFS的联通地址;

  • StorageChecker:校验存储地址;


4.3. AlluxioProxy

4.3.1. 启动流程

  • 基于ProxyProcess.Factory 创建对应的进程对象:AlluxioProxyProcess;

  • 创建AlluxioProxyProcess进程对象后,执行start方法,调用ProxyWebServer执行start方法,启动Proxy Web服务;

afcbe5c7ea643d3fbdf5e7ec82832a88.png

4.4. AlluxioJobMaster


4.4.1. 启动流程

  • 基于AlluxioJobMasterProcess.Factory创建对应的进程对象:AlluxioJobMasterProcess;

  • AlluxioJobMasterProcess执行start方法,调用细节如下:

    • 启动AlluxioJobMaster关联的JournalSystem,并获取Master Leader;

    • 启动Job的Server服务,调用JobMaster start;

    • 分别启动JobMaster的Web Server和RPC Server,提供对外通信服务;

7a523445dfa3dc109158800718af686a.png


4.4.2. JobMaster

Alluxio内置轻量级的作业调度框架,JobMaster处理AlluxioJobMaster中所有job管理相关操作。

start启动流程概述:基于PlanTracker获取上一次调度系统中遗留的所有运行中执行计划并停止,提交HeartbeatThread(心跳线程) 进行监测,提交的进程是:LostWorkerDetectionHeartbeatExecutor,用于检测心跳丢失的Worker节点;


4.5. AlluxioJobWorker

4.5.1. 启动流程

  • 通过MasterInquireClient.Factory 获取Alluxio Master的地址和相关配置信息;

  • 创建AlluxioJobWorkerProcess进程对象,并执行start方法,具体如下:

    • 注册WebServer Handler并启动JobWorkerWebServer,提供Web服务;

    • 启动JobWorker的Server服务 JobWorker,注册job worker节点,并提交心跳检测线程CommandHandlingExecutor;

    • 启动RPC服务于外部通信。

f68616fa8be32d542bcc7df08a18b031.png


4.5.2. JobWorker

负责管理Worker节点中执行任务相关的所有操作,通过CommandHandlingExecutor 心跳检测执行进程实现。

start启动流程概述:向JobWorkerIdRegistry注册当前worker节点信息,提交HeartbeatThread(心跳线程) 进行监测,提交的线程是:CommandHandlingExecutor,处理JobWorker节点所接受的Command命令。



PART FIVE

RPC框架

Alluxio是分布式存储缓存系统,服务之间的通信经过RPC调用,其内部采用了grpc框架实现,在子项目alluxio-core-transport中定义RPC的proto文件。以AlluxioMaster为例,详述RPC启动调用流程:AlluxioMaster进程启动的时候,会启动grpc server 对外提供接口服务,其中Server(Master服务)中定义各个Server待注册启动的RPC服务,所有RPC服务注册到GrpcServerBuilder后,基于GrpcServerBuilder.build生成GrpcServer并启动。

dc8d4ea67ce4adea0cb21dbe4567c6b7.png

Master RPC和Worker RPC注册服务,都是基于Handler实现grpc定义的方法,如下所示:

2ee75f1e8d8e877dcc9ffa08c9255534.png

《Alluxio-源码简析》下篇更精彩哦,已同步更新。

44d5653c1263a39e9a7953ecf4e8fdfe.png

欢迎关注「腾源会」公众号,期待你的「在看」哦~👇

这篇关于你不知道的开源分布式存储系统 Alluxio 源码完整解析(上篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/828466

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、