Java中的大量数据处理/ HPC - 建议我如何开始

时间:2012-10-10 08:26:48

标签: java multithreading design-patterns data-mining hpc

我正在考虑编写一个编程问题,我想,我需要了解很多高级编程概念。出于某些原因,我决定用Java编写代码 - 尽管我并不精通它。 所以我希望你能帮助我提供建议,指导,资源指南,书籍,教程或任何你认为相关的通用建议。

以下是我的问题的基本性质:

  1. 我需要创建一个客户端 - 服务器架构。 Server支持多个并发客户端。客户端发送简单的指令(可能是服务器在特定端口上暴露某种API /运行侦听器),服务器执行指令并将结果发送回客户端。

  2. 服务器的主要工作是根据给出的指令进行大量的数据处理。它从后端数据库/文件系统获取数据。数据量很容易激增〜 200GB - 700GB 。数据通常会流式传输到它,但可能需要在处理期间在内存缓存中保存大量数据(如果RAM不够,则将其分页到磁盘)。计算通常是数字密集本质上(假设采用矩阵的逆矩阵)

  3. 服务器应该可以执行多线程(我不知道这个术语在Java中是什么意思,我希望服务器应该能够以多个方式分配作业并行子流程。)

  4. 服务器本身应该非常轻量级。我不需要任何GUI 界面。

  5. 如果我以某种方式设计它以便以后可以将它与 Hadoop 等HPC框架集成,那将会很棒。

  6. 现在,如果我要这样做,我需要学习什么样的编程?顺便说一句,我对OOP有很好的理解,我对数据结构和算法有点熟悉,我知道基本的Java(以前从未在Java中进行任何网络或多线程编程,但是使用了典型的oop概念,泛型,可比较接口等。)。我基本上是在数据库编程中工作,但过去也做了很多C,C ++,C#,Python。

    鉴于要求和我的背景,请建议,

    1. 我应该如何开始这个项目?构建项目的方法是什么?
    2. 我应该首先创建一些基本的API定义,然后开始处理细节吗?
    3. 我应该遵循任何特定的设计模式吗?从哪里学习?
    4. 我需要在Java学习哪些东西以及从哪里学习它们?
    5. 在内存中读取大量数据的最佳方法是什么? Java nio是不错的解决方案?
    6. 如果我实例化一个包含大量数据的类,它会起作用吗? (例如,假设我有一个Vector类来表示具有数百万个元素的矩阵,并且该类的构造函数在内存中读取大量数据集)。处理这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

您需要定义客户端和服务器如何相互通信。最简单的方法是使用已建立的协议(如HTTP),通过创建客户端无需编写代码即可调用的REST服务。

大多数支持HTTP的框架都会创建几个在不同线程中运行的侦听器。这为您提供了开箱即用的多线程。

我建议调查我更喜欢Spring Controllers。春天的重量相当轻。

如果您想使用这些框架,您需要快速查找并将它们合并到您的应用程序中进行编译和打包。

我建议为此考虑一下Maven。这是一个很大的节省时间。特别是使用原型来创建项目的文件夹结构,以及自动下载依赖项及其依赖项。

最后我的智慧之言。确保您的服务是单一的无状态服务。这意味着您只创建一次对象,每个线程使用相同的对象。垃圾收集发生的次数要少得多。这在处理大量请求时会产生巨大差异。

在这些服务中,注意不要使用类级别变量来保存状态。如果这样做,不同的线程将过度写入彼此的数据。

答案 1 :(得分:1)

首先我要说的是,根据你对你使用java作为服务器端语言的好东西的解释。

您选择的客户端服务器架构类型可能取决于您实际投放的客户端类型。它们是典型的基于GUI或CUI的桌面客户端还是Web客户端。

在后一种情况下,您可以以正常方式使用Spring Framework,而对于前者,您可以进一步探索Spring对Restful Web服务的支持。我建议不要使用基于套接字或TCP的网络解决方案或使用java网络。

Spring RESTful API为您提供了一个非常酷的抽象,即网络和多线程,甚至是基于桌面的客户端。对于桌面客户端,您可以使用JSON / XML作为响应,并可以使用HttpClient库来调用服务器,这是对底层网络内容的非常酷的抽象。

Spring的设计模式进一步追随非常linear的数据流。 Spring使用Dependency InjectionInversion of Control来完成很多基本设计注意事项,这些注意事项非常简单。

有关与特定要求相关的设计模式的详细分析,我建议您阅读Java Design Patterns: A Tutorial Addison Wesley个出版物的书籍,作者是James W. Cooper

关于API设计的另一件事。您最好先创建一个API规范,然后再进一步实现它们。