2.5.7 广播任务该方法在与计算实例关联的所有节点broadcast()上执行任务 。
// Limit broadcast to remote nodes only.IgniteCompute compute = ignite.compute(ignite.cluster().forRemotes());// Print out hello message on remote nodes in the cluster group.compute.broadcast(() -> System.out.println("Hello Node: " + ignite.cluster().localNode().id()));2.5.8 异步执行前几节中描述的所有方法都有异步对应物:
- callAsync(…?)
- runAsync(…?)
- applyAsync(…?)
- broadcastAsync(…?)
IgniteCompute compute = ignite.compute();Collection<IgniteCallable<Integer>> calls = new ArrayList<>();// Iterate through all words in the sentence and create callable jobs.for (String word : "Count characters using a callable".split(" "))calls.add(word::length);IgniteFuture<Collection<Integer>> future = compute.callAsync(calls);future.listen(fut -> {// Total number of characters.int total = fut.get().stream().mapToInt(Integer::intValue).sum();System.out.println("Total number of characters: " + total);});2.5.9 执行超时任务您可以设置任务执行的超时时间 。如果任务没有在给定的时间范围内完成,它会被停止并取消该任务产生的所有作业 。
要执行超时任务,请使用withTimeout(…?)计算接口的方法 。该方法返回一个计算接口,该接口以时间限制的方式执行给它的第一个任务 。后续任务没有超时:您需要调用withTimeout(…?)每个应该有超时的任务 。
IgniteCompute compute = ignite.compute();compute.withTimeout(300_000).run(() -> {// your computation// ...});2.5.10 在本地节点上的作业之间共享状态在一个节点上执行的不同计算作业之间共享状态通常很有用 。为此 , 每个节点上都有一个共享的并发本地映射 。
IgniteCluster cluster = ignite.cluster();ConcurrentMap<String, Integer> nodeLocalMap = cluster.nodeLocalMap();节点局部值类似于线程局部变量,因为这些值不分布并且仅保留在本地节点上 。节点本地数据可用于在计算作业之间共享状态 。它也可以被部署的服务使用 。
在以下示例中,作业每次在某个节点上执行时都会增加一个节点本地计数器 。结果,每个节点上的节点本地计数器告诉我们作业在该节点上执行了多少次 。
IgniteCallable<Long> job = new IgniteCallable<Long>() {@IgniteInstanceResourceprivate Ignite ignite;@Overridepublic Long call() {// Get a reference to node local.ConcurrentMap<String, AtomicLong> nodeLocalMap = ignite.cluster().nodeLocalMap();AtomicLong cntr = nodeLocalMap.get("counter");if (cntr == null) {AtomicLong old = nodeLocalMap.putIfAbsent("counter", cntr = new AtomicLong());if (old != null)cntr = old;}return cntr.incrementAndGet();}};2.5.11 从计算任务访问数据如果您的计算任务需要访问存储在缓存中的数据,您可以通过以下实例来完成Ignite:
public class MyCallableTask implements IgniteCallable<Integer> {@IgniteInstanceResourceprivate Ignite ignite;@Overridepublic Integer call() throws Exception {IgniteCache<Long, Person> cache = ignite.cache("person");// Get the data you needPerson person = cache.get(1L);// do with the data what you need to doreturn 1;}}请注意,上面显示的示例可能不是最有效的方法 。原因是key对应的person对象1可能位于与执行任务的节点不同的节点上 。在这种情况下,对象是通过网络获取的 。这可以通过将任务与数据放在一起来避免 。
注意:如果要在IgniteCallable和IgniteRunnable任务中使用键和值对象,请确保键和值类部署在所有集群节点上 。2.6 SQL查询与处理Ignite 带有符合 ANSI-99、水平可扩展和容错的分布式 SQL 数据库 。根据用例,通过跨集群节点对数据进行分区或完全复制来提供分布 。
作为 SQL 数据库,Ignite 支持所有 DML 命令 , 包括 SELECT、UPDATE、INSERT 和 DELETE 查询,并且还实现了与分布式系统相关的 DDL 命令子集 。
您可以通过连接来自外部工具和应用程序的JDBC或ODBC驱动程序与 Ignite 进行交互,就像与任何其他启用了 SQL 的存储一样 。Java、.NET 和 C++ 开发人员可以利用本机 SQL API 。
在内部 , SQL 表与键值缓存具有相同的数据结构 。这意味着您可以更改数据的分区分布并利用亲和力托管技术来获得更好的性能 。
Ignite 的默认 SQL 引擎使用 H2 数据库来解析和优化查询并生成执行计划,但也可以启用基于 Apache Calcite 的 SQL 引擎来执行查询 。
2.6.1 分布式查询针对分区表的查询以分布式方式执行:
- 查询被解析并拆分为多个“map”查询和一个“reduce”查询 。
推荐阅读
- 快读《ASP.NET Core技术内幕与项目实战》WebApi3.1:WebApi最佳实践
- IQueryable和IEnumerable 快读《ASP.NET Core技术内幕与项目实战》EFCore2.5:集合查询原理揭秘
- Spring事务传播行为实战
- 四十八 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-使用第三方UI框架
- React +SpreadJS+Echarts 项目实战:在线报价采购系统
- 四十七 SpringCloud微服务实战——搭建企业级开发框架:【移动开发】整合uni-app搭建移动端快速开发框架-添加Axios并实现登录功能
- 【一】ERNIE:飞桨开源开发套件,入门学习,看看行业顶尖持续学习语义理解框架,如何取得世界多个实战的SOTA效果?
- Module XAF新手入门 - 模块
- 3 Python全栈工程师之从网页搭建入门到Flask全栈项目实战 - 入门Flask微框架
- 机器学习实战-AdaBoost