首页 文章 精选 留言 我的

精选列表

搜索[API集成],共10000篇文章
优秀的个人博客,低调大师

MapReduce源码分析之新API作业提交(二):连接集群

MapReduce作业提交时连接集群是通过Job的connect()方法实现的,它实际上是构造集群Cluster实例cluster,代码如下: private synchronized void connect() throws IOException, InterruptedException, ClassNotFoundException { // 如果cluster为null,构造Cluster实例cluster, // Cluster为连接MapReduce集群的一种工具,提供了一种获取MapReduce集群信息的方法 if (cluster == null) { cluster = ugi.doAs(new PrivilegedExceptionAction<Cluster>() { public Cluster run() throws IOException, InterruptedException, ClassNotFoundException { return new Cluster(getConfiguration()); } }); } } 这个方法用synchronized关键字标识,处理逻辑为:如果cluster为null,构造Cluster实例cluster。 Cluster为连接MapReduce集群的一种工具,提供了一种获取MapReduce集群信息的方法,我们看下它的成员变量,如下所示: // 客户端通信协议提供者 private ClientProtocolProvider clientProtocolProvider; // 客户端通信协议实例 private ClientProtocol client; // 用户信息 private UserGroupInformation ugi; // 配置信息 private Configuration conf; // 文件系统实例 private FileSystem fs = null; // 系统路径 private Path sysDir = null; // 阶段区域路径 private Path stagingAreaDir = null; // 作业历史路径 private Path jobHistoryDir = null; // 日志 private static final Log LOG = LogFactory.getLog(Cluster.class); // 客户端通信协议提供者加载器 private static ServiceLoader<ClientProtocolProvider> frameworkLoader = ServiceLoader.load(ClientProtocolProvider.class); Cluster最重要的两个成员变量是客户端通信协议提供者ClientProtocolProvider实例clientProtocolProvider,客户端通信协议ClientProtocol实例client,而后者是依托前者的create()方法生成的。 Cluster提供了两个构造函数,如下: public Cluster(Configuration conf) throws IOException { this(null, conf); } public Cluster(InetSocketAddress jobTrackAddr, Configuration conf) throws IOException { <span style="white-space:pre"> </span>// 设置配置信息 this.conf = conf; // 获取当前用户 this.ugi = UserGroupInformation.getCurrentUser(); // 调用initialize()方法完成初始化 initialize(jobTrackAddr, conf); } 最终会调用initialize()方法完成初始化,代码如下: // 确定客户端ClientProtocol实例client private void initialize(InetSocketAddress jobTrackAddr, Configuration conf) throws IOException { synchronized (frameworkLoader) { // 取出每个ClientProtocolProvider实例provider,通过其create()方法, // 构造ClientProtocol实例clientProtocol, // 并将两者赋值给对类应成员变量,退出循环 for (ClientProtocolProvider provider : frameworkLoader) { LOG.debug("Trying ClientProtocolProvider : " + provider.getClass().getName()); ClientProtocol clientProtocol = null; try { // 通过ClientProtocolProvider的create()方法,获取客户端与集群通讯ClientProtocol实例clientProtocol if (jobTrackAddr == null) { clientProtocol = provider.create(conf); } else { clientProtocol = provider.create(jobTrackAddr, conf); } // 设置类成员变量clientProtocolProvider、client,并退出循环 if (clientProtocol != null) { clientProtocolProvider = provider; client = clientProtocol; // 记录debug级别日志信息 LOG.debug("Picked " + provider.getClass().getName() + " as the ClientProtocolProvider"); break; } else { // 记录debug级别日志信息 LOG.debug("Cannot pick " + provider.getClass().getName() + " as the ClientProtocolProvider - returned null protocol"); } } catch (Exception e) { LOG.info("Failed to use " + provider.getClass().getName() + " due to error: " + e.getMessage()); } } } // 如果clientProtocolProvider、client任一为空,直接抛出IO异常 if (null == clientProtocolProvider || null == client) { throw new IOException( "Cannot initialize Cluster. Please check your configuration for " + MRConfig.FRAMEWORK_NAME + " and the correspond server addresses."); } } initialize()方法唯一的一个任务就是确定客户端通信协议提供者clientProtocolProvider,并通过其create()方法构造客户端通信协议ClientProtocol实例client。 MapReduce中,ClientProtocolProvider抽象类的实现共有YarnClientProtocolProvider、LocalClientProtocolProvider两种,前者为Yarn模式,而后者为Local模式。 我们先看下Yarn模式,看下YarnClientProtocolProvider的create()方法,代码如下: @Override public ClientProtocol create(Configuration conf) throws IOException { // 如果参数mapreduce.framework.name配置的为yarn,构造一个YARNRunner实例并返回,否则返回null if (MRConfig.YARN_FRAMEWORK_NAME.equals(conf.get(MRConfig.FRAMEWORK_NAME))) { return new YARNRunner(conf); } return null; } Yarn模式下,如果参数mapreduce.framework.name配置的为yarn,构造一个YARNRunner实例并返回,否则返回null,关于YARNRunner,我们待会再讲,我们接着再看下Local模式,LocalClientProtocolProvider的create()方法,代码如下: @Override public ClientProtocol create(Configuration conf) throws IOException { // 初始化framework:取参数mapreduce.framework.name,参数未配置默认为local String framework = conf.get(MRConfig.FRAMEWORK_NAME, MRConfig.LOCAL_FRAMEWORK_NAME); // 如果framework是local,,则返回LocalJobRunner实例,并设置map任务数量为1,否则返回null if (!MRConfig.LOCAL_FRAMEWORK_NAME.equals(framework)) { return null; } conf.setInt(JobContext.NUM_MAPS, 1); return new LocalJobRunner(conf); } Local模式也是需要看参数mapreduce.framework.name的配置是否为local,是的话,返回LocalJobRunner实例,并设置map任务数量为1,否则返回null,值得一提的是,这里参数mapreduce.framework.name未配置的话,默认为local,也就是说,MapReduce需要看参数mapreduce.framework.name确定连接模式,但默认是Local模式的。 到了这里,我们就能够知道一个很重要的信息,Cluster中客户端通信协议ClientProtocol实例,要么是Yarn模式下的YARNRunner,要么就是Local模式下的LocalJobRunner,记住这点,对透彻了解MapReduce作业提交的整体流程非常重要。 好了,我们继续以Yarn模式来分析MapReduce集群连接,看下YARNRunner的实现,先看下它的成员变量,如下: // 记录工厂RecordFactory实例 private final RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null); // ResourceManager代理ResourceMgrDelegate实例 private ResourceMgrDelegate resMgrDelegate; // 客户端缓存ClientCache实例 private ClientCache clientCache; // 配置信息Configuration实例 private Configuration conf; // 文件上下文FileContext实例 private final FileContext defaultFileContext; 其中,最重要的一个变量就是ResourceManager代理ResourceMgrDelegate实例resMgrDelegate,Yarn模式下整个MapReduce客户端就是由它负责与Yarn集群进行通信,完成诸如作业提交、作业状态查询等过程,通过它获取集群的信息,其内部有一个YarnClient实例YarnClient,负责与Yarn进行通信,还有ApplicationId、ApplicationSubmissionContext等与特定应用程序相关的成员变量。关于ResourceMgrDelegate的详细介绍,请阅读《MapReduce源码分析ResourceMgrDelegate》一文,这里不再做详细介绍。 另外一个比较重要的变量就是客户端缓存ClientCache实例clientCache, 接下来,我们看下YARNRunner的构造函数,如下: /** * Yarn runner incapsulates the client interface of * yarn * @param conf the configuration object for the client */ public YARNRunner(Configuration conf) { // 先构造ResourceManager代理ResourceMgrDelegate实例,然后再调用两个参数的构造函数 this(conf, new ResourceMgrDelegate(new YarnConfiguration(conf))); } /** * Similar to {@link #YARNRunner(Configuration)} but allowing injecting * {@link ResourceMgrDelegate}. Enables mocking and testing. * @param conf the configuration object for the client * @param resMgrDelegate the resourcemanager client handle. */ public YARNRunner(Configuration conf, ResourceMgrDelegate resMgrDelegate) { // 先构造客户端缓存ClientCache实例,然后再调用三个参数的构造函数 this(conf, resMgrDelegate, new ClientCache(conf, resMgrDelegate)); } /** * Similar to {@link YARNRunner#YARNRunner(Configuration, ResourceMgrDelegate)} * but allowing injecting {@link ClientCache}. Enable mocking and testing. * @param conf the configuration object * @param resMgrDelegate the resource manager delegate * @param clientCache the client cache object. */ public YARNRunner(Configuration conf, ResourceMgrDelegate resMgrDelegate, ClientCache clientCache) { // 成员变量赋值 this.conf = conf; try { this.resMgrDelegate = resMgrDelegate; this.clientCache = clientCache; // 获取文件山下文FileContext实例defaultFileContext this.defaultFileContext = FileContext.getFileContext(this.conf); } catch (UnsupportedFileSystemException ufe) { throw new RuntimeException("Error in instantiating YarnClient", ufe); } } YARNRunner一共提供了三个构造函数,而我们之前说的WordCount作业提交时,其内部调用的是YARNRunner带有一个参数的构造函数,它会先构造ResourceManager代理ResourceMgrDelegate实例,然后再调用两个参数的构造函数,继而构造客户端缓存ClientCache实例,然后再调用三个参数的构造函数,而最终的构造函数只是进行简单的类成员变量赋值,然后通过FileContext的静态getFileContext()方法获取文件山下文FileContext实例defaultFileContext。 总结 MapReduce作业提交时连接集群是通过Job的connect()方法实现的,它实际上是构造集群Cluster实例cluster。Cluster为连接MapReduce集群的一种工具,提供了一种获取MapReduce集群信息的方法。在Cluster内部,有一个与集群进行通信的客户端通信协议ClientProtocol实例client,它由ClientProtocolProvider的静态create()方法构造,而Hadoop2.6.0中提供了两种模式的ClientProtocol,分别为Yarn模式的YARNRunner和Local模式的LocalJobRunner,Cluster实际上是由它们负责与集群进行通信的,而Yarn模式下,ClientProtocol实例YARNRunner对象内部有一个ResourceManager代理ResourceMgrDelegate实例resMgrDelegate,Yarn模式下整个MapReduce客户端就是由它负责与Yarn集群进行通信,完成诸如作业提交、作业状态查询等过程,通过它获取集群的信息。

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

阿里推出 AIGC 设计应用“呜哩 (Wuli)”,集成通义千问图像模型

阿里巴巴推出了一款名为“呜哩”的AIGC创意设计生产力平台,并已正式开启测试。 https://wuli.art/generate 该平台旨在为内容创作者、设计师及营销人员提供一套高效多元的AI创意生成解决方案。 平台深度整合了通义千问团队研发的多款图像大模型,形成一个模型全家桶。其中包括主打高质量的Qwen Image25.12生成模型、追求极致响应速度的Qwen Image Turbo模型,以及专注于细节调整的Qwen Image25.11编辑模型。用户可根据不同创作需求,在生成质量、速度与可控性之间灵活选择。 在功能层面,呜哩平台提供了从图片生成、视频生成到灵感联想、翻译辅助及资源库支持的完整工具集,可帮助用户跨越创意瓶颈。用户通过输入简单的描述,即可快速生成如3D艺术字体、电影风格海报、电商场景图在内的丰富内容。

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

开源多媒体框架 FFmpeg 集成 Whisper.cpp,增加 AI 语音转写功能

开源多媒体框架FFmpeg 在即将发布的8.0 版本中新增了 af_whisper 音频工具,可在 FFmpeg 生态系统内直接实现自动语音识别(ASR)。 https://git.ffmpeg.org/gitweb/ffmpeg.git/commit/13ce36fef98a3f4e6d8360c24d6b8434cbb8869b 该工具基于 whisper.cpp 库,为媒体处理流程引入 AI 模型,支持灵活的音频转写功能,包括选择 AI 模型、指定语言和设置输出格式(文本、SRT、JSON 等)。 它既可处理预录制文件,也可处理实时音频流,并提供语音激活检测(VAD)以提升转写的准确性与效率。同时,该工具支持 GPU 加速,能够显著缩短转写时间。 社区用户对这一新功能发表了许多看法,有用户表示,“添加 --enable-whisper 到自定义的 FFmpeg 构建配置中”很令人期待;当然也有人质疑:“为什么要将其整合入 FFmpeg?最可能的用途是实时生成并将字幕嵌入视频,但这看起来还是很小众”。还有人写道:“我希望这个功能可以用来从音频中隔离语音内容,这样就能更好地重制 TV 节目音轨,而不只是依赖字幕”。 FFmpeg 8.0 预计将在接下来几周内正式发布,届时还将包含 Vulkan 加速、CPU 性能优化等其他改进。

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

Diboot 低代码 v3.6.0 版本发布 - 集成 DeepSeek,强化 AI 赋能

Diboot 是一个在开发框架上长出来的低代码平台,天生具备 pro-code 优势的同时,也具备很强的低/零代码及工作流能力,可在 pro-code、low-code、no-code 之间灵活切换,有效赋能开发者,实现开发和维护过程的提质降本增效。 > Diboot v3.6.0 版本带来了全面的优化与升级,划重点的主要更新有: core内核新增了流水序列实现类,极大简化了自动编号相关场景的开发 IAM新增客户端及开放接口管理,方便管理三方应用接入、授权、日志 AI组件支持接入DeepSeek,支持DS推理 PC前端:角色管理支持配置角色人员、菜单资源支持配置移动端菜单、确认删除提示支持明确哪条数据等 devtools工具:创建模型时支持导入视图、支持借助AI生成测试数据、上传Excel通过AI解析创建模型字段、提升字段AI自动命名的响应性能并默认填充推荐值等 专业版:新增图表设计支持零代码动态配置统计图表、新增序列编号配置支持零代码配置自动编号策略、支持一个模型多个表单、表单设计器新增卡片组件、展示图片组件等 旗舰版:新增支持重新发起事件、升级 Flowable至 v7.1.0等 以下为主要更新明细: 内核diboot-core & core starter v3.6.0 新增:流水号计数及流水序列生成器相关实现,简化自动编号场景开发 新增: S.removeHtmlTags() 用于剔除html标签保留文本内容 优化:关联数据绑定支持量大分批执行,适配大数据量导出等场景 优化:关联数据绑定的移除并行优化性能 优化:I18nConfig国际化、Dictionary字典表新增update_time字段以识别增量更新 优化:系统参数配置Service接口增加缓存支持 优化: BindQuery的select字段优化,支持剔除大字段避免Oracle Distinct查询报错等 优化:开启i18n时修改字典或菜单的国际化中文label时同步修改i18n值 优化:操作日志可配置支持记录系统异常堆栈日志,方便排查线上报错 优化: 数据权限实现,支持存在多个实例及一个实现对应多个Entity类 优化: 国际化翻译配置文件移至各组件下,避免未启用组件提示告警 Bugfix:fixSqlServerlimit查询未指定orderBy报OFFSET异常问题 依赖升级:升级Spring boot 至 v3.4.3,mybatis-plus至3.5.10.1等 IAM组件diboot-IAM starter v3.6.0 新增:角色管理下支持直接 配置角色人员 新增:客户端及开放接口管理,支持三方应用接入、授权、访问日志等 优化: 人员管理表单中的主岗兼职岗配置相关UE 优化: 操作按钮国际化编码 优化: 系统参数配置Service接口增加缓存支持 优化: 数据权限的默认实现类 优化: 从token获取兼容参数携带token及图片获取携带token Bugfix:fix token刷新后无法强退的问题 文件组件 diboot-file starter v3.6.0 新增:excel本地文件中读取数据工具类:ExcelHelper.read(localFilePath,listener) 优化: 调整@ExcelBindField查询数据逻辑 优化: 文件后缀合法性检查改为白名单 定时组件 diboot-scheduler starter v3.6.0 新增:针对数据同步场景的定时任务相关的基础封装 优化:定时任务执行策略及日志相关UI显示 多租户组件 diboot-tenant starter v3.6.0 优化:调整自动添加国际化文件及操作按钮国际化编码 消息通知组件 diboot-notification starter v3.6.0 优化:调整自动添加国际化文件 AI 组件:diboot-AI starter v3.6.0 新增:支持接入DeepSeek,支持DS推理 优化:调整自动添加国际化文件 PC前端diboot-admin-ui v3.6.0 新增:角色管理下支持直接配置角色人员 新增:客户端及开放接口管理功能,支持三方应用接入 新增:支持操作日志记录查看系统异常堆栈 新增:菜单资源配置页面 支持配置移动端菜单资源 新增:AI对话对接DeepSeek,优化AI对话样式 优化:人员管理中的主岗兼职岗配置相关UI、UE 优化:定时任务执行策略及日志相关UI显示 优化:操作日志页过滤条件支持选择用户 优化:确认删除数据的提示支持附加参数明确待删除的是“哪条数据” 优化:token获取兼容参数携带token及图片获取携带token Bugfix:修复多页word打印不完全问题、打包类型报错、个人中心路由重名问题 升级前端依赖,适配 pnpm v10.x,清理前端编译告警信息等 Mobile前端diboot-mobile-ui v3.6.0 新增:支持v-has-permission与v-has-role权限指令,适配菜单权限 新增:登录页面添加租户编码以支持多租户,可配置开启关闭 Bugfix:修复移动端打包报错 开发工具:diboot-devtools v3.6.0 新增:创建模型时支持导入视图 新增: 模型支持借助AI生成测试数据 新增:支持上传Excel通过AI解析创建模型字段 优化:模型字段AI自动命名的响应性能提升,并默认填充第一项 优化:模型设计支持从当前行、从其他模型复制字段 优化:模型设计支持显示模型名、字段数、字段类型配置备注等 优化:模型设计支持修改表名,n-n关联中间表名 优化:列表页生成代码时提示用户后续生成详情与表单 Bugfix:修复SqlServer删除关联字段未删除索引时的报错 低代码专业版V3.6.0 (企业版) 新增:图表设计模块,支持动态配置模型数据的统计图表 新增:序列编号配置,支持动态配置流水序列编号的自动赋值策略 页面设计:支持一个模型多个表单,列表页自定义按钮指定打开表单 页面设计:列表页支持是否数据只读,只读列表页不添加新建编辑按钮 表单设计器:新增卡片组件、展示图片组件 移动端:支持零代码动态渲染页面设计的 CRUD 表单设计器:设计表单扩展接口支持配置表单字段值作为请求参数 表单设计器:支持组件前后移动调整 Bugfix:修复富文本编辑器全屏显示z-index遮挡问题 低代码旗舰版V3.6.0 (企业版) 新增: 支持重新发起事件 优化:升级 Flowable 至 v7.1.0 优化:多实例审批过程增加审批不通过类型 优化:动态页面数据管理中打印支持流程模型的审批记录 优化:移动端流程审批时支持上传附件 优化:支持跨节点动态指派节点执行人 Bugfix: 修复流程配置节点执行人-变量无法选择字段问题 修复流程设计器多实例配置切换失效问题 修复流程预测解析动态变量时,选择多人解析数据异常 低代码旗舰微服务版 V3.6.0 (企业版) 新增功能与优化: 同步所有单体旗舰版的相关优化并适配微服务架构 前端代码生成适配cloud 详细内容参考官网,版本升级亲参考官网:“文档-版本升级文档

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册