回顾

在《Alluxio-源码解析-上》次要讲述了Alluxio本地环境搭建,源码我的项目构造,服务过程的启动流程和服务间RPC调用。

本篇将在上篇的根底上,持续为大家讲述Alluxio中重点类详解,Alluxio中Block底层读写流程,Alluxio Client调用流程和 Alluxio内置的轻量级调度框架。

Part 1 重点类讲述

1.1 Journaled

Journaled接口定义可被Journaled长久化保护的通用办法,通过JournalEntryIterable#getJournalEntryIterator获取Journal元素遍历信息,该接口提供默认checkpoint办法。Journaled接口继承Checkpointed、JournalEntryIterable,定义的办法包含:

  • getJournalEntryIterator:获取Journal所有元素;
  • getCheckpointName:获取checkpoint class类名称;
  • writeToCheckpoint:长久化写入所有状态的checkpoint;
  • restoreFromCheckpoint:checkpoint复原;
  • processJournalEntry:解决指定的Journal元素,Journal解决外围办法;
  • resetState:重置Journal状态;
  • applyAndJournal:对Journal元素执行和利用Journal操作。

1.2 UnderFileSystem

Alluxio治理和适配数据在底层各个存储系统执行操作,实现UnderFileSystem接口的底层存储能够作为Alluxio的非法UFS。

1.2.1. 类图

UnderFileSystem的类图如下所示,次要由抽象类BaseUnderFileSystem实现,而BaseUnderFileSystem下次要分为两大类:

  • ConsistentUnderFileSystem:具备一致性的UFS实现,次要包含:LocalUnderFileSystem、HdfsUnderFileSystem、CephFSUnderFileSystem等;
  • ObjectUnderFileSystem:对象存储UFS实现,次要包含:S3AUnderFileSystem、COSUnderFileSystem、OSSUnderFileSystem等。

1.2.2. 接口办法

在UnderFileSystem中有两类接口API:

  • 存储系统通用操作,如:创立/删除文件,文件重命名;
  • 解决数据长久化最终一致性的操作(eventual consistency),如:解决当AlluxioMaster保护元数据胜利时,但执行UFS操作失败的问题。

1.2.2.1. 存储系统操作

  • create:指定path门路,在UFS中创立数据文件(父目录不存在会主动创立),可通过CreateOptions设置创立文件的用户组和ACL策略;
  • deleteDirectory:删除指定目录,可通过DeleteOptions设置删除的策略和遍历形式;
  • deleteFile:删除指定文件;
  • getDirectoryStatus:获取UFS指定目录状态,需传入已存在的目录文件;
  • getFileStatus:获取UFS指定文件状态;
  • getStatus:获取UFS状态,可指定目录或文件;
  • isDirectory:判断指定门路在UFS是否是目录;
  • open:关上UFS上指定文件,可通过OpenOptions设置文件关上参数;
  • renameDirectory:UFS上指定目录重命名;
  • renameFile:UFS上指定文件重命名;
  • exists:判断指定的文件或目录是否存在;
  • getAclPair:获取UFS的ACL策略;
  • getBlockSizeByte:获取指定目录下UFS的每个Block文件大小,单位bytes;
  • getFileLocations:获取指定门路在UFS关联的存储Location列表;
  • getFingerprint:计算并获取指定门路的文件标识(指纹),文件标识(指纹)的计算必须是确定且不可变的;
  • getOperationMode:获取底层UFS的操作模式,Alluxio的底层存储能够由多种类型UFS组成,该办法用来确定底层UFS的操作模式,例子:底层UFS为:hdfs://ns1/,hdfs://ns2/,则返回后果:{hdfs://ns1/:NO_ACCESS,hdfs://ns2/:READ_WRITE};
  • getPhysicalStores:获取所有UFS类型,包含数据结构和对应权限getSpace:
  • 通过制订SpaceType获取UFS中指定门路的存储空间信息,SpaceType包含:SPACE_TOTAL、SPACE_FREE、SPACE_USED;
  • getUnderFSType:获取UFS类型,如hdfs;
  • isFile:判断文件文件在UFS是否存在;
  • isObjectStorage:判断UFS是否是对象存储;
  • isSeekable:判断UFS是否反对搜寻;
  • listStatus:指定UFS门路下的文件状态列表,该列表不保障程序,可通过ListOptions设置是否反对遍历;
  • mkdirs:在UFS上创立指定目录,可通过MkdirsOptions设置目录创立规定,如ACL和递归父目录创立;
  • setAclEntries:指定门路,设置UFS的ALC策略汇合;
  • setMode:指定门路,设置UFS ALC Mode,如0777;
  • setOwner:指定门路,设置UFS ALC的user和group;
  • supportsFlush:判断UFS是否反对文件Flush;
  • supportsActiveSync:判断UFS是否反对ActiveSync(拜访外部文件共享),ActiveSync相干的接口包含:getActiveSyncInfo、startSync、stopSync、startActiveSyncPolling、stopActiveSyncPolling。

1.2.2.2. 最终一致性操作

  • createNonexistingFile:创立不存在的文件,若文件存在,则退出;
  • deleteExistingDirectory:删除指定目录;
  • deleteExistingFile:删除指定文件;
  • getExistingDirectoryStatus:获取UFS指定目录状态;
  • getExistingFileStatus:获取UFS指定文件状态;
  • getExistingStatus:获取UFS状态,可指定目录或文件;
  • isExistingDirectory:判断指定门路在UFS是否是目录;
  • openExistingFile:关上UFS上指定文件,可通过OpenOptions设置文件关上参数;
  • renameRenamableDirectory:UFS上指定目录重命名;
  • renameRenamableFile:UFS上指定文件重命名。

1.2.2.3. 其余操作

  • cleanup:当数据文件创建时没有失常的胜利完结或被摈弃解决,则对底层UFS清理;
  • connectFromMaster:指定AlluxioMaster主机地址,建设指定Master与UFS连贯;
  • connectFromWorker:指定AlluxioWorker主机地址,建设指定Worker与UFS连贯;
  • resolveUri:给定Alluxio根底URI和门路,返回拼装后的Alluxio门路。

1.3 UfsManager

Alluxio中对底层UFS(Under FileSystem)治理操作的通用对立接口类定义,定义的接口办法包含:

  • addMount:UFS挂载到Alluxio,该办法仅针对Alluxio解决,不对底层UFS操作;
  • removeMount:移除Alluxio中的UFS挂载;
  • get:依据mountId获取挂载的UFS信息;
  • getRoot:获取Alluxio上挂载的根目录信息;
  • getJournal:获取Journal的Location地址;

其中AbstractUfsManager抽象类对UFS治理接口进行根本实现。

1.3.1. UfsClient

保护底层UFS的Client连贯信息和其余相干UFS的形容信息,基于UfsClient实现Alluxio对UnderFileSystem的操作。

1.4 BlockClient

BlockClient抽象类定义调用方对Block根本的读写操作,其类图示意如下,次要包含:BlockWriter、BlockReader。

读写Block的定义的办法类:

1.5 DefaultFileSystemMasterMaster

服务保护所有FileSystem(文件系统)元数据变更的治理操作,DefaultFileSystemMaster外部基于InodeTree保护文件系统构造,并将InodeTree长久化到日志文件(journal);除此之外,其外部保护多个治理操作,如:InodeLockManager、MasterUfsManager、MountTable等;备注:DefaultFil1.5. DefaultFileSystemMastereSystemMaster的启动start办法详情后面所述内容。

1.5.1. 接口办法

FileSystemMaster接口定义master中针对FS的操作方法,DefaultFileSystemMaster继承FileSystemMaster,其接口办法次要包含:

  • cleanupUfs:周期性清理底层UFS;
  • getFileId:基于Alluxio门路URI 获取文件ID,若文件不缓存Alluxio,则调用UFS获取;
  • getFileInfo:依据文件ID获取文件详情,该接口仅对外部服务凋谢,不对用户间接凋谢;
  • getPersistenceState:依据文件ID,获取该文件的长久化状态;
  • listStatus:指定Alluxio门路,获取文件状态列表;
  • checkAccess:校验指定Alluxio门路的权限;
  • checkConsistency:校验指定Alluxio门路的文件数据一致性;
  • completeFile:敞开/完结指定Alluxio门路,敞开后,则该文件不可写;
  • createFile:基于指定Alluxio文件门路,创立文件FileInfo;
  • getNewBlockIdForFile:指定Alluxio文件门路,获取下个待操作Block文件的Block ID;
  • getMountPointInfoSummary:获取Alluxio中mount(挂载)门路的快照信息;
  • getDisplayMountPointInfo:获取Alluxio用户展现的Mount信息;
  • delete:删除指定Alluxio门路的文件元信息;
  • getFileBlockInfoList:获取指定Alluxio门路下的所有Block列表信息;
  • getInAlluxioFiles:获取Alluxio中所有的文件列表门路;
  • getInMemoryFiles:获取Alluxio中所有缓存在内存的文件列表门路;
  • createDirectory:创立Alluxio对应的目录,并返回目录ID;
  • rename:Alluxio中文件重命名操作的元数据变更;
  • free:指定Alluxio目录下,开释所有alluxio缓存的block文件信息,反对目录下遍历的文件开释;
  • getPath:依据指定FileId获取Alluxio URI门路;
  • getPinIdList:获取被固定的inode id列表;
  • getUfsAddress:获取master所需的UFS地址;
  • getUfsInfo:依据挂载ID获取对应UFS信息;
  • getLostFiles:获取worker节点失落的文件列表;
  • mount:外围操作,将UFS门路挂载在Alluxio指定门路;
  • unmount:勾销指定Alluxio门路上的UFS挂载;
  • updateMount:更新指定Alluxio门路挂载信息;
  • setAcl:设置Alluxio门路ACL;
  • updateUfsMode:设置底层UFS Mode;
  • validateInodeBlocks:验证inode block信息是否具备完整性;
  • workerHeartbeat:指定worker ID,告诉对应worker进行文件的存储长久化;
  • getWorkerInfoList:获取所有worker节点信息列表;
  • getTimeSeries:获取alluxio master中元数据存储的工夫版本信息;

1.6 DefaultBlockWorker

1.6.1. 接口

Worker Server针对Block的治理操作,实现接口类:BlockWorker,其接口办法次要包含:

  • getWorkerId:获取worker id;
  • abortBlock:抛弃session中长期创立的block文件;
  • accessBlock:拜访指定session和block id下的block信息,该办法可能会在block缓存开释被拜访;
  • commitBlock:提交block到Alluxio的治理空间,待提交的block必须是长期的,当block提交胜利之前,block是不反对读写访问;
  • commitBlockInUfs:将block提交到UFS长久化;
  • createBlock:在Alluxio治理空间创立block,基于BlockWriter类可对block进行写操作,在block commit提交之前都是长期的;
  • getTempBlockMeta:获取长期block元数据;
  • createBlockWriter:基于session和block id创立BlockWriter,用于block的写操作;
  • getReport:获取worker与master周期性心跳的报告;
  • getStoreMeta:获取整个block存储的元数据信息,包含block中每个存储目录映射和每层存储的容量状况;
  • getStoreMetaFull:与getStoreMeta类似,但包含残缺的blockId列表,获取代价更高;getVolatileBlockMeta:依据指定blockId获取block元数据信息;
  • lockBlock:对block进行加锁操作;
  • moveBlock:将block从以后存储Location挪动到指标Location;
  • 以后仅反对分层存储挪动;
  • moveBlockToMedium:block挪动并指定对应的存储介质类型(MediumType);
  • createBlockReader:创立BlockReader进行Block读操作,可读取Alluxio Block和 UFS Block;createUfsBlockReader:创立BlockReader进行UFS Block读操作;
  • removeBlock:从Allxuio治理空间移除Block;
  • requestSpace:为指定block获取存储空间,该block必须为长期block;unlockBlock:对block去除锁操作;
  • asyncCache:提交异步缓存申请进行异步的缓存治理;
  • updatePinList:更新底层block存储占用的pin列表;getFileInfo:基于指定file id获取文件信息。

1.6.2. TieredBlockStore

BlockStore定义block的存储接口,用于治理本地block存储,其接口外围目标:具体实现BlockWorker中定义的办法类,接口如下:

TieredBlockStore是BlockStore的实现类,实现了Alluxio中外围性能点:分层存储,使得对应的存储对象可基于block模式进行分层存储管理,并对外裸露提供API进行block治理。TieredBlockStore中内置调配算法确定新block的存取和旧block的开释,基于BlockMetadataManager保护分层存储状态、block读写锁治理等元数据信息。

TieredBlockStore是线程平安的,所有基于block级别的操作都须要调用BlockLockManager来获取对应的读写锁,保障该block下的元数据操作和I/O操作是线程平安的。任何block的元数据操作都须要基于BlockMetadataManager来获取元数据的ReentrantReadWriteLock 读写锁。

Allocator接口定义Alluxio中数据管理的调配策略,接口办法:allocateBlockWithView,目前外部有三种实现类:

  • RoundRobinAllocator:基于round-robin轮训调配,默认从最高层开始调配,当最高层存储空间有余则会到下一层,该调配策略不反对指定存储具体的分层。
  • MaxFreeAllocator:调配到存储中最大残余空间,当没有指定具体存储分层,默认从最高层开始调配;
  • GreedyAllocator:返回满足存储block大小的第一层存储空间,是存储调配的示例类;

其中BlockStoreLocation定义存储block的location地址和分层信息,形容了三个存储维度:存储层别名、对应存储层目录地址,存储层介质信息。

1.6.2.1. createBlock

当存在可用空间(space)时,基于block调配算法创立长期block;特地的:创立block不会触发其余block的销毁开释,通过BlockMetadataAllocatorView 获取只读的Block元数据信息,为Allocator调度提供数据起源,Allocator调配调度后返回StorageDirView对象并创立TempBlockMeta 并通过BlockMetadataManager治理。存储调配后的元数据会基于createBlockFile办法长久化到Block元文件。

Allocator接口定义Alluxio中数据管理的调配策略,接口办法:allocateBlockWithView,目前外部有三种实现类:

RoundRobinAllocator:基于round-robin轮询调配,默认从最高层开始调配,当最高层存储空间有余则会到下一层,该调配策略不反对指定存储具体的分层。
MaxFreeAllocator:调配到存储中最大残余空间,当没有指定具体存储分层,默认从最高层开始调配;
GreedyAllocator:返回满足存储block大小的第一层存储空间,是存储调配的示例类;

其中BlockStoreLocation定义存储block的location地址和分层信息,形容了三个存储维度:存储层别名、对应存储层目录地址,存储层介质信息。

1.6.2.2. freeSpace

同步办法执行Block缓存存储空间执行立即删除开释,当所有存储分层的空间开释操作完结后能力反对新Block创立。依据BlockMetadataEvictorView 获取Block存储中可移除的Block信息。判断以后缓存存储中是否满足最小间断空间和最小可用空间,若同时满足,则不进行后续空间清理操作;若不满足,则遍历Block信息,判断是否可清理,若能够清理,则删除对应的Block文件及元数据,通过BlockStoreEventListener事件监听器同步Block开释操作。

BlockStoreEventListener 监听BlockStore中元数据变动胜利完结的触发事件,次要包含的接口办法类:

  • onAccessBlock:拜访Block 事件触发;
  • onAbortBlock:清理和开释长期Block 事件触发;
  • onCommitBlock:提交长期Block并关联Block的存储信息BlockStoreLocation 事件触发;
  • onMoveBlockByClient:基于Client挪动Block的BlockStoreLocation 事件触发;
  • onMoveBlockByWorker:基于Worker挪动Block的BlockStoreLocation 事件触发;
  • onRemoveBlockByClient:基于Client移除并开释Block的BlockStoreLocation 事件触发;
  • onRemoveBlock:移除并开释Block 事件触发;onBlockLost:Block失落 事件触发;
  • onStorageLost:存储目录失落 事件触发。

1.7 PlanDefinition

Alluxio中内置轻量级角度零碎的Job执行打算定义,有两个外围局部,1. PlanDefinition#selectExecutors:该办法在Master节点调用,用于抉择执行工作的AlluxioJobWorker,2.PlanDefinition#runTask:在JobWorker中运行指定作业打算。PlanDefinition 次要包含的作业定义实现有:

MoveDefinition:在FileSystemMaster校验层级上触发Block的挪动操作;

  • ReplicateDefinition:在FileSystemMaster校验层级上触发Block的复制操作;
  • EvictDefinition:在FileSystemMaster校验层级上触发Block开释操作;
  • PersistDefinition:将Alluxio Block缓存存储长久化到底层UFS;
  • CompactDefinition:在指定目录降落结构化表的数据文件进行压缩;
  • MigrateDefinition:Block挪动,源和指标Block能够挂载在不同的UFS节点;
  • LoadDefinition:实现简略的Block文件的Load操作。

1.7.1. TaskExecutorManager

治理JobWorker Task执行器,真正的执行工作通过线程池调用TaskExecutor#run,而TaskExecutor#run底层通过PlanDefinition#runTask 实现;同时TaskExecutorManager外部也治理Task的执行容量和Task生命周期治理,如:获取执行的线程池,对工作执行限流/解除限流,工作启停。

Part 2 Block读写操作

2.1 读操作

BlockWorker RPC服务提供的客户端的读操作,大抵流程如下:

  • BlockWorkerClientServiceHandler.readBlock办法定义Block读取,默认创立申请参数StreamObserverresponseObserver 创立 CallStreamObserver;若反对零拷贝,则应用DataMessageServerStreamObserver
  • 基于CallStreamObserver 创立BlockReadHandler,并调用BlockReadHandler#onReady 开启数据读取,基于线程池提交创立DataReader线程执行;
  • DataReader是Alluxio用于I/O数据读取的线程类,封装了外围的Alluxio读操作逻辑,(1).获取Alluxio数据输出流DataBuffer;(2)调用CallStreamObserver.onNext触发和监听数据流读取;
  • DataReader获取DataBuffer是整个读取解决的外围逻辑,判断数据读取起源:Local、UFS,是否进行Block挪动实现短路读;
  • 创立关上Block,若申请须要减速(promote=true)则操作BlockWorker.moveBlock,将Block挪动到存储更高层;
  • 调用DefaultBlockWorker#createBlockReader 创立BlockReader,判断本地Worker是否能够间接拜访,若反对则返回LocalFileBlockReader;若为UFS中,则调用UnderFileSystemBlockReader;- 调用BlockReader.transferTo 读取数据,并将I/O封装为NettyDataBuffer返回。

2.1.1. UnderFileSystemBlockReaderUnderFileSystemBlockReader 类实现间接从UFS读取并将读取的信息缓存到读取的Worker Block中,大抵流程如下:

  • UfsInputStreamCache.acquire 依据ufs、门路、blockId获取输出流InputStream,若InputStream在缓存中间接获取,若不存在,则依据ufs.openExistingFile 获取底层UFS的文件输出流InputStream;
  • 获取并更新BlockWriter,判断是否存在有对应Block存在,不存在则调用BlockStore.createBlock新建长期Block,并返回对应BlockWriter;
  • 依据第一步骤获取的输出流InputStream和参数offset读取文件,读取的数据:(1).通过BlockWriter写入Block缓存对应Worker;(2).返回调用方读取信息。

备注:

  • LocalFileBlockReader:基于FileChannel.map办法的I/O操作读取文本文件信息
  • RemoteBlockReader:基于远端的Worker(非本地Worker)读取,暂不反对;
  • DelegatingBlockReader依据不同的应用场景,判断和抉择应用的BlockReader实现类。

2.1.2. ShortCircuitBlockReadHandler

ShortCircuitBlockReadHandler类是RPC服务实现提供短路读能力,首先Grpc的StreamObserver(观察者模式),一次onNext调用阐明一次音讯读取,大抵的执行流程:

  • 依据OpenLocalBlockRequest获取是否进行减速读取,若减速(promote=true)则调用BlockWorker.moveBlock将存储挪动更高层存储分层;
  • 调用BlockWorker.lockBlock 获取Block的读写操作锁,最初BlockWorker.accessBlock获取拜访Block

2.2 写操作

  • BlockWorker RPC服务提供的客户端的写操作,大抵流程如下:
  • BlockWorkerClientServiceHandler.writeBlock办法定义Block写入,默认创立申请参数StreamObserverresponseObserver 创立 CallStreamObserver;若反对零拷贝,则应用 BlockWorkerClientServiceHandler;
  • 基于CallStreamObserver 创立DelegationWriteHandler,并调用DelegationWriteHandler#onCancel敞开数据写操作;调用onNext办法进行数据流监听写操作;
  • DelegationWriteHandler 依据申请Command类型获取对应的AbstractWriteHandler 实现类:
  • ALLUXIO_BLOCK:BlockWriteHandler,数据仅写入Alluxio Block,基于BlockWriter实现写操作;
  • UFS_FILE:UfsFileWriteHandler,数据仅写入UFS,基于UFS Client创立目录文件并进行I/O操作;
  • UFS_FALLBACK_BLOCK:UfsFallbackBlockWriteHandler,先基于BlockWriteHandler写入Alluxio Block再写入UFS;

AbstractWriteHandler 抽象类关系如下:

2.2.1. LocalFileBlockWriter

基于本地Worker写入Block文件信息,调用FileChannel.map

2.2.2. ShortCircuitBlockWriteHandler

ShortCircuitBlockWriterHandler实现短路读的创立本地Block能力,基于onNext调用,大抵执行流程:

若仅申请空间资源,则基于BlockWorker.requestSpace 获取Block创立的申请空间资源;
若需创立长期Block,则调用BlockWorker.createBlock创立Block并返回对应Block门路。

Part 3 Catalog治理

AlluxioCatalog进行Alluxio中Catalog治理对象,封装和保护了Alluxio中注册的DB信息及各个DB下的Table等元数据信息,其根本的办法操作如下,包含:获取数据库db信息,db元数据同步,db绑定/解绑等操作。

attachDatabase:将绑定的db元数据信息保护在内存中并同步长久化到Journal中;
syncDatabase:会基于底层udb获取最新元数据database信息,如Hive则调用HMS客户端接口办法IMetaStoreClient#getDatabase获取数据库信息。

Part 4 Client操作

4.1 Client

Client接口形象定义Alluxio中Client操作,其继承和实现类如下所示,封装了对接各个组件的RPC接口:

FileSystemMasterClient:封装 FileSystemMasterClientServiceHandler 相干RPC调用,进行元数据管理操作
BlockMasterClient:封装 BlockMasterClientServiceHandler相干RPC调用,进行Block治理操作
TableMasterClient:封装 TableMasterClientServiceHandler 相干RPC调用,进行Alluxio Table Catalog
治理操作MetaMasterClient:封装 MetaMasterClientServiceHandler 相干RPC调用
MetaMasterConfigClient:封装 MetaMasterConfigurationServiceHandler 相干RPC调用
JobMasterClient:封装JobMasterClientServiceHandler 相干RPC调用,进行Alluxio Job的调用操作;

4.1.1. FileSystem

Client中定义的文件系统操作接口类,用于元数据管理和数据管理,用户可依据其实现类BaseFileSystem 扩大Client文件操作行为。

FileSystem 中定义的接口办法次要包含以下几类:

  • checkAccess:查看指定门路权限;
  • createDirectory:基于AlluxioURI 创立文件目录;
  • createFile:基于AlluxioURI 创立数据文件;
  • delete:基于AlluxioURI 删除指定文件/目录;
  • exists:基于AlluxioURI判断指定文件/目录是否存在;
  • free:基于AlluxioURI 开释Alluxio空间,但不删除UFS数据文件了;
  • listStatus:列出AlluxioURI文件/目录信息;
  • mount/updateMount/unmount:挂载/更新/勾销挂载指定AlluxioURI目录;
  • openFile:关上并读取AlluxioURI文件输出流;
  • persist:将Alluxio中缓存的数据异步长久化底层UFS;
  • rename:Alluxio文件重命名。

4.1.2. FileSystemContext

保护Alluxio基于Client进行文件系统操作的上下文信息,通常的,一个Client JVM过程会应用同个FileSystem连贯Alluxio,因而Client对象会在不同线程中共享。FileSystemContext 只有当用户须要个性化配置和认证时才被创立,线程共享的Client会针对FileSystemContext保护独立的线程空间,FileSystemContext 线程不共享(线程平安)会减少Client连贯的资源应用,因而当用户进行Alluxio操作后,须要敞开FileSystemContext开释资源。

4.1.3. FileInStream/FileOutStream

Client中定义基于Alluxio文件操作的输出/输入流,如下所示:

  • 输入流:AlluxioFileOutStream,Alluxio输入流写入,底层操作BlockOutStream
  • 输出流:AlluxioFileInStream:Alluxio输出流读取,封装了本地/远端节点数据读取,或者间接基于底层UFS;底层操作BlockInStream,LocalCacheFileInStream,AlluxioHdfsInputStream

4.2 AbstractShell

Client的性能能够通过Shell对外提供操作,AbstractShell抽象类定义Alluxio中Shell命令操作,其继承子类包含:

  • FileSystemShell:Alluxio Shell文件操作入口类;
  • FileSystemAdminShell:Alluxio文件系统治理操作;
  • CollectInfo:Alluxio中从所有Woker节点采集信息命令;
  • TableShell:Alluxio表治理操作;
  • JobShell:Alluxio执行job治理操作。

4.2.1. CatCommand

以CatCommand为例,简述Alluxio Client进行文件读取的大抵流程如:

  • FileSystemShell接管shell命令,执行"cat"关上文件操作,调用CatCommand.run命令,shell命令反对正则和多目录,对每个指定目录执行自定义实现的runPlainPath操作;
  • CatCommand#runPlainPath 办法通过getStatus判断文件类型,若为目录则退出,若为文件则基于FileSystem关上文件获取客户端输出流对象FileInStream(AlluxioFileInStream);
  • 基于AlluxioFileInStream#read读取文件内容,URIStatus保护Alluxio中目录和文件元数据快照信息,基于URIStatus获取指定Alluxio文件对应Block信息,通过Client AlluxioBlockStore中保护的Block信息获取BlockInStream(Block输出流);
  • 基于BlockInStream调用输出流读取操作,底层基于Block的数据读取接口DataReader实现,基于DataReader读取Block详情下述的Block读操作。

4.2.2. TouchCommand

  • 以TouchCommand为例,简述Alluxio Client进行文件写入的大抵流程如:
  • FileSystemShell接管shell命令,执行"touch"关上文件操作,调用TouchCommand.run命令,shell命令反对正则和多目录,对每个指定目录执行自定义实现的runPlainPath操作;
  • TouchCommand#runPlainPath 办法调用FileSystem.createFile 创立文件并在完结后敞开该连贯;
  • FileSystem.createFile的办法详解如下:
  • 基于FileSystemMasterClient获取FileSystemMasterClientServiceHandler 近程的RPC连贯信息;
  • 基于FileSystemMasterClient 调用RPC接口创立数据文件(createFile),将新建Alluxio文件元数据信息同步Alluxio Master;
  • FileSystem新建Client端的Alluxio文件输入流对象:AlluxioFileOutStream,其底层调用Block的DataWriter对象进行文件解决;
  • 输入流实现后,执行AlluxioFileOutStream#close办法,调用FileSystemMasterClient#completeFile 判断是否已执行实现,最终基于RPC接口实现completeFile;

Part 5 轻量级调度

Alluxio外部基于AlluxioJobMaster和AlluxioJobWoker实现轻量级内置的Alluxio操作调度,Master负责作业的调度治理,而Worker真正执行作业操作。

5.1 调度治理

由前文AlluxioJobMaster启动流程可知,AlluxioJobMaster在启动时会触发JobMaster Server启动,JobMaster外部保护执行打算(plan)的治理追踪器:PlanTracker,用于创立、移除、拜访工作作业汇合,每个作业都有对应的PlanCoordinator用于分布式作业执行协调。内部服务可通过HTTP和RPC形式调用JobMaster.run 办法依据作业配置(JobConfig)启动并进行作业调度(同步/线程平安的)。JobConfig 定义作业配置接口,分为两类:PlanConfig(单作业执行)、WorkflowConfig(一组作业流执行)。

JobMaster中作业调度治理的大抵流程如下:

  • 内部接口可调用JobMaster.run办法触发作业执行,以Plan作业类型为例,调用PlanTracker执行run办法;
  • PlanTracker先校验并移除已实现的作业,并基于PlanCoordinator创立新的作业实例并启动该作业实例;
  • PlanCoordinator作业启动流程:
  • 基于JobConfig获取对应的PlanDefinition;
  • 依据可用的Worker列表和PlanDefinition,调用selectExecutors办法获取待执行作业Worker列表;
  • 调用CommandManager提交作业,将作业及待执行作业worker列表信息保护在内存队列中;
  • 最初,Job Master和Job Worker节点通过RPC心跳检测,下发具体的作业信息给Worker执行。

5.2 作业执行

由前文AlluxioJobWorker启动流程可知,AlluxioJobWorker启动时会触发心跳检测线程CommandHandlingExecutor,对接管到的作业执行调度解决,每个作业启动一个线程执行,作业执行大抵流程如下:

  • CommandHandlingExecutor线程启动与JobMaster进行心跳检测,基于JobMasterClient.heartbeat办法获取所有的待执行作业列表;
  • 遍历待执行作业列表,从线程池调用CommandHandler.run线程类执行作业调度,包含的作业类型:启动、勾销、注册作业;
  • CommandHandler启动作业会调用TaskExecutorManager 执行作业,以Future执行TaskExecutor 进行线程级别作业调度;TaskExecutor真正执行作业调度:
  • 对应作业参数进行反序列化操作;
  • 依据PlanDefinitionRegistry 获取执行Job的PlanDefinition并调动runTask执行作业;

以PersistDefinition为例,大抵阐明Job Executor操作,将Alluxio Block存储长久化到底层UFS:

  • 获取Alluxio的数据存储URI,读取对应的数据输出流in;
  • 获取指定的UFS指标门路,依据UfsClient判断该门路是否存在,若不存在则创立,并基于UnderFileSystem创立输入流out;
  • 依据I/O操作工具类,将数据从数据流拷贝输入流,长久化到UFS。

想要获取更多乏味有料的【流动信息】【技术文章】【大咖观点】,请关注[[Alluxio智库]](https://page.ma.scrmtech.com/...):