1.前言从1990年代数字化医院的概念到现在20多年,数字化医院(数字化医院)在国内各大医院的快速普及、推广和发展取得了显著成效。不仅数字化医院管理信息系统(HIS)、影像归档与通讯系统(PACS)、电子病历系统(EMR)和区域医疗卫生服务(GMIS)的成功实施和推广,而且随着不断日新月异的计算机技术和网络技术的革新,进一步为数字化医院带来了新的交互渠道,如远程医疗服务、网上挂号预约等。随着信息技术的快速发展,80%以上的三级医院相继建立了自己的医院信息系统(HIS)、电子病历系统(EMR)、合理用药系统(PASS)、检验管理系统(LIS)、医学影像存储与共享系统(PACS)、移动查房、移动护理系统,并与大量第三方接口集成,医疗领域IT进入大数据时代。随着HIS的广泛应用和功能的不断完善,HIS收集了大量的医疗数据。进入2012年,大数据及相关的大数据处理技术越来越多地被国人提及,人们普遍接受大数据的概念。大数据技术也影响着我们的日常生活,互联网行业得到广泛应用,电信、银行等行业也广泛尝试利用大数据技术提供更稳定、更优质的服务。在目前的情况下,医疗IT系统收集了这些有价值的数据,但是这些大量有价值的历史医疗数据并没有发挥应有的价值,无法为一线临床医生提供医疗诊断辅助,也无法为他们提供必要的支持医院管理和业务决策。针对上述现状,考虑利用医院现有的病历、方剂、诊断、病案等,通过统计挖掘出有价值的医学规律和知识,并以此为基础构建专业的临床知识库规则和知识信息。为一线医护人员提供专业的诊断、处方、用药推荐功能。基于强大的关联推荐能力,可大幅提升医疗服务质量,减轻一线医护人员的工作量。2、Hadoop&Spark目前在大数据处理领域有很多框架。从计算的角度来看,主要有MapReduce框架(属于Hadoop生态系统)和Spark框架。其中,Spark是近两年兴起的新一代计算框架。其基于内存的特性使其在计算效率上远高于MapReduce框架。从存储的角度来看,目前主要使用Hadoop生态环境下的HDFS框架。HDFS的一系列特性使其非常适合大数据环境下的存储。2.1HadoopHadoop不是一个软件,而是一个分布式系统基础设施。它是在Apache基金会的赞助下开发的一个开源项目。Hadoop使用户可以在不了解分布式底层实现的情况下开发分布式程序,从而充分利用计算机集群的威力,实现高速计算和大规模数据存储。Hadoop主要由HDFS、MapReduce、Hbase等子项目组成。Hadoop是一个能够对大量数据进行分布式处理的软件框架,数据处理以可靠、高效、可扩展的方式进行。Hadoop假设数据处理和存储会失败,因此系统维护工作数据的多个副本以确保处理可以在失败的节点之间重新分配。Hadoop通过并行工作提高数据处理速度。Hadoop可以处理PB级的数据,这是传统数据服务器无法做到的。另外,Hadoop依托于开源社区,有什么问题都能及时解决,这也是Hadoop的一大优势。Hadoop是建立在Linux集群上的,因此它很便宜并且可供任何人使用。它主要有以下优点:1可靠性高。Hadoop系统中的数据默认有三份备份,Hadoop有系统的数据巡检和维护机制,从而提供高可靠的数据存储。2可扩展性强。Hadoop将数据分布在普通的PC服务器集群上,通过并行计算完成计算任务,可以方便地为集群扩展更多的节点。3效率。Hadoop可以在集群中的不同节点之间动态传输数据。并且保证每个节点的动态平衡,所以处理速度非常快。4容错性高。Hadoop可以存储数据的多个副本,以便在发生故障时可以重新分配数据。Hadoop的整体架构如下图所示。Hadoop架构的核心是MapReduce和HDFS。Google曾经发表过一篇论文《Google File System》,系统地讲解了Google的分布式文件系统的设计与实现。Apache对GFS进行了开源开发,发布了Hadoop的分布式文件系统:HadoopDistributedFileSystem,简称HDFS。MapReduce的核心思想也是Google的一篇论文《MapReduce:Simplified Data Processing on Large Clusters》提出的。MapReduce的核心思想简单解释就是:任务分解执行,执行结果聚合。2.2SparkSpark是由加州大学伯克利分校AMP实验室开源的一个类MapReduce计算框架。它是一个基于内存的集群计算系统。最初的目标是解决MapReduce磁盘读写的开销。当前最新版本是1.5.0。Spark——推出后,以其高性能和易用性吸引了众多大数据研究人员。在众多爱好者的努力下,Spark逐渐形成了自己的生态系统(基于Spark,上层包括SparkSQL、MLib、SparkStreaming和GraphX),成为Apache的旗舰项目。Spark的核心概念是ResilientDistributedDatasets(RDD),它是Spark对分布式内存的抽象。用户可以像操作本地数据集一样操作RDD,从而专注于业务处理。在Spark程序中,数据操作都是基于RDD的。比如经典的WordCount程序,它在Spark编程模型下的运行方式如下图所示:可以看到Spark首先从文件系统中抽象出RDD1,然后RDD1通过flatMap算子转换为RDD2,RDD2是通过reduceByKey算子转换为RDD3,RDD3中的数据被重写回文件系统。所有的操作都基于RDD。3.思路与架构经过多方考虑,最终决定基于Spark技术搭建实施医院临床知识库系统,采用MongoDB/Sequoiadb构建大数据仓库作为大数据的存储中心,采用Hadoop+Spark1构建大数据分析平台,基于AgileEAS.NETSOA中间件构建ETL数据抽取转换工具(后替换为PentahoKettle),基于AgileEAS.NETSOA中间件构建知识库服务门户,业务通过WCF/HIS系统集成WebServiceIntegration,使用AgileEAS.NETSOA+FineUI搭建基本的字典管理,然后分析结构的图形化展示功能。一开始我们选择了SequoiaDB作为大数据存储中心。为此,我还专门完成了SequoiaDB的C#驱动。参考我为SequoiaDB(开源NoSQL)写的C#驱动,支持Linq,全开源。我在github上投过一篇文章,但是一方面熟悉SequoiaDB的技术人员太少,维护起来是个问题。终于,经过大约8个月的时间,我们切换到MongoDB3.0作为大数据存储中心。最初,我们选择了hadoop2.0+spark1.3.1,使用scala2.10开发医院临床知识库系统。请参考centos+scala2.11.4+hadoop2.3+spark1.3.1环境搭建,但后期更换Sequoiadb与MongoDB同时,我们也将计算框架从hadoop2.0+spark1.3.1升级为hadoop2.6+火花1.6.2。考虑到spark部署在linux上,spark分析的输出存储在Mysql5.6数据库中,系统使用的各种字典信息也存储在Mysql中。spark数据分析部分的代码使用IntelliJIDEA14.1.4工具编写,其他部分代码使用VS2010编写。3.1总体架构整个系统由三部分组成:数据采集层、存储分析层和应用逻辑层,以及本系统选择的外部数据源。本系统的外部数据源目前主要是医院信息系统产生的临床数据,目前主要集中在HIS系统,后期将依托EMR、LIS、PACS系统。数据采集??层主要负责从临床业务系统中采集大量的历史临床数据。历史记录采集方式分为批量采集和实时采集。在数据采集过程中,对原始数据进行校验,并对原始数据进行清洗转换,并将处理后的数据存储在大数据仓库中。存储分析层主要负责数据存储和数据分析。清洗转换后合理有效的数据以JSON格式存储在大数据集群中。大数据存储参考使用SequoiaDB数据库,数据分析部分由Hadoop/SparkCluster提供完成,大数据存储通过Spark导入分析,分析结果写入临床知识库,临床知识库数据库使用MySql数据库存储。应用逻辑层主要负责人机交互和分析结构反馈给临床系统的通道,通过WebUI向临床医生和业务管理者提供列表式、图形化的知识展示,同时提供业务辅助和推荐功能的调用临床系统集成的API,目前API主要以两种方式提供:WebService和WebAPI。3.2总体流程整个系统从数据源采集数据,写入大数据存储SequoiaDB集群,再通过Spark进行分析计算,将分析产生的临床知识写入MySQL知识库,并进行交付通过WebUI和标准API将其用于临床。3.3数据导入过程历史数据的采集和导入是在使用初期使用AgileEAS.NETSOA的计划任务用C#脚本实现的。计划的任务定期协调和执行。具体的数据导入代码根据不同的临床业务系统实现。调整也可以使用PentahoKettle实现,数据的导入可以通过PentahoKettle可配置实现。3.4物理结构设计临床数据源是本系统分析的数据源,来自临床HIS和EMR。目前,医院HIS采用SQLServer2008R2数据库,EMR采用ORACLE11G数据库,运行Windows2008操作系统。SequoiaDB集群是一个大数据存储数据库集群,目前使用SequoiaDBv2.0,运行在Centos6.5操作系统上,根据业务规模使用2-16个节点的集群,用于存储之后的海量历史清洗和转换临床数据,供Spark集群分析,并提供SOA服务器进行历史数据查询和历史相关推荐。Hadoop/Spark集群是本系统分析计算的核心节点,用于分析SequoiaDB集群中的历史数据,生成医学知识,辅助临床医生。本集群根据业务规模采用2-16节点集群,采用Centos6.5操作系统,安装JAVA1.7.79运行环境,scala2.11.4语言,使用Hadoop2.3,spark1.3.1分析框架。MySql知识库是本系统的知识库存储数据库。Hadoop/Spark集群产生的分析结构写入该数据库,由SOA服务器和Web服务处理,用于临床系统集成和WebGUI显示。目前使用的是MySQL5.6版本。在Windows2008/Centos6操作系统上安装。SOAServer是本系统的对外接口应用服务器,为临床业务系统和WebServer提供业务操作逻辑,为临床业务系统提供服务API。目前运行Windows2008操作系统,部署.NETFramework4.0环境,运行AgileEAS。NETSOA中间件SOA服务,AgileEAS.NETSOA中间件SOA服务向外部系统提供标准的WebService和WebAPI。WebServer为系统提供了一个基于标准的B/S浏览器用户界面,供业务人员通过B/S网页管理系统,查询和使用知识库中的医学知识,目前运行于Windows2008操作系统,并部署.NETFramework4.0环境,运行IIS7.0。临床工作站系统运行HIS和EMR系统。两个系统都是采用C#语言SOA架构思想开发的。与系统集成改造后,采用标准WebService接口与系统对接,利用系统提供的API提供临床诊疗辅助。4.环境、安装、坑目前系统运行在虚拟化环境中,其中三台Centos6组成一个庞大的数据存储和计算集群,每台16CPU(核心)16G内存和2T硬盘,3台一共48核48G。每台机器安装java1.8.25+scala2.10+hadoop2.6、spark1.62、mongodb3.0组合3节点集群,spark采用StandaloneCluster模式,单master节点,每台机器分配12核12G是用于Worker,剩余的CPU内存留给mongodb集群使用。运行截图如下:aWin2008asSOA|应用服务器,分配32核64G内存,部署Mysql5.6、IIS、AgileEAS.NETSOA服务,整个系统的SOA服务和系统的web管理界面都由这台服务器承载。一方面以Web的形式提供管理和查询,另一方面通过webservice和webAPI为临床系统提供服务。具体环境的安装过程由于文章篇幅这里不再详述。我会单独写一篇文章给大家详细介绍。第一次使用Spark,没有太多资料可以参考,所以在开发过程中遇到了很多坑,尤其是在早期。花了一周的时间搭建环境,写代码的过程中总是发现坑。填坑,有些坑填不上,干脆换个思路绕了过去。记住sparksql的udf自定义函数并不是所有的函数都有漏洞。偶尔自己写的udf函数打不通,也找不到原因,看了spark的源码,看不出什么原因,所以不想重写代码,改主意了。我觉得特别喜欢scala语言。我觉得用.net4.0(C#)的朋友,尤其是熟悉Linq的朋友,scala语言还是很方便的。我觉得基本和linq一样方便,更肆无忌惮的是可以在函数中定义类,但是真的很方便。我不太喜欢java,但是我喜欢scala。5效果展示5.1门诊诊断排名门诊诊断排名是门诊诊断知识的图形化界面展示。用于展示医院或指定专科的TopN个常用诊断,以及各诊断与性别、年龄等人群的相关性。与节气相关的图表显示。5.2门诊伴诊查询门诊伴诊排行是门诊并发症的知识展示界面,用于展示某种疾病与其他疾病发生的可能性。5.3门诊自动处方查询门诊自动处方查询用于显示临床最常用处方和治疗自动处方的知识,即最常用的0.9%氯化钠注射液100ml混合头孢硫胺等注射液1g,常适用于扁桃体炎、喘息性支气管炎、上呼吸道感染等疾病,每日1次,静脉滴注。5.4门诊处方推论门诊推论用于显示临床疾病诊断与常用药物和治疗方案的相关性,即如上图所示,1包对乙酰氨基酚麻咪干混悬液常用于上呼吸道感染、四季抗病毒合剂、0.9%氯化钠注射液100ml+注射用头孢硫胺1g、注射用无菌水2ml+注射用重组人干扰素a1b10ug等。5.5医疗临床系统集成实现整体系统源于临床系统,服务于临床系统,我们链接我院HIS系统中的门诊医生站,基于WebService与本系统集成,如下图集成界面:临床医生完成门诊基础医疗后记录,系统将自动诊断门诊疾病被选中进行体检。80%-90%的案例可以直接选择。在少数情况下,医生会在没有合适推荐的情况下录入,省去医生录入诊断的麻烦,也减少了医生录入不规范造成的数据混乱。当临床医生完成门诊病历的书写、开具检查、检查、用药和治疗后,系统将根据可用的诊断信息推荐合适的治疗方案。临床医生只需双击右侧的推荐处方即可。可实现快速处方处方,极大方便了临床医生的工作。针对中医医院,系统集成超过3W经典方剂。根据历史资料和方剂词典的结合分析对比,大大方便了中医师的日常工作:6.大数据技术实施细则,大数据技术在医疗信息化行业的实践,以及实现中的思路和细节,无法在这么短的篇幅中介绍。这篇文章也是我们在实现需求和实践之后写的,所以总觉得事情比较简单。我只希望这篇文章能够达到引荐的作用,能够给同行业做相关工作的朋友们一个参考。思路可以借鉴,但是这篇文章真的没有把所有的细节都说清楚。
