是否可以在SpringBatch中执行MapReduce样式操作?
我的批处理工作有两个步骤.第一步计算平均值.第二步将每个值与平均值进行比较以确定另一个值.
例如,让我们说我有一个庞大的学生分数数据库.第一步计算每门课程/考试的平均分数.第二步将个人得分与平均值进行比较,根据一些简单的规则确定等级:
目前我的第一步是一个Sql,它选择平均值并将其写入表中.第二步是一个Sql,它将平均分数与个人分数相结合,并使用Processor来实现规则.
有类似的聚合函数,如avg,min在Steps中使用了很多,我真的更喜欢这可以在Processors中完成,尽可能简化Sqls.有没有办法编写一个处理器,它根据分组标准在多行中聚合结果,然后将一次平均值/最小值写入输出表?
这种模式重复了很多,我不是在寻找使用Sql的单处理器实现,它可以获取平均和个人分数.
我做了一些搜索,但找不到任何样本/示例.
我需要读取一个表(输入)的地理坐标,处理它以生成与坐标相关的POI.因此,一个地理坐标将导致需要将一个或多个POI插入另一个表(输出).
我目前正在使用JdbcCursorItemReader和JdbcBatchItemWriter来读取一个项目/记录并写入一个项目/记录.还有一个ItemProcessor,它为给定的地理坐标生成POI.
自定义JdbcBatchItemWriter是否帮助我实现了这一目标?
有任何想法吗?TIA.
我正在使用Spring Batch为我们的数据仓库构建累积快照,我遇到了一个我无法弄清楚的配置障碍.
我使用Spring模板项目使用STS(SpringSource Tool Suite 2.8.1)创建了一个简单的Spring Batch 项目.这些是我创建的两个xml配置文件:
发射后的context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:batch="http://www.springframework.org/schema/batch"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="
http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:property-placeholder location="classpath:batch.properties" />
<context:component-scan base-package="edu.kdc.visioncards" />
<jdbc:initialize-database data-source="dataSource">
<jdbc:script location="${batch.schema.script}" />
</jdbc:initialize-database>
<batch:job-repository id="jobRepository" />
<import resource="classpath:/META-INF/spring/module-context.xml" />
Run Code Online (Sandbox Code Playgroud)
和module-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:batch="http://www.springframework.org/schema/batch"
xsi:schemaLocation="http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<description>Example job to get you started. It provides a skeleton for a typical batch application.</description>
<batch:job id="job1">
<batch:step …Run Code Online (Sandbox Code Playgroud) 我的问题涉及Spring批处理和事务.
假设我为我的一个步骤选择了50的提交间隔.
还假设我总共有1000条记录,其中一条记录会导致itemWriter失败,从而导致整个块的回滚(在我的例子中为50条记录).
什么是stategies以确保在作业完成后将49个有效记录写入数据库(并忽略有问题的块)?
在我的实际应用程序中,我有一个DBCP连接池,它没有设置JDBC autoCommit = false.它似乎有默认的autoCommit = true.这可能是一个错误,但我想了解更改此参数的影响.
我正在使用: - 带有@Transactional注释的Spring - 带有JDBC阅读器和编写器的Spring Batch,最终使用JdbcTemplate自定义tasklet
我想知道Spring是否在当前连接上设置autoCommit = false,如果它在TransactionManager处理的事务的上下文中.它是否覆盖默认设置?因为在我看来这样做是有意义的.
我在XML中配置一个步骤,如下所示:
<batch:step id="slaveStep">
<batch:tasklet>
<batch:chunk
reader="reader"
processor="processor"
writer="writer"
commit-interval="10"
skip-limit="100000">
<batch:skippable-exception-classes>
<batch:include class="MyException"/>
</batch:skippable-exception-classes>
</batch:chunk>
</batch:tasklet>
</batch:step>
Run Code Online (Sandbox Code Playgroud)
在java配置中,我使用这样的StepBuilder:
@Bean
public StepBuilder stepBuilder(String stepName)
{
return new StepBuilder(stepName);
}
@Bean
Step slaveStep()
{
return stepBuilder("slaveStep")
.<Movie, Movie>chunk(10)
.reader(reader(new HashMap<>()))
.processor(processor())
.writer(writer())
.build();
}
Run Code Online (Sandbox Code Playgroud)
但我找不到配置可跳过的异常类的方法
我有一个文件夹,想要使用Spring和通配符将所有txt文件加载到列表中:
通过注释,我可以做以下事情:
@Value("classpath*:../../dir/*.txt")
private Resource[] files;
Run Code Online (Sandbox Code Playgroud)
但是如何以编程方式使用spring实现相同的目标呢?
我想了解有关Spring批处理中数据流的一些信息,但未能在Internet上找到我要查找的内容(尽管本网站上有一些有用的问题).
我正在尝试建立在我们公司使用Spring Batch的标准,我们想知道当一个步骤中的多个处理器更新不同数据源上的数据时,Spring Batch的行为如何.
这个问题集中在一个分块的过程,但随时提供有关其他模式的信息.
从我所看到的(如果我错了请纠正我),当读取一行时,它会在读取下一行之前跟随整个流程(读取器,处理器,写入器)(而不是读取器处理的孤岛处理)所有行,将它们发送到处理器,等等).
在我的例子中,几个处理器读取数据(在不同的数据库中)并在此过程中更新它们,最后写入器将数据插入到另一个DB中.目前,JobRepository没有链接到数据库,但这将是一个独立的,使得事情仍然有点复杂.
由于数据属于多个业务领域,因此无法更改此模型.
在这种情况下如何管理交易?只有处理完整块后才提交数据吗?那么,是否存在两阶段提交管理?如何确保?应该进行哪些开发或配置以确保数据的一致性?
更一般地说,在类似情况下,您的建议是什么?
我是批处理的新手.我试图从简单的调度程序和工作开始.但我很困惑b/w春季批次与石英工作.我的理解是
Quartz: - quartz提供了两个框架,即调度程序框架和作业框架(如果我不想使用spring批处理作业).对 ?
Spring Batch: -它只提供作业框架.我一直使用Quatz schecduler来安排弹簧批处理作业.spring还提供自己的调度程序吗?
我正在尝试在spring boot项目中配置spring批处理,我想在没有数据源的情况下使用它.我发现这ResourcelessTransactionManager是要走的路,但我不能让它发挥作用.问题是我已经定义了另外3个dataSources,但我不想在springBatch中使用它们中的任何一个.
我已经检查了默认实现DefaultBatchConfigurer,如果它无法找到dataSource,它将完全按照我的意愿执行.问题是我有3个并且不想使用任何.
请不要建议在内存数据库中使用hsql或其他,因为我不想要它.
spring-batch ×10
java ×6
spring ×6
transactions ×2
chunks ×1
commit ×1
jdbc ×1
mapreduce ×1
spring-boot ×1