在集群上支持数据库大数据量导出

标签: 集群 数据库 大数据 | 发表时间:2013-11-23 10:45 | 作者:wbj0110
分享到:
出处:http://www.iteye.com

80w行的数据导出

数据库表(经过程序处理)导出一般使用EXCEL文件,技术一般有POI、JXL、FastExcel。但是当文件过大(几十个字段,行数超过200,000)的时候,往往会出现内存溢出OutOfMemery,这个是应用无非承受的。

对于导出这么大量的数据,一般没有实时性的要求,也没有外观的要求。

业务部分的需求一般是:导出80W行数据,不管是什么,最后能变化成EXCEL即可。

解决方案:直接导出成TXT的格式,再由EXCEL打开,这样一般能满足业务的需求。

涉及的技术,压缩、并发等技术还要跟集群结合。

压缩:直接将txt压缩成RAR文件,没有什么难度。

并发:我们在后台起一个线程或者几个线程来运行一段程序,操作数据的任务表。(可以是单台机器操作)。

任务处理:直接在数据库建立任务表。

 

基本的结构如下所示:

交互图

  1. 用户的一个下载请求,传到这个服务器,服务器再传到第一台服务器。
  2. 第一台服务器向DB的任务表中插入一个条任务信息。
  3. 当第一台服务器启动的时候,启动一个线程,定时去查看DB中有没有任务。
  4. 如果有任务,则 处理,从底层BO中取得需要的数据。
  5. 直接写入文件file.txt中,再将压缩成file.rar文件
  6. 在页面展示一个下载中心,用户可以下载文件、也可以删除文件,甚至可以查看当然的下载任务的处理剩余时间。

 

file.rar必须挂在存储上,多台服务器共享。

 

 压缩源码(核心部分):

public static final String FILE_STYLE = ".rar";<br />

public static final String CODE = "ISO8859_1";<br />

public static BigDecimal compressedFiles(File file) throws IOException {<br />

File f = new File(file.getPath() + FILE_STYLE);<br />

compress(file, f);<br />

file.delete();<br />

return new BigDecimal(f.length() / (1024 * 1024 * 1.0));<br />

}<br />

public static void compress(File file, File ff) throws IOException {<br />

FileOutputStream f = new FileOutputStream(ff);<br />

CheckedOutputStream csum = new CheckedOutputStream(f, new CRC32());<br />

ZipOutputStream out = new ZipOutputStream(<br />

new BufferedOutputStream(csum));<br />

out.setComment("压缩的文件,文件是txt的");<br />

BufferedReader in = new BufferedReader(new InputStreamReader(<br />

new FileInputStream(file), CODE));<br />

out.putNextEntry(new ZipEntry(file.getName()));<br />

int c;<br />

while ((c = in.read()) != -1)<br />

out.write(c);<br />

out.flush();<br />

out.close();<br />

in.close();<br />

f.close();<br />

csum.close();<br />

}

NotepadRender:

 

public static final String FILE_STYLE = ".rar";<br />

public static final String CODE = "ISO8859_1";<br />

public static BigDecimal compressedFiles(File file) throws IOException {<br />

File f = new File(file.getPath() + FILE_STYLE);<br />

compress(file, f);<br />

file.delete();<br />

return new BigDecimal(f.length() / (1024 * 1024 * 1.0));<br />

}<br />

public static void compress(File file, File ff) throws IOException {<br />

FileOutputStream f = new FileOutputStream(ff);<br />

CheckedOutputStream csum = new CheckedOutputStream(f, new CRC32());<br />

ZipOutputStream out = new ZipOutputStream(<br />

new BufferedOutputStream(csum));<br />

out.setComment("压缩的文件,文件是txt的");<br />

BufferedReader in = new BufferedReader(new InputStreamReader(<br />

new FileInputStream(file), CODE));<br />

out.putNextEntry(new ZipEntry(file.getName()));<br />

int c;<br />

while ((c = in.read()) != -1)<br />

out.write(c);<br />

out.flush();<br />

out.close();<br />

in.close();<br />

f.close();<br />

csum.close();<br />

 

}

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [集群 数据库 大数据] 推荐:

在集群上支持数据库大数据量导出

- - Java - 编程语言 - ITeye博客
数据库表(经过程序处理)导出一般使用EXCEL文件,技术一般有POI、JXL、FastExcel. 但是当文件过大(几十个字段,行数超过200,000)的时候,往往会出现内存溢出OutOfMemery,这个是应用无非承受的. 对于导出这么大量的数据,一般没有实时性的要求,也没有外观的要求. 业务部分的需求一般是:导出80W行数据,不管是什么,最后能变化成EXCEL即可.

全球10大数据库

- - 译言-电脑/网络/数码科技
原文: Fiorenttini   译者: julie20098. [非商业性转载必须注明译者julie20098和相关链接. ,否则视为侵权,追究转载责任. 世界气候数据中心:气候全球数据中心, 220TB 的网络数据, 6PB 的其它数据. 国家能源研究科学计算中心,有 2.8PB 容量.

Clustrix Sierra关系数据库集群

- 2sin18 - 风轻扬
Clustrix的Sierra数据库集群引擎是一个share-nothing架构的可伸缩关系数据库集群. 官方宣传的非常诱人,说是功能像集中式关系数据库一样强大,可伸缩性超强,不需要规划什么数据分区,可用性也非常高. 简直是集SQL和NoSQL的优点于一身. 据说最近阿里云的RDS服务很可能是基于这个,因此仔细去了解了一下,发现架构上属于软硬一体化的路子,感觉架构上还是有些问题,对硬件的要求也不低.

文章: 大数据分析与列数据库

- - InfoQ cn
百度技术沙龙第三十四期:机器学习之多媒体方向的思考(2013年1月12日 周六). 百度技术沙龙特约观察员火热招募中,2013,因为有你更精彩. 性能测试专家,7dtest.com创始人高楼(Zee)主持出品2013北京QCon“优秀测试实践分析”专场. InfoQ《深入浅出Node.js》专栏作者,CNode社区朴灵确认主持并参与分享QCon Node.js专题.

大数据高并发数据库设计注意要点

- - BlogJava-qileilove
数据库的设计非常重要,很多时候,我们只关心和考虑到眼前的功能,而忽略了后续的可维护性和可拓展性,以及还有一个在大数据时代会遇到的高并发问题.    在设计表结构时要注意以下几个要点:.   1.数据行的长度不要超过8020字节,如果超过这个长度的话在物理页中这条数据会占用两行从而造成存储碎片,降低查询效率.

大数据量下的SQL Server数据库自身优化

- - Oracle - 数据库 - ITeye博客
  1.1:增加次数据文件.   从SQL SERVER 2005开始,数据库不默认生成NDF数据文件,一般情况下有一个主数据文件(MDF)就够了,但是有些大型的数据库,由于信息很多,而且查询频繁,所以为了提高查询速度,可以把一些表或者一些表中的部分记录分开存储在不同的数据文件里.   由于CPU和内存的速度远大于硬盘的读写速度,所以可以把不同的数据文件放在不同的物理硬盘里,这样执行查询的时候,就可以让多个硬盘同时进行查询,以充分利用CPU和内存的性能,提高查询速度.

MySQL数据库如何解决大数据量存储问题

- - 数据库 - ITeye博客
利用MySQL数据库如何解决大数据量存储问题. 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存储大数据量的问题,主要是数据库中的两张历史数据表,一张模拟量历史数据和一张开关量历史数据表,这两张表字段设计的很简单(OrderNo,Value,DataTime). 基本上每张表每天可以增加几千万条数据,我想问如何存储数据才能不影响检索速度呢.

Facebook揭密:如何让MySQL数据库集群自主运行

- - IT经理网
Facebook运行着全球最大的MySQL数据库集群,该集群分布在两个大洲上的多个数据中心中数以千计的服务器上. 让人不解的是,Facebook只动用了一个很小的团队来管理这个庞大的MySQL数据库集群. 近日Facebook的Shlomo Priymak在Facebook博客上 发文揭开了这个秘密.

京东容器集群支持数据库实践

- - DockerInfo
京东 容器数据库系统,管理1800台物理计算节点,生产1W+ 多MySQL Docker容器实例. 架构简单可靠,Docker容器计算平台与MySQL集群管理平台解耦处理. 为描述方便,京东容器化数据库系统命名为CDS,底层京东Docker容器计算平台命名为JDOS. 本文重点介绍JDOS如何支持CDS.

数据库老兵:大数据时代NoSQL不是颠覆性技术

- - IT经理网
数年前,当人们谈论起新兴的NoSQL数据库技术时,相当一部分观点认为NoSQL在大数据市场取代传统关系型数据库只是个时间问题. 如今,这一预言并未兑现,Mitchell Kertzman的总经理Hummer Winblad认为,大多数情况下,NoSQL都没有展现出所谓的革命性. 作为数据库的老兵,以下是Kertzman在本周的视频 访谈的一些观点摘录:.