tag 标签: java

相关帖子
相关博文
  • 热度 3
    2024-4-18 09:53
    350 次阅读|
    0 个评论
    要获取本地打印驱动,可以使用Java的`PrintServiceLookup`类。以下是一个示例代码: ```java import javax.print.PrintService; import javax.print.PrintServiceLookup; public class PrinterDrivers { public static void main(String printServices = PrintServiceLookup.lookupPrintServices(null, null); // 遍历并打印打印服务的名称 System.out.println("本地打印驱动:"); for (PrintService printService : printServices) { System.out.println(printService.getName()); } } } ``` 运行这段代码,它将输出本地计算机上安装的所有打印驱动的名称。
  • 热度 7
    2023-9-4 10:04
    642 次阅读|
    0 个评论
    随着 2023.2 的发布, Klocwork 为 C 、 C++ 、 C# 、 Java 和 JavaScript 分析提供了更新和改进。 MISRA C:2012 AMD 2 覆盖率和 DISA STIG ASD C/C++ 高严重性规则覆盖率高达 83% 。还引入了针对 C 语言检查器的附加路径分析。 Validate 平台现在具有增强的问题浏览和筛选功能。 其他增强功能包括改进 Microsoft Visual Studio 插件和 Project Streams in Validate 的稳定性和性能。 审查 Validate 中的问题 现在,您可以通过查看、修改和导航问题搜索列表,更轻松地在 Validate 中查看问题,而无需离开 “Issue Details” 页面。 • 通过新的 “File Navigation” 窗格搜索单个文件并探索问题,该窗格启用在使用相同浏览器时在会话之间持久存在的配置。 其他 Validate 平台改进 • 使用 " 度量元 " 报告 设计器 在 Validate 中编辑阈值 和总度量值 报告定义。 • 利用新的命令行应用程序包,为 Validate 命令提供通用命名。 C/C++ 分析引擎 改进了 C/C++ 的语言功能覆盖率和缺陷检测: • 增强了对 C++14 和 C++17 分析的支持。 • 添加了几个 MISRA 规则并增加了 MISRA C : 2012 (最高 AMD 2 )的覆盖范围。 • 增加了对 DISA STIG 高严重性规则、 CERT 、 OWASP 和 CWE 的覆盖范围,包括为 2022 年 CWE Top 25 最危险的软件弱点添加分类法。 C# 分析引擎 改进了对 C# 8.0 语言规范的支持。新的语言功能支持包括: • 接口中的静态构造函数。 • 接口中的嵌套类型和运算符声明。 • 内插 verbatim 字符串。 • 范围和索引支持 … 和 ^ 运算符。 • 使用新引擎对 C# 检查程序进行额外的路径分析。 Java 分析引擎 扩展了 Java 14 语言规范的覆盖范围。新功能包括: • 改进路径分析检查程序对 Java 14 的支持。 • 100% 覆盖 Jakarta EE 。 JavaScript 分析引擎 • JavaScript 分析支持 . eslintignore 文件 • 用于指定项目目录的 kwjsspec 工具的新选项 ○ --project- dir 编码标准 Klocwork 2023.2 的新标准和扩展标准覆盖范围和 分类标准 : • CERT • CWE – 2022 CWE Top 25 最危险的软件弱点 • DISA STIG v 5 - C/C++ 高严重性规则高达 83% • MISRA – 改进了 MISRA C : 2012 AMD 2 覆盖范围(需要支持人员提供额外实用程序,以实现最大覆盖范围) • OWASP 产品体验改进 Microsoft Visual Studio 插件 使用 Visual Studio 扩展更快地开始分析。 • 在使用 kwcheck 命令作为外部分析引擎时,我们改进了 Visual Studio 扩展的构建规范生成性能。 项目流 改进了大量项目流的 Validate 平台的性能。 • 显示和使用项目流清单所需的时间大大减少。 第三方依赖项 • 软件包中包含 Apache Tomcat 和 Open JDK 的升级版本。 有关新增功能的更多详细信息,请参阅发行说明。 Klockwork 2023.2 的重要变化 许可证管理更改 自 2023.2 起, Klocwork 工具现在使用 Reprise 许可证管理器 ( RLM ) v15.0 。 • 重要提示:升级后的 RLM v15.0 服务器包含在 Klocwork 2023.2 安装中。任何早期的 RLM 服务器都需要升级到此版本才能与 Klocwork 2023.2 及更高版本配合使用。升级到 RLM v15.0 解决了在与服务器连接量较大的情况下 Validate 2023.1 的服务器稳定性可能出现的问题。 • 2022 许可证与 Klocwork 2023.2 不兼容。升级时,请联系 info@polelink.com 以获取新许可证。 2022.4 SR/ 补丁可用 已创建 2021.4 至 2022.4 的补丁,以解决自动删除版本中丢失的引用问题。 Klocwork 2023.1 及更高版本不受影响。 • 使用 2022.4 的所有客户都应升级到该软件的最新版本。 ➡ 体验最新版 Klcwork2023.2: info@polelink.com
  • 2023-5-28 23:57
    2 次阅读|
    0 个评论
    Java 亿级项目架构设计与落地应用] download: https://www.51xuebc.com/thread-561-1-1.html 随着信息化时代的到来,数据成为了企业和组织管理中不可或缺的一部分。而数据库挖掘技术则是对海量数据进行深入分析、挖掘、处理和利用的有效手段。本文将为您介绍6大数据库挖掘技术及其应用。 1. 关联规则挖掘 关联规则挖掘技术是在大规模数据集中寻找项之间的关系和相关性,如购物篮分析。该技术可以帮助企业发现潜在的市场机会,并提高销售额和客户满意度。例如,通过对顾客购买记录进行关联规则挖掘,可以发现哪些商品经常被同时购买,并据此调整产品组合和营销策略。 2. 分类与预测 分类与预测技术是根据已有数据集的特征和分类标签,构建能够判断新数据属于哪一类的模型。这种技术广泛应用于银行信用评级、医学诊断、电影推荐等领域。例如,在医疗领域,可以通过对已知病例进行分类与预测,来协助医生诊断新病例。 3. 聚类分析 聚类分析技术是将大量数据集合分成若干组,使得同一组中的数据相似度高于与其他组中的数据相似度。这种技术广泛应用于市场细分、用户画像等领域。例如,在电商平台中,可以通过对用户行为和购买记录进行聚类分析,来发掘不同用户群体的偏好和需求,从而优化产品和服务。 4. 离群点检测 离群点检测技术是在海量数据中寻找异常值或罕见事件,以识别可能存在的问题或机会。该技术广泛应用于金融风险管理、网络安全、制造业质量管理等领域。例如,在银行业中,可以使用离群点检测技术识别信用卡欺诈行为,以保护客户资产和银行信誉。 5. 文本挖掘 文本挖掘技术是对大规模文本数据进行处理和分析,以提取有价值的信息和知识。该技术广泛应用于舆情监测、新闻自动分类、智能客服等领域。例如,在社交媒体中,可以使用文本挖掘技术分析用户评论和反馈,了解公众对企业或品牌的看法和态度。 6. 时间序列分析 时间序列分析技术是对随时间变化的数据进行建模和预测的一种方法。该技术广泛应用于股票价格预测、气象预测、交通流量预测等领域。例如,在电力系统中,可以使用时间序列分析技术来预测负荷峰谷期,并据此优化电力供应计划。 以上就是六大数据库挖掘技术及其应用。随着技术不断发展和进步,这些技术将不断拓展应用场景和深化运用。
  • 热度 8
    2022-12-12 18:43
    910 次阅读|
    0 个评论
    IAR Systems更新Visual Studio Code扩展
    用于代码构建和调试的 IAR Visual Studio Code 扩展备受市场喜爱,其最新 1.20 版进一步简化了嵌入式开发工作流程 嵌入式开发软件和服务的全球领导者 IAR Systems 为使用 Visual Studio Code (VS Code) 的嵌入式开发人员提供进一步支持,最新的 IAR Build 和 IAR C-SPY 调试的 VS Code 扩展 1.20 版与所有最新版本的 IAR Embedded Workbench 兼容,包括对称多核调试,支持更高级的断点类型,以及可定制的构建工具栏。这些新功能将进一步帮助软件工程师优化工作流程、提高性能,并降低开发成本,使用者可通过 Visual Studio Code Marketplace 免费下载。 VS Code 是一个流行的代码编辑器,被嵌入式开发人员用来有效地构建和调试复杂的项目、任务运行、版本控制等众多任务。通过 IAR 的 VS Code 扩展,开发人员可以在 VS Code 中处理代码,并充分利用 IAR Embedded Workbench 的强大功能,包括 IAR C-SPY 调试 和 IAR 构建工具。 IAR 工具会自动检测并支持 Arm 、 RISC-V 、 Renesas RH850 和 RL78 、 AVR 、 8051 等各种版本。 IAR C-SPY 是一个用于嵌入式应用的高级调试器,已完全集成到 IAR Embedded Workbench 中,可在同一个 IDE 中提供开发和调试功能。 IAR VS Code C-SPY 调试扩展自动提供来自工具套件和项目的调试配置。该扩展支持 Arm 和 RISC-V ,在 1.20 版本中还支持 Microchip AVR 和 Renesas RL78 芯片。此外,最新版本的扩展提供了对称多核调试和使用 Visual Studio 的高级断点类型,如条件断点、数据断点和日志断点(日志消息)。 最新版本的 IAR Build VS Code 扩展新增了一个工具栏窗口,其中包含用于构建应用和执行 C-STAT 静态分析的按钮。在 “ 扩展配置 ” 视图中新增了一个下拉菜单,允许开发人员选择 IAR Embedded Workbench 中的 “ 自定义参数变量 ” 。为了将工作区中不必要的项目文件从项目列表中排除,还增加 “ Projects to Exclude ” 设置。此外,现在设置文件中的文件路径使用的是工作区的相对路径,而不是绝对路径。 IAR Build 和 IAR C-SPY 调试扩展所实现的可扩展跨平台开发工作流程,为软件工程师提供了所有的功能和有用的快捷方式,帮助他们轻松管理项目文件,并保持对他们应用中每一行代码和每一条指令的控制。为了满足开发要求, VS Code 扩展还可以用于其他构建系统,如 Cmake 、源代码控制和 GitHub 等版本扩展以满足开发需求。 IAR Systems 的首席技术官 Anders Holmberg 表示: “ 今年早些时候, IAR 在 GitHub 和 Marketplace 上推出第一个官方 Visual Studio Code 扩展,在 Visual Studio Code 社区的下载使用率超出了我们的预期。这反映了嵌入式行业中一种趋势,即混合搭配各种技术,提高效率、实现更多自动化、支持各种跨平台环境。我们后续也听取了来自用户和市场的直接反馈,在此次 IAR VS Code 扩展新版本中相应添加了更多功能,提升用户体验。 ” 如需下载 IAR Build 和 IAR C-SPY 调试的 VS Code 扩展,可以直接访问 VS Code 的 Marketplace 或 IAR 的 GitHub 页面 https://github.com/IARSystems/iar-vsc-build 和 https://github.com/IARSystems/iar-vsc-debug 。如需了解有关 IAR Visual Studio Code 扩展的更多信息,请访问 www.iar.com/vscode 。 编者注: IAR Systems 、 IAR Embedded Workbench 、 Embedded Trust 、 C-Trust 、 C-SPY 、 C-RUN 、 C-STAT 、 IAR Visual State 、 I-jet 、 I-jet Trace 、 IAR Academy 、 IAR 以及 IAR Systems 的标识均是 IAR Systems AB 拥有的商标或注册商标。所有其他产品名称均为其各自所有者的商标。 关于 IAR Systems IAR Systems 提供世界领先的软件和服务,帮助提高开发人员在嵌入式开发和嵌入式安全方面的生产力,使企业能够创造和保护当前的产品和未来的创新。目前, IAR Systems 为来自 200 多个半导体合作伙伴的 15000 款芯片提供支持,为大约 10 万名供职于福布斯 2000 强公司、中小企业和初创企业的开发人员提供服务。 IAR Systems 成立于 1983 年,总部设在瑞典乌普萨拉,有 220 多名员工,在亚太地区、欧洲、中东和非洲以及北美设有 14 个办事处。 IAR Systems 为 I.A.R. Systems Group AB 所有,在纳斯达克 OMX 斯德哥尔摩交易所上市,属于中型股指数(股票代码: IAR B )。
  • 2022-9-6 14:18
    0 个评论
    区块链技术起源于大约 1970年代末,当时一位名为 Ralph Merkle 的计算机科学家申请了哈希树的专利,这些树是一种计算机科学结构,通过使用加密将区块链接起来,用于存储数据。随着区块链技术的不断发展,已经成为全球性争夺技术,并对整个技术和产业领域都发挥重要作用。2019年,区块链技术被国内赋予了战略性意义。 区块链,去中心化数据库,具有去中心化、开放性、独立性、安全性和匿名性五个特征。由于互联网身份的虚拟性,人们无法建立信任关系,而区块链技术通过密码学和数学巧妙的分布式算法,无需第三方介入,就可以使参与者达成共识,解决信任和价值的可靠传递难题。 区块链技术还通过提供去中心化的结算平台和价值转移,保证用户虚拟Z产和虚拟身份的安全,实现规则透明和确定性执行机制,保证其价值的所有权和流通,进而实现经济体系的高效稳定。 区块链技术的应用场景主要围绕区块链的三种形态展开,包括公有链、专有链、联盟链,目前国内的区块链主要以联盟链为主,联盟链介于公有链和私有链之间,比私有链大,但是又没有公有链的规格大,其数据效率快,因为节点少,且只需要和网络上三分之二的节点达成共识后就能完成交 Y过程,不同于公有链,联盟链只有部分是去中心化;数据具有保密性,仅限于联盟里机构和用户才能访问。 按照目前主流的区块链项目来看,区块链项目可分为必类、平台类、应用类、资产代必类,再近一步来说,包括区块链交 Y系统,数字藏品系统,电商商城等。就目前的区块链项目数量来看,每年都在不断的增长,如果想要参入其中开发一个区块链项目,肯定少不了区块链开发公司,He~Fei~艾数-大数据,合-肥区块链软件开-发-公-司,技术支持;伴随国内中小微企业加入区块链产业的数量越来越多,那一个区块链开发公司能给企业提供哪些技术? 第一个是无法更改,区块链为分布式数据库技术,这种技术是无法更改的,该系统中所有的数据模块都有对应的数据信息,且每一个数据块都会连接而成变为数据链;区块链开发 搭建技术源码;第二个是可溯源头,系统当中的任何一个模块,当中拥有的信息都是完整的,且能够追溯信息的源头;第三个是安全可靠,区块链最为显著的就是在提取或者储存信息时都应验证,每一次交Y都是多方一起验证才可达成。 此外,区块链开发项目会用到很多开 /发语言,例如C++、Java、Python、Go等。目前国内的区块链开发公司已经有一定的规模,但区块链开发公司的开发技术还需要不断更新完善。
相关资源
  • 所需E币: 0
    时间: 2023-12-21 16:08
    大小: 3.22KB
    目前主流的Java分布式框架有哪些,学起来难不难?Java的框架主要有:SpringMVC、Spring、Mybatis、Dubbo、Maven、RabbitMQ、Log4j、Ehcache、Redis、Shiro等等今天就给大家讲讲关于Java主流分布式的一些解决方法,内容包括:JVM锁和MySql锁解决库存超卖问题、基于Redisson框架实现分布式锁及实战&源码深入剖析、基于ZooKeeper实现分布式锁、分布式存储系统Etcd实现分布式锁、实现分布式锁通用SDK与集成、七种分布式事务解决方案、分布式事务Seata框架深入剖析、分库分表利器一-Sharding-JDBC实战等等内容。我将分别从源码、手撸框架、实战演练等多个方面进行多维度深入讲解,让大家轻松掌握分布式各种解决方案。首先我要问大家一个问题:大型项目分布式系统核心问题你能解决多少?1、分布式锁1.你知道Etcd如何实现分布式锁的吗?2.你知道Redis实现的分布式锁存在什么问题吗?3.不同分布式锁实现方案的优缺点你清楚了吗?4.如果让你手撸实现Redis分布式锁,你可以做到吗?2、分布式事务1.你知道为什么CAP不能同时满足吗?2.你了解不同分布式事务解决方案对应什么样的应用场景么?3.你知道为什么大多数业务场景都选择了最终一致性实现方案么?4.你了解Seata框架为什么当下如此受欢迎么?3、分布式ID1.这么多种分布式ID生成方式,应该选择哪种呢?2.雪花算法底层实现原理是什么?4、分库分表1.当数据量大了之后,我们应该如何选择分库分表的解决方案?2.做分库分表,是应该垂直切分还是水平切分?带着这些问题,我们一起来展开代码实战:新增和修改我们封装一个通用方法updateItem(),该方法传入两个参数:storeName、data,storeName表示对象仓库名称,data是一个对象,包含主键和索引,在调用indexedDB所提供的put()方法,在新增操作的时候不需要传入索引的键值对,修改操作的时候在该方法中另外多传递一个主键的键值对,这样才能根据id去修改对应的某一条数据。updateItem(storeName:string,data:any){  console.log(this.db)  conststore=this.db.transaction([storeName],'readwrite').objectStore(storeName)  constrequest=store.put({   ...data,   updateTIme:newDate().getTime()  })  request.onsuccess=(event:any)=>{   console.log('数据写入成功')   console.log(event)  }  request.onerror=(event:any)=>{   console.log('数据写入失败')   console.log(event)  }}关键点是根据传入key即为主键id的值来查询某一条数据,需要使用到indexedDB提供的get()方法来实现查询操作。getItem(storeName:string,key:number|string){  conststore=this.db.transaction([storeName],'readwrite').objectStore(storeName)  constrequest=store.get(key)  request.onsuccess=(event:any)=>{   console.log('查询某一条数据成功')   console.log(event.target.result)  }  request.onerror=(event:any)=>{   console.log('查询某一条数据失败')   console.log(event)  }}为了更好的获取indexedD事务中的返回结果,我们使用promise来包装一下上一小节indexedDB.ts中定义的几个方法:openStore、updateItem、deleteItem、getList、getItem。下面代码片段为getList() //查询所有数据 getList(storeName:string){  conststore=this.db.transaction(storeName).objectStore(storeName)  constrequest=store.getAll()  returnnewPromise((resolve,reject)=>{   request.onsuccess=(event:any)=>{    console.log('查询所有数据成功')    console.log(event.target.result)    resolve(event.target.result)   }   request.onerror=(event:any)=>{    console.log('查询所有数据失败')    console.log(event)    reject(event)   }  }) }在第一步中,首先使用Typescript的interface为store中的所有state声明类型,然后将interface放置在InjectionKeyd的泛型类型中,代码片段如下://src/store/index.tsimport{createStore,Store}from'vuex'import{InjectionKey}from'vue'//为storestate声明类型exportinterfaceAllStateTypes{ count:number, locale:any, userStatus:Number}//定义injectionkeyexportconstkey:InjectionKey<Store<AllStateTypes>>=Symbol('storeKey')exportconststore=createStore<AllStateTypes>({ //...})通过环境变量区分server.js中的一些代码片段,因为有些代码需要运行在开发环境,而有些代码需要运行在生产环境。本小节在server.js中一共对3个地方进行了环境区分,代码片段如下://server.jsif(!isProd){ //1.读取index.html template=fs.readFileSync(  path.resolve(__dirname,'index.html'),  'utf-8' ) //2.应用ViteHTML转换。这将会注入ViteHMR客户端, //  同时也会从Vite插件应用HTML转换。 //  例如:@vitejs/plugin-react-refresh中的globalpreambles template=awaitvite.transformIndexHtml(url,template) //3.加载服务器入口。vite.ssrLoadModule将自动转换 //  你的ESM源码使之可以在Node.js中运行!无需打包 //  并提供类似HMR的根据情况随时失效。 render=(awaitvite.ssrLoadModule('/src/entry-server.ts')).render}else{ //1.读取index.html template=fs.readFileSync(  path.resolve(__dirname,'dist/client/index.html'),  'utf-8' ) //3.加载服务器入口 render=require('./dist/server/entry-server.ts').render}fetchElephant()接口中有两个await,分别依次执行连接数据库和查询数据的操作,我们接下来在home.vue中引入这个Mock接口,然后调用,代码片段如下所示://home.vue//Mock接口functiongetElephant(){ fetchElephant().then(res=>{  console.log('Mock接口',res) })}getElephant()通过emit触发父组件上的事件,将language传递给父组件,并赋值给父组件中的全局组件<ElConfigProvider/>上的locale属性,同样也赋值给useI18n()实例上的locale属性,这样就可以实现在子组件headearCommon.vue中进行国际化切换操作并作用到父组件App.vue中
  • 所需E币: 0
    时间: 2023-12-22 10:13
    大小: 3.93KB
    上传者: 开心就很好了
    Java并发编程从入门到进阶多场景实战,众所周知,并发编程是优秀工程师的标准之一,但知识庞杂,复杂性高,常常让人望而却步。但如果没有掌握背后的核心原理,你开发的代码可能会成为难以调试和优化的头疼问题。在此,我将通过上百个案例场景驱动教学+动画直观演示,帮助大家深入、直观地理解并发编程核心概念和底层原理。助力大家在实际工作和面试中都能尽早脱颖而出。首先,我们先来了解关于并发的基本概念。并发情况主要会引出三个基本概念,分别是原子性、可见性、有序性三个基本概念Java中线程的状态分为6种:1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。2.运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。3.阻塞(BLOCKED):表示线程阻塞于锁。4.等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。5.超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。6.终止(TERMINATED):表示该线程已经执行完毕。其实我们可以通过job.setPartitionerClass来设置分区类,不过目前我们是没有设置的,那框架中是不是有默认值啊,是有的,我们可以通过job.getPartitionerClass方法看到默认情况下会使用HashPartitioner这个分区类那我们来看一下HashPartitioner的实现是什么样子的/**Partitionkeysbytheir{@linkObject#hashCode()}.*/@InterfaceAudience.Public@InterfaceStability.StablepublicclassHashPartitioner<K,V>extendsPartitioner<K,V>{ /**Use{@linkObject#hashCode()}topartition.*/ publicintgetPartition(Kkey,Vvalue,             intnumReduceTasks){  return(key.hashCode()&Integer.MAX_VALUE)%numReduceTasks; }}下面我们来具体跑一个这份数据,首先复制一份WordCountJob的代码,新的类名为WordCountJobSkewpackagecom.imooc.mr;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.LongWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.Mapper;importorg.apache.hadoop.mapreduce.Reducer;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjava.io.IOException;/** *数据倾斜-增加Reduce任务个数 * *Createdbyxuwei */publicclassWordCountJobSkew{  /**   *Map阶段   */  publicstaticclassMyMapperextendsMapper<LongWritable,Text,Text,LongWritable>{    Loggerlogger=LoggerFactory.getLogger(MyMapper.class);    /**     *需要实现map函数     *这个map函数就是可以接收<k1,v1>,产生<k2,v2>     *@paramk1     *@paramv1     *@paramcontext     *@throwsIOException     *@throwsInterruptedException     */    @Override    protectedvoidmap(LongWritablek1,Textv1,Contextcontext)        throwsIOException,InterruptedException{      //输出k1,v1的值      //System.out.println("<k1,v1>=<"+k1.get()+","+v1.toString()+">");      //logger.info("<k1,v1>=<"+k1.get()+","+v1.toString()+">");      //k1代表的是每一行数据的行首偏移量,v1代表的是每一行内容      //对获取到的每一行数据进行切割,把单词切割出来      String[]words=v1.toString().split("");      //把单词封装成<k2,v2>的形式      Textk2=newText(words[0]);      LongWritablev2=newLongWritable(1L);      //把<k2,v2>写出去      context.write(k2,v2);    }  }  /**   *Reduce阶段   */  publicstaticclassMyReducerextendsReducer<Text,LongWritable,Text,LongWritable>{    Loggerlogger=LoggerFactory.getLogger(MyReducer.class);    /**     *针对<k2,{v2...}>的数据进行累加求和,并且最终把数据转化为k3,v3写出去     *@paramk2     *@paramv2s     *@paramcontext     *@throwsIOException     *@throwsInterruptedException     */    @Override    protectedvoidreduce(Textk2,Iterable<LongWritable>v2s,Contextcontext)        throwsIOException,InterruptedException{      //创建一个sum变量,保存v2s的和      longsum=0L;      //对v2s中的数据进行累加求和      for(LongWritablev2:v2s){        //输出k2,v2的值        //System.out.println("<k2,v2>=<"+k2.toString()+","+v2.get()+">");        //logger.info("<k2,v2>=<"+k2.toString()+","+v2.get()+">");        sum+=v2.get();//模拟Reduce的复杂计算消耗的时间        if(sum%200==0){          Thread.sleep(1);        }      }      //组装k3,v3      Textk3=k2;      LongWritablev3=newLongWritable(sum);      //输出k3,v3的值      //System.out.println("<k3,v3>=<"+k3.toString()+","+v3.get()+">");      //logger.info("<k3,v3>=<"+k3.toString()+","+v3.get()+">");      //把结果写出去      context.write(k3,v3);    }  }  /**   *组装Job=Map+Reduce   */  publicstaticvoidmain(String[]args){    try{      if(args.length!=3){        //如果传递的参数不够,程序直接退出        System.exit(100);      }      //指定Job需要的配置参数      Configurationconf=newConfiguration();      //创建一个Job      Jobjob=Job.getInstance(conf);      //注意了:这一行必须设置,否则在集群中执行的时候是找不到WordCountJob这个类的      job.setJarByClass(WordCountJobSkew.class);      //指定输入路径(可以是文件,也可以是目录)      FileInputFormat.setInputPaths(job,newPath(args[0]));      //指定输出路径(只能指定一个不存在的目录)      FileOutputFormat.setOutputPath(job,newPath(args[1]));      //指定map相关的代码      job.setMapperClass(MyMapper.class);      //指定k2的类型      job.setMapOutputKeyClass(Text.class);      //指定v2的类型      job.setMapOutputValueClass(LongWritable.class);      //指定reduce相关的代码      job.setReducerClass(MyReducer.class);      //指定k3的类型      job.setOutputKeyClass(Text.class);      //指定v3的类型      job.setOutputValueClass(LongWritable.class);      //设置reduce任务个数      job.setNumReduceTasks(Integer.parseInt(args[2]));      //提交job      job.waitForCompletion(true);    }catch(Exceptione){      e.printStackTrace();    }  }}针对这个操作我们需要去修改代码,在这里我们再重新复制一个类,基于WordCountJobSkew复制,新的类名是WordCountJobSkewRandKeypackagecom.imooc.mr;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.LongWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.Mapper;importorg.apache.hadoop.mapreduce.Reducer;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjava.io.IOException;importjava.util.Random;/** *数据倾斜-把倾斜的数据打散 * *Createdbyxuwei */publicclassWordCountJobSkewRandKey{  /**   *Map阶段   */  publicstaticclassMyMapperextendsMapper<LongWritable,Text,Text,LongWritable>{    Loggerlogger=LoggerFactory.getLogger(MyMapper.class);    Randomrandom=newRandom();    /**     *需要实现map函数     *这个map函数就是可以接收<k1,v1>,产生<k2,v2>     *@paramk1     *@paramv1     *@paramcontext     *@throwsIOException     *@throwsInterruptedException     */    @Override    protectedvoidmap(LongWritablek1,Textv1,Contextcontext)        throwsIOException,InterruptedException{      //输出k1,v1的值      //System.out.println("<k1,v1>=<"+k1.get()+","+v1.toString()+">");      //logger.info("<k1,v1>=<"+k1.get()+","+v1.toString()+">");      //k1代表的是每一行数据的行首偏移量,v1代表的是每一行内容      //对获取到的每一行数据进行切割,把单词切割出来      String[]words=v1.toString().split("");      //把单词封装成<k2,v2>的形式      Stringkey=words[0];      if("5".equals(key)){        //把倾斜的key打散,分成10份        key="5"+"_"+random.nextInt(10);      }      Textk2=newText(key);      LongWritablev2=newLongWritable(1L);      //把<k2,v2>写出去      context.write(k2,v2);    }  }  /**   *Reduce阶段   */  publicstaticclassMyReducerextendsReducer<Text,LongWritable,Text,LongWritable>{    Loggerlogger=LoggerFactory.getLogger(MyReducer.class);    /**     *针对<k2,{v2...}>的数据进行累加求和,并且最终把数据转化为k3,v3写出去     *@paramk2     *@paramv2s     *@paramcontext     *@throwsIOException     *@throwsInterruptedException     */    @Override    protectedvoidreduce(Textk2,Iterable<LongWritable>v2s,Contextcontext)        throwsIOException,InterruptedException{      //创建一个sum变量,保存v2s的和      longsum=0L;      //对v2s中的数据进行累加求和      for(LongWritablev2:v2s){        //输出k2,v2的值        //System.out.println("<k2,v2>=<"+k2.toString()+","+v2.get()+">");        //logger.info("<k2,v2>=<"+k2.toString()+","+v2.get()+">");        sum+=v2.get();        //模拟Reduce的复杂计算消耗的时间        if(sum%200==0){          Thread.sleep(1);        }      }      //组装k3,v3      Textk3=k2;      LongWritablev3=newLongWritable(sum);      //输出k3,v3的值      //System.out.println("<k3,v3>=<"+k3.toString()+","+v3.get()+">");      //logger.info("<k3,v3>=<"+k3.toString()+","+v3.get()+">");      //把结果写出去      context.write(k3,v3);    }  }  /**   *组装Job=Map+Reduce   */  publicstaticvoidmain(String[]args){    try{      if(args.length!=3){        //如果传递的参数不够,程序直接退出        System.exit(100);      }      //指定Job需要的配置参数      Configurationconf=newConfiguration();      //创建一个Job      Jobjob=Job.getInstance(conf);      //注意了:这一行必须设置,否则在集群中执行的时候是找不到WordCountJob这个类的      job.setJarByClass(WordCountJobSkewRandKey.class);      //指定输入路径(可以是文件,也可以是目录)      FileInputFormat.setInputPaths(job,newPath(args[0]));      //指定输出路径(只能指定一个不存在的目录)      FileOutputFormat.setOutputPath(job,newPath(args[1]));      //指定map相关的代码      job.setMapperClass(MyMapper.class);      //指定k2的类型      job.setMapOutputKeyClass(Text.class);      //指定v2的类型      job.setMapOutputValueClass(LongWritable.class);      //指定reduce相关的代码      job.setReducerClass(MyReducer.class);      //指定k3的类型      job.setOutputKeyClass(Text.class);      //指定v3的类型      job.setOutputValueClass(LongWritable.class);      //设置reduce任务个数      job.setNumReduceTasks(Integer.parseInt(args[2]));      //提交job      job.waitForCompletion(true);    }catch(Exceptione){      e.printStackTrace();    }  }}调用parallelize()时,有一个重要的参数可以指定,就是将集合切分成多少个partition。Spark会为每一个partition运行一个task来进行处理。Spark默认会根据集群的配置来设置partition的数量。我们也可以在调用parallelize()方法时,传入第二个参数,来设置RDD的partition数量,例如:parallelize(arr,5)scala代码如下:packagecom.imooc.scalaimportorg.apache.spark.{SparkConf,SparkContext}/** *需求:使用集合创建RDD *Createdbyxuwei */objectCreateRddByArrayScala{ defmain(args:Array[String]):Unit={  //创建SparkContext  valconf=newSparkConf()  conf.setAppName("CreateRddByArrayScala")//设置任务名称  .setMaster("local")//local表示在本地执行  valsc=newSparkContext(conf)  //创建集合  valarr=Array(1,2,3,4,5)  //基于集合创建RDD  valrdd=sc.parallelize(arr)  valsum=rdd.reduce(_+_)  println(sum)  //停止SparkContext  sc.stop() }}
  • 所需E币: 0
    时间: 2023-10-27 18:00
    大小: 3.56KB
    上传者: huangyasir1990
    一、什么是分布式系统?要理解分布式系统,主要需要明白一下2个方面:1、分布式系统一定是由多个节点组成的系统。其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的。2、这些连通的节点上部署了我们的节点,并且相互的操作会有协同。分布式系统对于用户而言,他们面对的就是一个服务器,提供用户需要的服务而已。而实际上这些服务是通过背后的众多服务器组成的一个分布式系统。因此分布式系统看起来像是一个超级计算机一样。Java筑基(基础):Tomcat+Mysql+设计模式+并发编程+JVM+Netty开源框架(SSM框架):Spring+SpringMVC+Mybatis微服务架构:Dubbo、SpringBoot、SprinGCloud、Docker分布式:分布式限流+分布式缓存+分布式通讯(限流:Nignx+Zookeeper/缓存:Redis+MongoDB+Memcached/通讯:RabbitMQ+RocketMQ+Kafka)性能优化:Mysql优化+Java性能调优+JVM调优+Tomcat调二、分布式对象技术有三大流派目前国际上,分布式对象技术有三大流派——COBRA、COM/DCOM和Java。CORBA技术是最早出现的,1991年OMG颁布了COBRA1.0标准,在当时来说做得非常漂亮;再有就是Microsoft的COM系列,从最初的COM发展成现在的DCOM,形成了Microsoft一套分布式对象的计算平台;而Sun公司的Java平台,在其最早推出的时候,只提供了远程的方法调用,在当时并不能被称为分布式对象计算,只是属于网络计算里的一种,接着推出的JavaBean,也还不足以和上述两大流派抗衡,而其目前的版本叫J2EE,推出了EJB,除了语言外还有组件的标准以及组件之间协同工作通讯的框架。于是,也就形成了目前的三大流派。Motan是新浪微博开源的一个Java框架。它诞生的比较晚,起于2013年,2016年5月开源。Motan在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用。rpcx是Go语言生态圈的Dubbo,比Dubbo更轻量,实现了Dubbo的许多特性,借助于Go语言优秀的并发特性和简洁语法,可以使用较少的代码实现分布式的RPC服务。gRPC是Google开发的高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(ProtocolBuffers)序列化协议开发,且支持众多开发语言。本身它不是分布式的,所以要实现上面的框架的功能需要进一步的开发。thrift是Apache的一个跨语言的高性能的服务框架,也得到了广泛的应用。首先明确一点:分布式并不是某个技术的概称,而是一个互联网服务系统架构思想。我们一般称之为分布式架构。那么分布式到底是什么一个概念:分布式诞生的初衷是为了在多业务场景下,保证五个特点:高性能,高并发,高可用,可伸缩,可维护。它的具体实现——分布式系统,则是由一组服务节点,共同协调工作组成。它们之间通过网络进行通信。可以说它的诞生为单体架构解决了很大一部分问题,满足了互联网对大数据存储,高并发,快响应的要求,采用了”分而治之“的思想。三、Java工程师必须学习分布式架构技术吗?不论是从公司发展的需要、还是从个人能力提升考虑,分布式架构技术对于每位Java工程师来说,可以说是一项必备技能了!每一位想要在职业发展之路上更进一步的Java从业者,都需要牢牢掌握分布式架构思想。在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓存策略考虑进去,或者并没有选择更优的缓存策略,那么到时候重构起来将会是一个噩梦。本文主要是分享了5个常用的Java分布式缓存框架,这些缓存框架支持多台服务器的缓存读写功能,可以让你的缓存系统更容易扩展。四、分布式架构的技术要点:RPC的设计架构与思想,RPC架构完整调用流程,自定义RPC相应因素详情等;Netty三大组件,ByteBuffer之工作原理、应用模式、分配与释放机制、源码剖析等;RPC工程设计与整体结构,完成RPC服务注册与发现功能;ZK核心组件剖析,ZK工作流程剖析,网络通信组件、会话接收器、并发处理器等;Dubbo源码结构、整体设计及层次结构与作用,SPI机制,Dubbo服务注册发现剖析,Dubbo服务高可用,Dubbo服务治理之调用过程、服务降级与限流剖析,网络通信协议详解。五、分布式锁的解决方式1.首先明确一点,有人可能会问是否可以考虑采用ReentrantLock来实现,但是实际上去实现的时候是有问题的,ReentrantLock的lock和unlock要求必须是在同一线程进行,而分布式应用中,lock和unlock是两次不相关的请求,因此肯定不是同一线程,因此导致无法使用ReentrantLock。2.基于数据库表做乐观锁,用于分布式锁。3.使用memcached的add()方法,用于分布式锁。4.使用memcached的cas()方法,用于分布式锁。(不常用) 5.使用redis的setnx()、expire()方法,用于分布式锁。6.使用redis的setnx()、get()、getset()方法,用于分布式锁。7.使用redis的watch、multi、exec命令,用于分布式锁。(不常用) 8.使用zookeeper,用于分布式锁。(不常用) 六、大型项目分布式系统核心问题你能解决多少?分布式锁1.你知道Etcd如何实现分布式锁的吗?2.你知道Redis实现的分布式锁存在什么问题吗?3.不同分布式锁实现方案的优缺点你清楚了吗?4.如果让你手撸实现Redis分布式锁,你可以做到吗?分布式事务1.你知道为什么CAP不能同时满足吗?2.你了解不同分布式事务解决方案对应什么样的应用场景么?3.你知道为什么大多数业务场景都选择了最终一致性实现方案么?4.你了解Seata框架为什么当下如此受欢迎么?分布式ID1.这么多种分布式ID生成方式,应该选择哪种呢?2.雪花算法底层实现原理是什么?分库分表1.当数据量大了之后,我们应该如何选择分库分表的解决方案?2.做分库分表,是应该垂直切分还是水平切分?分布式会话
  • 所需E币: 0
    时间: 2023-8-18 17:00
    大小: 1.77KB
    上传者: 蝴蝶结欧恩
    分享一套java课程——Java七大热门技术框架源码解析,已完结25章,附源码。Java的性能受到多种因素的影响,在不同版本的软件中可能会有不同的表现。出乎开发人员和应用程序所有者意料的是,最新版本的Java并不一定提供最佳性能。编译器增强:Java每次发布新版本,都会改进即时(JIT)编译器。该编译器负责在运行时优化字节码,因此它的提升不仅可以更好地优化代码,而且还可以改进内存管理并提升特定类型应用程序的性能。
  • 所需E币: 0
    时间: 2023-8-10 09:55
    大小: 1.14KB
    Java七大热门技术框架源码解析视频教程分享,2023最新,一共25章!汇聚了JavaWeb开发主流热门框架(SpringFramework,SpringData,SpringBoot,SpringCloud,Mybatis,Tomcat,RocketMQ):框架1:SpringFrameworkspringframework是spring里面的一个基础开源框架,主要用于javaee的企业开发。框架2:SpringDataSpringData的任务是为数据访问提供一个熟悉且一致的,基于Spring的编程模型,同时仍保留基础数据存储的特殊特征框架3:SpringBootSpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。框架4:SpringCloudSpringCloud是一系列框架的有序集合。它利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用SpringBoot的开发风格做到一键启动和部署。框架5:MybatisMyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为MyBatis。框架6:TomcatTomcat是Apache软件基金会(ApacheSoftwareFoundation)的Jakarta项目中的一个核心项目框架7:RocketMQRocketMQ是由阿里捐赠给Apache的一款低延迟、高并发、高可用、高可靠的分布式消息中间件
  • 所需E币: 0
    时间: 2023-6-26 15:17
    大小: 1.83KB
    上传者: 蝴蝶结欧恩
    分享课程——Java七大热门技术框架源码解析,附源码+笔记。本课程专门为你汇聚了JavaWeb开发主流热门框架(SpringFramework,SpringData,SpringBoot,SpringCloud,Mybatis,Tomcat,RocketMQ),从框架的架构设计、核心源码解析到二次开发,造轮子,面试指导,循序渐进的让你更全面的掌握框架底层原理,提升框架应用技巧、和造轮子等高阶能力。
  • 所需E币: 5
    时间: 2023-6-9 09:28
    大小: 162.37KB
    上传者: 木头1233
    基于JAVA遗传算法的中药药对挖掘系统的设计(源代码+论文)
  • 所需E币: 5
    时间: 2023-6-9 09:27
    大小: 2.28MB
    上传者: 木头1233
    基于JAVA局域网监听软件的设计与开发(包含源代码及论文)
  • 所需E币: 5
    时间: 2023-6-9 09:27
    大小: 4.06MB
    上传者: 木头1233
    基于JAVA的医药管理系统设计与实现(包含论文及源代码)
  • 所需E币: 5
    时间: 2023-6-9 09:28
    大小: 169.49KB
    上传者: 木头1233
    基于Java在BS结构下的OA流程可视化的设计(源代码+论文)
  • 所需E币: 5
    时间: 2023-6-9 09:28
    大小: 340.11KB
    上传者: 木头1233
    基于Java手机游戏(堡垒)的设计与开发(包含源代码及论文)
  • 所需E币: 5
    时间: 2023-6-9 09:27
    大小: 240.58KB
    上传者: 木头1233
    基于JAVA局域网飞鸽传书软件设计与实现(源代码+论文)
  • 所需E币: 5
    时间: 2023-6-9 09:20
    大小: 7.36MB
    上传者: 木头1233
    基于JAVA的班主任管理系统设计与实现(包含源代码及论文)
  • 所需E币: 5
    时间: 2023-6-9 09:19
    大小: 105.02KB
    上传者: 木头1233
    基于JAVA的J2ME的手机游戏(贪吃蛇)开发设计(论文+源代码)
  • 所需E币: 5
    时间: 2023-6-9 09:20
    大小: 1.01MB
    上传者: 木头1233
    基于JAVA的RSA文件加密软件的设计与实现(源代码+论文)
  • 所需E币: 5
    时间: 2023-6-9 09:22
    大小: 406.8KB
    上传者: 木头1233
    基于JAVA的物业管理系统设计与实现(包含论文及源代码)
  • 所需E币: 5
    时间: 2023-6-9 09:19
    大小: 1.43MB
    上传者: 木头1233
    基于Java的ME无线网络移动端的俄罗斯方块游戏设计(论文+源代码)
  • 所需E币: 5
    时间: 2023-6-9 09:21
    大小: 46.7KB
    上传者: 木头1233
    基于JAVA的画图形学程序设计与实现(包含论文及源代码)
  • 所需E币: 5
    时间: 2023-6-9 09:21
    大小: 263.1KB
    上传者: 木头1233
    基于JAVA的本地监听与远程端口扫描设计(源代码+论文)
  • 所需E币: 5
    时间: 2023-6-9 09:20
    大小: 1.01MB
    上传者: 木头1233
    基于JAVA的SNMP网络设备MIB信息采集(论文+源代码)