首页 文章 精选 留言 我的

精选列表

搜索[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集群进行通信,完成诸如作业提交、作业状态查询等过程,通过它获取集群的信息。

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

API 接口安全审计怎么做:日志留什么、怎么溯源

接口安全审计要回答的不是「有没有日志」,而是「这条日志能不能定到人、定到数据、定到时间」。有日志但查不出人,等于没有审计。监管对这件事有明确要求。《银行保险机构数据安全管理办法》(金规〔2024〕24 号)第二十八条要求对敏感级及以上数据严格实施授权管理,并对数据访问行为实施审计。金融行业标准 JR/T 0185—2020 则把接口审计的具体要求写在安全审计一节里。本文就围绕这几条,讲清接口审计到底要留什么、怎么用。

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

突然发现Runninghub的赠送的rh币不能调用api了

![在这里插入图片描述](https://developer.qcloudimg.com/http-save/yehe-6690930/cef933dd2ad8f54e9a9a92709722194f.png) 看图,如果遇到这样的错误,只能在网站的界面上调用,这样效率岂不是大大的受影响。 针对这个情况,我想了两种方式 1、使用无限循环工作流,把提示词先写好,批量发送 2、使用导演台工作流,结合搅拌机的工作流批量出片 两种方式我都试过了,需要工作流的自取,runninghub目前涨价比较厉害,大家看情况使用吧。未来可能还会有调整 ```python 工作流1:MiniMax H3 导演台循环工作台 生成长视频 体验地址:https://www.runninghub.cn/post/2118001489410088961/?inviteCode=oga1ahgc ``` 无限循环工作流上传不了runninghub,大家需要的话,留言666,我私发给各位。 简要介绍一下这两个工作流的使用方法 **一、无限循环工作流** 1、让deepseek输出这样的格式的txt文档,黏贴到提示词里面就行 ![在这里插入图片描述](https://developer.qcloudimg.com/http-save/yehe-6690930/6544b920e6605a64c04b70c37ebb4c6e.png) 2、把参考图和音频链接好 ![在这里插入图片描述](https://developer.qcloudimg.com/http-save/yehe-6690930/b6e7e192917f43c28b4986b85cb86958.png) 3、这里注意填写分段,如果分段(和需要生成的视频个数N)不对,工作流会报错(但是N-1段的视频还是会生成)。 ![在这里插入图片描述](https://developer.qcloudimg.com/http-save/yehe-6690930/851c0b7876d41bb7d5112420758ea240.png) **二、导演台工作流** 1、自定义图片可以先上传 ![在这里插入图片描述](https://developer.qcloudimg.com/http-save/yehe-6690930/a16e7430414de4b42a1dcaaaf0eb0328.png) 2、通过添加素材组新增新的组 3、通过选择运行,选择运行全部还是个别的片段 ![在这里插入图片描述](https://developer.qcloudimg.com/http-save/yehe-6690930/d97a5791e001b2c82f0edcb7f1f59735.png) 以上就是这两个工作流使用的注意事项了,有问题可以评论区留言。

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

1688商品详情API参数详解:适配跨境选品、ERP 同步场景

## 一、业务背景 1688 作为国内 B2B 批发货源平台,和淘系 C 端商品接口有明显区别,核心多出**起订量 MOQ、阶梯价、混批、代发、交货周期**等批发专属字段。 跨境 ERP、无货源铺货、反向海淘选品系统,需要稳定拉取商品基础信息、SKU、阶梯拿货价、库存、发货、供应商信息,经过清洗、换算毛利、类目映射之后,同步到海外平台刊登。 本文围绕**跨境选品、ERP 同步**两个场景,梳理入参、返回结构、字段取舍、工程落地要点。 ## 二、请求参数详解 表格 |参数|是否必填|说明|跨境 ERP / 选品使用建议| | --- | --- | --- | --- | |apiname|是|接口名称|1688.item_get(Taobaoapi2014前往)| |adress|是|请求网关|c0b.cc/R4rbK2| |appkey|是|应用 Key,开放平台应用凭证|1688 开放平台创建应用获取,需要申请对应商品接口权限| |timestamp|是|请求时间戳|注意时区,校验误差不能超限,批量采集容易在这里报错| |sign|是|请求签名|接口调用核心,签名算法错误直接返回鉴权失败;批量并发采集重点保障| |productId|是|商品 ID|由商品搜索接口返回,单次仅支持单个商品查询| |fields|是|需要返回的字段集合,逗号分隔|核心优化点,按需拉取,不要全量返回,降低带宽与解析压力| 跨境选品 + ERP 同步推荐 fields 组合(可直接复制) ``` productId,title,mainImage,images,priceInfo,skuList,stockInfo,moq,sendGoodsCycle,supplierInfo,canDropShip,props,spec ``` 字段释义:商品 ID、标题、主图、轮播图、价格信息、SKU 列表、库存、起订量、交货周期、供应商信息、是否一件代发、属性、规格 > 不建议携带营销、活动、会员价等非必要字段,这类字段权限要求高、返回包大,ERP 同步一般不需要。 ## 三、返回结构分层解读(业务视角) 顶层返回对象为product,下面分为基础信息、图片、价格(阶梯价)、SKU、库存、批发规则、供应商、属性规格几大块。 ### 3.1 商品基础信息(选品打分、标题翻译、刊登标题源) ``` { "productId": "654321098765", "title": "新款简约不锈钢水杯便携随行杯", "moq": 2, "canDropShip": true, "sendGoodsCycle": "48小时内发货", "categoryId": "123456" } ``` - moq:最小起订量,跨境毛利计算、刊登设置最小下单数量必备字段 - canDropShip:是否支持一件代发,反向海淘、无货源业务筛选核心标记 - sendGoodsCycle:供货交期,用于 ERP 预估发货时效、给海外买家展示备货周期 - categoryId:1688 内部类目 ID,需要维护类目映射表,转换为 Ozon、Temu 等海外平台类目 ### 3.2 图片字段(铺货素材核心) ``` "mainImage": "https://cbu01.alicdn.com/xxx.jpg", "images": [ {"url":"https://cbu01.alicdn.com/xxx1.jpg"}, {"url":"https://cbu01.alicdn.com/xxx2.jpg"} ] ``` > 重点踩坑:1688 图片存在防盗链,**不能直接外链用于海外平台刊登**。ERP 流程中必须异步下载、转存自有对象存储,再做白底处理、裁剪、多语种配图加工。 ### 3.3 priceInfo 阶梯批发价(B2B 接口独有,跨境成本核算重中之重) ``` "priceInfo": { "priceRanges": [ {"quantityStart": 2, "price": "12.50"}, {"quantityStart": 50, "price": "11.20"}, {"quantityStart": 200, "price": "9.80"} ] } ``` - 含义:不同采购数量对应不同拿货单价 - ERP 业务处理:按采购阶梯分别核算成本、运费、平台佣金,自动计算多档毛利 - 坑点:部分商品只有一档价格,需要兼容单阶梯逻辑,避免数组越界 ### 3.4 skuList SKU 规格列表(刊登最容易出错模块) ``` "skuList": [ { "skuId": "123456", "spec": "颜色:黑色;容量:500ml", "skuPrice": "12.50", "stock": "1200", "outerSkuId": "BK-500" } ] ``` - spec:规格组合字符串,程序需要拆分键值对(颜色、容量等) - skuPrice:该 SKU 对应价格,部分商品 SKU 价格和商品阶梯价互相独立,需要优先取 SKU 价格 - stock:实时库存,ERP 用来做库存同步、防止超卖 - outerSkuId:商家自定义编码,可作为我方系统内部关联编码 ### 3.5 props 商品属性(报关、属性翻译、规格自动生成) 属性是 1688 内部标准属性,格式为属性ID:属性值 用途: 1. 自动翻译生成海外平台规格参数 1. 作为报关申报要素参考 1. 选品筛选(材质、尺寸、适用人群等) ### 3.6 supplierInfo 供应商信息 包含供应商名称、店铺 ID、是否实力商家、发货地址; 用于供应链评估、货源分级、运费预估、供应商台账管理。 ## 四、跨境选品 & ERP 同步的字段取舍策略 1.必选字段:productId,title,mainImage,images,priceInfo,skuList,stockInfo,moq,canDropShip,sendGoodsCycle,supplierInfo,props 2.可选字段:商品详情描述 desc(用于 AI 改写卖点、NLP 文案生成) 3.尽量不获取:营销活动价、会员折扣、直播相关字段,非 ERP 同步刚需,增加接口负载 ## 五、工程化落地思路(适配 ERP 系统) 1. **限流与缓存**:1688 开放平台有 QPS 配额,批量采集必须做队列、限速、失败重试;高频访问商品做本地缓存,避免重复调用接口消耗配额 1. **数据标准化清洗** - 价格统一转为浮点数,保留 2 位小数; - 阶梯价数组排序,按采购数量从小到大排序; - SKU 规格拆分、标准化,清洗中文口语化描述; 1. **数据库模型设计**:商品主表 + SKU 子表 + 阶梯价子表,一对多存储,方便 ERP 价格变动监控、库存同步 1. **业务过滤规则**:自动过滤库存为 0、不支持代发、交期过长、起订量过高,不符合铺货要求的货源 1. **多语种预处理**:标题、属性、规格送入翻译服务,生成英文 / 俄文等目标语种素材,供海外平台刊登 ## 六、高频踩坑清单 1. 混淆 C 端淘宝接口和 1688 B2B 接口,淘宝taobao.item.get拿不到 MOQ、阶梯价、一件代发标识 1. 忽略阶梯价逻辑,直接取单一价格,造成毛利计算错误 1. 直接使用原图链接刊登海外平台,防盗链拦截,图片无法展示 1. 并发无限制,短时间大量请求,应用被限流、权限降级 1. SKU 规格为空、规格名称不统一,上架后海外前台展示混乱 1. 部分商品不支持代发,canDropShip为 false,未做过滤,导致订单无法履约 ## 七、Python 简易调用示例(示意代码) ``` # 1688开放平台SDK调用示意,alibaba.product.get from top import TopClient client = TopClient( "https://gw.open.1688.com/openapi/param2/1/com.alibaba.open", appkey="your_appkey", appsecret="your_appsecret" ) req = client.request("alibaba.product.get") req.set_fields("productId,title,mainImage,priceInfo,skuList,moq,canDropShip") req.set_productId("654321098765") resp = client.execute(req) product = resp.get("product") # 后续:阶梯价解析、SKU拆分、图片下载、入库、毛利计算 ``` ## 八、配套接口联动 1. 商品搜索接口:alibaba.product.search,先批量检索候选商品 ID,再循环调用本详情接口采集 1. 供应商接口:获取供应商更多资质、起订规则 1. 订单接口:ERP 下单履约链路使用

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

模型 API 接入验收:如何确认超时设置不会误杀慢请求?

一个内部知识助手切换到 nexo 中转站时,可能遇到短问答能完成、长输入一发就超时。作者参与该站运营,本文经 AI 辅助整理。以下用本地模拟端点验证客户端和代理的超时分工,时间数字只是演练参数。 ## 给三种超时分别取证 先让模拟端点在收到请求后等待两秒再发送首段,然后每秒发一个片段。记录应用发起请求、收到响应头、收到首个有效事件以及收到终止事件的时间。首段到得晚和开始输出后中途停住是不同场景,应在日志里分别归类。 第一次把首段等待上限设成一秒,预期在任何文本出现前失败。第二次把首段上限放宽到三秒,但让服务在第二个片段后停四秒,空闲上限设成两秒。预期界面能显示已有片段,并将状态标记为中断。第三次按原来的每秒一段输出,单独设总时长上限,验证持续输出也不会无限占用任务。 ## 找出究竟是哪一层先关连接 先让客户端直连模拟端点,记下三轮结果。再加入实际部署路径中的代理,保持应用侧配置一致。如果加入代理后才在固定时间断开,查代理的读取超时及应用是否及时向下游转发事件。如果两条路径都在同一应用上限断开,先验证客户端计时器是否按设计开始和重置。不要一次把所有超时都调大,否则无法看出哪项设置起作用。 ## 把结果变成验收条件 针对首段慢、流中空闲和任务超期各保存一份记录,至少写下预期结束原因、实际结束原因和最后一个已读事件。再加一条正常结束用例,确认取消计时器后不会把完整回答改判为失败。上线时用自己的正常请求分布选上限,演练里的一秒和两秒只用来快速触发路径。

资源下载

更多资源
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应用均可从中受益。

Rocky Linux

Rocky Linux

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

用户登录
用户注册