CN117198474B - 医学影像数据实时获取方法、系统、电子设备及存储介质 - Google Patents
医学影像数据实时获取方法、系统、电子设备及存储介质 Download PDFInfo
- Publication number
- CN117198474B CN117198474B CN202311463340.3A CN202311463340A CN117198474B CN 117198474 B CN117198474 B CN 117198474B CN 202311463340 A CN202311463340 A CN 202311463340A CN 117198474 B CN117198474 B CN 117198474B
- Authority
- CN
- China
- Prior art keywords
- image data
- medical image
- kafka
- data
- flume
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 69
- 238000003860 storage Methods 0.000 title claims abstract description 46
- 238000012545 processing Methods 0.000 claims abstract description 54
- 230000008569 process Effects 0.000 claims description 9
- 238000005516 engineering process Methods 0.000 abstract description 3
- 230000008676 import Effects 0.000 description 38
- 239000011800 void material Substances 0.000 description 10
- 230000007246 mechanism Effects 0.000 description 5
- 238000012805 post-processing Methods 0.000 description 5
- 230000005540 biological transmission Effects 0.000 description 4
- 230000001360 synchronised effect Effects 0.000 description 4
- 238000009825 accumulation Methods 0.000 description 3
- 238000011084 recovery Methods 0.000 description 3
- 210000003813 thumb Anatomy 0.000 description 3
- 230000001419 dependent effect Effects 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 238000007726 management method Methods 0.000 description 2
- 238000005457 optimization Methods 0.000 description 2
- 230000002085 persistent effect Effects 0.000 description 2
- 238000002360 preparation method Methods 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 230000003044 adaptive effect Effects 0.000 description 1
- 230000002776 aggregation Effects 0.000 description 1
- 238000004220 aggregation Methods 0.000 description 1
- 238000013474 audit trail Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 238000013480 data collection Methods 0.000 description 1
- 238000009826 distribution Methods 0.000 description 1
- 238000003384 imaging method Methods 0.000 description 1
- 230000010354 integration Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000005192 partition Methods 0.000 description 1
- 238000013468 resource allocation Methods 0.000 description 1
- 230000000717 retained effect Effects 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
- XLYOFNOQVPJJNP-UHFFFAOYSA-N water Substances O XLYOFNOQVPJJNP-UHFFFAOYSA-N 0.000 description 1
Landscapes
- Medical Treatment And Welfare Office Work (AREA)
Abstract
本发明涉及计算机技术应用领域,提供了一种医学影像数据实时获取方法、系统、电子设备及存储介质,包括:在需要获取医学影像数据的客户端构建数据获取系统,系统包括Flume采集模块、Kafka存储模块和Flink处理模块;利用所述数据获取系统从医学影像数据提供端获取所需要的医学影像数据并进行处理。本发明能够有效解决医共体内,影像数据多并发大的应用场景,能够实时监控新增影像数据。
Description
技术领域
本发明涉及计算机技术应用领域,特别是涉及一种医学影像数据实时获取方法、系统、电子设备及存储介质。
背景技术
随着影像云、云PACS及云胶片等相关应用,获取医院及医共体的影像数据方式主要包括以下两种:1、通过构建基于DICOM传输方式的服务端,配置PACS节点,通过影像设备传输及接收影像DICOM数据。2、通过医院内部的PACS开放接口,传输及接收影像DICOM数据。然而,这两种方式都存在弊端,第一种方式由于通过影像设备自动归档传输,无法有效控制后处理影像和错误影像。第二种方式由于通过院内PACS开发接口传输,通过定时任务等方式传输,存在数据延时性。两种方式在医共体大数据量的前提下,传输数据量及任务量过大,容易出现数据堆积的情况,且应用的可扩展性较差。
发明内容
针对上述技术问题,本发明采用的技术方案为:
本发明实施例提供一种医学影像数据实时获取方法,所述方法包括如下步骤:
S100,在需要获取医学影像数据的客户端构建数据获取系统,所述数据获取系统包括Flume采集模块、Kafka存储模块和Flink处理模块;
S200,利用所述数据获取系统从医学影像数据提供端获取所需要的医学影像数据并进行处理;
S200具体包括:
S201,通过Flume采集模块从医学影像数据提供端采集所需要的医学影像数据,并发送给所述Kafka存储模块;
S202,通过Flink处理模块从所述Kafka存储模块获取所述医学影像数据并进行处理,以及将处理后的医学影像数据存储至指定位置处。
可选地,所述Flume采集模块中的Source组件通过对Flume的Source源代码进行重构得到。
可选地,所述Flume采集模块中的Source组件通过如下步骤创建的代码得到:
S101,引入dcm4che库和Flume库;
S102,自定义Directory Source类继承Source源代码中Abstract Source类,实现Event Driven Source和Configurable方法;
S103,重写Source源代码中configure,用于读取Flume配置文件;
S104,重写Source源代码中的start启动方法,用于初始化资源,启动目标目录监听器,以及当医学影像数据创建时,读取医学影像数据发送到事件流中;
S105,重写Source源代码中的readFileContent方法,用于将File实例化DicomInputStream,使用readDataset将dicom读取为DataSet,使用convertToJSON方法,将DataSet转化为JSON结构化数据。
可选地,所述通过Flink处理模块通过如下步骤创建的代码从所述Kafka存储模块获取所述医学影像数据并进行处理:
S10,引入Flink源码包;
S11,创建Flink流处理任务的上下文环境StreamExecutionEnvironment;
S12,定义Kafka的连接配置和消费者属性;
S13,创建FlinkKafkaConsumer实例,并指定要消费的Kafka主题;
S14,将 Kafka消费者添加到执行环境中;
S15,通过dcm4che对kafkaDataStream应用实现数据格式转换,将JSON结构化数据还原为DICOM格式并存储;
S16,调用execute()方法来执行整个流处理任务。
可选地,包括多个Flume采集模块和多个Kafka存储模块。
可选地,所述医学影像提供端为PACS服务器。
本发明实施例提供一种医学影像数据获取系统,所述系统包括Flume采集模块、Kafka存储模块和Flink处理模块;
其中,所述Flume采集模块用于从医学影像数据提供端采集所需要的医学影像数据,并发送给所述Kafka存储模块;
所述Flink处理模块用于从所述Kafka存储模块获取所述医学影像数据并进行处理,以及将处理后的医学影像数据存储至指定位置处。
本发明实施例还提供一种非瞬时性计算机可读存储介质,所述存储介质中存储有至少一条指令或至少一段程序,其所述至少一条指令或所述至少一段程序由处理器加载并执行以实现前述方法。
本发明实施例还提供一种电子设备,包括处理器和前述的非瞬时性计算机可读存储介质。
本发明至少具有以下有益效果:
本发明提供的技术方案采用Flume作为采集模块、Kafka作为存储模块以及采用Flink作为数据处理模块,这些模块均原生支持分布式集群,具有极强的可扩展性和并发性,有效解决医共体内,影像数据多并发大的应用场景,能够实时监控新增影像数据。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的医学影像数据实时获取方法的流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明的技术思想在于,提供一种基于Flume+Kafka+Flink的架构获取医学影像数据的方法,用于解决现有技术中容易出现数据堆积的情况,且应用的可扩展性较差的技术问题。
基于Flume+Kafka+Flink的架构优势包括:
(1)Apache Flume是一个流行的数据收集、聚合和传输工具,Flume提供了可靠的数据传输机制,确保数据从源头到目的地的可靠传递。它支持数据的事务性和容错处理,能够处理网络中断、故障恢复等情况,从而保证数据不会丢失或重复。同时支持多种拓扑结构,Flume 提供了丰富的数据源和目的地插件,Flume 还与其他大数据生态系统工具(如Spark、Kafka等)紧密集成,提供了更强大的数据处理能力。
(2)高吞吐量和低延迟:Kafka 能够处理大规模的消息流,每秒可以处理成千上万的消息。同时,它具有低延迟的特性,可以快速地将消息传递给消费者。
可持久化存储:Kafka使用磁盘进行消息存储,这意味着消息在被消费之后仍然可以保留一段时间。这对于需要持久存储和回放消息的场景非常有用,如日志收集、审计跟踪等。
分布式和可扩展性:Kafka可以水平扩展到多个服务器,允许将负载分布到多个节点上。它使用分区和副本机制来实现数据的分布和冗余存储,从而提高了整体的性能和可靠性。
容错性:Kafka具备高度的容错性和故障恢复能力。它通过副本机制来保证数据的可靠性,在出现节点故障时,仍然可以继续工作并保证消息的完整性。
灵活的发布-订阅模型:Kafka使用发布-订阅模型,允许多个消费者订阅同一个主题,并且每个消费者可以独立地按照自己的速度消费消息。这种模型非常适合构建实时流数据处理、事件驱动架构等场景。
生态系统支持:Kafka是开源项目,拥有活跃的社区和强大的生态系统。它与大数据平台(如Hadoop、Spark等)紧密集成,同时提供了各种工具和库来简化开发和管理,如Kafka Connect、Kafka Streams等。
(3)Apache Flink是一个流式数据处理框架,低延迟和高吞吐量:Flink 提供了超低的事件处理延迟和高吞吐量,能够实时处理大规模的数据流。它通过在内存中执行计算,以及优化的流水线执行模型,实现了快速而高效的数据处理。
Exactly-Once 语义:Flink 提供了精确一次处理(Exactly-Once)的数据一致性保证。它使用分布式快照技术来捕获系统状态,并使用正好一次的处理语义确保结果的准确性和一致性,即使在故障情况下也能保证数据的完整性。
灵活的事件时间处理:Flink在处理事件时非常灵活,可以轻松处理无序事件、乱序事件和迟到事件。它提供了内置的事件时间窗口、水位线管理和延迟容忍机制,使得处理实时数据变得更加可靠和精确。
可扩展性和容错性:Flink具备良好的可扩展性和容错性。它可以在大规模集群上运行,并通过动态重新平衡和故障恢复机制来实现高可用性和容错性,从而保证数据处理的稳定性和可靠性。
统一的批处理和流处理:Flink提供了统一的编程模型,可以同时处理批处理和流处理任务。这样,你可以在同一个框架下使用相同的代码逻辑处理批量数据和实时流数据,避免了不同系统之间的集成和学习成本。
动态自适应优化:Flink具备自动优化的能力,能够根据数据和任务的特性智能地调整执行计划。它可以动态地调整并发度、任务分配和资源分配,以适应数据负载的变化,提高整体的性能和效率。
因此,本发明采用基于Flume+Kafka+Flink的架构获取医学影像数据,能够解决现有技术中容易出现数据堆积的情况,且应用的可扩展性较差的技术问题。
如图1所示,本发明实施例提供的医学影像数据获取方法可包括如下步骤:
S100,在需要获取医学影像数据的客户端构建数据获取系统,所述数据获取系统包括Flume采集模块、Kafka存储模块和Flink处理模块。
S200,利用所述数据获取系统从医学影像数据提供端获取所需要的医学影像数据并进行处理。
在本发明实施例中,医学影像数据提供端可为具有医学影像数据的端,例如PACS服务器。医学影像数据的格式为DICOM格式。
进一步地,S200可具体包括:
S201,通过Flume采集模块从医学影像数据提供端采集所需要的医学影像数据,并发送给所述Kafka存储模块。
在本发明实施例中,所述Flume采集模块中的Source组件通过对Flume的Source源代码进行重构得到。具体,基于Spooling Directory Source实现自定义文件读取方式的自定义Source,继承 SpoolDirectorySource 类,重写readFile方法,引入dcm4che-core依赖包,读取新增DICOM文件转换为DataSet数据格式,将DataSet添加到Flume Channel换存储。
更具体地,所述Flume采集模块中的Source组件通过如下步骤创建的代码得到:
S101,引入dcm4che库和Flume库。
具体地,在创建的代码编辑文档中引入dcm4che库和Flume库。
S102,自定义Directory Source类继承Source源代码中Abstract Source类,实现Event Driven Source和Configurable方法。
S103,重写Source源代码中configure,用于读取Flume配置文件。
S104,重写Source源代码中的start启动方法,用于初始化资源,启动目标目录监听器,以及当医学影像数据创建时,读取医学影像数据发送到事件流中。
S105,重写Source源代码中的readFileContent方法,用于将File实例化DicomInputStream,使用readDataset将dicom读取为DataSet,使用convertToJSON方法,将DataSet转化为JSON结构化数据。
在一个示意性实施例中,通过上述步骤创建的Source组件可如下所示:
“import org.apache.flume.;
import org.apache.flume.conf.Configurable;
import org.apache.flume.event.SimpleEvent;
import org.apache.flume.source.AbstractSource;
import java.io.File;
import java.util.Map;
import org.dcm4che3.data.Attributes;
import org.dcm4che3.data.Tag;
import org.dcm4che3.io.DicomInputStream;
import com.google.gson.Gson;
import java.io.File;
import java.io.IOException;
public class CustomSpoolingDirectorySource extends AbstractSourceimplements EventDrivenSource, Configurable {
// 自定义属性
private String spoolDirectory;
private String completedSuffix;
private int maxBackoff;
private int pollDelay;
@Override
public void configure(Context context) {
// 读取配置
spoolDirectory = context.getString("spool.directory");
completedSuffix = context.getString("completed.suffix", ".COMPLETED");
maxBackoff = context.getInteger("max.backoff", 5000);
pollDelay = context.getInteger("poll.delay", 1000);
}
@Override
public synchronized void start() {
// 启动逻辑,可以初始化资源等
// 创建事件拦截器链
getChannelProcessor().initialize();
// 启动目录监听器
SpoolDirectoryTailer tailer = new SpoolDirectoryTail(spoolDirectory, completedSuffix, maxBackoff, pollDelay);
tailer.setListener(new SpoolDirectoryListener() {
@Override
public void onFileCreate(File file) {
// 当有文件创建时,读取文件内容并发送到事件流中
Event event = new SimpleEvent();
event.setBody(readFileContent(file));
getChannelProcessor().processEvent(event);
}
});
tailer.start();
super.start();
}
@Override
public synchronized void stop() {
// 停止逻辑,释放资源等
super.stop();
}
private String readFileContent(File file) {
// 读取文件内容的逻辑
try (DicomInputStream dis = new DicomInputStream(file)) {
Attributes attrs = dis.readDataset(-1, -1);
String jsonData = convertToJSON(attrs);
System.out.println(jsonData);
} catch (IOException e) {
e.printStackTrace();
}
// 返回文件的内容数据
return jsonData;
}
}
S202,通过Flink处理模块从所述Kafka存储模块获取所述医学影像数据并进行处理,以及将处理后的医学影像数据存储至指定位置处。
Kafka Sink底层使用 Kafka Producer API 来与 Kafka 交互,并通过配置参数和事件的转换将数据发送到指定的 Kafka 主题中。基于Kafka Sink 将DataSet数据从Channel缓存池中传输到 Apache Kafka 消息队列中,为数据后处理做数据流和消息队列准备,Kafka集群对激增数据具有削峰能力,提高抗压能力。
在本发明实施例中,通过Flink的flink-connector-kafka工具,实现消费者KafkaConsumer来读取Kafka消息队列中DataSet格式的影像数据,Flink程序依据配置参数创建Kafka Consumer 实例,Kafka Consumer 可以订阅一个或多个 Kafka 主题,一旦订阅成功,KafkaConsumer 将会从 Kafka 集群中不断拉取数据。Flink 的 TaskManager 会分配一个或多个线程来处理从 Kafka 获取到的数据。Flink 的算子(operator)对数据进行过滤、映射、聚合等操作,实现对影像数据的后处理及完成存储。
进一步地,所述通过Flink处理模块通过如下步骤创建的代码从所述Kafka存储模块获取所述医学影像数据并进行处理:
S10,引入Flink源码包。
S11,创建Flink流处理任务的上下文环境StreamExecutionEnvironment。
S12,定义Kafka的连接配置和消费者属性。
S13,创建FlinkKafkaConsumer实例,并指定要消费的Kafka主题。
S14,将 Kafka消费者添加到执行环境中。
S15,通过dcm4che对kafkaDataStream应用实现数据格式转换,将JSON结构化数据还原为DICOM格式并存储。
S16,调用execute()方法来执行整个流处理任务。
在一个示意性实施例中,通过S10至S16创建的代码可如下所示:
“
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.dcm4che3.data.Attributes;
import java.util.Properties;
public class KafkaToFlinkToFile {
public static void main(String[] args) throws Exception {
// 设置执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 配置Kafka连接参数
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "kafka-server:9092");
properties.setProperty("group.id", "flink-consumer-group");
// 创建一个Kafka消费者
FlinkKafkaConsumer<String>kafkaConsumer = newFlinkKafkaConsumer<>(
"topic-name",
new SimpleStringSchema(),
properties
);
// 将Kafka消费者添加到执行环境中
DataStream<String>kafkaStream = env.addSource(kafkaConsumer);
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object>jsonMap = objectMapper.readValue(kafkaStream, new TypeReference<Map<String,Object>>(){});
for (Map.Entry<String, Object>entry : jsonMap.entrySet()) {
ring tagString = entry.getKey();
ject value = entry.getValue();
nt tag = Integer.parseInt(tagString, 16);
taset.setValue(tag, VR.LO, value.toString());
}
// 将数据写入文件
String outputFilePath = "path/to/output/file_name.dcm;
icomOutputStream dcmOutput = new DicomOutputStream(newFileOutputStream(outputFilePath));
dcmOutput.writeDataset(null, dataset);
dcmOutput.close();
// 执行任务
env.execute("Kafka to File");
}
}”
进一步地,在本发明实施例中,Flume以集群模式搭建,可实现同时对多个目标目录进行监控。即本发明实施例中,可包括多个Flume采集模块和多个Kafka存储模块。
本发明提供的医学影像数据获取方法,采用Flume作为采集模块、Kafka作为存储模块以及采用Flink作为数据处理模块,这些模块均原生支持分布式集群,具有极强的可扩展性和并发性,有效解决医共体内,影像数据多并发大的应用场景,能够实时监控新增影像数据
本发明另一实施例提供一种医学影像数据获取系统,包括Flume采集模块、Kafka存储模块和Flink处理模块;
其中,所述Flume采集模块用于从医学影像数据提供端采集所需要的医学影像数据,并发送给所述Kafka存储模块;
所述Flink处理模块用于从所述Kafka存储模块获取所述医学影像数据并进行处理,以及将处理后的医学影像数据存储至指定位置处。
在本发明实施例中,医学影像数据提供端可为具有医学影像数据的端,例如PACS服务器。医学影像数据的格式为DICOM格式。
在本发明实施例中,所述Flume采集模块中的Source组件通过对Flume的Source源代码进行重构得到。具体,基于Spooling Directory Source实现自定义文件读取方式的自定义Source,继承 SpoolDirectorySource 类,重写readFile方法,引入dcm4che-core依赖包,读取新增DICOM文件转换为DataSet数据格式,将DataSet添加到Flume Channel换存储。
更具体地,所述Flume采集模块中的Source组件通过如下步骤创建的代码得到:
S1,引入dcm4che库和Flume库。
具体地,在创建的代码编辑文档中引入dcm4che库和Flume库。
S2,自定义Directory Source类继承Source源代码中Abstract Source类,实现Event Driven Source和Configurable方法。
S3,重写Source源代码中configure,用于读取Flume配置文件。
S4,重写Source源代码中的start启动方法,用于初始化资源,启动目标目录监听器,以及当医学影像数据创建时,读取医学影像数据发送到事件流中。
S5,重写Source源代码中的readFileContent方法,用于将File实例化DicomInputStream,使用readDataset将dicom读取为DataSet,使用convertToJSON方法,将DataSet转化为JSON结构化数据。
在一个示意性实施例中,通过上述步骤创建的Source组件可如下所示:
“
import org.apache.flume.;
import org.apache.flume.conf.Configurable;
import org.apache.flume.event.SimpleEvent;
import org.apache.flume.source.AbstractSource;
import java.io.File;
import java.util.Map;
import org.dcm4che3.data.Attributes;
import org.dcm4che3.data.Tag;
import org.dcm4che3.io.DicomInputStream;
import com.google.gson.Gson;
import java.io.File;
import java.io.IOException;
public class CustomSpoolingDirectorySource extends AbstractSourceimplements EventDrivenSource, Configurable {
// 自定义属性
private String spoolDirectory;
private String completedSuffix;
private int maxBackoff;
private int pollDelay;
@Override
public void configure(Context context) {
// 读取配置
spoolDirectory = context.getString("spool.directory");
completedSuffix = context.getString("completed.suffix", ".COMPLETED");
maxBackoff = context.getInteger("max.backoff", 5000);
pollDelay = context.getInteger("poll.delay", 1000);
}
@Override
public synchronized void start() {
// 启动逻辑,可以初始化资源等
// 创建事件拦截器链
getChannelProcessor().initialize();
// 启动目录监听器
SpoolDirectoryTailer tailer = new SpoolDirectoryTail(spoolDirectory, completedSuffix, maxBackoff, pollDelay);
tailer.setListener(new SpoolDirectoryListener() {
@Override
public void onFileCreate(File file) {
// 当有文件创建时,读取文件内容并发送到事件流中
Event event = new SimpleEvent();
event.setBody(readFileContent(file));
getChannelProcessor().processEvent(event);
}
});
tailer.start();
super.start();
}
@Override
public synchronized void stop() {
// 停止逻辑,释放资源等
super.stop();
}
private String readFileContent(File file) {
// 读取文件内容的逻辑
try (DicomInputStream dis = new DicomInputStream(file)) {
Attributes attrs = dis.readDataset(-1, -1);
String jsonData = convertToJSON(attrs);
System.out.println(jsonData);
} catch (IOException e) {
e.printStackTrace();
}
// 返回文件的内容数据
return jsonData;
}
}
进一步地,在本发明实施例中,基于Kafka Sink 将DataSet数据从Channel缓存池中传输到 Apache Kafka 消息队列中,为数据后处理做数据流和消息队列准备,Kafka集群对激增数据具有削峰能力,提高抗压能力。
在本发明实施例中,通过Flink的flink-connector-kafka工具,实现消费者KafkaConsumer来读取Kafka消息队列中DataSet格式的影像数据,Flink程序依据配置参数创建Kafka Consumer 实例,Kafka Consumer 可以订阅一个或多个 Kafka 主题,一旦订阅成功,KafkaConsumer 将会从 Kafka 集群中不断拉取数据。Flink 的 TaskManager 会分配一个或多个线程来处理从 Kafka 获取到的数据。Flink 的算子(operator)对数据进行过滤、映射、聚合等操作,实现对影像数据的后处理及完成存储。
进一步地,所述通过Flink处理模块通过如下步骤创建的代码从所述Kafka存储模块获取所述医学影像数据并进行处理:
S20,引入Flink源码包。
S21,创建Flink流处理任务的上下文环境StreamExecutionEnvironment。
S22,定义Kafka的连接配置和消费者属性。
S23,创建FlinkKafkaConsumer实例,并指定要消费的Kafka主题。
S24,将 Kafka消费者添加到执行环境中。
S25,通过dcm4che对kafkaDataStream应用实现数据格式转换,将JSON结构化数据还原为DICOM格式并存储。
S26,调用execute()方法来执行整个流处理任务。
在一个示意性实施例中,通过S20至S26创建的代码可如下所示:
“
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.dcm4che3.data.Attributes;
import java.util.Properties;
public class KafkaToFlinkToFile {
public static void main(String[] args) throws Exception {
// 设置执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 配置Kafka连接参数
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "kafka-server:9092");
properties.setProperty("group.id", "flink-consumer-group");
// 创建一个Kafka消费者
FlinkKafkaConsumer<String>kafkaConsumer = newFlinkKafkaConsumer<>(
"topic-name",
new SimpleStringSchema(),
properties
);
// 将Kafka消费者添加到执行环境中
DataStream<String>kafkaStream = env.addSource(kafkaConsumer);
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object>jsonMap = objectMapper.readValue(kafkaStream, new TypeReference<Map<String,Object>>(){});
for (Map.Entry<String, Object>entry : jsonMap.entrySet()) {
ring tagString = entry.getKey();
ject value = entry.getValue();
nt tag = Integer.parseInt(tagString, 16);
taset.setValue(tag, VR.LO, value.toString());
}
// 将数据写入文件
String outputFilePath = "path/to/output/file_name.dcm;
icomOutputStream dcmOutput = new DicomOutputStream(newFileOutputStream(outputFilePath));
dcmOutput.writeDataset(null, dataset);
dcmOutput.close();
// 执行任务
env.execute("Kafka to File");
}
}”
进一步地,在本发明实施例中,Flume以集群模式搭建,可实现同时对多个目标目录进行监控。即本发明实施例中,可包括多个Flume采集模块、多个Kafka存储模块和多个Flink处理模块。
本发明的实施例还提供了一种非瞬时性计算机可读存储介质,该存储介质可设置于电子设备之中以保存用于实现方法实施例中一种方法相关的至少一条指令或至少一段程序,该至少一条指令或该至少一段程序由该处理器加载并执行以实现上述实施例提供的方法。
本发明的实施例还提供了一种电子设备,包括处理器和前述的非瞬时性计算机可读存储介质。
本发明的实施例还提供一种计算机程序产品,其包括程序代码,当所述程序产品在电子设备上运行时,所述程序代码用于使该电子设备执行本说明书上述描述的根据本发明各种示例性实施方式的方法中的步骤。
虽然已经通过示例对本发明的一些特定实施例进行了详细说明,但是本领域的技术人员应该理解,以上示例仅是为了进行说明,而不是为了限制本发明的范围。本领域的技术人员还应理解,可以对实施例进行多种修改而不脱离本发明的范围和精神。本发明公开的范围由所附权利要求来限定。
Claims (6)
1.一种医学影像数据实时获取方法,其特征在于,所述医学影像数据的格式为DICOM格式,所述方法包括如下步骤:
S100,在需要获取医学影像数据的客户端构建数据获取系统,所述数据获取系统包括Flume采集模块、Kafka存储模块和Flink处理模块;
S200,利用所述数据获取系统从医学影像数据提供端获取所需要的医学影像数据并进行处理;
S200具体包括:
S201,通过Flume采集模块从医学影像数据提供端采集所需要的医学影像数据,并发送给所述Kafka存储模块;
S202,通过Flink处理模块从所述Kafka存储模块获取所述医学影像数据并进行处理,以及将处理后的医学影像数据存储至指定位置处;
所述Flume采集模块中的Source组件通过对Flume的Source源代码进行重构得到;
所述Flume采集模块中的Source组件通过如下步骤创建的代码得到:
S101,引入dcm4che库和Flume库;
S102,自定义Directory Source类继承Source源代码中Abstract Source类,实现Event Driven Source和Configurable方法;
S103,重写Source源代码中configure,用于读取Flume配置文件;
S104,重写Source源代码中的start启动方法,用于初始化资源,启动目标目录监听器,以及当医学影像数据创建时,读取医学影像数据发送到事件流中;
S105,重写Source源代码中的readFileContent方法,用于将File实例化DicomInputStream,使用readDataset将dicom读取为DataSet,使用convertToJSON方法,将DataSet转化为JSON结构化数据;
所述通过Flink处理模块通过如下步骤创建的代码从所述Kafka存储模块获取所述医学影像数据并进行处理:
S10,引入Flink源码包;
S11,创建Flink流处理任务的上下文环境StreamExecutionEnvironment;
S12,定义Kafka的连接配置和消费者属性;
S13,创建FlinkKafkaConsumer实例,并指定要消费的Kafka主题;
S14,将 Kafka消费者添加到执行环境中;
S15,通过dcm4che对kafkaDataStream应用实现数据格式转换,将JSON结构化数据还原为DICOM格式并存储;
S16,调用execute()方法来执行整个流处理任务。
2.根据权利要求1所述的方法,其特征在于,包括多个Flume采集模块和多个Kafka存储模块。
3.根据权利要求1所述的方法,其特征在于,所述医学影像提供端为PACS服务器。
4.一种医学影像数据获取系统,其特征在于,所述医学影像数据的格式为DICOM格式,所述系统包括Flume采集模块、Kafka存储模块和Flink处理模块;
其中,所述Flume采集模块用于从医学影像数据提供端采集所需要的医学影像数据,并发送给所述Kafka存储模块;
所述Flink处理模块用于从所述Kafka存储模块获取所述医学影像数据并进行处理,以及将处理后的医学影像数据存储至指定位置处;
其中,所述Flume采集模块中的Source组件通过对Flume的Source源代码进行重构得到,具体通过如下步骤创建的代码得到:
S1,引入dcm4che库和Flume库;
具体地,在创建的代码编辑文档中引入dcm4che库和Flume库;
S2,自定义Directory Source类继承Source源代码中Abstract Source类,实现EventDriven Source和Configurable方法;
S3,重写Source源代码中configure,用于读取Flume配置文件;
S4,重写Source源代码中的start启动方法,用于初始化资源,启动目标目录监听器,以及当医学影像数据创建时,读取医学影像数据发送到事件流中;
S5,重写Source源代码中的readFileContent方法,用于将File实例化DicomInputStream,使用readDataset将dicom读取为DataSet,使用convertToJSON方法,将DataSet转化为JSON结构化数据;
所述通过Flink处理模块通过如下步骤创建的代码从所述Kafka存储模块获取所述医学影像数据并进行处理:
S20,引入Flink源码包;
S21,创建Flink流处理任务的上下文环境StreamExecutionEnvironment;
S22,定义Kafka的连接配置和消费者属性;
S23,创建FlinkKafkaConsumer实例,并指定要消费的Kafka主题;
S24,将 Kafka消费者添加到执行环境中;
S25,通过dcm4che对kafkaDataStream应用实现数据格式转换,将JSON结构化数据还原为DICOM格式并存储;
S26,调用execute()方法来执行整个流处理任务。
5.一种非瞬时性计算机可读存储介质,所述存储介质中存储有至少一条指令或至少一段程序,其特征在于,所述至少一条指令或所述至少一段程序由处理器加载并执行以实现如权利要求1-3中任意一项的所述方法。
6.一种电子设备,其特征在于,包括处理器和权利要求5中所述的非瞬时性计算机可读存储介质。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311463340.3A CN117198474B (zh) | 2023-11-06 | 2023-11-06 | 医学影像数据实时获取方法、系统、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311463340.3A CN117198474B (zh) | 2023-11-06 | 2023-11-06 | 医学影像数据实时获取方法、系统、电子设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117198474A CN117198474A (zh) | 2023-12-08 |
CN117198474B true CN117198474B (zh) | 2024-03-01 |
Family
ID=88990907
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311463340.3A Active CN117198474B (zh) | 2023-11-06 | 2023-11-06 | 医学影像数据实时获取方法、系统、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117198474B (zh) |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109271412A (zh) * | 2018-09-28 | 2019-01-25 | 中国-东盟信息港股份有限公司 | 智慧城市的实时流数据处理方法及系统 |
CN110222091A (zh) * | 2019-06-10 | 2019-09-10 | 帷幄匠心科技(杭州)有限公司 | 一种海量数据实时统计分析方法 |
CN111629335A (zh) * | 2020-05-29 | 2020-09-04 | 四川亨通网智科技有限公司 | 基于大数据实现景区实时人流热力图的方法、系统 |
CN112328569A (zh) * | 2020-07-31 | 2021-02-05 | 山东云缦智能科技有限公司 | 基于Flume分布式数据收集架构的构建方法 |
CN113282555A (zh) * | 2021-06-18 | 2021-08-20 | 北京奇艺世纪科技有限公司 | 一种数据处理方法、装置、设备及存储介质 |
WO2022133981A1 (zh) * | 2020-12-25 | 2022-06-30 | 京东方科技集团股份有限公司 | 数据处理方法、平台、计算机可读存储介质及电子设备 |
CN115374102A (zh) * | 2021-07-30 | 2022-11-22 | 北京大杏科技有限责任公司 | 数据处理方法及系统 |
CN115469941A (zh) * | 2022-09-09 | 2022-12-13 | 武汉众邦银行股份有限公司 | 基于FlinkSQL的风控指标计算开发的自动配置处理方法及系统 |
CN115620877A (zh) * | 2021-07-13 | 2023-01-17 | 蓝网科技股份有限公司 | 一种医疗数据上传云平台的方法、系统、设备及存储介质 |
CN115695920A (zh) * | 2022-09-30 | 2023-02-03 | 武汉兴图新科电子股份有限公司 | 一种基于Flume的rtsp摄像头视频流接入方法 |
CN116936041A (zh) * | 2023-09-18 | 2023-10-24 | 天河超级计算淮海分中心 | 一种医学影像文件处理方法、电子设备及存储介质 |
-
2023
- 2023-11-06 CN CN202311463340.3A patent/CN117198474B/zh active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109271412A (zh) * | 2018-09-28 | 2019-01-25 | 中国-东盟信息港股份有限公司 | 智慧城市的实时流数据处理方法及系统 |
CN110222091A (zh) * | 2019-06-10 | 2019-09-10 | 帷幄匠心科技(杭州)有限公司 | 一种海量数据实时统计分析方法 |
CN111629335A (zh) * | 2020-05-29 | 2020-09-04 | 四川亨通网智科技有限公司 | 基于大数据实现景区实时人流热力图的方法、系统 |
CN112328569A (zh) * | 2020-07-31 | 2021-02-05 | 山东云缦智能科技有限公司 | 基于Flume分布式数据收集架构的构建方法 |
WO2022133981A1 (zh) * | 2020-12-25 | 2022-06-30 | 京东方科技集团股份有限公司 | 数据处理方法、平台、计算机可读存储介质及电子设备 |
CN113282555A (zh) * | 2021-06-18 | 2021-08-20 | 北京奇艺世纪科技有限公司 | 一种数据处理方法、装置、设备及存储介质 |
CN115620877A (zh) * | 2021-07-13 | 2023-01-17 | 蓝网科技股份有限公司 | 一种医疗数据上传云平台的方法、系统、设备及存储介质 |
CN115374102A (zh) * | 2021-07-30 | 2022-11-22 | 北京大杏科技有限责任公司 | 数据处理方法及系统 |
CN115469941A (zh) * | 2022-09-09 | 2022-12-13 | 武汉众邦银行股份有限公司 | 基于FlinkSQL的风控指标计算开发的自动配置处理方法及系统 |
CN115695920A (zh) * | 2022-09-30 | 2023-02-03 | 武汉兴图新科电子股份有限公司 | 一种基于Flume的rtsp摄像头视频流接入方法 |
CN116936041A (zh) * | 2023-09-18 | 2023-10-24 | 天河超级计算淮海分中心 | 一种医学影像文件处理方法、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN117198474A (zh) | 2023-12-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111061715B (zh) | 基于Web和Kafka的分布式数据集成系统及方法 | |
CN105765578B (zh) | 分布式文件系统中的数据的并行访问 | |
Liu et al. | A data transfer framework for large-scale science experiments | |
US9626261B2 (en) | Failure recovery resolution in transplanting high performance data intensive algorithms from cluster to cloud | |
US8135785B2 (en) | System and method for processing messages using pluggable protocol processors in a service-oriented pipeline architecture | |
KR20210005043A (ko) | 입력 및 출력 스키마 매핑 | |
Kamburugamuve et al. | Survey of distributed stream processing | |
CN105183470A (zh) | 一种自然语言处理系统化服务平台 | |
Oliveira et al. | Component framework infrastructure for virtual environments | |
WO2016168216A1 (en) | Checkpointing higher order query operators | |
CN117198474B (zh) | 医学影像数据实时获取方法、系统、电子设备及存储介质 | |
e Silva et al. | Application execution management on the InteGrade opportunistic grid middleware | |
US10511656B1 (en) | Log information transmission integrity | |
Escoffier et al. | Reactive Systems in Java | |
Jung et al. | Oneos: Middleware for running edge computing applications as distributed posix pipelines | |
Caromel et al. | Peer-to-Peer and fault-tolerance: Towards deployment-based technical services | |
Sabek et al. | CRA: Enabling data-intensive applications in containerized environments | |
Malysiak et al. | An efficient framework for distributed computing in heterogeneous beowulf clusters and cluster-management | |
Schmatz et al. | An interface to heterogeneous data sources based on the mediator/wrapper architecture in the Hadoop ecosystem | |
Pham et al. | A dynamic platform for run-time adaptation | |
US11757959B2 (en) | Dynamic data stream processing for Apache Kafka using GraphQL | |
Martella et al. | Giraph architecture | |
US12021921B2 (en) | Data plane reduction for eventing components | |
Kunkel | Distributed Storage and Processing with Hadoop | |
Kail et al. | Dynamic execution of scientific workflows in cloud |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |