首页 文章 精选 留言 我的

精选列表

搜索[企业级在线文档编辑解决方案],共10000篇文章
优秀的个人博客,低调大师

ApiBoot DataSource Switch 使用文档

ApiBoot是一款基于SpringBoot1.x,2.x的接口服务集成基础框架, 内部提供了框架的封装集成、使用扩展、自动化完成配置,让接口开发者可以选着性完成开箱即用, 不再为搭建接口框架而犯愁,从而极大的提高开发效率。 ApiBoot DataSource Switch 顾名思义,DataSource Switch是用于数据源选择切换的框架,这是一款基于Spring AOP切面指定注解实现的,通过简单的数据源注解配置就可以完成访问时的自动切换,DataSource Switch切换过程中是线程安全的。 添加依赖 使用DataSource Switch很简单,在pom.xml配置文件内添加如下依赖: <!--ApiBoot DataSource Switch--> <dependency> <groupId>org.minbox.framework</groupId> <artifactId>api-boot-starter-datasource-switch</artifactId> </dependency> ApiBoot所提供的依赖都不需要添加版本号,具体查看ApiBoot版本依赖 集成数据源实现 目前ApiBoot DataSource Switch集成了Druid、HikariCP两种数据源实现依赖,在使用方面也有一定的差异,因为每一个数据源的内置参数不一致。 Druid:参数配置前缀为api.boot.datasource.druid HikariCP:参数配置前缀为api.boot.datasource.hikari 具体使用请查看下面功能配置介绍。 配置参数 参数名 参数默认值 是否必填 参数描述 api.boot.datasource.primary master 否 主数据源名称 api.boot.datasource.druid.{poolName}.url 无 是 数据库连接字符串 api.boot.datasource.druid.{poolName}.username 无 是 用户名 api.boot.datasource.druid.{poolName}.password 无 是 密码 api.boot.datasource.druid.{poolName}.driver-class-name com.mysql.cj.jdbc.Driver 否 驱动类型 api.boot.datasource.druid.{poolName}.filters stat,wall,slf4j 否 Druid过滤 api.boot.datasource.druid.{poolName}.max-active 20 否 最大连接数 api.boot.datasource.druid.{poolName}.initial-size 1 否 初始化连接数 api.boot.datasource.druid.{poolName}.max-wait 60000 否 最大等待市场,单位:毫秒 api.boot.datasource.druid.{poolName}.validation-query select 1 from dual 否 检查sql api.boot.datasource.druid.{poolName}.test-while-idle true 否 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 api.boot.datasource.druid.{poolName}.test-on-borrow false 否 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 api.boot.datasource.druid.{poolName}.test-on-return false 否 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 api.boot.datasource.hikari.{poolName}.url 无 是 数据库连接字符串 api.boot.datasource.hikari.{poolName}.username 无 是 用户名 api.boot.datasource.hikari.{poolName}.password 无 是 密码 api.boot.datasource.hikari.{poolName}.driver-class-name com.mysql.cj.jdbc.Driver 否 数据库驱动类全限定名 api.boot.datasource.hikari.{poolName}.property 无 否 HikariCP属性配置 HikariCP数据源是SpringBoot2.x自带的,配置参数请访问HikariCP。 单主配置 ApiBoot DataSource Switch支持单主数据源的配置,application.yml配置文件如下所示: api: boot: datasource: # 配置使用hikari数据源 hikari: # master datasource config master: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 修改主数据源名称 master为默认的主数据源的poolName,这里可以进行修改为其他值,不过需要对应修改primary参数,如下所示: api: boot: datasource: # 主数据源,默认值为master primary: main # 配置使用hikari数据源 hikari: # main datasource config main: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 在上面配置主数据源的poolName修改为main。 主从配置 如果你的项目内存在单主单从、一主多从的配置方式,如下所示: api: boot: datasource: # 配置使用hikari数据源 hikari: # master datasource config master: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 # 默认值为【com.mysql.cj.jdbc.Driver】 #driver-class-name: com.mysql.cj.jdbc.Driver # slave 1 datasource config slave_1: url: jdbc:mysql://localhost:3306/oauth2?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 # slave 2 datasource config slave_2: url: jdbc:mysql://localhost:3306/resources?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 在上面是一主多从的配置方式,分别是master、slave_1、slave_2。 多类型数据库配置 ApiBoot DataSource Switch提供了一个项目内连接多个不同类型的数据库,如:MySQL、Oracle...等,如下所示: api: boot: # 主数据源,默认值为master primary: mysql hikari: mysql: url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 oracle: url: jdbc:oracle:thin:@172.16.10.25:1521:torcl username: root password: 123456 driver-class-name: oracle.jdbc.driver.OracleDriver 在上面配置中,master主数据源使用的MySQL驱动连接MySQL数据库,而slave从数据源则是使用的Oracle驱动连接的Oracle数据库。 动态创建数据源 ApiBoot DataSource Switch内部提供了动态创建数据源的方法,可以通过注入ApiBootDataSourceFactoryBean来进行添加,如下所示: @Autowired private ApiBootDataSourceFactoryBean factoryBean; public void createNewDataSource() throws Exception { // 创建Hikari数据源 // 如果创建Druid数据源,使用DataSourceDruidConfig DataSourceHikariConfig config = new DataSourceHikariConfig(); // 数据库连接:必填 config.setUrl("jdbc:mysql://localhost:3306/resources"); // 用户名:必填 config.setUsername("root"); // 密码:必填 config.setPassword("123456"); // 数据源名称:必填(用于@DataSourceSwitch注解value值使用) config.setPoolName("dynamic"); // 创建数据源 DataSource dataSource = factoryBean.newDataSource(config); Connection connection = dataSource.getConnection(); System.out.println(connection.getCatalog()); connection.close(); } 自动切换 ApiBoot DataSource Switch的数据源自动切换主要归功于Spring的AOP,通过切面@DataSourceSwitch注解,获取注解配置的value值进行设置当前线程所用的数据源名称,从而通过AbstractRoutingDataSource进行数据源的路由切换。 我们沿用上面一主多从的配置进行代码演示,配置文件application.yml参考上面配置,代码示例如下: 从数据源示例类 @Service @DataSourceSwitch("slave") public class SlaveDataSourceSampleService { /** * DataSource Instance */ @Autowired private DataSource dataSource; /** * 演示输出数据源的catalog * * @throws Exception */ public void print() throws Exception { // 获取链接 Connection connection = dataSource.getConnection(); // 输出catalog System.out.println(this.getClass().getSimpleName() + " ->" + connection.getCatalog()); // 关闭链接 connection.close(); } } 主数据源示例类 @Service @DataSourceSwitch("master") public class MasterDataSourceSampleService { /** * DataSource Instance */ @Autowired private DataSource dataSource; /** * Slave Sample Service */ @Autowired private SlaveDataSourceSampleService slaveDataSourceSampleService; /** * 演示输出主数据源catalog * 调用从数据源类演示输出catalog * * @throws Exception */ public void print() throws Exception { Connection connection = dataSource.getConnection(); System.out.println(this.getClass().getSimpleName() + " ->" + connection.getCatalog()); connection.close(); slaveDataSourceSampleService.print(); } } 在主数据源的示例类内,我们通过@DataSourceSwitch("master")注解的value进行定位连接master数据源数据库。 同样在从数据库的示例类内,我们也可以通过@DataSourceSwitch("slave")注解的value进行定位连接slave数据源数据库。 单元测试示例 在上面的测试示例中,我们使用交叉的方式进行验证数据源路由是否可以正确的进行切换,可以编写一个单元测试进行验证结果,如下所示: @Autowired private MasterDataSourceSampleService masterDataSourceSampleService; @Test public void contextLoads() throws Exception { masterDataSourceSampleService.print(); } 运行上面测试方法,结果如下所示: MasterDataSourceSampleService ->test 2019-04-04 10:20:45.407 INFO 7295 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Starting... 2019-04-04 10:20:45.411 INFO 7295 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-2 - Start completed. SlaveDataSourceSampleService ->oauth2 单次执行数据源切换没有任何的问题,master数据源获取catalog输出后,调用slave示例类进行输出catalog。 ApiBoot DataSource Switch会在项目启动时首先初始化master节点DataSource实例,其他实例会在第一次调用时进行初始化。 压力性能测试 单次执行单线程操作没有问题,不代表多线程下不会出现问题,在开头说到过ApiBoot DataSource Switch是线程安全的,所以接下来我们来验证这一点,我们需要添加压力测试的依赖,如下所示: <dependency> <groupId>org.databene</groupId> <artifactId>contiperf</artifactId> <version>2.3.4</version> <scope>test</scope> </dependency> 接下来把上面的单元测试代码改造下,如下所示: // 初始化压力性能测试对象 @Rule public ContiPerfRule i = new ContiPerfRule(); @Autowired private MasterDataSourceSampleService masterDataSourceSampleService; /** * 开启500个线程执行10000次 */ @Test @PerfTest(invocations = 10000, threads = 500) public void contextLoads() throws Exception { masterDataSourceSampleService.print(); } 测试环境: 硬件:i7、16G、256SSD 系统:OS X 整个过程大约是10秒左右,ApiBoot DataSource Switch并没有发生出现切换错乱的情况。 注意事项 在使用ApiBoot DataSource Switch时需要添加对应数据库的依赖 如果使用Druid连接池,不要配置使用druid-starter的依赖,请使用druid依赖。 配置poolName时不要添加特殊字符、中文、中横线等。

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

ApiBoot - ApiBoot Quartz 使用文档

ApiBoot Quartz ApiBoot内部集成了Quartz,提供了数据库方式、内存方式的进行任务的存储,其中数据库方式提供了分布式集群任务调度,任务自动平滑切换执行节点。 引用ApiBoot Quartz 在pom.xml配置文件内添加,如下配置: <!--ApiBoot Quartz--> <dependency> <groupId>org.minbox.framework</groupId> <artifactId>api-boot-starter-quartz</artifactId> </dependency> 备注:如果使用ApiBoot Quartz的内存方式,仅需要添加上面的依赖即可。 相关配置 参数名称 是否必填 默认值 描述 api.boot.quartz.job-store-type 否 memory 任务存储源方式,默认内存方式 api.boot.quartz.scheduler-name 否 scheduler 调度器名称 api.boot.quartz.auto-startup 否 true 初始化后是否自动启动调度程序 api.boot.quartz.startup-delay 否 0 初始化完成后启动调度程序的延迟。 api.boot.quartz.wait-for-jobs-to-complete-on-shutdown 否 false 是否等待正在运行的作业在关闭时完成。 api.boot.quartz.overwrite-existing-jobs 否 false 配置的作业是否应覆盖现有的作业定义。 api.boot.quartz.properties 否 Quartz自定义的配置属性,具体参考quartz配置 api.boot.quartz.jdbc 否 配置数据库方式的Jdbc相关配置 内存方式 ApiBoot Quartz在使用内存方式存储任务时,不需要做配置调整。 数据库方式 需要在application.yml配置文件内修改api.boot.quartz.job-store-type参数,如下所示: api: boot: quartz: # Jdbc方式 job-store-type: jdbc Quartz所需表结构 Quartz的数据库方式内部通过DataSource获取数据库连接对象来进行操作数据,所操作数据表的表结构是固定的,ApiBoot把Quartz所支持的所有表结构都进行了整理,访问Quartz支持数据库建表语句列表查看,复制执行对应数据库语句即可。 创建任务类 我们只需要让新建类集成QuartzJobBean就可以完成创建一个任务类,如下简单示例: /** * 任务定义示例 * 与Quartz使用方法一致,ApiBoot只是在原生基础上进行扩展,不影响原生使用 * <p> * 继承QuartzJobBean抽象类后会在项目启动时会自动加入Spring IOC * * @author:恒宇少年 - 于起宇 * <p> * DateTime:2019-03-28 17:26 * Blog:http://blog.yuqiyu.com * WebSite:http://www.jianshu.com/u/092df3f77bca * Gitee:https://gitee.com/hengboy * GitHub:https://github.com/hengboy */ public class DemoJob extends QuartzJobBean { /** * logger instance */ static Logger logger = LoggerFactory.getLogger(DemoJob.class); @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { logger.info("定时任务Job Key : {}", context.getJobDetail().getKey()); logger.info("定时任务执行时所携带的参数:{}", JSON.toJSONString(context.getJobDetail().getJobDataMap())); //...处理逻辑 } } 任务参数 在任务执行时传递参数是必须的,ApiBoot Quartz提供了比较方便的传递方式,不过最终Quartz会把传递的值都会转换为String类型数据。 任务Key默认值 ApiBoot Quartz的newJob方法所创建的定时任务,如果在不传递Job Key参数时,会默认使用UUID随机字符串作为Job Key以及Trigger Key。 自定义任务开始时间 任务开始时间可以通过startAtTime方法进行设置,在不设置的情况下,任务创建完成后会立刻执行。 Cron 表达式任务 创建Cron类型任务如下所示: String jobKey = apiBootQuartzService.newJob(ApiBootCronJobWrapper.Context() .jobClass(DemoJob.class) .cron("0/5 * * * * ?") .param( ApiBootJobParamWrapper.wrapper().put("param", "测试")) .wrapper()); Cron 表达式任务由ApiBootCronJobWrapper类进行构建。 上面的DemoJob任务类将会每隔5秒执行一次。 Loop 重复任务 Loop循环任务,当在不传递重复执行次数时,不进行重复执行,仅仅执行一次,如下所示: String jobKey = apiBootQuartzService.newJob( ApiBootLoopJobWrapper.Context() // 参数 .param( ApiBootJobParamWrapper.wrapper() .put("userName", "恒宇少年") .put("userAge", 24) ) // 每次循环的间隔时间,单位:毫秒 .loopIntervalTime(2000) // 循环次数 .repeatTimes(5) // 开始时间,10秒后执行 .startAtTime(new Date(System.currentTimeMillis() + 10000)) // 任务类 .jobClass(DemoJob.class) .wrapper() ); Loop 任务由ApiBootLoopJobWrapper类进行构建。 上面的定时任务将会重复执行5次,连上自身执行的一次也就是会执行6次,每次的间隔时间为2秒,在任务创建10秒后进行执行。 Once 一次性任务 Once一次性任务,任务执行一次会就会被自动释放,如下所示: Map paramMap = new HashMap(1); paramMap.put("paramKey", "参数值"); String jobKey = apiBootQuartzService.newJob( ApiBootOnceJobWrapper.Context() .jobClass(DemoJob.class) // 参数 .param( ApiBootJobParamWrapper.wrapper() .put("mapJson", JSON.toJSONString(paramMap)) ) // 开始时间,2秒后执行 .startAtTime(new Date(System.currentTimeMillis() + 2000)) .wrapper() ); Once 任务由ApiBootOnceJobWrapper类进行构建。 在参数传递时可以是对象、集合,不过需要进行转换成字符串才可以进行使用。 暂停任务执行 任务在执行过程中可以进行暂停操作,通过ApiBoot Quartz提供的pauseJob方法就可以很简单的实现,当然暂停时需要传递Job Key,Job Key可以从创建任务方法返回值获得。 暂停任务如下所示: // 暂停指定Job Key的任务 apiBootQuartzService.pauseJob(jobKey); // 暂停多个执行中任务 apiBootQuartzService.pauseJobs(jobKey,jobKey,jobKey); 恢复任务执行 任务执行完暂停后,如果想要恢复可以使用如下方式: // 恢复指定Job Key的任务执行 apiBootQuartzService.resumeJob(jobKey); // 恢复多个暂停任务 apiBootQuartzService.resumeJobs(jobKey,jobKey,jobKey); 修改Cron表达式 修改Cron表达式的场景如下: 已创建 & 未执行 已创建 & 已执行 修改方法如下所示: // 修改执行Job Key任务的Cron表达式 apiBootQuartzService.updateJobCron(jobKey, "0/5 * * * * ?"); 删除任务 想要手动释放任务时可以使用如下方式: // 手动删除指定Job Key任务 apiBootQuartzService.deleteJob(jobKey); // 手动删除多个任务 apiBootQuartzService.deleteJobs(jobKey,jobKey,jobKey); 删除任务的顺序如下: 暂停触发器 移除触发器 删除任务本章源码地址:https://github.com/hengboy/api-boot/tree/master/api-boot-samples/api-boot-sample-quartz

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

Apache Storm 官方文档 —— Metrics

Storm 提供了一个可以获取整个拓扑中所有的统计信息的度量接口。Storm 内部通过该接口可以跟踪各类统计数字:executor 和 acker 的数量、每个 bolt 的平均处理时延、worker 使用的最大堆容量等等,这些信息都可以在 Nimbus 的 UI 界面中看到。 Metric 类型 使用 Metrics 只需要实现一个接口方法:getValueAndReset,在方法中可以查找汇总值、并将该值复位为初始值。例如,在 MeanReducer 中就实现了通过运行总数除以对应的运行计数的方式来求取均值,然后将两个值都重新设置为 0。 Storm 提供了以下几种 metric 类型: AssignableMetric— 将 metric 设置为指定值。此类型在两种情况下有用:1. metric 本身为外部设置的值;2. 你已经另外计算出了汇总的统计值。 CombinedMetric— 可以对 metric 进行关联更新的通用接口。 CountMetric— 返回 metric 的汇总结果。可以调用incr()方法来将结果加一;调用incrBy(n)方法来将结果加上给定值。 MultiCountMetric— 返回包含一组 CountMetric 的 HashMap ReducedMetric MeanReducer— 跟踪由它的reduce()方法提供的运行状态均值结果(可以接受Double、Integer、Long等类型,内置的均值结果是Double类型)。MeanReducer 确实是一个相当棒的家伙。 MultiReducedMetric— 返回包含一组 ReducedMetric 的 HashMap Metric Consumer 构建自定义 metric 内建的 Metric builtin_metrics.clj为内建的 metrics 设置了数据结构,以及其他框架组件可以用于更新的虚拟方法。metrics 本身是在回调代码中实现计算的 — 请参考executor.clj中的ack-spout-msg的例子。 转载自并发编程网 - ifeve.com

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

Apache Storm 官方文档 —— Hooks

Storm 提供了一种 hooks 机制,可以实现在 Storm 的各种事件流中运行自定义代码的功能。可以通过继承BaseTaskHook类来创建 hook,还可以根据需要在继承的子类中覆写适当的方法来跟踪相关事件。 注册 hook 有两种方法: 在 spout 的 open 方法或者 bolt 的 prepare 方法中使用TopologyContext#addTaskHook方法; 使用 Storm 配置表中的topology.auto.task.hooks配置项。之后这些 hook 会自动注册到每个 spout 和 bolt 中,这样就可以很方便地处理例如集成自定义的系统监控代码之类的事情了。 转载自并发编程网 - ifeve.com

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

Apache Storm 官方文档 —— 配置

Storm 有大量配置项用于调整 nimbus、supervisors 和拓扑的行为。有些配置项是系统级的配置项,在拓扑中不能修改,另外一些配置项则是可以在拓扑中修改的。 每一个配置项都在 Storm 代码库的defaults.yaml中有一个默认值。可以通过在 Nimbus 和 Supervisors 的环境变量中定义一个 storm.yaml 来覆盖默认值。最后,在使用StormSubmitter提交拓扑时也可以定义基于具体拓扑的配置项。但是,基于拓扑的配置项仅仅能够覆盖那些以 “TOPOLOGY” 作为前缀的配置项。 Storm 0.7.0 以上版本支持覆写每个 Bolt/Spout 的配置信息。不过,使用这种方式只能修改以下几个配置项: “topology.debug” “topology.max.spout.pending” “topology.max.task.parallelism” “topology.kryo.register”:由于序列化对拓扑中的所有组件都是可见的,这一项与其他几项稍微有一些不同,详细信息可以参考Storm 的序列化 Storm 的 Java API 支持两种自定义组件配置信息的方式: 内置型:在需要配置的 Spout/Bolt 中覆写getComponentConfiguration方法,使其返回特定组件的配置表; 外置型:TopologyBuilder中的setSpout与setBolt方法会返回一个带有addConfiguration方法的ComponentConfigurationDeclarer对象,通过addConfiguration方法就可以覆写对应组件的配置项(同时也可以添加自定义的配置信息——译者注)。 配置信息的优先级依次为:defaults.yaml < storm.yaml < 拓扑配置 < 内置型组件信息配置 < 外置型组件信息配置。 相关资料 Config:此类包含所有可配置项的列表,对于创建拓扑配置信息很有帮助 defaults.yaml:所有配置项的默认值 配置 Storm 集群:说明了如何创建、配置一个 Storm 集群 在生产环境中运行拓扑:列出了在集群中运行拓扑的一些有用的配置项 本地模式:列出了使用本地模式时比较有用的配置项 转载自并发编程网 - ifeve.com

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

《Spark 官方文档》硬件配置

硬件配置 Spark开发者们常常被问到的一个问题就是:如何为Spark配置硬件。我们通常会给出以下的建议,但具体的硬件配置还依赖于实际的使用情况。 存储系统 因为绝大多数Spark作业都很可能是从外部存储系统加载输入数据(如:HDFS或者HBase),所以最好把Spark部署在离这些存储比较近的地方。建议如下: 只要有可能,就尽量在HDFS相同的节点上部署Spark。最简单的方式就是,在HDFS相同的节点上独立部署Spark(standalone mode cluster),并配置好Spark和Hadoop的内存和CPU占用,以避免互相干扰(对Hadoop来说,相关的选项有 mapred.child.java.opts – 配置单个任务的内存,mapred.tasktracker.map.tasks.maximun和mapred.tasktracker.reduce.tasks.maximum – 配置任务个数)。当然,你也可以在一些通用的集群管理器上同时运行Hadoop和Spark,如:Mesos或Hadoop YARN。 如果不能将Spark和HDFS放在一起,那么至少要将它们部署到同一局域网的节点中。 对于像HBase这类低延迟数据存储来说,比起一味地避免存储系统的互相干扰,更需要关注的是将计算分布到不同节点上去。 本地磁盘 虽然大部分情况下,Spark都是在内存里做计算,但它仍会使用本地磁盘存储数据,如:存储无法装载进内存的RDD数据,存储各个阶段(stage)输出的临时文件。因此,我们建议每个节点上用4~8块磁盘,非磁盘阵列方式挂载(只需分开使用单独挂载点即可)。在Linux中,挂载磁盘时使用noatimeoption可以减少不必要的写操作。在Spark中,配置(configure)spark.local.dir 属性可指定Spark使用的本地磁盘目录,其值可以是逗号分隔的列表以指定多个磁盘目录。如果该节点上也有HDFS目录,可以和HDFS共用同一个块磁盘。 内存 一般来说,Spark可以在8GB~几百GB内存的机器上运行得很好。不过,我们还是建议最多给Spark分配75%的内存,剩下的内存留给操作系统和系统缓存。 每次计算具体需要多少内存,取决于你的应用程序。如需评估你的应用程序在使用某个数据集时会占用多少内存,可以尝试先加载一部分数据集,然后在Spark的监控UI(http://<driver-node>:4040)上查看其占用内存大小。需要注意的是,内存占用很大程度受存储级别和序列化格式影响 – 更多内存优化建议,请参考调优指南(tuning guide)。 最后,还需要注意的是,Java虚拟机在200GB以上内存的机器上并非总是表现良好。如果你的单机内存大于200GB,建议在单个节点上启动多个worker JVM。在Spark独立部署模式下(standalone mode),你可在conf/spark-env.sh 中设置 SPARK_WORKER_INSTANCES 来配置单节点上worker个数,而且在该文件中你还可以通过 SPARK_WORKER_CORES 设置单个worker占用的CPU core个数。 网络 以我们的经验来说,如果数据能加载进内存,那么多数Spark应用的瓶颈都是网络带宽。对这类应用,使用万兆网(10 Gigabit)或者更强的网络是最好的优化方式。对于一些包含有分布式归约相关算子(distributed reduce相关算子,如:group-by系列,reduce-by系列以及SQL join系列)的应用尤其是如此。对于任何一个应用,你可以在监控UI(http://<driver-node>:4040)上查看Spark混洗跨网络传输了多少数据量。 CPU Cores Spark在单机几十个CPU的机器上也能表现良好,因为Spark尽量减少了线程间共享的数据。但一般你至少需要单机8~16个CPU cores。当然,根据具体的计算量你可能需要更多的CPU,但是:一旦数据加载进内存,绝大多数应用的瓶颈要么是CPU,要么是网络。 转载自并发编程网 - ifeve.com

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

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部分的功能。

用户登录
用户注册