alluxio源码完整解析|你不知道的开源数据编排系统(上篇)

Alluxio Alluxio     2023-02-23     452

关键词:

前言

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

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

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

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

环境准备

本地部署

从官方下载安装版本(下载地址),以2.6.0安装为例,下载后解压安装包:
1 tar -zxvf alluxio-2.6.0-bin.tar.gz
修改基本的配置文件,
(1). 修改alluxio-site.properties,设置master地址,设置默认Alluxio root挂载点:
1 cp conf/alluxio-site.properties.template alluxio-site.properties
2 #放开注释:
3 alluxio.master.hostname=127.0.0.1
4 alluxio.master.mount.table.root.ufs=$alluxio.work.dir/underFSStorage

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

修改完配置后,准备启动Alluxio服务,执行如下命令操作:
1 # mount对应磁盘
2 bin/alluxio-mount.sh Mount workers
3 # 进行环境校验
4 bin/alluxio validateEnv master
5 bin/alluxio validateEnv worker

服务启动命令操作,对于所有服务操作包括:master、worker、job_master、job_worker、proxy
1 # 启动所有服务
2 bin/alluxio-start.sh all
3 # 停止所有服务
4 bin/alluxio-stop.sh all
5
6 # 启动单个服务
7 bin/alluxio-start.sh -a master
8 bin/alluxio-start.sh -a worker
9 bin/alluxio-start.sh -a job_master
10 bin/alluxio-start.sh -a job_worker
11 bin/alluxio-start.sh -a proxy

启动后服务成功,也可通过JPS查看Java进程:AlluxioMaster、AlluxioWorker、AlluxioJobMaster、AlluxioJobWorker、AlluxioProxy。
http://localhost:19999,页面查看alluxio master ui界面,默认端口:19999

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

IDEA调试

源码编译可参考官方说明文档:Building Alluxio From Source
1 mvn clean install -DskipTests
2 # 加速编译
3 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参数示例如下:
1 -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

操作示例如下:

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

DEBUG远程调试,在alluxio-env.sh 配置环境变量,可增加如下配置属性
1 export ALLUXIO_WORKER_JAVA_OPTS=“ A L L U X I O J A V A O P T S − a g e n t l i b : j d w p = t r a n s p o r t = d t s o c k e t , s e r v e r = y , s u s p e n d = n , a d d r e s s = 6606 " 2 e x p o r t A L L U X I O M A S T E R J A V A O P T S = " ALLUXIO_JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6606" 2 export ALLUXIO_MASTER_JAVA_OPTS=" ALLUXIOJAVAOPTSagentlib:jdwp=transport=dtsocket,server=y,suspend=n,address=6606"2exportALLUXIOMASTERJAVAOPTS="ALLUXIO_JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6607”
3 export ALLUXIO_USER_DEBUG_JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=6609"

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

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

项目结构

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工具;

服务进程

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

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

AlluxioMaster

启动流程

基于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相关的指标;

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

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

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

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

start:Server启动;

stop:Server停止;

close:Server关闭;

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

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清理器

    :HeartbeatExecutor的类图概要

    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的心跳进行检测。

AlluxioWorker

启动流程

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

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

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

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

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

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

Worker Server

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:校验存储地址;

AlluxioProxy

启动流程

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

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

AlluxioJobMaster

启动流程

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

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

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

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

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

    JobMaster

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

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

AlluxioJobWorker

启动流程

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

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

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

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

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

    JobWorker

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

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

RPC框架

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


《Alluxio-源码解析》下篇更精彩哦,敬请期待。

导师男团来袭|开源之夏2022,与alluxio一起探索数据编排的奇妙世界

活动简介开源之夏(英文简称OSPP)是由“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动,今年是第三届,由中国科学院软件研究所与openEuler社区共同举办,旨在鼓励在校学生积极参与开源软... 查看详情

云原生数据编排厂商alluxio获5000万美元c轮融资

全球首创的开源云原生数据编排软件开发商Alluxio宣布完成5000万美元C轮融资,该轮融资由新投资方高瓴创投领投,战略投资方和原股东a16z、SevenSeasPartners、火山石投资跟投。与此同时,Alluxio宣布将大力拓展国内市场... 查看详情

alluxio2.9新版发布|重塑架构,支持大规模多租户环境

/Alluxio宣布正式发布数据编排平台2.9版本/Alluxio2.9版本的主要新增功能包括:新增跨环境集群同步功能、增强Alluxio在Kubernetes上的可管理性、提高S3API安全性和用户体验2022年11月17日,全球首创的开源数据编排软件开发商Allu... 查看详情

2.7版本发布丨alluxio数据编排平台进一步深化对人工智能和机器学习工作负载在混合云和多云上的支持

...练时间和成本全球首创的开源云原生数据编排软件开发商Alluxio宣布正式发布数据编排平台2.7版本,新版本立即可用。2.7版本通过并行数据加载、数据预处理和训练工作流,可将机器学习(ML)训练的I/O效率提高8-12倍,从... 查看详情

deeptech深科技专访丨分布式系统开源项目领跑者alluxio获5000万美元c轮融资

...架和存储系统之间架设的新的一层——即数据编排平台。Alluxio应运而生Alluxio系统是全球首个分布式超大规模数据编排系统,孵化于加州大学伯克利分校AMP实验室。自项目开源以来,已有超过来自300多个组织机构的1100多... 查看详情

联通数据编排技术在联通的应用

...排技术在联通的应用。本次分享内容将围绕四个方面讲述Alluxio数据编排技术在联通的应用,主要围绕缓存加速、存算分离、混合负载以及轻量级分析四个不同的使用场景进行分享:摘要01.在缓存加速方面的应用为了加速S... 查看详情

联通数据编排技术在联通的应用

...排技术在联通的应用。本次分享内容将围绕四个方面讲述Alluxio数据编排技术在联通的应用,主要围绕缓存加速、存算分离、混合负载以及轻量级分析四个不同的使用场景进行分享:摘要01.在缓存加速方面的应用为了加速S... 查看详情

alluxio2.0特性-预览

项目地址https://github.com/Alluxio/alluxio/tree/branch-2.0-preview2.0版本-构思和设计支持超大规模数据工作负载Alluxio作为计算和存储之间的数据编排层,使数据移动并且可以跨多个不同的存储系统访问:HDFS,对象存储,网络附加存储,随... 查看详情

云知声atlas超算平台:基于fluid+alluxio的计算加速实践

...介: 本文主要介绍云知声Atlas超算平台基于Fluid+Alluxio的计算加速实践,以及Fluid是如何为Atlas带来全新的数据集管理方式的。Fluid是云原生基金会CNCF下的云原生数据编排和加速项目,由南京大学、阿里云及Alluxio社... 查看详情

华为拥抱开源alluxio:内存将成重要战略平台

华为公司近日宣布将利用自家FusionStorage产品与Alluxio开源软件实现大数据分析加速;此举相信能够为令人昏昏欲睡的缓慢数据分析流程带来一股新风。华为拥抱开源Alluxio:内存将成重要战略平台Alluxio此前曾名为TachyonNexus,是一家... 查看详情

一站式全覆盖数据i/o平台-alluxio与aunalytics的完美结合

“Aunalytics云原生数据分析平台与Alluxio的开源数据编排软件相结合,使客户能够进行跨所有数据源的统一访问,并驱动人工智能分析,产出更好的答案,获得竞争优势。”Aunalytics分析云首席技术官汤姆·帕诺佐√... 查看详情

alluxio+weride|加速l4级自动驾驶技术开发进程(代码片段)

文远知行WeRide+Alluxio:机器学习和人工智能领域的跨区域混合云存储网关开源云数据编排软件开发商Alluxio近日宣布,全球领先的L4级自动驾驶技术智能出行公司文远知行WeRide已将Alluxio数据编排软件作为混合云存储网关&... 查看详情

你不知道的requestidlecallback(代码片段)

本文副标题是RequestSchedule源码解析一。在本章中会介绍requestIdleCallback的用法以及其缺陷,接着对React团队对该api的hack部分的源码进行剖析。在下一篇中会结合优先级对React的调度算法进行宏观的解释,欢迎关注个人博客。React调度... 查看详情

源码大招:不服来战!撸这些完整项目,你不牛逼都难!

经常有人问我有没有什么项目代码,我回复说去Github找,但是还是好多人不知道如何找到那些比较好的项目。今天花了点时间找了些安卓的项目,觉得还是不错的,几乎就是自己生活常用的一些app,如果你是一个Android开发者,... 查看详情

从“少林寺”毕业后,我当上了开源社区“区长”

本期名人堂我们有幸邀请到了Alluxio创始成员兼开源社区副总裁范斌先生。范斌先生讲述了自己的求学、工作、加入开源社区的经历,以及对未来十年数据编排发展的展望,和对开发贡献者的一些建议。问题1:范斌老... 查看详情

合集-行业解决方案如何搭建高性能的数据加速与数据编排平台

在2022年过去的半年时间里,Alluxio一共做过30场面向客户、用户、粉丝、关注者的直播分享。这30场分享中,我们每1期都会精心规划、定向邀请嘉宾,其中有来自一线大厂的实战者,有来自Alluxio的嘉宾。内容涵盖... 查看详情

查询作业

开源指开源你对源码进行二次开发进行修改bug修复等版权可以标为自己开发。不开源则和开源相反你不知道源码内容无法对源码进行修改等版权也是开发人所有。开源(OpenSource,开放源码)被非盈利软件组织(美国的OpenSourceInitia... 查看详情

alluxio+nvidiagpus:加速分析和人工智能

...的分离,加速数据访问将变得更加重要。NVIDIA已经和Alluxio社区开展合作,对大规模数据集缓存和GPU数据可用性进行高性能数据编排系统测试。ApacheSpark3.0,RAPIDSAcceleratorforApacheSpark和Alluxio可用于:(1)数据分析和商... 查看详情