问题标签 [spring-batch]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1290 浏览

java - Spring批处理数据读取器在读取项目集合结束时返回额外的空对象?

我正在使用 Spring 批处理 - 使用数据读取器加载项目列表。对于我的每个读者,他们都在列表末尾返回一个额外的空对象。

有人见过这个吗?我究竟做错了什么?

0 投票
7 回答
6981 浏览

java - 减少内存流失的方法

背景

我有一个 Spring 批处理程序,它读取一个文件(我正在使用的示例文件大小约为 4 GB),对文件进行少量处理,然后将其写入 Oracle 数据库。

我的程序使用 1 个线程读取文件,使用 12 个工作线程进行处理和数据库推送。

我正在搅动很多很多很多年轻一代的记忆,这导致我的程序运行得比我想象的要慢。

设置

JDK 1.6.18
Spring batch 2.1.x
4 Core Machine w 16 GB ram

问题

使用这些 JVM 参数,我可以为 Tenured Generation 获得大约 5.x GB 的内存,为 Young Generation 获得大约 5.X GB 的内存。

在处理这一个文件的过程中,我的 Tenured Generation 很好。它最大可能增长到 3 GB,而且我永远不需要进行一次完整的 GC。

然而,年轻一代多次达到最大值。它上升到 5 GB 范围,然后发生并行次要 GC 并将 Young Gen 清除到使用的 500MB。次要 GC 比完整 GC 好且更好,但它仍然会大大降低我的程序速度(我很确定当发生年轻一代收集时应用程序仍然冻结,因为我看到数据库活动消失了)。我为次要 GC 冻结了超过 5% 的程序时间,这似乎过多。我想说,在处理这个 4 GB 文件的过程中,我搅动了 50-60GB 的年轻一代内存

我在我的程序中没有看到任何明显的缺陷。我试图遵守一般的 OO 原则并编写干净的 Java 代码。我试图不要无缘无故地创建对象。我正在使用线程池,并尽可能传递对象而不是创建新对象。我将开始分析应用程序,但我想知道是否有人有一些好的一般经验法则或反模式以避免导致过多的内存流失?50-60GB 的内存搅动来处理一个 4GB 的文件是我能做的最好的吗?我是否必须恢复到对象池之类的 JDK 1.2 技巧?(尽管 Brian Goetz 做了一个演讲,其中包括为什么对象池是愚蠢的,我们不需要再这样做了。我相信他比我相信自己多得多.. :))

0 投票
0 回答
12331 浏览

jms - Spring 批处理 JMS 编写器/读取器示例

任何人都知道一个很好的资源来详细(比 Spring Batch 文档)查看 Spring Batch 中 JMS Item Writer/Reader 的使用?

具体来说,因为我的任务是尝试重用一个现有系统,其唯一接口是在队列上异步的,所以我想知道以下是否可能:

第 1 步:读取一些数据并构建消息。
第 2 步:使用 JMSItemWriter 将消息放到队列中。
第 3 步:使用响应队列上的 JMSItemReader 等待消息返回。
第 4 步:做一些其他的事情
……冲洗并重复,每天几千次。

或者换句话说,本质上是使用 Spring Batch 来强制与异步资源进行同步交互。在我进一步研究之前,我想确保这是 A) 可能的,并且 B) 不会无耻地滥用框架,这会导致未来的严重头痛。

在此先感谢您的任何信息。

0 投票
3 回答
5596 浏览

mysql - 用于大规模夜间/每小时 Hive/MySQL 数据处理的 Spring-Batch

我正在考虑替换一堆 Python ETL 脚本,这些脚本执行每晚/每小时的数据摘要和对大量数据的统计收集。

我想要实现的是

  • 鲁棒性 - 失败的作业/步骤应自动重新启动。在某些情况下,我想改为执行恢复步骤。
  • 框架必须能够从崩溃中恢复。我想这里需要一些坚持。
  • 监控 - 我需要能够监控作业/步骤的进度,最好查看有关性能的历史记录和统计信息。
  • 可追溯性 - 我必须能够了解执行的状态
  • 手动干预 - 很高兴...能够从 API / UI / 命令行启动/停止/暂停作业。
  • 简单——当我介绍替代品时,我不想让我的同事生气……拥有一个简单易懂的 API 是必需的。

当前脚本执行以下操作:

  • 从多台机器收集文本日志,并将它们推送到Hadoop DFS。我们将来可能会在这一步中使用 Flume(参见http://www.cloudera.com/blog/2010/07/whats-new-in-cdh3b2-flume/)。
  • 对数据执行Hive汇总查询,并插入(覆盖)到新的 Hive 表/分区。
  • 将新的汇总数据提取到文件中,然后加载(合并)到 MySql 表中。这是稍后在线报告所需的数据。
  • 对新添加的 MySql 数据(来自 MySql 表)执行附加连接,并更新数据。

我的想法是用 spring-batch 替换脚本。我也研究了Scriptella,但我认为这对于这种情况来说太“简单”了。

因为我在 Spring-Batch 上看到了一些不好的感觉(主要是旧帖子),所以我希望在这里得到一些输入。我也没有看到太多关于 spring-batch 和 Hive 集成的东西,这很麻烦。

0 投票
1 回答
1371 浏览

java - Spring Batch:迁移 1 到 n 关系,其中 n 可能很大

我对 Spring 有经验,但对 Spring Batch 很陌生。现在我的任务是将数据结构从一个数据库中的简单结构迁移到另一个数据库中的复杂结构。数据结构对应于我将这样命名的对象层次结构

在旧数据库中,只有两个表,在新系统中,事情变得更加复杂,有 8 个表,但现在无关紧要。

基本上我想使用一个简单的基于 JDBC 的解决方案,其中行映射器从 OldParent 读取并转换为 NewParent。

所以这将是一个基本的配置片段:

在这种情况下,parentReader 将获取并转换 OldChild 对象,可能委托给 childReader / childWriter 对象。

问题是这样的:虽然有几十万个父母,但每个父母可以有零到几百万个孩子,所以基于父母的提交间隔根本没有帮助,但我非常希望有一个可配置的提交间隔。

因此,另一种解决方案是使工作流程基于子级:

在这种情况下,childReader 还必须读取 OldParent 对象并写入 NewParent,委托给 parentReader 和 parentWriter 对象。这里的主要缺点是我丢失了所有没有关联 OldChild 对象的 OldParents。

第三种可能的情况是为OldParent -> NewParent和提供两个不同的工作流程OldChild -> NewChild。(我必须维护一个映射表来存储 OldParent 和 NewParent id 之间的关系,但我可以使用标准配置,包括提交间隔。

还有其他可能性吗?您会推荐以下哪一项作为最佳实践?

0 投票
3 回答
844 浏览

java - 如何测试“打开的文件过多”问题

我有一个将 WAV 顺序转换为 MP3 的批处理过程。问题是在几千个文件之后打开的文件太多,并且超出了文件限制。

它这样做的原因是因为 SystemCommandTasklet 中的代码:

这有一个令人讨厌的副作用,就是让我依赖 JVM 来清理进程,让文件保持打开状态等等。

我把它改写成这样:

我有 95% 的把握这在我的 mac 上有效(感谢 lsof),但是我如何进行适当的测试以在任何系统上工作以证明我正在尝试做的事情确实有效?

0 投票
2 回答
15735 浏览

spring-batch - 带有侦听器的 Spring Batch 基本步骤

我想设置一个基本步骤,附加一个记录器侦听器,以确保所有错误日志最终都出现在正确的文件中。

下面的设置很简单,与http://static.springsource.org/spring-batch/reference/html/configureStep.html#mergingListsOnStep上的示例非常相似,但根据http://www.springframework.org/schema /batch/spring-batch.xsd,似乎听众不属于 step 而是属于 tasklet。

那么,谁是正确的,我如何使用正确的 xsd 来产生所需的结果?

以下基本步骤似乎可以解决问题,其中 StepLogListener 侦听器实现了 StepExecutionListener。

然而,这似乎不是最优的,坦率地说也不完全正确。这意味着 baseLoggedStep 是 TaskletStep 的抽象实例,对吗?

0 投票
2 回答
610 浏览

spring-batch - 如何使用 Spring Batch 将 2 个 jdbc 读取器的数据发送到一个平面文件

我需要写一份工作,其中我必须读取数据库 2 次。

第一个查询只返回一条记录,我需要将此记录作为我的平面文件的标题发送。
第二个查询返回一组我需要写入同一个平面文件的记录。

我尝试为它创建一个复合编写器,并在其中提供了两个flatFileItemWriter并为两个 flatFileItemWriters 设置了相同的资源名称。但这会导致资源已存在的错误。

谁能告诉我应该遵循的方法。

提前致谢。

0 投票
1 回答
6649 浏览

spring-batch - Spring Batch 中的可选作业参数

如果未指定作业参数而不是抛出异常,是否可以使作业参数成为可选参数?

我所追求的是

我可以将其作为属性传递给另一个 bean,该 bean 处理未指定 fileNamePattern 的情况。

0 投票
2 回答
2063 浏览

hibernate - 在休眠中进行批处理的任何样本?

我可以在 java hibernate 中找到批处理的示例,以便我可以在两个表上运行删除查询。