Part 1 前言
目前数据湖已成为大数据畛域的最新热门话题之一,而什么是数据湖,每家数据平台和云厂商都有本人的解读。整体来看,数据湖次要的能力劣势是:集中式存储原始的、海量的、多起源的、多类型的数据,反对数据的疾速加工及计算。相比于传统的数据仓库,数据湖对数据有更大的包容性,反对结构化/半结构化/非结构化数据,能疾速进行数据的落地和数据价值挖掘。数据湖的技术体系能够分为三个子畛域:数据湖存储、数据湖计算、数据湖对立元数据。
数据湖存储提供海量异构数据的存储能力,反对多类型的底层存储系统,如分布式存储 HDFS、对象存储 AWS S3、腾讯云对象存储 COS 等,除此之外,在数据湖场景中计算和存储拆散,使得计算的数据本地性不复存在。因而有必要在数据湖存储和计算之间引入对立的数据缓存层。
Alluxio是一款基于云原生开源的数据编排技术,为数据计算与数据存储构建了桥梁,反对将数据从原始存储层挪动到减速计算的虚构分布式存储系统。Alluxio可为数据湖计算提供对立的数据湖存储拜访入口,反对跨不同类型的底层存储并形象出对立的数据拜访命名空间,提供数据本地性、数据可拜访性、数据伸缩性。
本文将对 Alluxio 底层源码进行简要剖析,分高低两篇:次要包含本地环境搭建,源码我的项目构造,服务过程的启动流程,服务间RPC调用,Alluxio 中重点类详解,Alluxio 中 Block 底层读写流程,Alluxio Client调用流程和 Alluxio 内置的轻量级调度框架。
Part 2 环境筹备
2.1 本地部署
从官网下载安装版本(下载地址),以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
2.2 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="$ALLUXIO_JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6606"
2 export ALLUXIO_MASTER_JAVA_OPTS="$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 /
Part 3 我的项目构造
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工具;
Part 4 服务过程
Alluxio服务外部的5个外围过程:AlluxioMaster、AlluxioWorker、AlluxioProxy、AlluxioJobMaster、AlluxioJobWorker 都是基于Process(过程)接口类扩大实现的,定义组件过程的生命周期治理操作。
类图实现继承关系如下所示:
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相干的指标;
启动时序图简化如下所示:
4.1.2. Server接口类
特地的,初始化并启动的Server接口类组件,次要包含Master类和Worker类,Server会从线程池获取线程,启动执行各个Server定义的操作,server中定义服务线程的生命周期操作,定义的接口办法如下:
getName:获取该Server名称;
getDependencies:该Server依赖的其余前置Server;
getServices:获取Server定义的GrpcService汇合;
start:Server启动;
stop:Server进行;close:Server敞开;
4.1.3. Master Server
定义Master组件中封装的各个线程Server服务,包含Block元数据管理,文件系统治理等,其细化类图如下所示:
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清理器
附:HeartbeatExecutor的类图概要
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
4.2.2. Worker Server
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服务;
4.4 AlluxioJobMaster
4.4.1. 启动流程
基于AlluxioJobMasterProcess.Factory创立对应的过程对象:AlluxioJobMasterProcess;
AlluxioJobMasterProcess执行start办法,调用细节如下:
- 启动AlluxioJobMaster关联的JournalSystem,并获取Master Leader;
- 启动Job的Server服务,调用JobMaster start;
- 别离启动JobMaster的Web Server和RPC Server,提供对外通信服务;
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服务于内部通信。
4.5.2. JobWorker
负责管理Worker节点中执行工作相干的所有操作,通过CommandHandlingExecutor 心跳检测执行过程实现。
start启动流程概述:向JobWorkerIdRegistry注册以后worker节点信息,提交HeartbeatThread(心跳线程) 进行监测,提交的线程是:CommandHandlingExecutor,解决JobWorker节点所承受的Command命令。
Part 5 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智库]](https://page.ma.scrmtech.com/...):