首页 文章 精选 留言 我的

精选列表

搜索[开源游戏引擎],共10000篇文章
优秀的个人博客,低调大师

JeecgBoot 3.4.3-GA 版本发布,开源免费的企业级低代码平台

项目介绍 JeecgBoot 是一款企业级的低代码平台!前后端分离架构 SpringBoot,SpringCloud,Ant Design&Vue3,Mybatis-plus,Shiro,JWT 支持微服务。强大的代码生成器让前后端代码一键生成!JeecgBoot 引领低代码开发模式 (OnlineCoding-> 代码生成 -> 手工 MERGE), 帮助解决 Java 项目 70% 的重复工作,让开发更多关注业务。既能快速提高效率,节省成本,同时又不失灵活性! 当前版本:3.4.3-GA | 2022-10-31 源码下载 后端:https://github.com/jeecgboot/jeecg-boot 前端:https://github.com/jeecgboot/jeecgboot-vue3 升级日志 又升级了,重要的事情说三遍 ! 升级 Online 前端依赖,解决了几个很棒的功能!!! 升级低代码功能 online 表单,支持关联记录和他表字段控件 online 表单,支持三级联动控件 online 代码生成,支持选择那种前端代码生成(vue3\vue2\vue3 原生) online 报表查询,支持字典下拉搜索控件 online 报表查询,字符串类型默认支持模糊查询,不需要输入 * 升级积木报表到最新版 修复严重 Bug 解决点击 online 功能测试,重新加载首页问题 issues/I5XBZF 访问 online 表单开发菜单,提示 token 失效 #4132 解决带参数的路由菜单点击右上角刷新报错 用户添加按钮看不见问题 online 代码生成选择 Vue3 风格,生成的代码却是 vue2 的 #4151 GUI 代码生成器报错 #4150 vue3 版本,online 在线表单,新增页面无法显示联动控件 #4008 解决标签页样式更多下拉显示样式错乱问题 专项功能介绍 —— 关联记录和他表字段 一、关联记录介绍 一个项目下的多张业务表存储不同的业务对象数据,不同业务对象之间可能存在一定的关联。 以《客户信息》、《客户联系人》 为例,两表分别存储着两个业务对象数据, 但一个客户公司可能有多个联系人, 一个联系人可能是个体,也能隶属某个公司。如果独立管理这两种数据,不仅会重复录入数据,在查看相关的数据时操作上也会断层。 如果设置了关联关系,当创建联系人记录时,只需关联到《客户信息》中的已有客户记录即可,无需另外录入,再查看时,也能快速查看客户公司的详细信息。 1、效果展示 在“客户信息”表中添加联系人 关联多条其他记录效果(一个客户有多个联系人)— 卡片效果 关联多条其他记录效果(一个客户有多个联系人)— 下拉效果 2. 配置方式 2.1 选择控件类型 新增字段“联系人”后,在“页面属性”-“控件类型”中选择“关联记录” 2.2 配置关联记录 点击“页面属性”-“个性配置”中“联系人”的“打开配置” 字段描述:字段的显示文本 —“联系人” 关联表:可选择 online 表单中的其他表单作为关联表 —“客户联系人”表 标题字段:选择关联表中的某个字段作为表单及列表中的展示字段 —“客户联系人”中的“姓名”字段 封面图片:可选择关联表中的图片作为关联记录的封面图片展示,可为空 其他字段:选择关联表中的字段作为其他展示字段信息,可选多个 —“客户联系人”中“手机号”、“邮箱”、“职位”字段 显示方式:支持卡片、下拉框方式 是否多选:可配置单选或多选 配置完成预览即可看到效果。 二、他表字段介绍 他表字段是关联记录的扩展, 可以实现引用其他表的记录字段内容,并将他表记录的字段内容存储在本表记录中并保持同步,或仅在打开记录显示在本表记录中。 场景举例: 一个联系人关联了所属客户,需要将客户的公司地址信息直接显示为本表字段。 由于 “他表字段” 的使用必须依附于 “关联记录” ,请先了解【关联记录】 的使用。 关联一条他表记录效果(一个联系人只能属于一个客户) 2. 配置方式 2.1 选择控件类型 新增字段“所属客户”、“公司地址”后,在“页面属性”-“控件类型”中分别选择为“关联记录”、“他表字段” 2.2 配置关联记录 字段描述:字段的显示文本 —“所属客户” 关联表:可选择 online 表单中的其他表单作为关联表 —“客户信息”表 标题字段:选择关联表中的某个字段作为表单及列表中的展示字段 —“客户信息”表中的“公司全称” 封面图片:选择关联表中图片作为关联记录的封面图片展示,可为空 其他字段:选择关联表中的字段作为其他展示字段信息,可选多个 —“客户信息”表中的“地区”、“客户地址”、“所属行业”(此字段可用于“他表字段”中“显示字段”使用) 显示方式:支持卡片、下拉框方式 是否多选:可配置单选或多选 2.2 配置他表字段 点击“页面属性”-“个性配置”中“公司地址”的“打开配置” 字段描述:字段的显示文本 —“公司地址” 关联记录:表单中配置的“关联记录”均可选择 — 选择上一步配置的“所属客户” 显示字段:选择“关联记录”中配置的“其他字段”,只可选择一个显示 — 关联记录中的“地区”、“客户地址”、“所属行业”三选一 配置完成后,保存预览即可看到效果。

优秀的个人博客,低调大师

英特尔的开源 OpenGL 驱动程序增加对“protected content”支持

科技媒体Phoronix 指出,新合并到Mesa 22.3中的英特 "Iris"Gallium3D 驱动程序中的"protected content"支持与EGL_EXT_protected_content 扩展进行了结合。 EGL_EXT_protected_content 允许创建 protected contexts,进而创建受"protected"的 surfaces 和 EGL 图像,且只能在 protected contexts 中使用。这可以用于数字版权管理和其他具有安全意识的场景。到目前为止,EGL_EXT_protected_content 主要被 Android应用所利用,并且 EGL 扩展也是由移动 SoC 供应商发起。 最新合并的十个补丁集为英特尔 Iris Gallium3D 驱动程序提供了 protected content 支持,以及必要的 Gallium3D 状态跟踪器和 EGL 基础架构更改。从内核驱动程序来看,此 Iris protected content支持依赖于 I915_GEM_CREATE_EXT_PROTECTED_CONTENT。反过来,其又取决于 Intel Gen12 和更高版本显卡的Protected Xe Path (PXP)。 Intel Protected Xe Path 允许 protected/encrypted 的对象。对于那些关心数字权限管理和“protected”配置的人来说,一些 PXP 操作也涉及 Intel Management Engine (ME),因此可以在内核构建时使用 CONFIG_DRM_I915_PXPKconfig 选项禁用该支持。目前,英特尔 PXP 支持已经在 Linux 5.16 中被合并。 此外,Vulkan 1.1 也提供 protected content 支持,但此次的 Mesa 用户空间变化只关于 Iris Gallium3D(OpenGL)的支持。感兴趣的用户可以通过推送到 Mesa 22.3 的近千行新代码的合并请求了解更多信息。

优秀的个人博客,低调大师

ShopWind 开源电商系统 V3.4.3 更新,多人拼团重要修复

更新内容 【新增】类似拼多多两人拼团,三人成团功能 【新增】数据采集模块支持淘宝天猫京东拼多多阿里巴巴商品源 【新增】后台增加自提订单列表、订单详情页显示自提门店地址 【新增】后台增加确认收货、关闭订单等时效设置 【优化】第三方账号登录插件 【优化】我的钱包模块 【优化】移动端视频播放 【优化】商品评价页下拉刷新问题 【优化】商品评价页面数据显示 【优化】商品规格字段 【优化】微信公众号首页分享到朋友圈(好友) 【修复】拼图价格显示问题 【修复】自动成团时间不准确的问题 【修复】微信公众号详情页等分享到朋友圈(好友)无法显示标题和图片的问题 【修复】社区团购模块选择自提点时页面空白问题 随着拼多多平台的火爆,拼团也成了电商系统必不可少促销活动方式。ShopWind 移动端增加了拼团功能模块,完美融合了拼团玩法,可以两人成团,三人成团,设置拼团优惠价格,超时自动成团等功能。ShopWind 拼团插件的拼团商品、成团人数由商家发布,发布后的商品在拼团频道中展示。消费者可在拼团频道找到物美价廉的商品,通过发起拼团或参与拼团的形式去进行购物,不仅让商家能够走量赚钱,也能够让买家们花更少的钱买到自己想要的东西。多人拼团模块流程以及更新如下: 1、消费者在移动端首页,点击拼团频道,进入拼团频道选择喜欢的商品 2、点击去开团,进入团购详情页面,发起拼单,进入购买流程完成支付。支付完成后订单状态变为待成团 3、其他消费者进入该拼团商品中,页面展示出正在拼团的人。消费者可以点击去拼单,进入支付流程,完成支付后且满足拼团人数后,订单状态变为待发货。 4、拼单操作完成,接下来商家走正常的发货流程。 ShopWind APP 和微信小程序均可以测试体验拼团功能。打开微信搜索 "shopwind" 或扫码下面二维码即可进入小程序体验拼团功能。 ShopWind 官网 官网网址:https://www.shopwind.net 开发文档:https://developer.shopwind.net API 接口文档:http://docs.shopwind.net 开发者社区:https://forum.shopwind.net PC 体验 前台体验:http://test.shopwind.net买家测试账号:buyer 密码:123456 支付密码:123456 后台体验:http://test.shopwind.net/admin平台管理员账号:admin 密码:123456 商家体验:http://test.shopwind.net/seller/login.html商家测试账号:seller 密码:123456 移动端体验 页面展示 首页 / 用户中心 / 分类页 产品详情 / 购物车 / 下单页 平台后台管理 丰富的功能插件 可视化模板编辑 / DIY 页面布局

优秀的个人博客,低调大师

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

回顾 在《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 DefaultFileSystemMaster Master服务维护所有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. UnderFileSystemBlockReader UnderFileSystemBlockReader 类实现直接从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智库]:

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册